防守更聪明,而不是更难

0x01 前言

CyberDefenders 是一个蓝队培训平台,专注于网络安全的防御方面,以学习、验证和提升网络防御技能。使用cyberdefenders的题目来学习恶意流量取证,题目来自真实环境下产生的流量,更有益于我们掌握取证的流程和相关工具的使用,学习攻击者的攻击思路以便于防御者给出更好的解决办法。

0x02 题目简介

题目链接

难度

中等

解压密码

cyberdefenders.org

案情介绍

1
2
3
4
A multinational corporation has been hit by a cyber attack that has led to the theft of sensitive data. The attack was carried out using a variant of the BlackEnergy v2 malware that has never been seen before.
一家跨国公司遭到网络攻击,导致敏感数据被盗。该攻击是使用以前从未见过的 BlackEnergy v2 恶意软件变体进行的。
The company's security team has acquired a memory dump of the infected machine, and they want you to analyze the dump to understand the attack scope and impact.
公司安全团队已获取受感染机器的内存转储,希望您分析转储以了解攻击范围和影响。

推荐工具

volatility2.X

前置知识

volatility语法

amcache - 打印 AmCache 信息

apihooks - 检测进程和内核内存中的 API 挂钩
atoms - 打印会话和窗口站原子表
atomscan - 原子表的池扫描器
auditpol - 从 HKLM\SECURITY\Policy\PolAdtEv 打印审计策略
bigpools - 使用 BigPagePoolScanner 转储大页面池
bioskbd - 从实模式内存中读取键盘缓冲区
cachedump - 从内存中转储缓存的域哈希
callbacks - 打印系统范围的通知例程
clipboard - 提取 windows 剪贴板的内容
cmdline - 显示进程命令行参数
cmdscan - 通过扫描 _COMMAND_HISTORY 来提取命令历史记录
connections - 打印打开的连接列表 [仅限 Windows XP 和 2003]
connscan - 用于 tcp 连接的池扫描器
consoles- 通过扫描 _CONSOLE_INFORMATION 来提取命令历史记录
crashinfo - 转储故障转储信息
deskscan - 用于 tagDESKTOP(桌面)的池扫描器
devicetree - 显示设备树
dlldump - 从进程地址空间转储 DLL
dlllist - 打印每个进程加载的 dll 列表
driverirp - 驱动程序 IRP 钩子检测
drivermodule - 将驱动程序对象关联到内核模块
driverscan - 驱动程序对象的池扫描器
dumpcerts - 转储 RSA 私有和公共 SSL 密钥
dumpfiles - 提取内存映射和缓存文件
dumpregistry - 将注册表文件转储到磁盘
editbox - 显示有关编辑控件的信息。(列表框实验性的。)
envars - 显示进程环境变量
eventhooks - 打印有关 Windows 事件挂钩的详细信息
evtlogs - 提取 Windows 事件日志(仅限 XP/2003)
filescan - 文件对象的池扫描器
gahti - 转储 USER 句柄类型信息
gditimers - 打印已安装的 GDI 计时器和回调
gdt - 显示全局描述符表
getservicesids - 获取注册表中的服务名称并返回计算的 SID
getsids - 打印拥有每个进程的 SID
handles - 打印每个进程的打开句柄列表/可以查看进程打开的文件 handles -t file
hashdump - 从内存中转储密码哈希 (LM/NTLM)
hibinfo - 转储休眠文件信息
hivedump - 打印出一个蜂巢
hivelist - 打印注册表配置单元列表。
hivescan - 注册表配置单元的池扫描器
hpakextract - 从 HPAK 文件中提取物理内存
hpakinfo - HPAK 文件的信息
idt - 显示中断描述符表
iehistory - 重建 Internet Explorer 缓存/历史记录
imagecopy - 将物理地址空间复制为原始 DD 映像
imageinfo - 识别图像的信息
impscan - 扫描对导入函数的调用
joblinks - 打印进程作业链接信息
kdbgscan - 搜索并转储潜在的 KDBG 值
kpcrscan - 搜索并转储潜在的 KPCR 值
ldrmodules - 检测未链接的 DLL
limeinfo - 转储 Lime 文件格式信息
linux_apihooks - 检查 userland apihooks
linux_arp - 打印 ARP 表
linux_aslr_shift - 自动检测 Linux ASLR 移位
linux_banner - 打印 Linux 横幅信息
linux_bash - 从 bash 进程内存中恢复 bash 历史
linux_bash_env - 恢复进程的动态环境变量
linux_bash_hash - 从 bash 进程内存中恢复 bash 哈希表
linux_check_afinfo - 验证网络协议的操作函数指针
linux_check_creds - 检查是否有任何进程正在共享凭证结构
linux_check_evt_arm - 检查异常向量表以查找系统调用表挂钩
linux_check_fop - 检查 rootkit 修改的文件操作结构
linux_check_idt - 检查 IDT 是否被更改
linux_check_inline_kernel - 检查内联内核挂钩
linux_check_modules - 将模块列表与 sysfs 信息进行比较(如果可用)
linux_check_syscall - 检查系统调用表是否被修改
linux_check_syscall_arm - 检查系统调用表是否被更改
linux_check_tty - 检查 tty 设备的挂钩
linux_cpuinfo - 打印有关每个活动处理器的信息
linux_dentry_cache - 从 dentry 缓存中收集文件
linux_dmesg - 收集 dmesg 缓冲区
linux_dump_map - 将选定的内存映射写入磁盘
linux_dynamic_env - 恢复进程的动态环境变量
linux_elfs - 在进程映射中查找 ELF 二进制文件
linux_enumerate_files - 列出文件系统缓存引用的文件
linux_find_file - 从内存中列出和恢复文件
linux_getcwd - 列出每个进程的当前工作目录
linux_hidden_modules - 雕刻内存以找到隐藏的内核模块
linux_ifconfig - 收集活动接口
linux_info_regs - 就像 GDB 中的“信息寄存器”。它打印出所有
linux_iomem - 提供类似于 /proc/iomem 的输出
linux_kernel_opened_files - 列出从内核中打开的文件
linux_keyboard_notifiers - 解析键盘通知程序调用链
linux_ldrmodules - 将 proc 映射的输出与 libdl 的库列表进行比较
linux_library_list - 列出加载到进程中的库
linux_librarydump - 将进程内存中的共享库转储到磁盘
linux_list_raw - 列出具有混杂套接字的应用程序
linux_lsmod - 收集加载的内核模块
linux_lsof - 列出文件描述符及其路径
linux_malfind - 寻找可疑的进程映射
linux_memmap - 转储 linux 任务的内存映射
linux_moddump - 提取加载的内核模块
linux_mount - 收集挂载的文件系统/设备
linux_mount_cache - 从 kmem_cache 收集挂载的文件系统/设备
linux_netfilter - 列出 Netfilter 挂钩
linux_netscan - 雕刻网络连接结构
linux_netstat - 列出打开的套接字
linux_pidhashtable - 通过 PID 哈希表枚举进程
linux_pkt_queues - 将每个进程的数据包队列写入磁盘
linux_plthook - 扫描 ELF 二进制文件的 PLT 以查找不需要的图像的挂钩
linux_proc_maps - 收集进程内存映射
linux_proc_maps_rb - 通过映射红黑树为 linux 收集进程映射
linux_procdump - 将进程的可执行映像转储到磁盘
linux_process_hollow - 检查进程中空的迹象
linux_psaux - 收集进程以及完整的命令行和启动时间
linux_psenv - 收集进程及其静态环境变量
linux_pslist - 通过遍历 task_struct->task 列表来收集活动任务
linux_pslist_cache - 从 kmem_cache 收集任务
linux_psscan - 扫描进程的物理内存
linux_pstree - 显示进程之间的父/子关系
linux_psxview - 使用各种进程列表查找隐藏进程
linux_recover_filesystem - 从内存中恢复整个缓存文件系统
linux_route_cache - 从内存中恢复路由缓存
linux_sk_buff_cache - 从 sk_buff kmem_cache 恢复数据包
linux_slabinfo - 模拟正在运行的机器上的 /proc/slabinfo
linux_strings - 将物理偏移量与虚拟地址匹配(可能需要一段时间,非常冗长)
linux_threads - 打印进程线程
linux_tmpfs - 从内存中恢复 tmpfs 文件系统
linux_truecrypt_passphrase - 恢复缓存的 Truecrypt 密码
linux_vma_cache - 从 vm_area_struct 缓存中收集 VMA
linux_volshell - 内存映像中的 Shell
linux_yarascan - Linux 内存映像中的 shell
lsadump - 从注册表中转储(解密的)LSA 机密
mac_adium - 列出 Adium 消息
mac_apihooks - 检查进程中的 API 挂钩
mac_apihooks_kernel - 检查系统调用和内核函数是否挂钩
mac_arp - 打印 arp 表
mac_bash - 从 bash 进程内存中恢复 bash 历史
mac_bash_env - 恢复 bash 的环境变量
mac_bash_hash - 从 bash 进程内存中恢复 bash 哈希表
mac_calendar - 从 Calendar.app 获取日历事件
mac_check_fop - 验证文件操作指针
mac_check_mig_table - 列出内核的 MIG 表中的所有内容
mac_check_syscall_shadow - 寻找影子系统调用表
mac_check_syscalls - 检查系统调用表条目是否被挂钩
mac_check_sysctl - 检查未知的 sysctl 处理程序
mac_check_trap_table - 检查是否挂钩了 mach 陷阱表条目
mac_compressed_swap - 打印 Mac OS X VM 压缩器统计信息并转储所有压缩页面
mac_contacts - 从 Contacts.app 获取联系人姓名
mac_dead_procs - 打印终止/取消分配的进程
mac_dead_sockets - 打印终止/取消分配的网络套接字
mac_dead_vnodes - 列出释放的 vnode 结构
mac_devfs - 列出文件缓存中的文件
mac_dmesg - 打印内核调试缓冲区
mac_dump_file - 转储指定文件
mac_dump_maps - 转储进程的内存范围,可选地包括压缩交换中的页面
mac_dyld_maps - 从 dyld 数据结构中获取进程的内存映射
mac_find_aslr_shift - 查找 10.8+ 图像的 ASLR 移位值
mac_get_profile - 自动检测 Mac 配置文件
mac_ifconfig - 列出所有设备的网络接口信息
mac_interest_handlers - 列出 IOKit 兴趣处理程序
mac_ip_filters - 报告任何挂钩的 IP 过滤器
mac_kernel_classes - 列出内核中加载的 C++ 类
mac_kevents - 显示进程的父/子关系
mac_keychaindump - 恢复可能的钥匙串密钥。使用chainbreaker打开相关keychain文件
mac_ldrmodules - 将 proc 映射的输出与 libdl 的库列表进行比较
mac_librarydump - 转储进程的可执行文件
mac_list_files - 列出文件缓存中的文件
mac_list_kauth_listeners - 列出 Kauth Scope 侦听器
mac_list_kauth_scopes - 列出 Kauth 范围及其状态
mac_list_raw - 列出具有混杂套接字的应用程序
mac_list_sessions - 枚举会话
mac_list_zones - 打印活动区域
mac_lsmod - 列出加载的内核模块
mac_lsmod_iokit - 列出通过 IOkit 加载的内核模块
mac_lsmod_kext_map - 列出加载的内核模块
mac_lsof - 列出每个进程打开的文件
mac_machine_info - 打印关于样本的机器信息
mac_malfind - 寻找可疑的进程映射
mac_memdump - 将可寻址内存页转储到文件
mac_moddump - 将指定的内核扩展写入磁盘
mac_mount - 打印挂载的设备信息
mac_netstat - 列出每个进程的活动网络连接
mac_network_conns - 列出来自内核网络结构的网络连接
mac_notesapp - 查找 Notes 消息的内容
mac_notifiers - 检测将挂钩添加到 I/O Kit 中的 Rootkit(例如 LogKext)
mac_orphan_threads - 列出未映射回已知模块/进程的线程
mac_pgrp_hash_table - 遍历进程组哈希表
mac_pid_hash_table - 遍历 pid 哈希表
mac_print_boot_cmdline - 打印内核引导参数
mac_proc_maps - 获取进程的内存映射
mac_procdump - 转储进程的可执行文件
mac_psaux - 在用户空间中打印带有参数的进程 (argv)
mac_psenv - 打印用户空间中的环境进程 (
envp)
mac_pslist - 列出正在运行的进程
mac_pstree - 显示进程的父/子关系
mac_psxview - 使用各种进程列表查找隐藏进程
mac_recover_filesystem - 恢复缓存的文件系统
mac_route - 打印路由表
mac_socket_filters - 报告套接字过滤器
mac_strings - 将物理偏移量与虚拟地址匹配(可能需要一段时间,非常冗长)
mac_tasks - 列出活动任务
mac_threads - 列出进程线程
mac_threads_simple - 列出线程及其开始时间和优先级
mac_timers - 报告由内核驱动程序设置的计时器
mac_trustedbsd - 列出恶意的 trustedbsd 策略
mac_version - 打印 Mac 版本
mac_vfsevents - 列出进程过滤文件系统事件
mac_volshell - 内存映像中的 Shell
mac_yarascan - 扫描内存以获取 yara 签名
machoinfo - 转储 Mach-O 文件格式信息
malfind - 查找隐藏和注入的代码
mbrparser - 扫描并解析潜在的主引导记录 (MBR)
memdump - 转储进程的可寻址内存
memmap - 打印内存映射
messagehooks - 列出桌面和线程窗口消息挂钩
mftparser - 扫描并解析潜在的 MFT 条目
moddump - 将内核驱动程序转储到可执行文件示例
modscan - 内核模块的池扫描器
modules - 加载模块的打印列表
multiscan - 一次扫描各种对象
mututscan - 互斥对象的池扫描器
netscan - 扫描 Vista(或更高版本)图像以查找连接和套接字
notepad - 列出当前显示的记事本文本
objtypescan - 扫描 Windows 对象类型对象
patcher - 根据页面扫描修补内存
poolpeek - 可配置的池扫描器插件
pooltracker - 显示池标签使用情况的摘要
printkey - 打印注册表项及其子项和值
privs - 显示进程权限
procdump - 将进程转储到可执行文件示例
pslist - 按照 EPROCESS 列表打印所有正在运行的进程
psscan - 进程对象的池扫描器
pstree - 将进程列表打印为树
psxview - 使用各种进程列表查找隐藏进程
qemuinfo - 转储 Qemu 信息
raw2dmp - 将物理内存样本转换为 windbg 崩溃转储
screenshot - 保存一个基于 GDI 窗口的伪截图
servicediff - 列出 Windows 服务(ala Plugx)
sessions - 列出 _MM_SESSION_SPACE 的详细信息(用户登录会话)
shellbags - 打印 ShellBags 信息
shimcache - 解析应用程序兼容性填充缓存注册表项
shutdowntime - 从注册表打印机器的关机时间
sockets - 打印打开的套接字列表
sockscan - 用于 tcp 套接字对象的池扫描器
ssdt - 显示 SSDT 条目
strings - 将物理偏移量与虚拟地址匹配(可能需要一段时间,非常冗长)
svcscan - 扫描 Windows 服务
symlinkscan - 符号链接对象的池扫描器
thrdscan - 线程对象的池扫描器
线程 - 调查 _ETHREAD 和 _KTHREADs
timeliner - 从内存中的各种工件创建时间线
timers - 打印内核定时器和相关模块 DPC
truecryptmaster - 恢复 TrueCrypt 7.1a 主密钥
truecryptpassphrase - TrueCrypt 缓存密码查找器
truecryptsummary - TrueCrypt 摘要
unloadedmodules - 打印卸载模块列表
userassist - 打印 userassist 注册表项和信息
userhandles - 转储用户句柄表
vaddump - 将 vad 部分转储到文件中
vadinfo - 转储 VAD 信息
vadtree - 遍历 VAD 树并以树格式显示
vadwalk - 遍历 VAD 树
vboxinfo - 转储 virtualbox 信息
verinfo - 打印出 PE 镜像的版本信息
vmwareinfo - 转储 VMware VMSS/VMSN 信息
volshell - 内存映像中的 Shell
win10cookie - 查找 Windows 10 的 ObHeaderCookie 值
windows - 打印桌面 Windows(详细信息)
wintree - 打印 Z-Order 桌面 Windows 树
wndscan - 窗口站的池扫描器
yarascan - 使用 Yara 签名扫描进程或内核内存

0x03 解题过程

0x03_1 Which volatility profile would be best for this machine?

解题

思路:使用volatility 2.6输入以下命令查看machine的信息

1
volatility -f  F:\取证\c79-BE\CYBERDEF-567078-20230213-171333.raw imageinfo

image-20230416184353964

答案

Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86)所以这个机器的profile 是WinXPSP2x86

0x03_2 How many processes were running when the image was acquired?

解题

思路:使用volatility 2.6输入以下命令查看进程的信息,并将结果输出1.txt文件中去

1
volatility -f  F:\取证\c79-BE\CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 pslist >1.txt

image-20230416184716772

image-20230416184746792

从上图可以看出有25个进程,但是题目要的是running 的进程,所以exit的6个进程进行减去,所以正在运行的进程数目为19个

答案

​ 正在运行的进程数目为19

0x03_3 What is the process ID of cmd.exe?

解题

思路FTK 检索/root/root/Downlods/路径下的文件发现仅有mimikatz_trunk.zip

解题

思路:在上题的1.txt文件里查看cmd进程ID,在文件中进程ID对应的是PIDimage-20230416185229201

答案

cmd.exe进程ID1960

0x03_4 What is the name of the most suspicious process?

解题

思路:同样是使用题目生成1.txt文件,发现不属于win系统的进程rootkit.exe

image-20230416185435627

下面是维基百科给出的关于rootkit.exe的信息

image-20230416185657352

答案

​ 最可疑的进程叫rootkit.exe

0x03_5 Which process shows the highest likelihood of code injection?

解题

malfind - 查找隐藏和注入的代码

思路:使用volatility 2.6输入以下命令查看代码注入的信息,将生成的信息输出到4.txt的文件里

1
volatility -f  F:\取证\c79-BE\CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86  malfind > 4.txt

image-20230416190552669

答案

​ 进程svchost.exe显示代码注入的可能性最高

0x03_6 There is an odd file referenced in the recent process. Provide the full path of that file.

解题

思路:使用volatility 2.6输入以下命令查看最近的进程引用的文件名。因为题目说的是在最近的进程中引用了一个奇怪的文件,所以这个进程肯定是上题中的那个进程,那个进程的pid是880,所以我们使用handles命令去查询进程:handles - 打印每个进程的打开句柄列表/可以查看进程打开的文件 handles -t file

1
volatility -f  F:\取证\c79-BE\CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86  -p 880 handles -t file

发现文件就3个文件

\Device\HarddiskVolume1\WINDOWS\system32\config\systemprofile\Local Settings\Temporary Internet Files\Content.IE5\index.dat
\Device\HarddiskVolume1\WINDOWS\system32\config\systemprofile\Cookies\index.dat

\Device\HarddiskVolume1\WINDOWS\system32\drivers\str.sys

我们应该知道前两个都是win系统中的,后一个不确定,所以我们使用谷歌进行检索发现这是个异常的文件

image-20230417101434172

答案

​ 该文件的完整路径:C:\WINDOWS\system32\drivers\str.sys

0x03_7 What is the name of the injected dll file loaded from the recent process?

解题

思路:使用volatility 2.6输入以下命令查看最近进程中加载的注入的dll文件的名称

因为注入的dll文件是为了对系统进行隐藏,所以使用命令ldrmodules - 检测未链接的 DLL

1
volatility -f  F:\取证\c79-BE\CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86  -p 880 ldrmodules

image-20230417102944737

我们应该查询的是 InLoad InInit这两个参数都是false的

所以发现 880 svchost.exe 0x009a0000 False False False \WINDOWS\system32\msxml3r.dll这个dll符合

答案

​ 最近进程中加载的注入的dll文件的名称是msxml3r.dll

0x03_8 What is the base address of the injected dll?

解题

思路:使用volatility 2.6输入以下命令注入dll的基址,因为在第五题我们已经知道进程svchost.exe显示代码注入的可能性最高,所以我们使用malfind指定参数-p 880(svchost的pid)

1
volatility -f  F:\取证\c79-BE\CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86  -p 880 malfind

image-20230417103644611

答案

​ 注入的 dll 的基址是0x980000