前言
前段时间HackingTeam数据泄露事件引起了一场轩然大波,足足400G的干货。虽然这件事已经过去很久了,但是意图不轨的人试图利用HackingTeam里面的干货,来干一些坏事。 对目标进行监听。这篇博文是对其中的一个dll的部分分析。仅仅这个dll也就让人够头疼的了。
样本分析
0x01敏感信息加密处理
1.对敏感字符串进行加密处理
列出被加密的部分敏感信息(在该样本中,很少会出现明文,都是被加密过的字符串)
1002139B |. 68 04E50610 push ww.1006E504 ; ASCII "_ xgvUR8vUPC 0UiUPC 1J1vlo......"
100214A6 |. 68 80E40610 push ww.1006E480 ; ASCII "L99Q rYp35 [K0l 1J1vlo U1 8Wtl8iJ oEPUvEtli]"
100214FF |. 68 5CE40610 push ww.1006E45C ; ASCII "_ 4v8tvUPC gEtl oEidWl.........."
10021558 |. 68 3CE40610 push ww.1006E43C ; ASCII " xClPv zdWWJ E7lt8vUEP8W"
2.对敏感函数进行加密处理(大量,这里贴出部分)
1002139B |. 68 04E50610 push ww.1006E504 ; ASCII "_ xgvUR8vUPC 0UiUPC 1J1vlo......"="-Activating hiding system…………"
100214A6 |. 68 80E40610 push ww.1006E480 ; ASCII "L99Q rYp35 [K0l 1J1vlo U1 8Wtl8iJ oEPUvEtli]" = "ERROR 2931 [The system is already monitored]"
100214FF |. 68 5CE40610 push ww.1006E45C ; ASCII "_ 4v8tvUPC gEtl oEidWl.........." = "- Starting core module"
10021558 |. 68 3CE40610 push ww.1006E43C ; ASCII " xClPv zdWWJ E7lt8vUEP8W" = "Agent fully operational"
2.1解密函数内藏的玄机
对无无意义的字符串进行解密,解密后利用LoadLibraryA函数和GetProceAddress函数来获取到解密后的函数地址,如果调用失败,样本就会进入睡眠状态,如果调用失败大于等于4次,就会进入消息循环中,等带消息
while ( 1 ){
v7 = LoadLibraryA((LPCSTR)v5);
if ( !v7 )
Sleep(0x64u);
++v6;
if ( v7 )
break;
if ( v6 >= 4 )
WhileMessage(); }
v8 = 0;
while ( 1 ){
v9 = GetProcAddress(v7, lpProcName);
if ( !v9 )
Sleep(0x64u);
++v8;
if ( v9 )
break;
if ( v8 >= 4 )
WhileMessage();}
0x02检测敏感驱动
反病毒软件的驱动名是被加密了的只有通过动态解密才能获取
检测方法:
利用GetEnvirnmentvariableA函数获取到到系统个根目录,然后通过将获取到的根目录与事先写好在程序中的system32/drivers32在内存中相接,以获取到驱动目录
1000AF57 |. 68 05010000 push 105
1000AF5C |. 8D8C24 100100>lea ecx,dword ptr ss:[esp+110]
1000AF63 |. 51 push ecx
1000AF64 |. 68 CCBC0610 push ww.1006BCCC ; ASCII "SYSTEMROOT"
1000AF69 |. 68 B4BC0610 push ww.1006BCB4 ; ASCII "HfuFowjsponfouWbsjbcmfB"
1000AF6E |. E8 4D050400 call <ww.Decode_GetApi>
1000AF73 |. 83C4 04 add esp,4
1000AF76 |. FFD0 call eax ; kernel32.GetEnvironmentVariableA
然后通过调用FindFirtFileA函数来判断是否存在该驱动文件
1000B009 |. 68 D4BE0610 push ww.1006BED4 ; ASCII "GjoeGjstuGjmfB"
1000B00E |. F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[>
1000B010 |. E8 AB040400 call <ww.Decode_GetApi>
1000B015 |. 83C4 04 add esp,4
1000B018 |. FFD0 call eax ; kernel32.FindFirstFileA
被检测的驱动信息列表
ox03检测敏感进程及文件信息
被检测的进程
ielowutil.exe、TaskMan.exe、hackmon.exe、hiddenfinder.exe、unhackme.exe、fsbl.exe、sargui.exe 、avgarkt.exe、avscan.exe、RootkiRevevaler.exe、taskmgr.exe、avgscanx.exe、IceSword.exe、rku.exe、pavark.exe、avp.exe、bscan.exe、avk.exe、k7.exe、rootkitbuster.exe、pcts.exe、iexplore.exe、chrom.exe、fs32.exe
通过创建快照,对进程进行遍历一个一个和一下进程名进行比较
10017792 |. FFD0 call eax ; kernel32.CreateToolhelp32Snapshot
100177AE |. FFD0 call eax ; kernel32.Process32FirstW
100177D0 |> /395C24 14 /cmp dword ptr ss:[esp+14],ebx
100177D4 |. |74 2C |je short ww.10017802
100177D6 |. |8D4C24 0C |lea ecx,dword ptr ss:[esp+C]
100177DA |. |51 |push ecx
100177DB |. |56 |push esi
100177DC |. |68 BCC00610 |push ww.1006C0BC ; ASCII "Qspdftt43OfyuX"
100177E1 |. |E8 DA3C0300 |call <ww.Decode_GetApi>
100177E6 |. |83C4 04 |add esp,4
100177E9 |. |FFD0 |call eax ; kernel32.Process32NextW
100177EB |. |85C0 |test eax,eax
被检测的文件信息
Outlook、Security Task Manager、Detectsrootkits、HiddenProcessFinder、Detectsrootkits、SecureBlackLight、Sophos AntiRootkit、AVG AntiRootkit、Rootkit detection utility、pavark、Trend Micro RootkitBuster、Internet Explorer、F-Secure Settings*
获取进程的文件信息,然后再挨个与上面的文件信息作比较,判断是否存在以上文件信息
1001B4A0 |. 52 push edx ; /pHandle
1001B4A1 |. 8D8424 800000>lea eax,dword ptr ss:[esp+80] ; |
1001B4A8 |. 50 push eax ; |FileName
1001B4A9 |. E8 8A000300 call <jmp.&VERSION.GetFileVersionInfoSiz>; GetFileVersionInfoSizeW
1001B4D0 |. 56 push esi ; /Buffer
1001B4D1 |. 57 push edi ; |BufSize
1001B4D2 |. 6A 00 push 0 ; |Reserved = 0
1001B4D4 |. 8D8C24 8C0000>lea ecx,dword ptr ss:[esp+8C] ; |
1001B4DB |. 51 push ecx ; |FileName = "C:WINDOWSsystem32wscntfy.exe"
1001B4DC |. E8 51000300 call <jmp.&VERSION.GetFileVersionInfoW> ; GetFileVersionInfoW
1001B4ED |. 52 push edx ; /pValueSize
1001B4EE |. 8D4424 18 lea eax,dword ptr ss:[esp+18] ; |
1001B4F2 |. 50 push eax ; |ppValue
1001B4F3 |. 68 1CD10610 push ww.1006D11C ; |pSubBlock = "VarFileInfoTranslation"
1001B4F8 |. 56 push esi ; |pBlock
1001B4F9 |. E8 2E000300 call <jmp.&VERSION.VerQueryValueW> ; VerQueryValueW
1001B548 |. 52 push edx ; /pValueSize
1001B549 |. 8D4424 10 lea eax,dword ptr ss:[esp+10] ; |
1001B54D |. 50 push eax ; |ppValue
1001B54E |. 8D4C24 24 lea ecx,dword ptr ss:[esp+24] ; |
1001B552 |. 51 push ecx ; |pSubBlock = "StringFileInfo40904b0FileDescription"
1001B553 |. 56 push esi ; |pBlock
1001B554 |. E8 D3FF0200 call <jmp.&VERSION.VerQueryValueW> ; VerQueryValueW
0x04 注入所有拥有admin权限的进程
如果在上面的进程监测和文件信息检测中检测到了上面列表中的数据,就不会对该进程进行注入。如果该进程不被包含在两者任何一个中就会开始注入
判断进程是否具有admin权限
100178B9 |. 68 F8B60610 push ww.1006B6F8 ; ASCII "PqfoQspdftt"
100178BE |. 896C24 1C mov dword ptr ss:[esp+1C],ebp
100178C2 |. 896C24 18 mov dword ptr ss:[esp+18],ebp
100178C6 |. E8 F53B0300 call <ww.Decode_GetApi>
100178CB |. 83C4 04 add esp,4
100178CE |. FFD0 call eax ; kernel32.OpenProcess
100178E1 |. 53 push ebx
100178E2 |. 68 00B90610 push ww.1006B900 ; ASCII "PqfoQspdfttUplfo"
100178E7 |. E8 D43B0300 call <ww.Decode_GetApi>
100178EC |. 83C4 04 add esp,4
100178EF |. FFD0 call eax ; ADVAPI32.OpenProcessToken
如果打开成功,就先获取进程的特权信息,然后通过LookupAccounSidA函数来获取用户名,如果掉失败就通过调用GetUserName函数来获取到计算机的用户名
10017908 |. 68 F0BD0610 push ww.1006BDF0 ; ASCII "HfuUplfoJogpsnbujpo"
1001790D |. E8 AE3B0300 call <ww.Decode_GetApi>
10017912 |. 83C4 04 add esp,4
10017915 |. FFD0 call eax ; ADVAPI32.GetTokenInformation
10017994 |. 83C4 04 add esp,4
10017997 |. FFD0 call eax ; ADVAPI32.LookupAccountSidA
100179A6 |. 52 push edx
100179A7 |. 68 20D30610 push ww.1006D320 ; ASCII "HfuVtfsObnfB"
100179AC |. E8 0F3B0300 call <ww.Decode_GetApi>
100179B1 |. 83C4 04 add esp,4
100179B4 |. FFD0 call eax ; ADVAPI32.GetUserNameA
接下来就是注入数据,样本同一个进程会进行三次注入,每次注入部分数据
第一次写
0006CBDC 1003D815 ? /CALL to WriteProcessMemory from ww.1003D813
0006CBE0 0000008C ?.. |hProcess = 0000008C (window)
0006CBE4 02020000 .. |Address = 2020000
0006CBE8 10016A90 恓 |Buffer = ww.10016A90
0006CBEC 000001F4 ?.. |BytesToWrite = 1F4 (500.)
0006CBF0 0006CCA4 ぬ. pBytesWritten = 0006CCA4
第二次写
0006CBDC 1003D815 ? /CALL to WriteProcessMemory from ww.1003D813
0006CBE0 0000008C ?.. |hProcess = 0000008C (window)
0006CBE4 02030000 .. |Address = 2030000
0006CBE8 0006CCC0 捞. |Buffer = 0006CCC0
0006CBEC 00000368 h.. |BytesToWrite = 368 (872.)
0006CBF0 0006CCA4 ぬ. pBytesWritten = 0006CCA4
第三次写
0006CBDC 1003D815 ? /CALL to WriteProcessMemory from ww.1003D813
0006CBE0 0000008C ?.. |hProcess = 0000008C (window)
0006CBE4 0202000F . |Address = 202000F
0006CBE8 0006CCE0 嗵. |Buffer = 0006CCE0
0006CBEC 00000004 ... |BytesToWrite = 4
0006CBF0 0006CCA4 ぬ. pBytesWritten = 0006CCA4
最后创建远程线程
1003D9EE . 68 88250710 push ww.10072588 ; ASCII "DsfbufSfnpufUisfbe"
1003D9F3 . E8 C8DA0000 call <ww.Decode_GetApi>
1003D9F8 . 83C4 04 add esp,4
1003D9FB . FFD0 call eax ; kernel32.CreateRemoteThread
0x05写注册表自启动
打开注册表,看是否存在相应注册表,如果打开失败就查询是否存在该注册表值,如果不存在就试图打开一个文件
0006F538 100183B5 祪 /CALL to RegOpenKeyA from ww.100183B3
0006F53C 80000001 ..€ |hKey = HKEY_CURRENT_USER
0006F540 0006F564 d?. |Subkey = "SoftwareClassesnuax_auto_fileshellopencommand"
0006F544 0006F54C L?. pHandle = 0006F54C
100183E1 |. FFD0 call eax ; ADVAPI32.RegQueryValueExA
0006F524 1001847A z? /CALL to CreateFileA from ww.10018478
0006F528 0006F874 t?. |FileName = "C:DOCUME~1ADMINI~1桌面HT_BAC~1..JklAKLjsd-asdjAIUHDUD82.nuax"
打开文件失败就会创建注册表
0006F534 100185EE 顓 /CALL to RegCreateKeyA from ww.100185EC
0006F538 80000001 ..€ |hKey = HKEY_CURRENT_USER
0006F53C 0006F97C |?. |Subkey = "SoftwareClassesnuax_auto_fileshellopencommand"
0006F540 0006F54C L?. pHandle = 0006F54C
0006F528 1001862A *? /CALL to RegSetValueExA from ww.10018628
0006F52C 00000088 ?.. |hKey = 88
0006F530 00000000 .... |ValueName = NULL
0006F534 00000000 .... |Reserved = 0
0006F538 00000002 ... |ValueType = REG_EXPAND_SZ
0006F53C 0006F564 d?. |Buffer = 0006F564
0006F540 00000069 i... BufSize = 69 (105.)
0006F534 10018695 晢 /CALL to RegCreateKeyA from ww.10018693
0006F538 80000001 ..€ |hKey = HKEY_CURRENT_USER
0006F53C 0006F97C |?. |Subkey = "SoftwareClasses.nuax"
0006F540 0006F54C L?. pHandle = 0006F54C
0006F528 100186CE 螁 /CALL to RegSetValueExA from ww.100186CC
0006F52C 00000088 ?.. |hKey = 88
0006F530 00000000 .... |ValueName = NULL
0006F534 00000000 .... |Reserved = 0
0006F538 00000002 ... |ValueType = REG_EXPAND_SZ
0006F53C 0006F564 d?. |Buffer = 0006F564
0006F540 0000000F ... BufSize = F (15.)
0006F528 100187B0 皣 /CALL to RegSetValueExA from ww.100187AE
0006F52C 00000088 ?.. |hKey = 88
0006F530 10066400 .d |ValueName = "JklAKLjsd-asdjAIUHDUD82"
0006F534 00000000 .... |Reserved = 0
0006F538 00000002 ... |ValueType = REG_EXPAND_SZ
0006F53C 0006F564 d?. |Buffer = 0006F564
0006F540 00000037 7... BufSize = 37 (55.)
0x06配置完成后,修改桌面背景,删除自己
传入参数Infected.bmp,调用SystemParametersInfoA函数修改桌面背景
0006FA74 1000795A Zy. /CALL to SystemParametersInfoA from ww.10007958
0006FA78 00000014 ... |Action = SPI_SETDESKWALLPAPER
0006FA7C 00000000 .... |wParam = 0
0006FA80 0006FA88 堹. |pParam = 0006FA88
0006FA84 00000000 .... UpdateProfile
遍历进程查找是否有ccSvcHst.exe进程(赛门铁克相关的一个进程)如果有 该进程就逃出循环对浏览器进行检查检测是否存在iexplore、firefox、opera、chrome.exe如果该进程是以上几个浏览器之一就不在对其进行判断,会继续进行下一轮循环
10018DC3 |. 56 push esi
10018DC4 |. B8 60C50610 mov eax,ww.1006C560 ; ASCII "opera.exe"
10018DC9 |. 57 push edi
10018DCA |. 8B7C24 34 mov edi,dword ptr ss:[esp+34]
10018DCE |. 894424 08 mov [Arg_0],eax
10018DD2 |. C74424 0C 44C>mov dword ptr ss:[esp+C],ww.1006C544 ; ASCII "iexplore.exe"
10018DDA |. C74424 10 54C>mov [Arg_2],ww.1006C554 ; ASCII "firefox.exe"
10018DE2 |. C74424 14 38C>mov dword ptr ss:[esp+14],ww.1006C538 ; ASCII "chrome.exe"
10018DEA |. C74424 18 ADB>mov dword ptr ss:[esp+18],ww.1006BBAD
10018DF2 |. 33F6 xor esi,esi
如果没找到,会遍历进程去查找进程中是否存在taskmgr、outlook、explore.exe、mghtml.exe如果不存在就判断是否存在BDHV.sys。
如果存在就利用前面的方法下判断该进程是否有管理员权限,然后决定要不要注入。注入也分三次,只是注入的数据不同,这次注入的数据会监测是否新开启具有管理员权限的进程,如果具有管理员权限的进程就对该进程进行修改。
0x07未知危害
1.打开一个xTLfG~3.f66文件,打不开的话就直接返回,如果能打开的话,再打开文件,创建文件映射,将文件映射到当前应用程序的地址空间。然后设置文件的属性,设置了文件属性之后以写的权限去打开该文件,如果失败就调用sleep函数睡眠一会儿,然后重新以写的权限去打开文件,获取文件大小,然后向文件中写入数据。如果失败还是会继续写,直到写入向文件中写入内容成功,然后删除该文件
0006CD14 100189A5 /CALL to SetFileAttributesA from ww.100189A3
0006CD18 0006CD50 P?. |FileName = "C:DOCUME~1ADMINI~1桌面HT_BAC~1-xTLfG~3.f66"
0006CD1C 00000080 €... FileAttributes = NORMAL
0006CD00 100189EF 飰 /CALL to CreateFileA from ww.100189ED
0006CD04 0006CD50 P?. |FileName = "C:DOCUME~1ADMINI~1桌面HT_BAC~1-xTLfG~3.f66"
0006CD08 40000000 ...@ |Access = GENERIC_WRITE
0006CD0C 00000001 ... |ShareMode = FILE_SHARE_READ
0006CD10 00000000 .... |pSecurity = NULL
0006CD14 00000003 ... |Mode = OPEN_EXISTING
0006CD18 00000000 .... |Attributes = 0
0006CD1C 00000000 .... hTemplateFile = NULL
10018C12 |. FFD0 call eax ; kernel32.CreateFileMappingA
10018C33 |. FFD0 call eax ; kernel32.MapViewOfFile
2.尝试以读的方式去访问cKbssss.6AI文件,如果打开不成功就返回,如果成功就读取文件中的内容
10024A11 |. FFD0 call eax ; kernel32.ReadFile
3.对三个文件进行同样的操作
设置文件属性,文件属性设置成功就以写的权限打开文件
0006FA4C 100189A5 /CALL to from ww.100189A3
0006FA50 0006FA84 匉. |FileName = "C:DOCUME~1ADMINI~1桌面HT_BAC~1fWXcUC~8.Ugg"
0006FA54 00000080 €... FileAttributes = NORMAL
0006FA38 100189EF 飰 /CALL to CreateFileA from ww.100189ED
0006FA3C 0006FA84 匉. |FileName = "C:DOCUME~1ADMINI~1桌面HT_BAC~1fWXcUC~8.Ugg"
0006FA40 40000000 ...@ |Access = GENERIC_WRITE
0006FA44 00000001 ... |ShareMode = FILE_SHARE_READ
0006FA48 00000000 .... |pSecurity = NULL
0006FA4C 00000003 ... |Mode = OPEN_EXISTING
0006FA50 00000000 .... |Attributes = 0
0006FA54 00000000 .... hTemplateFile = NULL
获取文件大小,然后在文件中写入8个字节数据(如果写入失败,程序会一直写入数据,知道数据写入成功),然后删除文件
10018A15 . FFD0 call eax ; kernel32.GetFileSize
0006FA40 10018A4E N? /CALL to WriteFile from ww.10018A4C
0006FA44 FFFFFFFF |hFile = FFFFFFFF
0006FA48 0006FA6C l?. |Buffer = 0006FA6C
0006FA4C 00000008 ... |nBytesToWrite = 8
0006FA50 0006FA68 h?. |pBytesWritten = 0006FA68
0006FA54 00000000 .... pOverlapped = NULL
防范措施
360安全卫士已经能安全查杀,建议各位网友扫描一下全盘,看看自己是否中招了、
Comments