恶意软件分析
Reading time: 11 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
取证备忘单
https://www.jaiminton.com/cheatsheet/DFIR/#
在线服务
离线杀毒和检测工具
Yara
安装
sudo apt-get install -y yara
准备规则
使用此脚本从github下载并合并所有yara恶意软件规则: https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9
创建_rules目录并执行它。这将创建一个名为malware_rules.yar_的文件,其中包含所有恶意软件的yara规则。
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
mkdir rules
python malware_yara_rules.py
扫描
yara -w malware_rules.yar image #Scan 1 file
yara -w malware_rules.yar folder #Scan the whole folder
YaraGen: 检查恶意软件并创建规则
您可以使用工具 YaraGen 从二进制文件生成 yara 规则。查看这些教程: 第 1 部分, 第 2 部分, 第 3 部分
python3 yarGen.py --update
python3.exe yarGen.py --excludegood -m ../../mals/
ClamAV
安装
sudo apt-get install -y clamav
扫描
sudo freshclam #Update rules
clamscan filepath #Scan 1 file
clamscan folderpath #Scan the whole folder
Capa
Capa 检测可执行文件中的潜在恶意 能力:PE、ELF、.NET。因此,它会找到诸如 Att&ck 策略或可疑能力,例如:
- 检查 OutputDebugString 错误
- 作为服务运行
- 创建进程
在 Github repo 中获取它。
IOCs
IOC 代表妥协指标。IOC 是一组 条件,用于识别 一些潜在的不需要的软件或确认的 恶意软件。蓝队使用这种定义来 搜索这种恶意文件 在他们的 系统 和 网络 中。
共享这些定义非常有用,因为当恶意软件在计算机中被识别并为该恶意软件创建 IOC 时,其他蓝队可以使用它更快地识别恶意软件。
创建或修改 IOCs 的工具是 IOC Editor.
您可以使用 Redline 等工具来 搜索设备中的定义 IOC。
Loki
Loki 是一个简单妥协指标的扫描器。
检测基于四种检测方法:
1. File Name IOC
Regex match on full file path/name
2. Yara Rule Check
Yara signature matches on file data and process memory
3. Hash Check
Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files
4. C2 Back Connect Check
Compares process connection endpoints with C2 IOCs (new since version v.10)
Linux Malware Detect
Linux Malware Detect (LMD) 是一个针对Linux的恶意软件扫描器,发布于GNU GPLv2许可证,旨在应对共享托管环境中面临的威胁。它使用来自网络边缘入侵检测系统的威胁数据,提取正在攻击中积极使用的恶意软件,并生成检测签名。此外,威胁数据还来自用户提交的LMD结账功能和恶意软件社区资源。
rkhunter
像rkhunter这样的工具可以用来检查文件系统中可能存在的rootkits和恶意软件。
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
FLOSS
FLOSS 是一个工具,尝试使用不同的技术在可执行文件中查找混淆字符串。
PEpper
PEpper 检查可执行文件中的一些基本内容(如二进制数据、熵、URLs 和 IPs,以及一些 yara 规则)。
PEstudio
PEstudio 是一个工具,可以获取 Windows 可执行文件的信息,如导入、导出、头部信息,同时还会检查病毒总数并找到潜在的 Att&ck 技术。
Detect It Easy(DiE)
DiE 是一个工具,用于检测文件是否 加密,并找到 打包器。
NeoPI
NeoPI 是一个 Python 脚本,使用多种 统计方法 来检测文本/脚本文件中的 混淆 和 加密 内容。NeoPI 的预期目的是帮助 检测隐藏的 web shell 代码。
php-malware-finder
PHP-malware-finder 尽力检测 混淆/可疑代码 以及使用 PHP 函数的文件,这些函数通常用于 恶意软件/webshells。
Apple Binary Signatures
在检查某些 恶意软件样本 时,您应该始终 检查二进制文件的签名,因为签名的 开发者 可能已经与 恶意软件 相关。
#Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
#Check if the app’s contents have been modified
codesign --verify --verbose /Applications/Safari.app
#Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app
检测技术
文件堆叠
如果你知道某个包含文件的文件夹最后更新于某个日期。检查所有文件在web 服务器中的创建和修改日期,如果有任何日期是可疑的,请检查该文件。
基线
如果一个文件夹的文件不应该被修改,你可以计算该文件夹原始文件的哈希并与当前文件进行比较。任何被修改的文件都将是可疑的。
统计分析
当信息保存在日志中时,你可以检查统计数据,比如每个web服务器的文件被访问的次数,因为web shell可能是其中之一。
反混淆动态控制流 (JMP/CALL RAX 调度器)
现代恶意软件家族严重滥用控制流图 (CFG) 混淆:它们不是直接跳转/调用,而是在运行时计算目标并执行jmp rax
或call rax
。一个小型调度器(通常九条指令)根据CPU的ZF
/CF
标志设置最终目标,完全破坏静态CFG恢复。
该技术 - 由SLOW#TEMPEST加载器展示 - 可以通过一个仅依赖于IDAPython和Unicorn CPU模拟器的三步工作流程来击败。
1. 定位每个间接跳转/调用
import idautils, idc
for ea in idautils.FunctionItems(idc.here()):
mnem = idc.print_insn_mnem(ea)
if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax":
print(f"[+] Dispatcher found @ {ea:X}")
2. 提取调度程序字节码
import idc
def get_dispatcher_start(jmp_ea, count=9):
s = jmp_ea
for _ in range(count):
s = idc.prev_head(s, 0)
return s
start = get_dispatcher_start(jmp_ea)
size = jmp_ea + idc.get_item_size(jmp_ea) - start
code = idc.get_bytes(start, size)
open(f"{start:X}.bin", "wb").write(code)
3. 使用Unicorn模拟两次
from unicorn import *
from unicorn.x86_const import *
import struct
def run(code, zf=0, cf=0):
BASE = 0x1000
mu = Uc(UC_ARCH_X86, UC_MODE_64)
mu.mem_map(BASE, 0x1000)
mu.mem_write(BASE, code)
mu.reg_write(UC_X86_REG_RFLAGS, (zf << 6) | cf)
mu.reg_write(UC_X86_REG_RAX, 0)
mu.emu_start(BASE, BASE+len(code))
return mu.reg_read(UC_X86_REG_RAX)
运行 run(code,0,0)
和 run(code,1,1)
以获取 false 和 true 分支目标。
4. 修补直接跳转 / 调用
import struct, ida_bytes
def patch_direct(ea, target, is_call=False):
op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32
disp = target - (ea + 5) & 0xFFFFFFFF
ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('<I', disp))
在打补丁后,强制 IDA 重新分析该函数,以恢复完整的 CFG 和 Hex-Rays 输出:
import ida_auto, idaapi
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
5. 标记间接 API 调用
一旦每个 call rax
的真实目标被确定,你可以告诉 IDA 它是什么,以便参数类型和变量名称能够自动恢复:
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
实际好处
- 恢复真实的CFG → 反编译从10行变为数千行。
- 使字符串交叉引用和xrefs成为可能,行为重建变得简单。
- 脚本可重用:将它们放入任何受相同技巧保护的加载器中。
参考文献
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。