11. 恶意代码行为
11.1 下载器和启动器
下载器从互联网下载恶意代码到本地执行,通常和漏洞利用打包使用。下载器常用Windows API函数URLDownloadtoFileA
和WinExec
,来下载并运行新的恶意代码。
启动器(加载器),可执行文件,安装立即运行或者之后执行的恶意代码,通常包含要加载的恶意代码。
11.2 后门
后门允许攻击者远程访问一个受害的机器。后门代码往往实现了全套功能,例如操作注册表,列举窗口,创建目录,搜索文件等等。
查看后门使用和导入的Windows函数,可以确定后门程序实现的功能。附录A有恶意代码常用函数列表。
11.2.1 反向shell
反向shell从被感染机器上发起连接,提供攻击者shell访问被感染机器的权限。攻击者能如同在本地上一样运行命令。
- Netcat反向shell
- Windows反向shell:使用
cmd.exe
作为反向shell- 基础方法:涉及
CreateProcess
函数的调用 - 多线程技术:涉及
CreateThread,CreatePipe
- 基础方法:涉及
11.2.2 远程控制工具
RAT被用来远程管理多台机器。RAT: Remote Adiminstration Tool, Remote Access Trojan
11.2.3 僵尸网络
被感染主机(僵尸网络)的集合,由单一实体控制,僵尸控制器。传播恶意代码或蠕虫,或者执行DDoS攻击。
11.2.4 远程控制工具与僵尸网络的比较
- 控住主机数量。僵尸网络以百万计,远程控制工具数量很少。
- 僵尸网络同时控制所有主机。远程控制工具以每个受害者为单位,攻击者与受害主机交互更紧密。
- RAT执行针对性攻击,僵尸网络进行大规模攻击。
11.3 登录凭证窃密器
窃取登录凭证
- 等待用户登录窃取登录凭证的程序
- 转储Windows中存放信息的程序,例如密码哈希值,程序直接使用或者离线破解。
- 击键记录程序
11.3.1 GINA拦截
Graphical Identification and Authentication
11.3.2 口令哈希转储
转储Windows口令哈希,以便离线暴力破解或者进行Pass-the-Hash攻击。
11.3.2 击键记录
- 基于内核的击键记录器
- 用户空间的击键记录器:
- 通过hook来实现,
SetWindowsHookEx
; - 通过轮询实现,
GetAsyncKeyState
识别一个按键是被按下还是弹起,GetForegroundWindows
识别当前窗口,告诉击键记录器只在进行输入的应用程序.
- 通过hook来实现,
11.4 存活机制
11.4.1 Windows注册表
- AppInit_DLL:恶意代码编写者通过一个名为AppInit_DLL特殊注册表项加载DLL。AppInit_DLL中的DLL程序在进程加载
User32.dll
时被加载。 - Winlogon Notify:hook一个特殊的Winlogon事件,如登录、注销、关机以及锁屏。
winlogon.exe
产生一个事件时,系统会检测Notify注册表键来查找处理事件的DLL程序。 - SvcHost DLL:所有的服务都存在于注册表中,如果一个服务的注册表键被移除,则这个服务不能启动。安装恶意代码作为
svchost.exe
的DLL来存活,混淆恶意代码和其他进程。
11.4.2 特洛伊木马化(Trojanized)系统二进制文件
特洛伊木马化系统二进制文件,被感染二进制文件下次运行或加载时,将会强制运行恶意代码。
11.4.3 DLL加载顺序劫持
不需要注册表项或者特洛伊二进制文件。
11.5 提权
提权攻击利用漏洞进行攻击。
11.5.1 使用SeDebugPrivilege
以用户权限运行的进程并没有任意访问系统一切资源的权限,例如远程进程调用TerminateProcess
和CreateRemoteThread
函数。恶意代码获得这些函数访问权限的唯一方法是设置访问令牌access token
权限来开启SeDebugPrivilege
.可以通过调整AdjustTokenPrivileges
来调整访问令牌。
11.6 隐藏它的踪迹— 用户态的Rootkit
恶意代码隐藏它的生存机制和正在运行的进程,是恶意代码的文件、进程、网络连接以及其他资源对其他程序隐藏。隐藏恶意代码行为的工具被称为Rootkit。内核层的Rootkit比用户层更容易修改操作系统内部的功能。
两种用户态的Rootkit技术:
11.6.1 IAT Hook
经典的Rootkit方法,隐藏本地系统的文件、进程以及网络连接。修改导入或者导出地址表。
11.6.2 Inline Hook
覆盖导入DLL中的API函数。IAT Hook简单修改函数指针,Inline Hook修改实际的函数代码。