恶意代码分析实战 恶意代码行为 Lab11-1 11-2 11-3
恶意代码分析实战Lab11-恶意代码行为
从本章开始,会见识各种恶意行为
笔记
下载器和启动器
下载器用来将恶意代码下载下来进行执行;启动器用来秘密加载恶意代码
后门(Backdoor)
后门程序往往实现了全套功能,不需要额外下载功能代码,有一套通用功能:注册表操作、文件操作等
反向Shell:从目标机器上发起连接来接受控制,可以作为单独的代码,也可以作为组件的一部分存在
RAT:控制管理主机,通常是为了特定目标进行控制
botnet:大范围控制主机,用来进行大规模攻击
登录凭证窃密器
转储Windows口令Hash,用来进行离线破解,或Pass-The-Hash攻击
- pwdump:从SAM输出本地账户LM和NTLM口令,通过注入DLL到Lsass进程进行获取,pwdump变种经常会动态获取函数,经常会见到GetProcAddress函数
- PTH:也是通过DLL注入进行获取
识别转出技术很重要,但确定恶意代码对哈希做了什么操作更重要,是存在硬盘了还是上传网上了,还是PTH攻击用了
按键记录
内核态常用键盘渠道来进行检测
用户态常用API进行Hook来实现,可能会见到这几个函数:SetWindowsHookEx(设置Hook)、GetAsyncKeyState(判断按键状态)、GetForgeroundWindow(判断当前窗口)
通过字符串列表来识别按键记录器很有用(Up、Num Lock、Down、Right、Left、PageDown等。。)
存活机制
注册表有很多地方能实现存活,Run、AppInit_DLL、Winlogon、SvcHost DLL等,一般通过procmon等工具去检测访问的注册表、通过sysinternals等工具找出自启动项
特洛伊木马化系统二进制文件,修改系统二进制文件,使其运行时加载恶意代码
DLL劫持也行
提权
通过访问令牌来提权,据说这种方式在最新的windows上没用了,不知道是不是真的
用户态Rootkit
用来隐藏恶意代码行为的工具称为rootkit,用户态常用的有IAT Hook(过时、容易检测),InlineHook技术
作业
Lab 11-1:
分析目标:Lab11-01.exe
无壳
查导入表发现:设置注册表键值的函数,资源释放的函数,存在资源文件,4D5A开头是个二进制文件
查看字符串:发现了好多Wlx开头没见过的函数,以及其他一些可疑信息:
看下msginal.dll,MSGINA就是系统启动后显示出来的用户名密码窗体,长时间不操作系统桌面进入锁定状态时的窗体,以及2000系统按下CTRL+ALT+DEL后显示出来的窗体。 MSGINA导出了大量的函数,这些是与Winlogon交互必须的。
当然了,一开始应该直接看下全局的东西,不能太陷入细节,先来下反汇编:
从这个看,关键的东西在2个 sub里面,
其中一个在加载资源,另外一个在修改注册表。注册表看下subkey,
是winlogon,可以看到是在做持久化,登录的时候就运行。
加载资源的,大概率是在将资源当成二进制exe使用。导出下再反编译看看:
所有的gina函数都是在调用sub10001000,估计是在劫持hook。
好了有一个大致印象了。我们继续往下:
-
这个恶意代码向磁盘释放了什么?
运行火绒剑监控系统信息:
该恶意代码向进程所在目录释放了msgina32.dll文件,还修改了注册表,设置了GinaDLL的值,是个二进制数据,没有观测到网络行为
-
这个恶意代码如何进行驻留?
WindowsXP通过注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL
来设置需要WinLogon加载的第三方DLL,恶意代码将释放出来的msgina32.dll设置到了这个注册表里 -
这个恶意代码如何窃取用户登录凭证?
静态分析看见exe文件仅仅是做了资源释放和注册表设置两件事,其他功能应该是在资源文件里实现的,分析资源文件,无壳,字符串里是Wlx那堆函数,导入表没啥特别的,有注册表操作相关API,
看到一堆Wlx开头函数,以及GinaDLL字符串,这里应该是用了GINA拦截的操作(有点像DLL劫持操作)
根据查资料:WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下)。微软同时也为我们提供了接口,我们可以自己编写GINA DLL来代替MSGINA.DLL。
参考资料:Windows开机登录认证与Gina DLL - 一心一意 - 博客园 (cnblogs.com)
查资料得知:GINA DLLs are ignored in Windows Vista,看来这是个XP特有的
静态分析:
这里把系统原本的msgina.dll给加载了,然后把句柄存到全局变量里,然后dllmain就结束了,因为是DLL劫持,所以功能不是全部都在dllmain中实现的,观察旁边的函数列表:
基本上全部都是调用sub_10001000函数,这应该是个函数转发,查看:
确实是这样,这里是从原本的dll中获取函数地址,然后返回函数地址,然后再返回出来之后直接jmp过去
密码验证相关的函数是:
WlxLoggedOutSAS(这个命名也是醉了!)
,把函数挨个点一遍也会发现,就这个函数里面的内容不一样: - 查了下
WlxLoggedOutSAS
如下,可以通过他找到用户登录的账户名和密码。 -
前面先是正常调用了函数,然后把参数里的关键信息入栈调用了sub_10001570函数:
这个函数主要就是打开文件
msutil32.sys
然后把数据写进去了 ==》我自己反编译看下: -
-
这个恶意代码对窃取的证书做了什么处理?
把信息记录在了
msutil32.sys
中 -
如何在你的测试环境让这个恶意代码获得用户凭证?
要重启系统才能触发:
Lab 11-2:
整体功能:利用ws_sock里的send挂钩,做了用户态的rootkit,实现在使用outlook发送电子邮件的时候,可以抄送给恶意的电子邮箱。该邮箱地址还加密放在ini文件里了。
目标文件:Lab11-02.dll,Lab11-02.ini
PE查看:导入表导入了遍历模块列表的函数,注册表操作的函数
字符串查看:有好多exe结尾的名称,还有注册表地址,和spoolvxx32.dll和Lab11-02.ini
-
这个恶意DLL导出了什么?
导出了
installer
函数 可以使用dependency walker查看:
仅一个 -
使用rundll32.exe安装这个恶意代码后,发生了什么?==》使用process monitor监控恶意程序的运行,并设置过滤器:
监控
因为本次实验是一个dll程序,dll程序是无法直接监控的,所以监控宿主程序。
使用命令行运行:
运行
其中installer是之前我们利用dw发现的导出函数。回车之后就代表恶意程序安装成功了。
其安装之后会向系统中拷贝一个文件:拷贝文件名在系统system32目录下创建了文件spoolvxx32.dll,在注册表AppInit_DLLs里添加了这个dll
-
为了使这个恶意代码正确安装,ini文件需要放置在哪里?
分析DLLmain函数:首先获取当前路径到一个全局变量,然后打开system32目录下的ini文件,如果打开失败,则后面就不执行了
==》上面都是猜想,最正宗的方法就是使用ollydbg运行,设置断点看下,直接将dll文件拖到ollydbg里!
-
这个安装的恶意代码如何驻留?
-
AppInit_DLLs is a mechanism that allows an arbitrary list of DLLs to be loaded into each user mode process on the system. Microsoft is modifying the AppInit DLLs facility in Windows 7 and Windows Server 2008 R2 to add a new code-signing requirement. This will help improve the system reliability and performance, as well as improve visibility into the origin of software.
简单的说就是:AppInit_DLLs用来全局注入dll模块,凡是导入了user32.dll的程序都会 主动加载这个键值下的模块。
-
驻留是通过AppInit_DLLs注册表进行的,installer函数会把自己复制到system32目录下,以及给注册表AppInit_DLLs添加项:
-
这个恶意代码采用的用户态Rootkit技术是什么?
采用了InlineHook,dllmain函数后面读取ini信息,然后进行解密操作,解密完成之后保存在全局变量里,接下来调用了函数进行Hook:
sub_100014B6函数首先获取当前进程名:
紧接着将进程名变大写,进行判断,是不是如下三个进程:==》因为outlook肯定会调用user32.dll!所以就达到了挂钩劫持的目的!如下:
如果是的话,就执行接下来的操作:设置Hook,Hook wsock32.dll的send函数
-
Hook代码做了什么?
Hook代码Hook了send函数,将要发送的字符串里如果有
RCPT TO:
就添加:RCPT TO: <billy@malwareanalysisbook.com>\r\n
,然后再调用send函数,应该是邮件劫持 -
哪个进程执行这个恶意攻击,为啥?
劫持邮件,针对邮件程序进行攻击,针对:THEBAT.exe、OUTLOOK.exe、MSIMN.exe进程进行攻击
-
ini文件的意义是什么?
是加密后的邮箱地址,ollydbg设置断点,然后看调用函数返回eax寄存器的值即可知道,解密后如下图所示:
补充下这个用户态的钩子,是针对send进行挂钩。没有看到windows 挂钩子的api,如下,网上说是SetWindowsHookEx,但是这里面没有啊。。。
==》还是需要再看看本质,,,等去公司问问。
Lab 11-3:
整体功能:修改系统的cisvc
.exe,将恶意的shellcode键盘记录放进去,使得服务在调用该exe的时候会先执行自己的shellcode。
分析目标:LAb11-03.exe、Lab11-03.dll
-
使用基础的静态分析过程,你发现什么有趣线索?
exe:导入表没啥东西,字符串有奇怪的东西:
dll:导入表导入了按键记录三件套:
导出了一个函数:zzz69806582,
字符串特别的有:
-
当运行这个恶意代码,发生了什么?
看起来是把自己的dll复制到了system32目录下,改名为inet_epar32.dll,修改了cisvc程序,然后通过cmd执行了命令:
cmd.exe /c net start cisvc
启动了一个服务 -
exe如何安装dll使其长期驻留?
通过修改服务文件cisvc.exe实现驻留,除了去读反汇编分析改了哪些内容,还可以通过对比二进制文件来了解:
OEP被修改了,然后下面删掉了大堆0,又添加了一堆数据:
这里有两个字符串,分别是dll路径和它的导出函数,大概率这里是加载这个导出函数来运行,拖入OD便运行便配合IDA进行分析,功能和推断一致:
-
这个恶意代码感染Windows系统哪个文件?
cisvc.exe文件
-
dll做了什么?
创建了一个线程:
线程函数首先判断互斥量:
然后接下来创建了一个文件,进入了一个函数,这个函数的功能就是按键记录器
-
这个恶意代码将收集到的信息存到了哪里?
都存到了
C:\Windows\System32\kernel64x.dll
,随便按几下查看该文件,emmm,挺看不懂的:
至于如何植入shellcode的,下面这个文章分析得比较细致!使用的是内存映射文件来修改。shellcode就是加载Lab11-03.dll的导出函数zzz69806582,从而实现键盘记录!使用ollydbg动态调试即可发现:
Lab 11-3
分析恶意代码Lab11-03.exe和Lab11-03.dll。确保这两个文件在分析时位于同一个目录中。
问题
1. 使用基础的静态分析过程,你可以发现什么有趣的线索?
我们先来看exe的导入表有些啥:
放到IDA里面再看看,在这里我们能够看到C : \WINDOwS\1System32\ linet_epar32.dll还有Lab11-03.dll这俩dll,cisvc.exe这个exe程序以及net start cisvc这条命令。
dll接下来再看,我们先了解一下cisvc.exe是个啥东西:
似乎不是什么不好的东西,而net start cisvc则是启动这个服务的命令,于是我们转移目标,看Lab11-03.dll:
我们能发现,这里的GetForegroundWindow;GetiindowTextA;GetAsyncKeyState三个导入函数。初步推断是要做键盘记录。再看看导出函数。
这个导出函数暂时也不知道是干什么的。我们再到IDA里面看看,这里好像创建了个kernel64x.dll的文件,其他还有创建文件,创建互斥体,创建线程什么的,我们就先不管。
Lab11-03.exe包含字符串inet_epar32.dll和 net start cisvc,这意味着它可能启动CiSvc索引服务。包含字符串C:\WINDOWS\System32\kernel64x.dll的Lab11-03.dl导入了API函数GetAsyncKeyState和 GetForegroundwindow,这让我们怀疑它是一个记录到文件kernel64x.dll的击键记录器。
2. 当运行这个恶意代码时,发生了什么?
我们用procmon来监测一下,过滤一下:
我们看到以下这些行为
可以看到,这里会创建inet_epar32.dll,还有Lab11-03.dll的一堆操作。我们打开创建的inet_epar32.dll看看)。进行MD5比对能够发现,inet_epar32.dll和Lab11-03.dll是相同的文件,所以我们可以知道恶意代码复制了lab11-03.dll到windows系统目录。
监控到的还有cisvc.exe的创建,不过并没有其他的相关操作。
恶意代码首先复制Lab11-03.dll到Windows系统目录的inet_ epar32.dll中, 并有针对cisvc.exe的操作
3. Lab11-03.exe 如何安装Lab11-03.dll使其长期驻留?
我们用IDA调试一下Lab11-03.exe
在main函数中一开始是复制lab11-03.dll到system32系统目录中的inet_epar32.dll。之后创建一个字符c:\windows\system32\cisvc.exe,将其作为参数传递给了sub_401070.之后是使用系统运行命令net start cisvc,来启动索引服务。
接下来我们看看他的子函数
从上图可知调用了createfile(创建文件),createfilemappingA(创建一个文件映射内核对象)和MapViewOfFile(将一个文件映射对象映射到当前应用程序的地址空间),将cisvc.exe映射到内存中。这些函数都有访问这个文件的权限。
MapViewOfFile返回的内存映射视图的基地址(lpBaseAddrress)可以被读写
我们接着往下看
可以看到调用了UnmapViewOfFile(停止当前程序的一个内存映射),这样对这个文件做的任何修改都会被写入到硬盘。
同时我们顺着绿色那条线看下来(上三图的下面那张),查看在调用该函数sub_401070之前的操作。
能够发现其实是进行了写入操作。一开始文件的映射位置移入到EDI,用Var_28调整一些偏移量。rep movsd循环,用ecx(4E)计数来写入该数量的DWORD。之后byte_409030被移入ESI,复制byte_409030的数据到映射文件中。
接下来F5跟进一下
跟一下dword_409030
这里一大段不知道是个啥东西,来c一下看看
可以看到这里出现了一个跳转jmp loc_409134,跟过去看看
发现这里出现了被感染的dll和这个exe的导出函数。所以我们可以猜测,shellcode加载了这个dll,并调用了它的导出函数。
接下来IDA分析一下感染后的文件
这里call了sub_1001AD5,我们跟过去看看
这里call的这些个函数不知道是个啥,所以我们上OD里面调试一下
在01001B0A用这个函数的位置下断点,运行
提示出用的是loadlibrary函数,在数据窗口看一下这个位置
可以知道其作用是将inet_epar32.dll载入内存
同理接着看下一个函数,00101B1B处下断点,看到此时是调用GetProcAddress,其作用是获取导出函数的地址(在右下角可以看到导出函数)返回值在eax,接下来将eax赋给ebp-8,之后是call ebp-8,那么也就是说下一个call就是在调用这个导出函数。
接着往下单步
通过一个jmp后到达原始程序的入口点。
所以,恶意代码通过入口点重定向从而使它永久性地安装Lab11-03.dll。它通过重定向入口点,来运行加载这个DLL的shellcode
接下来使用ida分析本次的dll文件
4. 这个恶意代码感染Windows系统的哪个文件?
为加载inet epar32.dll,恶意代码感染了cisvc.exe,然后调用了inet_epar32.dll的导出函数zzz69806582。
5. Lab11-03.dll做了什么?
来看他的导出函数
这里有个创建线程,其中有个startaddress参数,跟过去看看
这里创建了个“MZ”互斥量(因为前面OpenMutexA那个地方没有互斥量,所以跟着绿线运行下来)
接着往下看
创建了个文件"C:\WINDOWS \System32\kernel64x.dll"
SetFilePointer:在一个文件中设置新的读取位置,dwMoveMethod值为2(开始点为文件的结尾位置)
然后call了个sub_10001380,看看是什么
call了个sub_10001030,看看
这又call了个sub_10001000,过去看看
这里看到了一开始静态分析的时候看到的GetForegroundWindow,GetiindowTextA,用来判断当前哪个程序正在输入和获取当前的标题。
再看回sub_10001030,能发现下面用到了GetAsyncKeyState判断一个按键是被按下还是弹起。
Lab11-03.dll 是一个轮询的记录器,这在它的导出函数zzz69806582中得到实现
6. 这个恶意代码将收集的数据存放在何处?
恶意代码存储击键记录和窗体输入记录,其中击键记录被存入到C:\Windows\System32\kernel64x.dll。