前言
将近三周的时间开发,目标是针对小白都能上手的Windows应急工具,完全基于红队人员攻击思路以及蓝队应急流程开发的Windows应急响应工具,目前V2.0的版本基本上已经ok了没有问题,下面是工具介绍,目前网上基本上没有比这个更好用且更完善的工具,计划是在V3.0计划兼容Winserver2008以下版本,另外加入内存马查杀机制。因为初衷就是想轻量,如果工具过大就违背了这个工具的初衷。
工具授权
目前工具设置需要授权码,计划是三月一次授权。
系统支持
- Windows 10/11 ✅
- Windows Server 2012/2016/2019/2022 ✅
- Windows Server 2008 R2 ✅
- Windows Server 2008 非 R2 ⚠️ 仅支持 Get-EventLog,需升级 PowerShell
工具核心日志处理
// 后门用户迁移4732时间id日志提取
func FetchAndStoreBackdoorUsers(db *sql.DB, startTime, endTime string) error {
// 动态构建 PowerShell 命令,使用传入的开始和结束时间
psCmd := fmt.Sprintf(`[Console]::OutputEncoding = [System.Text.Encoding]::UTF8;
$startTime = '%s';
$endTime = '%s';
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4732; StartTime=$startTime; EndTime=$endTime} -MaxEvents 200 |
ForEach-Object {
$xml = [xml]$_.ToXml()
$subjectSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "SubjectUserSid" } | Select-Object -ExpandProperty '#text'
$memberSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "MemberSid" } | Select-Object -ExpandProperty '#text'
$groupSid = $xml.Event.EventData.Data | Where-Object { $_.Name -eq "TargetSid" } | Select-Object -ExpandProperty '#text'
function Get-NameFromSid($sid) {
try {
return (New-Object System.Security.Principal.SecurityIdentifier($sid)).Translate([System.Security.Principal.NTAccount]).Value
} catch {
return $sid
}
}
$subjectName = Get-NameFromSid $subjectSid
$memberName = Get-NameFromSid $memberSid
$groupName = Get-NameFromSid $groupSid
"$($_.TimeCreated)###$($_.Id)###$subjectName###$memberName###$groupName"
}`, startTime, endTime)
// 调用 runPowerShellCommand,它会返回一个包含输出行的切片和错误信息
lines, err := runPowerShellCommand(psCmd)
// --- 错误处理部分 ---
// 如果 PowerShell 命令执行失败
if err != nil {
// 检查错误信息是否包含“No events were found”
if strings.Contains(err.Error(), "No events were found") {
// 如果是这个特定错误,返回自定义的友好错误信息
return fmt.Errorf("无用户组迁移相关事件id4732")
}
// 如果是其他错误,则返回原始错误
return fmt.Errorf("执行PowerShell命令失败: %w", err)
}
// 如果没有错误,但返回的行切片是空的,也视为没有找到事件
if len(lines) == 0 {
return fmt.Errorf("无用户组迁移相关事件id4732")
}
// --- 错误处理部分结束 ---
tx, err := db.Begin()
if err != nil {
return err
}
defer func() {
if err != nil {
tx.Rollback()
}
}()
// 清理旧数据
_, err = tx.Exec(`DELETE FROM backdoor_users`)
if err != nil {
return err
}
stmt, err := tx.Prepare(`INSERT INTO backdoor_users (time_created, event_id, subject_name, member_name, group_name) VALUES (?, ?, ?, ?, ?)`)
if err != nil {
return err
}
defer stmt.Close()
for _, line := range lines {
if len(strings.TrimSpace(line)) == 0 {
continue
}
parts := strings.SplitN(line, "###", 5)
if len(parts) < 5 {
continue
}
_, err = stmt.Exec(parts[0], parseInt(parts[1]), parts[2], parts[3], parts[4])
if err != nil {
return fmt.Errorf("插入后门用户日志失败: %w", err)
}
}
return tx.Commit()
}
基本上所有的日志模块的处理都是基于powershell来实现的,所以在winserver 2008及以下的版本不安装工具是无法使用的
日志检索效率以及优势
因为该工具是日志文件数据提取保存,会从db文件中读取已经保存的部分数据,在检索速度上效果还是可以的,最大的优势是直接根据事件详情提取需要的字段,避免从Windows自带的检索功能中逐条查看,效率大大提高。
主机信息模块
- 获取主机信息和网卡信息
- 获取网络连接状态
- 网络外联IP定位,目前调用的是公网的ip.net的接口

日志分析模块
- 提取 Windows 应用日志(Application Log)
- 提取 Windows 安全日志(Security Log)
- 支持查看登录成功(4624)、登录失败(4625)、防火墙日志、用户组迁移、用户创建删除等事件
- 日志保存到 log.db(SQLite 数据库)
- UI 分页展示、点击查看完整内容
- 支持模糊查询快速定位IP和用户
- 根据数据库内容利用AI依据各个表的时间线进行安全分析(建议使用AI分析+人工确认)
- 一键快速分析功能,可以直接根据数据库生成事件摘要


目前版本为V2.0,因为在实战中1.0的出现部分bug,已经在2,0版本中修复了,防火墙日志图片仅供参考
任务调度


网站导航模块
- 云沙箱、IP反查、威胁情报、空间测绘、网站备案、常见编码解码
目前支持一键跳转,本来是计划做一个聚合类的导航栏,奈何go语言实现太麻烦,略微有点儿鸡肋性价比低就实现的跳转。
DeepseekChatAI模块
- 支持 Deepseek API 调用
- 上下文聊天、会话创建、清空、删除

在风险主机出网的条件下是支持使用ChatAI模块的,直接在Deepseek购买api量即可,总的来说完全够用。

IP情报查询模块
- 调用 VirtualTools API 查询IP
- 请求率: 每分钟4次,每日500次,每月15.5K次
- 红色标记已打标签IP

目前代码位置固定仅支持每分钟查询4个ip。
截图模块
- 点击“截图”按钮即可截取全屏
- 自动保存到当前目录下的 Screenshots 文件夹
- 支持多显示器同时截图
- 弹窗提示保存的截图数量和保存路径

使用方法
- 启动工具后选择日志类型
- 点击按钮执行提取,日志保存到本地数据库
- 分页浏览日志,点击查看详情
- 可通过筛选或时间选择缩小范围
注意事项
- 必须以管理员权限运行
- 默认拉取最近7天日志,可自定义
- 首次运行会自动创建 log.db,config.json
工具使用效果
目前在本机三层靶场测试效果还可以,基本上受控主机上测试效果还是可以的,基本上可以覆盖溯源攻击路径,不过该工具还是基于windows日志来实现的,前提是日志审核策略需要开启,目前基本上一般业务系统有做过等保和加固的常见的日志审核策略是满足需求的。并且AI的一键分析是基本上能够满足定位分析攻击路径的。