본문 바로가기

서버운영 (TA, ADMIN)/정보보안

[정보보안] 웹서버 해킹

웹서버 해킹은 "네트워크 해킹"으로 알려진 더 큰 영역의 일부입니다. 대부분의 사람들에게는 아주 잘 알려진 도구를 사용하고 매체를 통해 널리 광고되기도 했으므로 해킹을 처음 시도해보는 사람들조차 파고들어가고픈 영역이기도 합니다.


네트워크 해킹에서 보안과 관련한 사람들이 반드시 알아두어야 하는 확실한 도구와 기술이 존재합니다. 이런 사항은 우리가 공격할 웹 서버가 웹 애플리케이션을 호스팅합니다. 네트워크를 해킹할 때 Nmap, Nessus, Metasploit 같은 도구는 보안을 연구하는 모든 사람들이 잠재적으로 사용하게 되는 중요한 것들입니다. 스스로 해킹 기술을 한 단계에 올리고자 한다면 이러한 기본적인 도구의 쓰임새를 마스터해야 합니다.


"뛰려면 먼저 걸어야 한다"


이런 도구에 관한 전문적인 책과 자원은 엄청나게 많지만, 특별히 웹 서버를 목표로 공격할 때는 양상이 조금 다릅니다. 전통적인 네트워크 해킹은 아주 조직적인 방법론을 따릅니다. 웹서버를 네트워크 서비스로 보고 공격할 때 사전 조사, 포트 스캐닝, 취약점 찾기, 공격하기 절차를 수행하게 됩니다.


웹 서버의 robots.txt 파일을 수동으로 검사하여 웹 서버 운영자가 검색엔진의 결과에 포함되길 원치 않는 디렉터리가 무엇인지 알아볼 필요가 있습니다. 이 안에는 웹 서버 안의 민감한 정보에 이르는 잠재적인 로드 맵이 들어있는데 직접 설치한 웹 서버에서 쉽게 확인해 볼 수 있습니다. 또한 Nikto와 같이 웹 서버의 취약점을 전문적으로 찾는 해킹 툴도 사용해보는 등 전통적이고 무르익은 네트워크  해킹 기술과 도구를 써서 웹서버를 해킹할 수 있습니다.



사전조사


사전조사(또는 정보수집이라고도 부르는) 단계에서는 이를테면 IP 주소, 네트워크 토폴로지, 네트워크에 연결된 장치들, 사용되는 기술, 패키지 버전 등 목표물에 대해 가능한 한 많은 정보를 수집하게 됩니다. 사전조사와 연관된 도구가 많지만 서버 (고유의 숫자) IP 주소를 얻기 위하여 우선 host와 Netcraft에 집중하고, 목표 환경에 대한 더 많은 정보를 얻기 위하여 robots.txt를 검사하게 됩니다.


사전조사는 네트워크 기반 공격에서 아주 중요합니다. 그렇기 때문에 사전조사에 많은 시간이 걸리더라도 네트워크 공격을 성공시키기 위한 기본 바탕이 되므로 충분히 시간을 갖고 대응해야 합니다. 또한 정보를 수집할 때는 모든 것을 기록하는 것이 좋습니다. 툴을 쓸때는 원래의 결과 값을 저장하고 인상적인 URL이나 IP 주소, 전자우편 주소와 다른 주목할 만한 토막뉴스 등을 모읍니다. 전문적으로 침투 테스트를 할 때에도 원래의 결과 값을 필요할 때마다 저장하여 고객에게 최종 보고서를 제출할 때 첨부하는 것이 좋습니다.



웹 서버에 대해 배우기

우리가 웹 서버를 목표로 하는 이유는 웹 서버가 네트워크 외부에서 접근할 수 있게 설계되었기 때문입니다. 웹 서버의 주 용도는 내부 네트워크 밖의 사용자가 접근할 수 있는 웹 애플리케이션을 호스팅하기 위한 것입니다. 그렇기 때문에 네트워크로 진입하는 창과 같은 역할을 합니다. 웹 서버에 대해 조사하려면 우선 외부 IP 주소를 알 필요가 있습니다. 우리는 보통 목표 웹 애플리케이션의 http://syngress.com/과 같은 URL을 IP 주소로 바꾸는 것으로부터 시작하게 됩니다. URL은 보통 사용자가 쉽게 기억할 수 있는 문자형식인데 반해, IP 주소는 웹 서버의 고유의 숫자 주소를 의미합니다. 네트워크 해킹 툴은 일반적으로 웹 서버의 IP 주소를 사용하는 데 사용자가 호스트명을 쓰더라도 컴퓨터는 눈에 띄지 않게 자동으로 주소를 찾아봅니다. URL을 IP 주소로 바꾸려면 다음과 같이 터미널 창에서 host 명령을 쓰면 됩니다. ( 도메인명으로 IP 확인 )


> host syngress.com


이 명령은 다음의 내용을 결과 값으로 회신하는데 외부 IP 주소를 첫 번째 항목으로 보여줍니다. 다른 항목들은 전자우편 서비스와 관련 있으며 나중에 사용될 수 있으므로 보관하는 것이 좋습니다.


웹 브라우저는 IP 주소와 URL의 어떤 것으로도 웹 서버가 호스팅하는 웹 애플리케이션의 홈페이지를 가져옵니다. 그래서 웹 서버의 정확한 IP 주소를 알게 되면 웹 브라우저에 직접 입력하여 도메인과 같은 목적지에 닫는지 확인해볼 필요가 있습니다.



Robots.txt 파일

웹 서버에서 무엇이 실행되는지 이해하려면, 그 서버의 robots.txt 파일을 보는 것으로 시작하는 것이 좋습니다. Robots.txt 파일에는 웹 크롤러가 색인 작업할 때 포함하지 않길 바라는 웹 서버의 디렉터리와 파일 목록을 담고 있기 때문입니다. 웹 크롤러는 Google이나 Yahoo와 같은 검색엔진에서 가장 일반적으로 사용하는 형태로서의 웹 정보 목록을 만들고 기록하는 소프트웨어를 말합니다. 이러한 웹 크롤러는 인터넷 검색 기능의 정확도와 성능을 향상시키기 위하여 인터넷을 샅샅이 누비며 찾은 모든 것을 목록화(기록화)합니다.


해커에게 robots.txt 파일은 민감한 정보를 확인하는 지침서와도 같은데, 웹서버의 robots.txt 파일은 브라우저에서 간단히 URL을 입력하여 얻어질 수 있기 때문입니다. 즉 브라우저 주소 창에 URL 뒤에 /robots.txt만 덧붙이면 다음과 같은 robots.txt 파일이 쉽게 얻어집니다.


User-agent: *

# Directories

Disallow: /modules/

Disallow: /profiles/

Disallow: /scripts/

Disallow: /themes/

# Files

Disallow: /CHANGELOG.txt

Disallow: /cron.php

Disallow: /INSTALL.mysql.txt

Disallow: /INSTALL.pgsql.txt

Disallow: /install.php

Disallow: /INSTALL.txt

Disallow: /LICENSE.txt

Disallow: /MAINTAINERS.txt

Disallow: /update.php

Disallow: /UPGRADE.txt

Disallow: /xmlrpc.php

# Paths (clean URLs)

Disallow: /admin/

Disallow: /logout/

Disallow: /node/add/

Disallow: /search/

Disallow: /user/register/

Disallow: /user/password/

Disallow: /user/login/

# Paths (no clean URLs)

Disallow: /?q=admin/

Disallow: /?q=logout/

Disallow: /?q=node/add/

Disallow: /?q=search/

Disallow: /?q=user/password/

Disallow: /?q=user/register/

Disallow: /?q=user/login/


Robots.txt 파일은 다음과 같이 네 부분으로 나뉩니다.


1. 디렉터리

2. 파일

3. 경로 (깨끗한 URL)

4. 경로 (깨끗하지 않은 URL)


깨끗한 URL은 브라우저에 경로를 복사하고 붙여 넣을 수 있는 절대 경로를 말하는데 반해, 깨끗하지 않은 URL은 앞의 경우와 같이 매개변수 "q"가 붙어있는 것을 말합니다. 이것은 빌더 페이지(builder page)라고 부르기도 하는데, 전적으로 전달되는 URL 매개변수에 근거한 데이터를 얻기 위해 사용됩니다. 디렉터리와 파일은 글자 그대로 입니다.


모든 웹 서버는 루트 디렉터리에 robots.txt 파일을 가지는데, 만일 그렇지 않다면 웹 크롤러는 데이터베이스와 파일을 포함한 모든 것에 대해 색인화합니다. 하지만 어떤 웹 관리자도 이런 정보가 Google 검색의 일부가 되길 희망하지 않습니다. 웹 서버의 루트 디렉터리는 실질적으로 웹 서버 소프트웨어가 설치된 호스트 컴퓨터의 물리적 디렉터리입니다. 윈도우에서 루트 디렉터리는 보통 C:/inetpub/wwwroot/가 기본이고, 리눅스에서는 /var/www/와 비슷한 곳을 씁니다.


완전히 정반대의 기능을 하도록 웹 크롤러를 만든다면 막을 수 있는 방법은 없습니다. 그러니까 오히려 robots.txt에 명시된 것들만 가져오게 해서 여러 웹 서버를 사전조사하는 경우 상당한 시간을 절약할 수 있습니다. 그렇지 않다면 브라우저에 각 robots.txt를 수동으로 요청하고 검토해야만 합니다. Robots.txt파일은 자동화된 웹 크롤러 입장에서 볼 때 완전한 장애물이지만 사람인 해커가 이 민감한 정보를 검토한다면 과속방지턱의 역할도 할 수 없을 만큼 가볍습니다.



포트 스캐닝


포트 스캐닝은 간단히 말해 목표 컴퓨터에 어떤 포트가 열려있는지 확안히는 절차입니다. 이 결과를 바탕으로 동작하는 서비스를 알 수 있습니다. 컴퓨터의 포트는 그것이 정문이든, 옆 문이든, 혹은 주차장 문이든 간에 집으로 들어오는 출입구와 같습니다. 집의 비유를 더 하자면, 서비스란 집으로 들어올 것으로 예상되는 길로 전달되는 트래픽입니다. 예를 들어 판매원은 정문을 이용하고, 집주인은 주차장 문을 이용하면, 친구들은 옆 문을 이용한다고 하자. 여기서 판매원이 정문을 이용하는 것과 마찬가지로 특정 서비스는 컴퓨터의 특정 포트를 사용한다고 볼 수 있습니다. HTTP 트래픽은 80을, HTTPS 트래픽은 443 포트를 표준으로 사용합니다. 그래서 만일 80과 443 포트가 열려있는 것을 찾는다면 우리는 HTTP와 HTTPS가 동작하고 있으므로 그 컴퓨터는 아마도 웹 서버라고 확신할 수 있습니다. 이처럼 포트 스캐닝을 할 때 우리는 다음의 세 가지 질문을 염두에 두어야 합니다.


1. 열린 포트는 어떤 것인가?

2. 그 포트에서 동작하는 서비스는 무엇인가?

3. 어느 버전의 서비스가 돌고 있는가?


만일 이러한 질문에 정확한 답을 할 수 있다면 공격의 기초는 아주 튼튼한 셈입니다.



Nmap

Nmap은 가장 널리 사용되는 포트 스캐너로서 http://nmap.org/에서 상당한 수준의 문서를 참조할 수 있습니다. 1997년 Gordon "Fyodor" Lyon이 첫 버전을 출시한 이래 Nmap에 는 취약점 스캐닝 및 공격 분야의 기능이 계속 추가되면서 세계에서 가장 뛰어난 포트스캐너의 기세를 이어오고 있습니다.


Nmap 업그레이드

Nmap을 처음 사용하기 전에 터미널에서 nmap -V 명령을 실행하여 가장 최신 버전인지 꼭 확인해야 합니다. 업데이트 시에는 터미널에서 apt-get upgrade nmap 명령을 입력하면 됩니다. 설치가 끝난 후 버전 6 또는 그 이상으로 제대로 되었는지 확실히 하기 위해 다시금 nmap -V 명령을 쳐보는 게 좋습니다.


Nmap 실행

Nmap에는 몇가지의 탐색 유형과 기능을 추가하는 스위치가 있습니다. 우리는 이미 우리가 운영하는 웹서버의 IP 주소를 알고 있기 때문에 Nmap이 해당 호스트에 대해 찾는 (즉 서버의 IP 주소를 확인하는) 과정을 뛰어넘어 웹 서버의 포트, 서비스, 버전같이 쓸모 있는 정보를 수집하는 데 더 관심을 갖는 것이 좋습니다. 자체 호스트(127.0.0.1)에 설치된 DVWA 웹서버에 대해 터미널에서 다음의 명령으로 Nmap을 실행합니다.


Nmap -sV -O -p- 127.0.0.1


-sV 옵션을 추가하면 서비스 버전 정보를 얻는다.

-O 옵션을 추가하면 운영체제의 종류와 버전 정보를 얻는다.

-p- 옵션으로 모든 포트를 스캔한다.

127.0.0.1는 목표로 하는 IP다. 


Nmap의 가장 흥미로운 기능 중 하나는 원격 운영체제를 식별해서 목표 시스템에서 동작하는 서비스와 그 버전 정보를 얻어노느 점입니다. Nmap은 원격 호스트에 일련의 패킷을 보내고 그 응답 값을 2,600개 이상의 알려진 운영체제 지문정보를 담고 있는 nmap-os-db 데이터베이스의 내용과 비교합니다. 우리가 일차적으로 스캔한 정보는 다음과 같습니다.


$ nmap -sV -O -p- 127.0.0.1


Starting Nmap 6.40 ( http://nmap.org ) at 2017-05-28 12:07 KST

Nmap scan report for 127.0.0.1

Host is up (0.0024s latency).

Not shown: 65529 filtered ports

PORT        STATE     SERVICE     VERSION

80/tcp      open      http        Apache httpd

443/tcp     open      ssl/http    Apache httpd

3478/tcp    closed    unknown

3479/tcp    closed    twrpc

8000/tcp    closed    http-alt

8443/tcp    closed    https-alt

Device type: general purpose

Running: Linux 2.6.X

OS CPE: cpe:/o:linux:linux_kernel:2.6

OS details: Linux 2.6.32


OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit .

Nmap done: 1 IP address (1 host up) scanned in 120.68 seconds


$ nmap -sV -O -p- 127.0.0.1


Starting Nmap 6.40 ( http://nmap.org ) at 2017-05-28 12:23 KST

Nmap scan report for localhost (127.0.0.1)

Host is up (0.000085s latency).

Not shown: 65531 closed ports

PORT        STATE    SERVICE    VERSION

22/tcp      open     ssh        OpenSSH 6.6.1 (protocol 2.0)

25/tcp      open     smtp       Postfix smtpd

80/tcp      open     http       Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.1e-fips)

443/tcp     open     ssl/http   Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.1e-fips)

No exact OS matches for host (If you know OS is running on it, see httpd://nmap.org/submit/ ).

TCP/IP fingerprint:

OS:SCAN(V=6.40%E=4%D=5/28%OT=22%CT=1%CU=34930%PV=N%DS=0%DC=L%G=Y%TM=592A42E

OS:0%P=x86_64-redhat-linux-gnu)SEQ(SP=FC%GCD=1%ISR=FE%TI=Z%CI=I%II=I%TS=A)O

OS:PS(O1=MFFD7ST11NW7%O2=MFFD7ST11NW7%O3=MFFD7NNT11NW7%O4=MFFD7ST11NW7%O5=M

OS:FFD7ST11NW7%O6=MFFD7ST11)WIN(W1=AAAA%W2=AAAA%W3=AAAA%W4=AAAA%W5=AAAA%W6=

OS:AAAA)ECN(R=Y%DF=Y%T=40%W=AAAA%O=MFFD7NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O

OS:%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=

OS:0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%

OS:S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(

OS:R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=

OS:N%T=40%CD=S)


Network Distance: 0 hops

Service Info: Host: dev-web.localdomain


OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 45.48 seconds


$ nmap -sV -O -p- 127.0.0.1


Starting Nmap 6.40 ( http://nmap.org ) at 2017-05-28 12:31 KST

Nmap scan reposrt for 127.0.0.1

Host is up (0.0016s latency).

Not shown: 65530 filtered ports

PORT        STATE    SERVICE    VERSION

22/tcp      open     ssh        OpenSSH 5.4 (protocol 2.0)

80/tcp      open     http       Apache httpd 2.2.15 ((CentOS))

3306/tcp    open     mysql      MySQL 5.6.31

8080/tcp    open     http       Apache Tomcat/Coyote JSP engine 1.1

8480/tcp    open     http       Apache Tomcat/Coyote JSP engine 1.1

Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port

Device type: general purposr|storage-misc|WAP|load balancer

Running (JUST GUESSING): Linux 2.6.x (97%), Netgear Linux 2.6.x (93%), Linksys embedded (91%), Vodafone embedded (90%), F5 Networks embedded (88%)

OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:netgear:linux_kernel:2.6 cpe:/h:linksys:befw11s4 cpe:/h:vodafone:easybox_802

Aggressive OS guesses: Linux 2.6.32 (97%), Netgear ReadyNAS 3200 NAS device (Linux 2.6) (93%), Linksys BEFW11S4 WAP (91%), Vodafone EasyBox 802 wireless ADSL router (90%), Linux 2.6.11 - 2.6.18 (89%), F5 BIG-IP load balancer (88%)

No exact OS matches for host (test conditions non-ideal).


OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 119.52 seconds


이 결과에서 포트, 상태, 서비스, 버전의 네 가지 항목을 찾을 수 있을 것입니다. 위에서 보이는 행의 개수는 해당 웹 서버의 운영 중인 서비스의 갯수를 의미합니다. 이 컴퓨터에서 어떤 것이 동작되고 있는지는 자명하더라도(물론 VM에서 돌리고 있는 것에 따라 그 결과는 조금 다를 수도 있지만), 각각의 내용을 살펴봄으로써 Nmap 결과를 똑같이 이해하는 것이 중요합니다.


정확한 서비스와 버전 정보를 알아두면 이후에 취약점을 찾고 침투하는 단계에 큰 도움이 됩니다. 그 외에 커널 버전, 운영체제 빌드에 관한 세부정보와 네트워크 홉 수 등에 대한 부가정보도 있습니다.


자체 호스트를 상대로 Nmap을 돌리면 실제로 다른 컴퓨터에서 응답 대기하는 포트를 쓸 수 없으므로 자기기만 적일 수 있습니다. 컴퓨터는 같은 근거리 통신망(Local Area Network, LAN) 안에 있거나 또는 완전히 LAN 바깥에 있을 것입니다. 127.0.0.1은 자체 호스트이므로 모든 컴퓨터가 자기 자신과 통신할 때 사용하는 되돌림 주소입니다. 외부 사용자가 본 컴퓨터에서 이용할 수 있는 것을 분명히 알려면 두 개의 서로 다른 컴퓨터에서 Nmap 스캔을 동작시켜야 합니다. 네트워크 안에서 돌리고, 네트워크 바깥에서 돌리는 식입니다. 그런 경우 세 가지의 스캔 결과를 서로 비교해볼 수 있습니다. 이런 고려가 결정적으로 중요하다고 할 수는 없어도 어떤 환경에서 스캔하는가에 따라 다른 결과를 얻을 수 있음을 깨닫는 것은 중요합니다.


Nmap 스크립트 엔진

Nmap은 특별한 스캔을 수행하는 스키립트를 포함하여 그 기능성을 넓혀왔습니다. 사용자는 단순히 스크립트와 그 스크립트에서 필요로 하는 매개변수를 호출하면 됩니다. Nmap 스크립트 엔진(Nmap Scripting Engine, NSE) 이 이런 기능을 다루기 때문에 우리는 운 좋게도 웹에 특정한 수많은 스크립트를 바로 사요할 수 있습니다. 거의 400개의 Nmap 스크립트(정확하게는 396개)가 있으므로 그 중 쓸만한 것 몇 개를 찾을 수 있다고 확신해도 좋습니다. 현재 통용되는 모든 NSE 스크립트와 문서는 http://nmap.org/nsedoc/ 에서 확인 가능합니다.


모든 NSE 스크립트를 이용할 때는 Nmap 스캔 문법의 일부로서 --script=<script name> 매개변수로 호출해야 합니다. 예를 들어 버전 스캔의 일부로 대중적인 웹 애플리케이션과 서버에서 쓰는 디렉터리를 열거하는 http-enum 스크립트를 사용할 요량이라면 다음과 같이 씁니다.


nmap -sV --script=http-enum 127.0.0.1


윈도우 컴퓨터에 이 스크립트를 실행했더니 다음과 같이 일곱 개의 공통 디렉터리를 찾았습니다. 이 디렉터리들은 나중에 경로 횡단 공격에 쓰일 수 있습니다. DVWA에 이 NSE 스크립트를 적용해보면 몇 개의 목록이 등재되고 MySQL 인스턴스가 실행 중입을 알게 될 것입니다.


$ nmap -sV -sV --script=http-enum 127.0.0.1


Starting Nmap 6.40 ( http://nmap.org ) at 2017-05-28 14:35 KST

Nmap scan report for localhost (127.0.0.1)

Host is up (0.000015s latency).

Not shown: 996 closed ports

PORT        STATE        SERVICE        VERSION

22/tcp      open         ssh            OpenSSH 6.6.1 (protocol 2.0)

25/tcp      open         smtp           Postfix smtpd

80/tcp      open         http           Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.1e-fips)

443/tcp     open         ssl/http       Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.1e-fips)

| http-enum:

|    /bak/: Possible backup

|    /css/: Potentially interesting folder w/ directory listing

|    /download/: Potentially interesting folder w/ directory listing

|    /icons/: Potentially interesting folder w/ directory listing

|    /images/: Potentially interesting folder w/ directory listing

|    /js/ : Potentially interesting folder w/ directory listing

Service Info: Host: dev-web.localdomain


Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 187.46 seconds


또 매우 도움이 되는 일반적인 웹 서버 스캔 방법 중 하나는 목표 컴퓨터가 80 포트에서 http-front-page-login 스크립트를 이용한 익명의 Microsoft FrontPage 로그인에 취약한지 확인하는 것입니다. 보통 "FrontPage는 윈도우에서만 쓰는 기능"이라고 생각합니다. 분명히 FrontPage는 대개 윈도우 환경에 적용하지만, 그 확장성이 꽤 넓기 때문에 리눅스 시스템에서도 그 기능을 지원합니다. Microsoft는 FrontPage 확장을 더 이상 지원하지 않으나 다소 오래된 웹 서버에서는 여전히 널리 사용됩니다.


nmap 127.0.0. -p 80 --script=http-frontpage-login


http-frontpage-login 스크립트를 동작시킨 결과는 다음과 같습니다. 오래된 버전의 FrontPage 기본 확장은 익명 사용자가 로그인할 수 있게 설정되어 있으므로 서버는 완전하게 공격당하게 됩니다.


PORT    STATE    SERVICE    REASON

80/tcp  open     http       syn-ack

| http-frontpage-login:

| VULNERABLE:

| Frontpage extension anonymouse login

| State: VULNERABLE

| Description:

| Default installations of older versions of frontpage extensions allow anonymous logins which can lead to server compromise.

|

| References:

|_  http://insecure.org/sploits/Microsoft.frontpage.insecurities.html


여기에 소개된 앞선 NSE의 마지막 예제는 웹 서버가 경로 횡단 공격을 감행하여 웹 서버가 리눅스에서는 /etc/passwd 파일을, 그리고 윈도우에서는 boot.ini 파일을 얻는데 취약한지 검사합니다. 만일 취약하면 공격자가 웹 서버에 접근해서는 안되는 파일 시스템 자원에 접근할 수 있음을 뜻합니다. 이런 유형의 공격은 이후에 훨씬 자세히 다루겠지만, Nmap으로 웹 서버를 해킹하는 동안 이런 식으로 취약점을 함께 검사한다는 점에서 대단한 기능입니다. 이렇게 한 번에 두 가지를 실행하는 놀라운 방법은 나중에 다른 목표를 공격할 때에도 사용할 수 있음은 물론입니다.


nmap --script http-pasword --script-args http-passwd.root=/127.0.0.1


바로 이것이 NSE의 놀라운 스크립트인데, 왜냐하면 자동화된 웹 애플리케이션 스캐너로는 웹 서버의 목록을 종횡무진 탐색하는 게 어렵기 때문입니다. 이 방법으로 얻은 취약점의 예제는 다음과 같습니다.


80/tcp open http

| http-passwd: Directory traversal found.

| Payload: "index.html?../../../../../boot.ini"

| Printing first 250 bytes:

| [boot loader]

| timeout=30

| defualt=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

| [operating systems]

|_multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect


Nmap으로 포트 스캐닝해서 얻은 내용을 바탕으로 Nessus나 Nikto를 써서 웹 서버의 취약점을 찾게 됩니다.



취약점 스캐닝


취약점 스캐닝은 운영 중인 서비스의 약점을 찾아내는 과정입니다. 목표로 하는 웹 서버의 IP 주소, 열린 포트, 동작하는 서비스와 그 서비스의 버전과 같이 구체적인 정보를 안다면, 이러한 서비스의 취약점을 확인할 수 있습니다. 이것이 웹 서버를 본격적으로 공격하기 전에 마지막 단계에서 수행하는 일입니다.


취약점 찾기는 보통 익스플로잇이나 퍼징 시그니처를 잔뜩 탑해한 자동화된 도구나 플러그인으로 수행됩니다. 이런 플러그인을 이용하여 목표로 한 컴퓨터의 서비스가 공격에 어떻게 반응하는지 관찰하고 분석합니다. 어던 서비스가 특정한 방식으로 반응하면 취약점 스캐너가 활성화되어 그 서비스가 취약한 사실뿐만 아니라 해당 취약점을 유발하는 정확한 익스플로잇까지 알 수 있습니다.


이것은 바로 컴퓨터에서 안티바이러스가 동작하는 원리와 비슷합니다. 컴퓨터에서 프로그램이 실행되려고 하면 안티바이러스 제품은 알려진 지문을 확인하여 그 프로그램이 바이러스인지 아닌지 판별합니다. 그렇기 때문에 취약점 스캐너와 안티바이러스 제품은 검사하는 데 쓰이는 지문의 수준까지만 신뢰할 수 있는 셈입니다. 만일 취약점 스캐너의 플러그인이 오래되었다면 그 결과를 100% 정확하다고 볼 수 없습니다. 만일 플러그인이 어떤 것을 거짓양성으로 표시한다면 그 결과를 100% 믿을만한 것으로 볼 수도 없습니다.


해킹의 전체 그림에서 취약점 스캐닝의 위치를 이해하는 것은 매우 중요합니다. 아주 뛰언 해커들 중에는 취약점 스캐너로 침투할 수 있는 취약점을 찾는 대신 수동으로 소프트웨어 패키지로 취약점을 찾은 후 직접 뚫고 들어가는 코드를 작성하기도 합니다. 똑똑하게 해킹하려면 수동으로 공격하는 기법 중 우선 퍼징, 디버깅, 리버스 엔지니어링, 맞춤식 쉘 코드와 수동으로 뚫고 들어가는 기법과도 익숙해져야 합니다.


Nessus

Nessus는 가장 유명한 취약점 스캐너 중 하나입니다. 취약점 스캐너를 쓰는 해커들은 언제나 보안의 가장 전면으로부터 한 발짝 뒤에 있을 수 밖에 없는데, 새로운 취약점이 발견되면 보안업체가 그 정보를 플러그인으로 패치를 적용할 때까지 시간이 걸리기 때문입니다. 하지만 새로운 공격 방법이 나온 것을 뉴스로 알게 되고 몇시간 지나지 않아서 그 새로운 취약점을 검사할 수 있는 Nessus 플러그인이 발표되는 경우도 심심찮게 많습니다. 더 좋은 경우에는 종종 새로운 취약점과 그에 대응하는 Nessus 플러그인이 함께 발표되기도 합니다. 한편 같은 Nessus라도 가정용 무료 버전은 유료 전문가 버전에 비해 가장 최신의 취약점을 업데이트하는 데 7일의 시차가 있음을 알아 두어야 합니다.



보고서의 요약 화면은 취약점의 위험도에 따라 정렬되어 있는데 위험(Critical)이 가장 높은 단계입니다. 위험도는 높음(High), 중간(Medium), 낮음(Low)과 정보 전달(Informational)로 분류하기도 합니다.


일반 취약성 및 노출(Common Vulnerability and Exposure, CVE) 식별자는 Nessus로 취약점을 검색할 때부터 Metasploit 공격에까지 사용되므로 특히 중요한 의미가 있습니다. CVE 식별자는 해당 취약점이 발견될 때마다 고유의 코드 값이 부여됩니다. 한편 Nessus로 스캔하는 도중에 나온 CVE 코드는 더 자세히 알아볼 수 있습니다. CVE 공식 사이트는 https://cve.mitre.org/ 이고, 추가로 취향에 따라 RSS 피드를 맞춰 가입할 수 있는 http://www.cvedetails.com/도 있습니다. 또 모든 취약점이 목록화되어 있는 http://packetstormsecurity.com/ 도 흥미로운 사이트입니다. 웹 서버를 해킹할 때 이 모든 자원을 이용하길 권합니다.



Nikto

Nikto는 오픈소스 취약점 스캐너로서 2001년 후반에 Perl로 개발되어 출시되었고, 특별히 웹서버의 취약점을 검토할 때 쓰입니다. 이를 이용하면 웹 서버의 잠재적으로 위험한 파일과 스크립트 6400여 건, 기한이 지난 서버 버전 1200여 건, 그리고 웹 서버의 버전과 관계된 문제점 300여 건을 검토할 수 있습니다.


웹 서버가 발견되면 Nessus에서 Nikto를 자동으로 시작할 수 있습니다. 여기서는 터미널에서 직접 Nikto를 실행하지만, Nessus 블로그에서 이 두 도구를 함께 엮어 자동으로 동작하게 하는 방법을 찾아볼 수 있습니다.


Nikto는 perl 스크립트로서 보통 /usr/bin/ 아래에 존재하므로, path가 걸려있으면 터미널에서 바로 실행할 수 있습니다.


./nikto.pl -h 127.0.0.1 -p 80


HTTP에서 DVWA가 통신할 때 사용하는 포트는 80밖에 없으므로, 여기서 스캔할 때는 간단히 80 포트만 명시합니다.


사실 스캔 포트를 특정하지 않으면 Nikto는 기본적으로 80 포트를 검사합니다. Nikto는 DVWA 웹 서버를 스캔하여 예상된 결과를 다음과 같이 요약해서 보여줍니다.


- ***** SSL support not available (see docs for SSL install) *****

- Nikto v2.1.5

---------------------------------------------------------------------------

+ Target IP:          127.0.0.1

+ Target Hostname:    127.0.0.1

+ Target Port:        80

+ Start Time:         2017-05-28 15:34:02 (GMT9)

---------------------------------------------------------------------------

+ Server: Apache/2.2.15 (CentOS)

+ Server leaks inodes via ETags, header found with file /, inode: 925391, size: 170, mtime: 0x5399a372d0f40

+ The anti-clickjacking X-Frame-Options header is not present.

+ Apache/2.2.15 appears to be outdated (current is at least Apache/2.2.22). Apache 1.3.42 (final release) and 2.0.64 are also current.

+ Allowed HTTP Methods: GET, HEAD, POST, OPTIONS, TRACE

+ OSVDB-877: HTTP TRACE method is active, suggesting the host is vulnerable to XST

+ OSVDB-3268: /html/: Directory indexing found.

+ OSVDB-3092: /html/: This might be interesting...

+ OSVDB-3268: /icons/: Directory indexing found.

+ OSVDB-3233: /icons/README: Apache default file found.

+ 6544 items checked: 4 error(s) and 9 item(s) reported on remote host

+ End Time:           2017-05-28 15:37:14 (GMT9) (192 seconds)

---------------------------------------------------------------------------

+ 1 host(s) tested


Nikto의 결과 보고서 중 가장 중요하게 볼것은 오픈소스 취약점 데이터베이스(Open Source Vulnerability Database, OSVDB) 항목으로서 발견된 취약점에 관하여 구체적인 정보를 함께 제공합니다.  이 식별자는 Nessus와 Metasploit에서 사용하는 CVE 식별자와 매우 유사합니다. OSVDB는 독립적일 뿐만 아니라 오픈소스 프로젝트 형태로 70,000개 이상의 제품과 관련된 90,000개 이상의 취약점에 대하여 균형 잡히 기술정보를 제공합니다.



공격하기


공격하기(exploitation)란 모든 정보를 수집하고, 포트 스캔하고, 취약점까지 검토를 완료한 다음에 비로소 허가 없이 목표 서버에 접근하거나 원격으로 코드를 실행하는 순간을 말합니다. 네트워크 공격하기의 목표 중 하나는 목표 컴퓨터(여기서는 웹 서버)에 관리자 수준의 권한을 얻어서 프로그램을 실행시키는 것입니다. 만일 이게 가능하다면 해커는 그 컴퓨터를 완전히 손아귀에 넣은 것이기 때문에 사용자나 관리자를 추가하고, 추후에 네트워크를 공격하기 위해 해킹 도구를 해당 컴퓨터에 설치하기도 하며, 이렇게 침투된 컴퓨터로 언제든 접속할 수 있는 뒷구멍을 만드는 등 어느 것이든 할 수 있는 상태를 뜻합니다. 언제나 접속할 수 잇는 뒷구멍은 집에 들어가기 위한 여벌의 열쇠를 만드는 것이기 때문에 더 이상 지하실 창문을 깨뜨릴 필요가 없습니다. 아무래도 열쇠를 이용하면 들어가기도 훨씬 쉬울 뿐더러 잡힐 확률도 낮아지는게 당연합니다.


여기서는 Metasploit을 공격 도구로 선정하였습니다. Metasploit는 HD Moore가 만든 익스플로잇 프레임워크로서, 오픈소스로 만든 공격 도구 중 꽤 인정받는 툴입니다. Metasploit Framework(MSF 또는 msf)는 구조화된 방법으로 시스템을 뚫고 들어가서 사용자 집단 간에 침투 경험을 연습하고, 적용하고, 공유할 수 있게 해줍니다. 나중에 시간을 더 투자하여 이처럼 훌륭한 공격 프레임워크에 익숙해지는 것이 좋습니다.


취약점(vulnerability): 목표 시스템의 잠재적인 약점을 뜻합니다. 패치를 하지 않았거나 (C언어에서 strcpy 같이) 알려진 약한 함수를 사용한 경우, 구현이 충실하지 않았거나 또는 (SQL과 같이) 컴파일된 언어를 잘못 사용할 경우, 혹은 해커가 노릴만한 다른 잠재적인 문제점을 의미합니다.

익스플로잇(exploit): 목표 시스템에 페이로드를 올릴 수 있는 코드의 집합체입니다.

페이로드(payload): 익스플로잇 최후의 목표로서, 목표 시스템에서 실행되는 악성코드입니다. 몇 가지 유명한 페이로드 중에서는 (윈도우 cmd 창이나 리눅스 쉘처럼) 쉘과 연관된 것들, (피해 컴퓨터에서 거꾸로 접속하여 발견되기 더욱 어렵게 만드는) 리버스 쉘, 원격 데스크톱 접속을 허용하는 VNC 주입, 그리고 목표 시스템에 임의로 관리자를 추가하기 등이 있습니다. 


Metasploit의 기초

다음과 같이 일곱 개의 MSF 명령을 사용하여 가볍게 익스플로잇을 완수할 수 있습니다.


1. 탐색(search): Nessus 결과에 보고된 CVE 식별자를 근거로 MSF 데이터베이스에서 관련된 침투 방법을 찾아봅니다.

2. 사용(use): CVE 식별자와 가장 잘 일치하는 공격 방법을 선택합니다.

3. 페이로드 보기(show payloads): 선택된 방법에 가능한 페이로드를 검토합니다.

4. 페이로드 설정(set payloads): 선택된 공격을 위하여 희망하는 페이로드를 선정합니다.

5. 옵션 보기(show options): 선택된 페이로드의 일부로서 반드시 정해야만 하는 옵션을 검토합니다.

6. 옵션 설정(set options): 성공하려면 페이로드에 꼭 있어야만 하는 옵션 값을 할당합니다.

7. 익스플로잇(exploit): 목표 시스템에 잘 만들어진 익스플로잇을 전송합니다.


우선 Metasploit 프레임워크를 시작해보면, 터미널에서 msfconsole 명령을 입력합니다. Metasploit을 실행하려면 1분정도 걸리므로 화면이 가만히 있더라도 당화하지 말아야 합니다.


새로운 익스플로잇이 매 시각 추가되므로 거의 날마다 습관적으로 Metasploit을 업데이트하는 것이 좋습니다. msfupdate 명령은 전체 프레임워크를 업데이트하기 때문에 늘 가장 최신 버전의 Metasploit을 유지할 수 있습니다.



접근 유지하기


해커가 공격한 컴퓨터를 완전하게 제어할 수 있도록 뒷구멍을 심어둠으로써 다음 번에는 해당 시스템을 다시 공격할 필요 없이 내부에 곧바로 되돌아올 수 있는 상태를 접근 유지 단계라고 부릅니다. 공격에 성공한 케이크를 그 상태 그대로 얼려서 유지하는 셈입니다. 루트킷, 뒷구멍, 트로이 목마, 바이러스, 봇넷과 같은 주제들이 이러한 접근 유지 카테고리에 속합니다.


아마도 지속적으로 접근하기 위해 사용되는 가장 일반적인 도구는 Netcat일 것입니다. 이 도구는 여러 컴퓨터와 네트워크로 설치하고, 설정 및 처리를 탄력적으로 할 수 있기 때문에 해킹의 맥가이버 칼이란 별명을 갖고 있스니다. Netcat은 종종 시스템을 해킹한 후에 가장 먼저 설치하는 도구인데, 해커가 뚫린 시스템을 거점으로 삼아 네트워크 안으로 더 깊이 파고들거나 다른 컴퓨터를 공격할 수 있기 때문입니다. 피보팅(pivoting)은 이미 뚫린 시스템을 거점으로 활용하여 공격의 기반으로 삼음으로써 외부에서는 절대 접근할 수 없는 내부 네트워크의 다른 컴퓨터를 공격하는 것을 의미합니다.


컴퓨터가 더 많이 공격 당할수록 이를 거점으로 삼아 해커는 내부 네트워크로 더 깊이 들어갈 것이고 만일 발각되지 않는다면 결국 모든 네트워크상의 컴퓨터를 노출시킬 수도 있습니다.