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






>> 목록보이기
#WH-IllInst-WordPress #웹해킹 훈련장 #Live ISO #WordPress #워드프레스 #nikto #/etc/hosts

WH-IllInst-WordPress 워드프레스 웹해킹훈련장 소개

워드프레스(WordPress)는 전세계에서 가장 많이 사용되고 있는 개인용 누리집 출판 소프트웨어이다. 설치와 사용법이 쉬워서 매우 많이 사용되고 있다. 2016년 12월 기준으로 모든 웹 서비스의 27.3%를 담당하고 있다(출처: https://w3techs.com/). 전 세계 누리집의 총 수가 약 10억개로 알려져 있으므로(출처: http://www.web-stat.com/), 2.7억개 이상의 웹 사이트가 워드프레스로 만들어졌다는 의미이다. 이 때문에 WordPress의 플러그인(plugin) 하나에서 취약점이 발견되면 10만개 이상의 좀비 서버가 만들어지기도 한다.
참고자료: SoakSoak Malware Compromises 100,000+ WordPress Websites (쏙쏙 취약점)

이 훈련장에서는 워드프레스에서 관리자 비밀번호를 취약하게 설정했을 때 발생할 수 있는 시스템 침투 취약점을 다룬다. 실제 웹취약성분석 과정에서 발견한 취약점을 재구성한 것이다. 당시의 웹서버는 MS 윈도우 계열이었으나 라이센스 문제로 리눅스에서 구현하였다. 이 훈련장은 기본적인 워드프레스만을 설치하였다.

웹해킹 실습환경 구성

다음의 WH-IllInst-WordPress 라이브 ISO 파일을 내려받는다.

이 파일을 적당한 위치에 저장한다. VMplayer나 VirtualBox를 이용하여 가상머신으로 부팅한다. 이때 메모리는 1024MB로 설정할 것을 권장한다. 손님 OS로 부팅 후에 root:root로 로그인하여 IP 주소를 확인한다. IP 주소는 ifconfig 명령어로 알 수 있다. 여기서는 192.168.206.136이었다.

칼리 리눅스(Kali Linux) 손님운영체제에서 WH-IllInst-WordPress 훈련장의 호스트 이름을 등록해주어야 한다. 훈련장 서버의 호스트명은 vulnwp이다. 칼리리눅스의 vigedit와 같은 편집기를 이용하여 /etc/hosts 파일에 192.168.206.136 vulnwp 한 줄을 추가한다.

root@kali:~# cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	kali

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@kali:~# vi /etc/hosts
root@kali:~# cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	kali
192.168.206.136	vulnwp

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@kali:~#

이제 WH-IllInst-WordPress 훈련장의 URL은 http://vulnwp/이다. 웹 브라우저로 이 URL에 연결하면 http://vulnwp/wordpress/로 경로가 재지정된다.

WH-IllInst-wordpress homepage
[ WH-IllInst-WordPress 훈련장 홈페이지 ]

WH-IllInst-wordpress blog list
[ WH-IllInst-WordPress 훈련장: 블로그 목록 ]

위의 두 그림은 Firefox로 WH-IllInst-WordPress 훈련장에 접속한 화면이다. 이제 nmap, nikto, owasp-zap (zaproxy)를 이용하여 기본적인 취약점을 탐색해보자.

nmap 포트 스캔 결과

Kali Linux의 /etc/hosts 파일에 훈련장의 호스트명을 등록했으므로 이제는 IP 주소 대신 호스트명을 사용할 수 있다. 훈련장의 호스트명인 vulnwp를 대상으로 nmap 스캔을 수행해보자.

root@kali:~# nmap -A vulnwp

Starting Nmap 7.40 ( https://nmap.org ) at 2017-01-10 11:23 KST
Nmap scan report for vulnwp (192.168.206.136)
Host is up (0.00033s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd
|_http-generator: WordPress 4.7
|_http-server-header: Apache
| http-title: \xEC\x84\xA4\xEC\xB9\x98\xEA\xB0\x80 \xEC\x9E\x98\xEB\xAA\xBB\xEB\x90\x9C \xEC\x9B\x8C\xEB\x93\x9C\xED\x94\x84\xEB\xA0\x88\xEC\x8A\xA4 – \xEA\xB4\x80\xEB\xA6\xAC\xEC\x9E\x90 \xEB\xB9\x84\xEB\xB0\x80\xEB\xB2...
|_Requested resource was /wordpress/
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.33 ms vulnwp (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 9.07 seconds
root@kali:~#

vulnwp 서버는 Linux 2.6(커널 버전이 2.6인 리눅스 운영체제)이며 80 포트에서 Apache httpd를 이용하여 웹 서비스를 제공한다. 그리고 http-generator: WordPress 4.7로 부터 워드프레스 4.7이 사용되고 있다는 것을 알 수 있다.

<meta name="generator" content="WordPress 4.7" />

http://vulnwp/wordpress/의 HTML 소스를 살펴보면 위와 같이 WordPress 4.7을 확인할 수 있다.

nikto를 이용한 웹서버 환경 스캔

http://vulnwp/의 기본적인 웹서비스 환경에 취약점이 있는 지 탐색해보자. 다음과 같이 nikto를 실행한다.

root@kali:~# nikto -host vulnwp
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          192.168.206.136
+ Target Hostname:    vulnwp
+ Target Port:        80
+ Start Time:         2017-01-10 11:24:26 (GMT9)
---------------------------------------------------------------------------
+ Server: Apache
+ Root page / redirects to: /wordpress/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Uncommon header 'link' found, with contents: ; rel="https://api.w.org/"
+ /wordpress/: A Wordpress installation was found.
+ 7373 requests: 0 error(s) and 2 item(s) reported on remote host
+ End Time:           2017-01-10 11:24:37 (GMT9) (11 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
root@kali:~#

curl -I http://vulnwp/wordpress/로 확인하면 Link: <http://vulnwp/wordpress/index.php/wp-json/>; rel="https://api.w.org/"라는 독특한 HTTP 헤더를 발견할 수 있다. 워드프레스가 HTTP 헤더에 바깥고리를 만드는 기능이라고 한다. 그리고 /wordpress/ 경로에 워드프레스가 설치된 것을 확인할 수 있다.

nikto를 이용하여 /wordpress/ 경로를 점검해보자. -root 옵션에 점검할 경로를 지정하면 된다.

root@kali:~# nikto -host vulnwp -root wordpress
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          192.168.206.136
+ Target Hostname:    vulnwp
+ Target Port:        80
+ Target Path:        /wordpress
+ Start Time:         2017-01-10 11:25:05 (GMT9)
---------------------------------------------------------------------------
+ Server: Apache
+ Uncommon header 'link' found, with contents: <http://vulnwp/wordpress/index.php/wp-json/>; rel="https://api.w.org/"
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Allowed HTTP Methods: GET, HEAD, POST, OPTIONS 
+ Web Server returns a valid response with junk HTTP methods, this may cause false positives.
+ DEBUG HTTP verb may show server debugging information. See http://msdn.microsoft.com/en-us/library/e8z01xdh%28VS.80%29.aspx for details.
+ Server leaks inodes via ETags, header found with file /wordpress/wp-content/plugins/akismet/readme.txt, inode: 7451, size: 14222, mtime: Thu Dec  8 02:57:24 2016
+ /wordpress/wp-content/plugins/akismet/readme.txt: The WordPress Akismet plugin 'Tested up to' version usually matches the WordPress version
+ /wordpress/readme.html: This WordPress file reveals the installed version.
+ /wordpress/wp-links-opml.php: This WordPress script reveals the installed version.
+ OSVDB-3092: /wordpress/license.txt: License file found may identify site software.
+ Cookie wordpress_test_cookie created without the httponly flag
+ /wordpress/wp-login.php: Wordpress login found
+ 7374 requests: 0 error(s) and 11 item(s) reported on remote host
+ End Time:           2017-01-10 11:26:10 (GMT9) (65 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
root@kali:~#

nikto/wordpress/ 경로에서 탐지한 항목들은 다음과 같다.

  • http://vulnwp/wordpress/wp-content/plugins/akismet/readme.txt: 워드프레스 버전 노출 ('Tested up to')
  • http://vulnwp/wordpress/readme.html: 워드프레스 설명서, 버전 노출
  • http://vulnwp/wordpress/wp-links-opml.php: 워드프레스 버전 노출
  • http://vulnwp/wordpress/license.txt: 워드프레스 라이센스
  • wordpress_test_cookie 쿠키에 대해서 HttpOnly 미설정
  • http://vulnwp/wordpress/wp-login.php: 워드프레스 로그인 페이지

버전이 노출되면 해당 버전에서 알려진 취약점을 악용할 수 있으므로 가능한 기반 소프트웨어의 종류나 버전은 노출하지 않는 것이 안전하다. 주로 이러한 관점의 항목들이 탐지되었다. CVE details를 확인한 결과 2017년 1월 10일 현재 WordPress 4.7에서 발견된 취약점은 없다(참고자료: Wordpress Vulnerability Statistics).

WH-IllInst-wordpress readme.html
[ WH-IllInst-WordPress 훈련장: readme.html 버전 노출 ]

위 그림은 http://vulnwp/wordpress/readme.html에서 제공하는 WordPress 소개자료이며 여기서 워드프레스의 버전(4.7)이 노출되고 있는 것을 볼 수 있다.

OWASP-ZAP을 이용한 웹 애플리케이션 취약점 점검

이제 OWASP-ZAP의 웹취약점 스캔 기능을 이용하여 웹 애플리케이션을 점검해보자. "빠른 시작"의 공격 URL을 http://vulnwp/로 입력하면 된다.

WH-IllInst-wordpress zaproxy quick start result
[ WH-IllInst-WordPress 훈련장: OWASP-ZAP "빠른 시작" 스캔 결과 ]

제법 시간이 흐른 후에 점검 결과가 출력된다. 일부 URL의 X-Frame-Options 헤더 누락 등과 같은 항목을 탐지하였다.

마무리

nmap, nikto, owasp-zap 등의 범용 도구에서는 특별한 취약점을 찾을 수 없었다. 다음 기사에서 wpscanhydra를 이용한 WH-IllInst-WordPress 공략법을 다룬다.

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


< 이전 글 : SSH 무작위 대입 공격으로 root권한을 탈취한 침해사고 사례 (2017.01.12)

> 다음 글 : WH-IllInst-WordPress 워드프레스 웹해킹훈련장 실습 설명서 (2017.01.10)


크리에이티브 커먼즈 라이선스 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다.
잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다.
문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문
 __
( 올바로 작동하지 않는다고 걱정하지  )
( 마라. 만일 모든 게 잘 된다면, 굳이  )
( 당신이 일할 이유가 없다.  )
(  )
( - Mosher’s Law of Software Engineering  )
 --
  o     .    _  .    
   o    |\_|/__/|    
       / / \/ \  \  
      /__|O||O|__ \ 
     |/_ \_/\_/ _\ |  
     | | (____) | ||  
     \/\___/\__/  // 
     (_/         ||
      |          ||
      |          ||\   
       \        //_/  
        \______//
       __ || __||
      (____(____)
.. -- -- | - .. .... | ... / .. .../ ... {] . .. .. .. ..| ...... .../ .../ .. ...... ... ... ] .. [ .../ ..../ ......./ .. ./// ../ ... .. ... .. -- -- | - .. .... | ... / .. .../ ... {] . .. .. .. ..| ...... .../ .../ .. ./// ../ ... .. ... ...| ..../ ./ ... / ..| ....| ........ / ... / .... ...... ... ... ] .. [ .../ ..../ ......./ .....| ..../ ./ ... / ..| ....| ........ / ... / .... ...| ..../ ./ ... / ..| ....| ........ / ... / .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .