前言
Hacking Team数据泄露事件前段时间引起了一场轩然大波,虽然事件已经过去很久了,但是卫士在最近捕获到了一个与Hacking Team相关的一个后门,但是样本捕获不全,只捕获到了一个dll文件。在分析的时候发现,就一个dll而已,就做了大量的操作,想想如果是一个完整的样本的话。。。。毕竟HT
样本分析
看看这些导出函数
样本分析
干扰分析手段
0x01敏感信息加密处理
1.对敏感字符串进行加密处理
列出被解密的部分敏感信息:
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.对敏感函数进行加密处理(被加密的函数是大量的,这里只列出了较小一部分)
100036BC |. 68 60B40610 push ww.1006B460 ; ASCII "PqfoGjmfNbqqjohB" = OpenFileMappingA
100036DE |. 68 50B40610 push ww.1006B450 ; ASCII "NbqWjfxPgGjmf" = MapViewofFile
10003712 |. 68 74B40610 push ww.1006B474 ; ASCII "DsfbufGjmfNbqqjohB"=CreateFileMappingA
1000378A |. 68 88B40610 push ww.1006B488 ; ASCII "VonbqWjfxPgGjmf" = UnMapViewOfFile
对解密后的函数进行调用
对无意义的字符串进行解密,解密后利用LoadLbraryA函数和GetProcAddress函数获取到解密后的函数地址,如果调用失败,程序睡眠一会儿会再次尝试是否能够获取到该函数的地址,如果调用失败大于或等于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检测敏感驱动
反病毒软件的驱动信息时被加密了的,只有通过动态解密才能获取
检测方式
1000A572 . 51 push ecx
1000A573 . 68 C0BE0610 push ww.1006BEC0 ; ASCII "FovnEfwjdfEsjwfst"
1000A578 . C74424 14 000>mov dword ptr ss:[esp+14],0
1000A580 . E8 3B0F0400 call <ww.Decode_GetApi>
1000A585 . 83C4 04 add esp,4
1000A588 . FFD0 call eax ; PSAPI.EnumDeviceDrivers
利用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
被检测驱动信息列表
0x03检测敏感程序
╮(╯▽╰)╭,超级多的程序信息,超级多的被检测。
对某个文件是否能打开进行判断(该文件是写死在程序中的,在程序初始化的时候,通过获取到当前进程所在的路劲,再通过格式化字符串拼接起来获取到文件,因为样本不够完整,这里没有该文件)是否能够打开该文件,如果能打开该文件就先设置该文件的属性为可读可写然后删除该文件,如果该文件不存在就向将dll中的需要检查是否存在的程序名以及文件的信息cpoy到内存中去(后面在检测文件是否存在的时候,文件名和文件信息两者都用到了的)
创建快照,遍历进程
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
依次打开获取到的进程,并调用OpenProcessToken获取权限
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,4100178CE |. 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
找到有系统权限的程序后,打开该程序后获取到当前模块的完整路劲
10017844 |. 56 push esi
10017845 |. 50 push eax ; /ProcessId
10017846 |. 6A 00 push 0 ; |Inheritable = FALSE
10017848 |. 68 10040000 push 410 ; |Access = VM_READ|QUERY_INFORMATION
1001784D |. FF15 CCB00610 call dword ptr ds:[<&KERNEL32.OpenProces>; \OpenProcess
10017861 |. 51 push ecx
10017862 |. 52 push edx
10017863 |. 6A 00 push 0
10017865 |. 56 push esi
10017866 |. E8 FD3C0300 call <jmp.&PSAPI.GetModuleFileNameExW>
接下来获取上面程序的文件的文件描述
1001B4A0 |. 52 push edx ; /pHandle
1001B4A1 |. 8D8424 800000>lea eax,dword ptr ss:[esp+80] ; |
1001B4A8 |. 50 push eax ; |FileName = "C:\WINDOWS\system32\wscntfy.exe"
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:\WINDOWS\system32\wscntfy.exe"
1001B4DC |. E8 51000300 call <jmp.&VERSION.GetFileVersionInfoW> ; \GetFileVersionInfoW
创建快照,然后依次将快照中的程序名与下面的文件名进行对比以及下面的文件信息做比较,看是否存在该样本觉得可疑的文件
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
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 = "\VarFileInfo\Translation"
1001B4F8 |. 56 push esi ; |pBlock = 00C20048
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 = "\StringFileInfo\040904b0\FileDescription"
1001B553 |. 56 push esi ; |pBlock
1001B554 |. E8 D3FF0200 call <jmp.&VERSION.VerQueryValueW> ; \VerQueryValueW
0x04写注册表
0x05遍历进程,注入进程
0x06未知危害行为
因为样本不完整,在分析该样本的过程中发现了该样本还会读取很多文件的操作,根据不同的文件做出不同的操作
1.其中程序会设置文件为只可读属性,以及试图将该文件的内容映射到当前应用程序的地址空间。以及在ring3层调用ZwQuerySystemInformation来获取进程信息
0006FA78 10019008 ? ww.10019008
0006FA7C 1001900D .? /CALL to SetFileAttributesA from ww.1001900B
0006FA80 0006FA88 堹. |FileName = "C:\DOCUME~1\ADMINI~1\桌面\HT_BAC~1\gS8rMv~n.Mtt"
0006FA84 00000021 !... \FileAttributes = READONLY|ARCHIVE
100193A8 |. 68 74B40610 push ww.1006B474 ; ASCII "DsfbufGjmfNbqqjohB"
100193AD |. E8 0E210300 call <ww.Decode_GetApi>
100193B2 |. 83C4 04 add esp,4
100193B5 |. FFD0 call eax ; kernel32.CreateFileMappingA
100193CA |. 68 50B40610 push ww.1006B450 ; ASCII "NbqWjfxPgGjmf"
100193CF |. E8 EC200300 call <ww.Decode_GetApi>
100193D4 |. 83C4 04 add esp,4
100193D7 |. FFD0 call eax ; kernel32.MapViewOfFile
10032F08 |. 6A 00 |push 0
10032F0A |. 57 |push edi
10032F0B |. 56 |push esi
10032F0C |. 6A 10 |push 10
10032F0E |. FFD3 |call ebx ; ntdll.ZwQuerySystemInformation
2.其中一个文件被打开后,就开始获取磁盘的剩余空间容量有关信息
100270B6 |. 68 5CEA0610 push ww.1006EA5C ; ASCII "HfuEjtlGsffTqbdfFyB"
100270BB |. E8 00440200 call <ww.Decode_GetApi>
100270C0 |. 83C4 04 add esp,4
100270C3 |. FFD0 call eax ; kernel32.GetDiskFreeSpaceExA
然后查找当前进程下的目录下的所有文件
0006F818 10023E8C ? /CALL to FindFirstFileA from ww.10023E8A
0006F81C 0006F96C l?. |FileName = "C:\DOCUME~1\ADMINI~1\桌面\HT_BAC~1\*"
0006F820 0006F82C ,?. \pFindFileData = 0006F82C
10023E95 |> /F64424 08 10 /test byte ptr ss:[esp+8],10
10023E9A |. |75 0B |jnz short ww.10023EA7
10023E9C |. |8B4424 28 |mov eax,dword ptr ss:[esp+28]
10023EA0 |. |83F8 FF |cmp eax,-1
10023EA3 |. |74 02 |je short ww.10023EA7
10023EA5 |. |03F8 |add edi,eax
10023EA7 |> |8D4424 08 |lea eax,dword ptr ss:[esp+8]
10023EAB |. |50 |push eax
10023EAC |. |56 |push esi
10023EAD |. |68 60E80610 |push ww.1006E860 ; ASCII "GjoeOfyuGjmfB"
10023EB2 |. |E8 09760200 |call <ww.Decode_GetApi>
10023EB7 |. |83C4 04 |add esp,4
10023EBA |. |FFD0 |call eax ; kernel32.FindNextFileA
10023EBC |. |85C0 |test eax,eax
10023EBE |.^\75 D5 \jnz short ww.10023E95
3.打开其中一个文件后,先看是否能够打开该文件,如果能打开该文件就先设置该 文件的属性为可读可写然后删除该文件,如果该文件不存在就向将dll中的需要检查是否存在的程序名以及程序信息cpoy到内存中去
10018A6B . 83C4 04 add esp,4
10018A6E . FFD0 call eax ; kernel32.DeleteFileA