码迷,mamicode.com
首页 > 其他好文 > 详细

Hacking Team后门分析

时间:2015-08-27 18:19:16      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

前言

  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,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

找到有系统权限的程序后,打开该程序后获取到当前模块的完整路劲

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

技术分享

Hacking Team后门分析

标签:

原文地址:http://www.cnblogs.com/kangxiaopao/p/4764035.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!