使用Autoruns分析恶意软件持久化 是做什么的?
概述
Sysinternals Autoruns从Windows上数百个自动启动扩展点(ASEP)中提取数据,扫描18个以上类别,包括Run/RunOnce键值、服务、计划任务、驱动程序、Winlogon项、LSA提供程序、打印机监视器、WMI订阅和AppInit DLL。数字签名验证可筛除微软已签名的条目。对比功能通过基线差异检测新增加的持久化方式。VirusTotal集成可检查文件哈希信誉。通过-z标志支持离线分析,可用于取证磁盘镜像检查。
使用时机
- 调查需要使用Autoruns分析恶意软件持久化的安全事件时
- 为此领域构建检测规则或威胁狩猎查询时
- SOC分析师需要此类分析的结构化流程时
- 验证相关攻击技术安全监控覆盖范围时
前提条件
- Sysinternals Autoruns(GUI版)和Autorunsc(CLI版)
- 目标系统上的管理员权限
- Python 3.9+(用于自动化分析)
- VirusTotal API密钥(用于信誉检查)
- 清洁基线导出文件(用于比较)
工作流程
步骤1:自动化持久化扫描
#!/usr/bin/env python3
"""自动化基于Autoruns的持久化分析。"""
import subprocess
import csv
import json
import sys
def scan_and_analyze(autorunsc_path="autorunsc64.exe", csv_path="scan.csv"):
cmd = [autorunsc_path, "-a", "*", "-c", "-h", "-s", "-nobanner", "*"]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=600)
with open(csv_path, 'w') as f:
f.write(result.stdout)
return parse_and_flag(csv_path)
def parse_and_flag(csv_path):
suspicious = []
with open(csv_path, 'r', errors='replace') as f:
for row in csv.DictReader(f):
reasons = []
signer = row.get("Signer", "")
if not signer or signer == "(Not verified)":
reasons.append("未签名二进制文件")
if not row.get("Description") and not row.get("Company"):
reasons.append("缺少元数据")
path = row.get("Image Path", "").lower()
for sp in ["\temp\", "\appdata\local\temp", "\users\public\"]:
if sp in path:
reasons.append(f"可疑路径")
launch = row.get("Launch String", "").lower()
for kw in ["powershell", "cmd /c", "wscript", "mshta", "regsvr32"]:
if kw in launch:
reasons.append(f"LOLBin: {kw}")
if reasons:
row["reasons"] = reasons
suspicious.append(row)
return suspicious
if __name__ == "__main__":
if len(sys.argv) > 1:
results = parse_and_flag(sys.argv[1])
print(f"[!] 发现 {len(results)} 个可疑条目")
for r in results:
print(f" {r.get('Entry','')} - {r.get('Image Path','')}")
for reason in r.get('reasons', []):
print(f" - {reason}")
验证标准
- 所有ASEP类别均已扫描并编目
- 未签名条目已标记以供调查
- 可疑路径和LOLBin启动字符串已高亮显示
- 基线比较可识别新的持久化机制