기술문서 08. 10. 25. 작성 PHP 기반웹쉘의동작원리와공개웹쉘의기능분석및대응방안 작성자 : 동명대학교 THINK 정정홍 (zeratul621@naver.com) 1. 시작하면서 p. 2 2. 웹쉘의동작원리 p. 3 3. r57shell p. 5 4. kcwebtelnet p. 9 5. phpremoteview p. 10 6. 웹쉘대응방안 p. 12 동명대학교정보보호동아리 T H IN K
1. 시작하면서 웹쉘 (WebShell) 이란, 웹기반에서동작하는쉘프로그램을의미한다. 일반적으로 PHP, ASP, JSP 등과같은웹스크립트언어에서는웹서버에콘솔기반명령어를실행할수있는함수나문법을지원하고있는데, 이런기능을이용하여마치웹에서 SSH나 Telnet을사용하는것처럼쉘프로그램을만들어사용할수있다. 하지만, 누구든지접근이용이한웹환경에서쉘을사용할수있다는점때문에최근웹쉘은각종침해사고에악용되고있다. 만약어느웹사이트의게시판에파일을업로드할수있는권한이있고, 업로드기능에웹스크립트언어확장자 (*.php, *.asp, *.jsp, *.html 등 ) 에대한필터링이없다면공격자는웹쉘을업로드하여해당서버의권한을쉽게획득할수있다. 웹쉘을사용할수있게되면, 공격자는웹사이트내의코드를보거나, 개인정보를유출및변조, 그리고서버에백도어를심는등서버를공격자마음대로제어할수있다. 또한, 웹쉘은그특성상 1) 바이러스백신프로그램에서탐지를잘하지않기때문에 2) 서버관리자가 웹쉘을탐지해내기어렵다. 때문에웹쉘을이용한공격에의해침해사고를당했을경우, 그피해정도가 심각해질수있다. 본문서에서는 PHP 기반웹쉘의동작원리와인터넷상에공개되어있는 PHP 기반웹쉘들의기능을 알아볼것이다. 그리고그에대한대응방법과웹쉘을탐지해내는방법에대해알아보고자한다. 1) 정상적인웹프로그램에도시스템명령을실행하는코드가있을수있다. 2) 최신버전의 V3 나카스퍼스키등의몇몇백신프로그램에서는알려진웹쉘의탐지가가능하다. - 2 -
2. 웹쉘의동작원리 앞서 < 시작하면서 > 에서도언급하였지만, 웹쉘은기본적으로웹스크립트언어의시스템명령을실행 할수있는함수나문법을활용하여동작한다. 그렇다면, 시스템명령을실행하는함수와문법에는어떤것들이있을까? 웹서비스에널리쓰이는언어인 PHP 를예로들어보도록하자. PHP 에서는다음과같이시스템명령 어를실행할수있는함수를제공하고있다. - passthru() ( 참고 : http://www.php.net/manual/en/function.passthru.php) - system() ( 참고 : http://www.php.net/manual/en/function.system.php) 위함수의사용법은간단하다. 다음과같이 ls -laf 명령어를실행하는예제소스코드를작성하여간단한테스트를해보도록하자. <?php?> echo passthru("la -laf", $v); [ 그림 1] 시스템명령어를실행한화면 우리는위화면으로부터웹스크립트언어를이용하여시스템명령의실행이가능하다는것을알수 있다. 그렇다면, 이러한방식으로시스템명령어를실행하면어느유저의권한으로실행될까? 결론부터말하 자면실행중인웹서비스데몬의권한으로실행된다. 일반적으로 Apache 웹서버데몬은 nobody 유저의 - 3 -
권한으로실행되며, 우분투 Apache 웹서버의경우에는 www-data 유저의권한으로실행된다. 행여나 Apache 설치를잘못하여 root 권한으로 Apache 데몬이실행되고있다면매우위험하다. 그상태에서만약파일업로드나원격실행에취약한프로그램을사용하고있다면해당서버의미래는불보듯뻔할것이다. 하지만, nobody 권한으로웹서버가실행되고있더라도웹쉘을실행할수만있다면공격자가서버에 행할수있는수단은매우많다. 이와같은방법을이용하여공격자의명령어를실행하고, 해당결과를일목요연하게정리하여보여주는프로그램이바로웹쉘 (WebShell) 이다. 웹쉘은공격자의명령을실행하여결과만을보여주는단순한것에서부터서버정보를보여주고, 데이터베이스를조작하거나공격하는것등다양한종류의웹쉘이있다. 이러한웹쉘들은검색엔진에서검색하면손쉽게구할수있다 3). [ 그림 2] Google 검색엔진에서 webshell 이라는키워드로검색한화면 다음절부터는해커들사이에서널리사용되는웹쉘의기능과동작원리, 그리고대응및탐지방안 에대해서알아보도록하겠다. 3) 2008 년 10 월 25 일기준으로 Google 검색엔진에서 "webshell" 을검색하면약 335,000 개의결과가검색된다. - 4 -
3. r57shell 소개 [ 그림 3] r57shell 의실행화면 PHP 환경에서동작하는웹쉘이다. 단순히터미널환경을웹에서구현해주는정도를넘어서버의정보, 서버의상태, 서버사양등모든정보를한눈에볼수있는등강력한기능을제공한다. 이외에다양한데이터베이스를지원하며, DB 정보를열람하거나조작을가할수도있다. 특히, 공격에자주쓰이는기능들을정리하여편하게명령어또는스크립트로실행을할수있다는점이매력이다. 기본적으로러시아어로설정되어있지만, 간단한소스코드수정을통해영문으로사용할수있는기 능도지원한다. 사용환경 - 실행기반 : PHP - 지원데이터베이스 : curl, MySQL, MSSQL, PostgreSQL, Oracle 주요기능 1) 로그인기능 [ 그림 4] r57shell 의로그인기능 r57shell 은사용자인증기능을지원한다. 간단한소스코드수정을통해, r57shell 에인증사용자 와암호를설정할수있다. - 5 -
2) 서버정보열람기능 [ 그림 5] r57shell 로서버정보를열람한모습 r57shell 은서버내의다양한정보를열람할수있는기능을지원한다. phpinfo() 의실행결과, php.ini 설정파일정보, 현재서버에존재하는유저리스트등을열람할수있다. 따라서공격자는 웹서버의설정환경과사용자정보등을한눈에볼수있다. 3) 터미널 (Terminal) 기능 [ 그림 6] r57shell 의강력한터미널기능 r57shell 은보다강력한터미널기능을지원한다. 단순한시스템명령실행 / 결과출력정도를넘어 - 6 -
특정파일을편집하거나 4) 공격에자주쓰이는명령어나매크로를쉽게실행할수있도록제공한다. 또한공격자가원하는형태의파일을쉽게찾을수있는기능까지제공한다. 4) 파일업로드 / 다운로드기능 [ 그림 7] r57shell 의파일업로드 / 다운로드기능 r57shell은해당서버에파일을업로드 / 다운로드할수있는기능을제공한다. 로컬파일을업로드할수있는기능에서부터 FTP 서버에서업로드 / 다운로드하기, wget 명령어를사용하기등이가능하다. 심지어웹서버에 FTP 서버가있다면, FTP 서버에무차별대입공격 (bruteforce) 공격을할수있는기능까지있다. 5) 데이터베이스조작기능 [ 그림 8] r57shell 의데이터베이스조작기능 r57shell 의가장큰특징으로는데이터베이스를조작할수있는기능을지원한다는것이다. 기본적 으로 PHP 와함께널리쓰이는 MySQL 뿐만아니라, MSSQL, PostgreSQL, Oracle 등의 DB 까지조작 4) 물론파일을편집하고자할때에는해당파일이나디렉토리의권한 (Permission) 에영향을받는다. - 7 -
할수있다. 공격자는 r57shell 을이용하여 DB 에임의의쿼리문을실행하거나, 공격자가원하는 DB 를 dump 받을수있다 5). 5) 단, 해당데이터베이스의로그인가능한계정명과비밀번호를알고있어야조작이가능하다. - 8 -
4. kcwebtelnet 소개 [ 그림 9] kcwebtelnet 의실행화면 kcwebtelnet 은한국인개발자가제작하여배포한 6) 웹쉘프로그램이다. 명령어만을실행하고결과를 보여주는단순한기능만을지원하지만, 인터페이스가마치유닉스쉘의모습과매우흡사하고, 명령어를 실행하고결과를확인하기가편리하다는특징이있다. 사용환경 - 실행기반 : PHP 4.x 주요기능 1) 터미널 (Terminal) 기능대부분의웹쉘프로그램에서지원하는기능이다. 하지만, kcwebtelnet은유닉스쉘과흡사한터미널을제공해주며, 명령어실행폼에실행하고자하는명령어를입력하여엔터키를이용하여실행할수있기때문에정적인웹환경에서도마치동적인콘솔환경처럼웹쉘을다룰수있다. 6) kcwebtelnet 의소스코드를살펴보면개발자정보가나와있다. - 9 -
5. phpremoteview 소개 [ 그림 10] phpremoteview 의실행화면 phpremoteview 웹쉘은윈도우즈탐색기형태의인터페이스를제공해주는것이특징이다. Setup 메 뉴를통해웹쉘의글꼴, 색상등을변경할수있고, phpinfo() 의실행결과모습, 공격자가직접서버에 명령어를실행할수있는기능등을지원한다. 사용환경 - 실행기반 : PHP 주요기능 1) PHP 코드및쉘명령실행기능 [ 그림 11] phpremoteview 의 PHP 코드실행및명령실행기능 phpremoteview 는입력폼에 PHP 코드를입력받아실행하거나시스템명령을실행할수있는기 능을제공한다. 공격자는공격용소스코드를입력필드에입력하여쉽게서버를공략할수있다. - 10 -
2) 파일탐색및소스보기기능 [ 그림 12] phpremoteview 의파일탐색및소스보기기능 phpremoteview 는윈도우즈탐색기형태의파일탐색및소스보기기능을지원한다. 공격자는 웹서버의디렉토리구조를쉽게파악할수있고, 해당파일에해당하는링크를클릭하면파일의소 스코드를보여준다. 또한, 소스보기페이지에서해당파일의 HexDump 정보를보거나, 해당파일을편집또는다운 로드할수있는기능까지제공한다 ( 물론해당파일에대한쓰기권한이있어야한다 ). 3) 서버정보열람기능 [ 그림 13] phpremoteview 의서버정보열람기능 phpinfo() 함수를실행하여해당웹서버의서버정보를열람할수있다. - 11 -
6. 웹쉘대응방안 우리는지금까지웹쉘의동작원리와인터넷에공개된몇몇웹쉘의특징에대하여알아보았다. 이번 절부터는웹쉘의패턴을분석하여웹쉘의업로드를차단하는방법과웹쉘을탐지하는방법등에대해 알아보도록할것이다. 웹쉘차단하기웹쉘이공격자에의해업로드되는경로는다양하다. 웹쉘은주로웹프로그램의버그나취약점을통해서버에업로드되는경우가많다. 그중가장많이공격의경로로사용되는것은웹사이트의자료실기능 ( 파일업로드가가능한페이지 ) 이다. 만약웹사이트의파일업로드기능을이용하여확장자가 *.php, *.html 인파일을업로드할수있을 경우공격자는웹쉘을업로드하여웹서버의권한을획득할수있다. 따라서, 웹개발자는파일업로드 기능을구현할때, 웹스크립트언어를실행할수있는파일의업로드는필터링하도록한다. 파일업로드확장자필터링시에는다음과같이정규표현식을이용하여필터링하면효과적이다. // 업로드파일명필터링 if (preg_match("/^.*\.(php asp htaccess jsp html htm)$/i", $_FILES['file'][ name'])) exit; [ 예제 1] 정규표현식을이용한파일확장자필터링코드예제 또한 passthru(), system() 함수등을사용하는부분은공격자가 $_GET, $_POST 변수의조작을통하여 시스템명령어를실행할수있는지의여부를살펴보도록한다. ftp 관련함수가사용된부분도공격자가 이를이용하여공격자가웹쉘을원격의 FTP 서버에서받아올수있으므로주의깊게살펴보도록한다. 그리고첨부파일이존재하는디렉토리에있는파일들은웹스크립트엔진이해석하지못하도록제한한다면좀더강력한보안을기대할수있을것이다. 아파치웹서버의경우 httpd.conf 파일을열어다음과같은 Directory 지시자를이용하여파일첨부디렉토리의웹스크립트언어실행권한을제한할수있다. <Directory "/home/homepage/www/bbs/data"> </Directory> RemoveType.html.php.htm [ 예제 2] 아파치에서특정디렉토리의 PHP 실행권한을제한하는코드예제 웹쉘탐지하기 웹쉘은리눅스의 find 명령등을이용하여시스템명령을실행하는코드가있는지의여부를검사하여 웹쉘을탐지할수있다. 하지만, 최근에등장하는웹쉘들은소스코드를암호화하여제대로탐지를하지 - 12 -
못하도록하기도한다. 윈도우즈서버의경우에는최신버전의카스퍼스키백신이나 V3 백신등을이용하여웹쉘을탐지할수있다. 하지만, 리눅스의경우에는암호화된웹쉘을검사하기가까다로울수있는데, 이럴경우에는한국정보보호진흥원에서제공하는휘슬 (Whistl: Web Hacking Inspection Security Tool) 7) 을이용하면쉽게탐지할수있다. 휘슬은인터넷침해사고대응센터 (http://www.krcert.or.kr) 웹사이트에서휘슬사용신청서를다운로드 받아작성하여제출하면제공받을수있다. 다음은휘슬을이용하여웹쉘을검사한화면이다. [ 그림 14] 휘슬을이용하여웹쉘을탐지하는장면 7) 한국정보보호진흥원 (KISA) 에서제공하는웹쉘전문탐지프로그램이다. - 13 -