税务软件里藏了个木马,我花了一整天把它揪出来(附完整排查脚本)
一、症状:每次开机都"复活"的文件
路径:C:\Users\Tina\AppData\Local\Temp\hx.exe大小:98,304 字节

二、第一回合:云沙箱分析






三、第二回合:开启审计日志,踩了两个大坑
auditpol /set /subcategory:”File System” /success:enable /failure:enable
设置审计策略时出错 - 参数不正确。错误代码: 0x00000057
文件系统审计 GUID(与语言无关)$guidFileSystem = ”{0CCE921D-69AE-11D9-BED3-505054503030}”# 进程创建审计 GUID$guidProcessCreation = ”{0CCE922B-69AE-11D9-BED3-505054503030}” # 用 GUID 启用审计策略auditpol /set /subcategory:$guidFileSystem /success:enable /failure:enableauditpol /set /subcategory:$guidProcessCreation /success:enable /failure:enable # 验证auditpol /get /subcategory:$guidFileSystemauditpol /get /subcategory:$guidProcessCreationdetect_hx_v2.ps1 - 中文 Windows 审计配置# 必须用 GUID,不能用英文名$guidFileSystem = ”{0CCE921D-69AE-11D9-BED3-505054503030}”$guidProcessCreation = ”{0CCE922B-69AE-11D9-BED3-505054503030}” # 启用审计策略$r1 = auditpol /set /subcategory:$guidFileSystem /success:enable /failure:enable 2>&1Write-Host ”文件系统审计: $r1”$r2 = auditpol /set /subcategory:$guidProcessCreation /success:enable /failure:enable 2>&1Write-Host ”进程创建审计: $r2” # 验证auditpol /get /subcategory:$guidFileSystem 2>&1 | ForEach-Object { Write-Host ” $” }auditpol /get /subcategory:$guidProcessCreation 2>&1 | ForEach-Object { Write-Host ” $” } # 尝试设置 SACL(文件系统审计需要)$tempDir = ”C:\Users\Tina\AppData\Local\Temp”$acl = Get-Acl $tempDir -Audit$auditRule = New-Object System.Security.AccessControl.FileSystemAuditRule( ”Everyone”, ”Write”, ”ContainerInherit, ObjectInherit”, ”None”, ”Success”)$acl.AddAuditRule($auditRule)Set-Acl $tempDir -AclObject $acl # 验证 SACL$verifyAcl = Get-Acl $tempDir -AuditWrite-Host ”SACL 条目数: $($verifyAcl.AuditRules.Count)”fix_sacl.ps1 - 三种方法设置 SACL $tempDir = ”C:\Users\Tina\AppData\Local\Temp” # 方法1:用 SID 代替用户名(S-1-1-0 = Everyone)Write-Host ”[1/3] 用 SID S-1-1-0 设置 SACL...”$everyoneSid = New-Object System.Security.Principal.SecurityIdentifier(”S-1-1-0”)$auditRule = New-Object System.Security.AccessControl.FileSystemAuditRule( $everyoneSid, ”Write”, ”ContainerInherit, ObjectInherit”, ”None”, ”Success”)$acl = Get-Acl $tempDir -Audit$acl.AddAuditRule($auditRule)Set-Acl $tempDir -AclObject $acl$verifyAcl = Get-Acl $tempDir -AuditWrite-Host ” AuditRules 条目数: $($verifyAcl.AuditRules.Count)”# 结果:0。失败了。 # 方法2:用 icacls 命令行工具Write-Host ”[2/3] 用 icacls 设置...”$result = & cmd /c ”icacls ”<span class="code-snippet__variable">$tempDir</span>” /audit Everyone:(W) /T /C” 2>&1Write-Host ” icacls 输出: $result”# 结果:icacls 不支持 /audit 参数(”无效参数”)。失败了。 # 方法3:用 auditpol /resourceSACLWrite-Host ”[3/3] 用 auditpol /resourceSACL...”$resourceSacl = auditpol /resourceSACL /get 2>&1$resourceSacl | ForEach-Object { Write-Host ” $_” }# 结果:参数错误。也失败了。
四、第三回合:文本解析又翻车
search_hx_v3.ps1 - 解析 Event 4688 $today = (Get-Date).Date$events4688 = Get-WinEvent -FilterHashtable @{ LogName=”Security”; Id=4688; StartTime=$today} -MaxEvents 1000 -ErrorAction SilentlyContinue | Sort-Object TimeCreated foreach ($evt in $events4688) { $msg = $evt.Message $newProcName = ”” $creatorProcName = ”” $cmdLine = ”” # 先尝试中文字段名 if ($msg -match ”新进程名称:\s+(.+)”) { $newProcName = $Matches[1].Trim() } if ($msg -match ”创建者进程名称:\s+(.+)”) { $creatorProcName = $Matches[1].Trim() } if ($msg -match ”进程命令行:\s+(.+)”) { $cmdLine = $Matches[1].Trim() } # 英文回退 if (-not $newProcName -and $msg -match ”New Process Name:\s+(.+)”) { $newProcName = $Matches[1].Trim() } if (-not $creatorProcName -and $msg -match ”Creator Process Name:\s+(.+)”) { $creatorProcName = $Matches[1].Trim() } $time = $evt.TimeCreated.ToString(”HH:mm:ss”) $name = Split-Path $newProcName -Leaf -ErrorAction SilentlyContinue $creator = Split-Path $creatorProcName -Leaf -ErrorAction SilentlyContinue Write-Host ” $time | $name <- $creator”}导出原始 Event 4688 消息$events = Get-WinEvent -FilterHashtable @{ LogName=”Security”; Id=4688} -MaxEvents 3 -ErrorAction SilentlyContinue foreach ($evt in $events) { Write-Host ”=== $($evt.TimeCreated) ===” Write-Host $evt.Message Write-Host ””}
五、终局之战:结构化数据一击必杀
导出 Event 4688 的 Properties 集合$today = (Get-Date).Date$events = Get-WinEvent -FilterHashtable @{ LogName=”Security”; Id=4688; StartTime=$today} -MaxEvents 5 -ErrorAction SilentlyContinue | Sort-Object TimeCreated foreach ($evt in $events) { Write-Host ”--- Event at $($evt.TimeCreated.ToString('HH:mm:ss')) ---” Write-Host ”Properties count: $($evt.Properties.Count)” for ($j = 0; $j -lt $evt.Properties.Count; $j++) { $val = $evt.Properties[$j].Value if ($val -is [byte[]]) { $val = [System.BitConverter]::ToString($val).Replace(”-”,” ”) } Write-Host ” [$j] = $val” } Write-Host ””}--- Event at 18:51:38 ---Properties count: 15 [0] = S-1-5-18 [1] = MMK-TINA$ [2] = WORKGROUP [3] = 999 [4] = 17212 ← 新进程 PID [5] = C:\...\MicrosoftEdgeUpdate.exe ← 新进程路径 [6] = %%1936 [7] = 2656 [8] = [9] = S-1-0-0 [10] = - [11] = - [12] = 0 [13] = C:\Windows\System32\svchost.exe ← 创建者进程路径 [14] = S-1-16-16384
读取所有 Event 4688$allEvents = Get-WinEvent -FilterHashtable @{ LogName=”Security”; Id=4688; StartTime=$today} -MaxEvents 1000 -ErrorAction SilentlyContinue | Sort-Object TimeCreated # 从第一条事件自动检测属性索引$sampleEvt = $allEvents[0]$procPathIdx = -1$creatorPathIdx = -1 for ($j = 0; $j -lt $sampleEvt.Properties.Count; $j++) { $val = ”$($sampleEvt.Properties[$j].Value)” if ($val -match ”^C:\..exe$” -and $procPathIdx -eq -1) { $procPathIdx = $j } elseif ($val -match ”^C:\..exe$” -and $procPathIdx -ne -1 -and $creatorPathIdx -eq -1) { $creatorPathIdx = $j }} Write-Host ”检测到索引: ProcessPath=[$procPathIdx] CreatorPath=[$creatorPathIdx]” # 遍历所有进程事件,输出时间线foreach ($evt in $allEvents) { $time = $evt.TimeCreated.ToString(”HH:mm:ss”) $procPath = ”$($evt.Properties[$procPathIdx].Value)” $creatorPath = ”$($evt.Properties[$creatorPathIdx].Value)” $procName = Split-Path $procPath -Leaf -ErrorAction SilentlyContinue $creatorName = Split-Path $creatorPath -Leaf -ErrorAction SilentlyContinue Write-Host ” $time | $procName <- $creatorName”}18:41:20 | UKAO.exe <- explorer.exe18:41:23 | UKAO.exe <- runonce.exe18:41:24 | hx.exe <- UKAO.exe ← 抓到了!18:44:44 | UKAO.exe <- explorer.exe18:44:48 | UKAO.exe <- runonce.exe18:44:48 | hx.exe <- UKAO.exe ← 再次确认!
runonce.exe / explorer.exe ↓ UKAO.exe ↓ hx.exe(释放到 Temp 目录)
文件系统审计 GUID(与语言无关)$guidFileSystem = ”{0CCE921D-69AE-11D9-BED3-505054503030}”# 进程创建审计 GUID$guidProcessCreation = ”{0CCE922B-69AE-11D9-BED3-505054503030}” # 用 GUID 启用审计策略auditpol /set /subcategory:$guidFileSystem /success:enable /failure:enableauditpol /set /subcategory:$guidProcessCreation /success:enable /failure:enable # 验证auditpol /get /subcategory:$guidFileSystemauditpol /get /subcategory:$guidProcessCreationdetect_hx_v2.ps1 - 中文 Windows 审计配置# 必须用 GUID,不能用英文名$guidFileSystem = ”{0CCE921D-69AE-11D9-BED3-505054503030}”$guidProcessCreation = ”{0CCE922B-69AE-11D9-BED3-505054503030}” # 启用审计策略$r1 = auditpol /set /subcategory:$guidFileSystem /success:enable /failure:enable 2>&1Write-Host ”文件系统审计: $r1”$r2 = auditpol /set /subcategory:$guidProcessCreation /success:enable /failure:enable 2>&1Write-Host ”进程创建审计: $r2” # 验证auditpol /get /subcategory:$guidFileSystem 2>&1 | ForEach-Object { Write-Host ” $” }auditpol /get /subcategory:$guidProcessCreation 2>&1 | ForEach-Object { Write-Host ” $” } # 尝试设置 SACL(文件系统审计需要)$tempDir = ”C:\Users\Tina\AppData\Local\Temp”$acl = Get-Acl $tempDir -Audit$auditRule = New-Object System.Security.AccessControl.FileSystemAuditRule( ”Everyone”, ”Write”, ”ContainerInherit, ObjectInherit”, ”None”, ”Success”)$acl.AddAuditRule($auditRule)Set-Acl $tempDir -AclObject $acl # 验证 SACL$verifyAcl = Get-Acl $tempDir -AuditWrite-Host ”SACL 条目数: $($verifyAcl.AuditRules.Count)”fix_sacl.ps1 - 三种方法设置 SACL $tempDir = ”C:\Users\Tina\AppData\Local\Temp” # 方法1:用 SID 代替用户名(S-1-1-0 = Everyone)Write-Host ”[1/3] 用 SID S-1-1-0 设置 SACL...”$everyoneSid = New-Object System.Security.Principal.SecurityIdentifier(”S-1-1-0”)$auditRule = New-Object System.Security.AccessControl.FileSystemAuditRule( $everyoneSid, ”Write”, ”ContainerInherit, ObjectInherit”, ”None”, ”Success”)$acl = Get-Acl $tempDir -Audit$acl.AddAuditRule($auditRule)Set-Acl $tempDir -AclObject $acl$verifyAcl = Get-Acl $tempDir -AuditWrite-Host ” AuditRules 条目数: $($verifyAcl.AuditRules.Count)”# 结果:0。失败了。 # 方法2:用 icacls 命令行工具Write-Host ”[2/3] 用 icacls 设置...”$result = & cmd /c ”icacls ”<span class="code-snippet__variable">$tempDir</span>” /audit Everyone:(W) /T /C” 2>&1Write-Host ” icacls 输出: $result”# 结果:icacls 不支持 /audit 参数(”无效参数”)。失败了。 # 方法3:用 auditpol /resourceSACLWrite-Host ”[3/3] 用 auditpol /resourceSACL...”$resourceSacl = auditpol /resourceSACL /get 2>&1$resourceSacl | ForEach-Object { Write-Host ” $_” }# 结果:参数错误。也失败了。
四、第三回合:文本解析又翻车
search_hx_v3.ps1 - 解析 Event 4688 $today = (Get-Date).Date$events4688 = Get-WinEvent -FilterHashtable @{ LogName=”Security”; Id=4688; StartTime=$today} -MaxEvents 1000 -ErrorAction SilentlyContinue | Sort-Object TimeCreated foreach ($evt in $events4688) { $msg = $evt.Message $newProcName = ”” $creatorProcName = ”” $cmdLine = ”” # 先尝试中文字段名 if ($msg -match ”新进程名称:\s+(.+)”) { $newProcName = $Matches[1].Trim() } if ($msg -match ”创建者进程名称:\s+(.+)”) { $creatorProcName = $Matches[1].Trim() } if ($msg -match ”进程命令行:\s+(.+)”) { $cmdLine = $Matches[1].Trim() } # 英文回退 if (-not $newProcName -and $msg -match ”New Process Name:\s+(.+)”) { $newProcName = $Matches[1].Trim() } if (-not $creatorProcName -and $msg -match ”Creator Process Name:\s+(.+)”) { $creatorProcName = $Matches[1].Trim() } $time = $evt.TimeCreated.ToString(”HH:mm:ss”) $name = Split-Path $newProcName -Leaf -ErrorAction SilentlyContinue $creator = Split-Path $creatorProcName -Leaf -ErrorAction SilentlyContinue Write-Host ” $time | $name <- $creator”}导出原始 Event 4688 消息$events = Get-WinEvent -FilterHashtable @{ LogName=”Security”; Id=4688} -MaxEvents 3 -ErrorAction SilentlyContinue foreach ($evt in $events) { Write-Host ”=== $($evt.TimeCreated) ===” Write-Host $evt.Message Write-Host ””}
五、终局之战:结构化数据一击必杀
导出 Event 4688 的 Properties 集合$today = (Get-Date).Date$events = Get-WinEvent -FilterHashtable @{ LogName=”Security”; Id=4688; StartTime=$today} -MaxEvents 5 -ErrorAction SilentlyContinue | Sort-Object TimeCreated foreach ($evt in $events) { Write-Host ”--- Event at $($evt.TimeCreated.ToString('HH:mm:ss')) ---” Write-Host ”Properties count: $($evt.Properties.Count)” for ($j = 0; $j -lt $evt.Properties.Count; $j++) { $val = $evt.Properties[$j].Value if ($val -is [byte[]]) { $val = [System.BitConverter]::ToString($val).Replace(”-”,” ”) } Write-Host ” [$j] = $val” } Write-Host ””}--- Event at 18:51:38 ---Properties count: 15 [0] = S-1-5-18 [1] = MMK-TINA$ [2] = WORKGROUP [3] = 999 [4] = 17212 ← 新进程 PID [5] = C:\...\MicrosoftEdgeUpdate.exe ← 新进程路径 [6] = %%1936 [7] = 2656 [8] = [9] = S-1-0-0 [10] = - [11] = - [12] = 0 [13] = C:\Windows\System32\svchost.exe ← 创建者进程路径 [14] = S-1-16-16384
读取所有 Event 4688$allEvents = Get-WinEvent -FilterHashtable @{ LogName=”Security”; Id=4688; StartTime=$today} -MaxEvents 1000 -ErrorAction SilentlyContinue | Sort-Object TimeCreated # 从第一条事件自动检测属性索引$sampleEvt = $allEvents[0]$procPathIdx = -1$creatorPathIdx = -1 for ($j = 0; $j -lt $sampleEvt.Properties.Count; $j++) { $val = ”$($sampleEvt.Properties[$j].Value)” if ($val -match ”^C:\..exe$” -and $procPathIdx -eq -1) { $procPathIdx = $j } elseif ($val -match ”^C:\..exe$” -and $procPathIdx -ne -1 -and $creatorPathIdx -eq -1) { $creatorPathIdx = $j }} Write-Host ”检测到索引: ProcessPath=[$procPathIdx] CreatorPath=[$creatorPathIdx]” # 遍历所有进程事件,输出时间线foreach ($evt in $allEvents) { $time = $evt.TimeCreated.ToString(”HH:mm:ss”) $procPath = ”$($evt.Properties[$procPathIdx].Value)” $creatorPath = ”$($evt.Properties[$creatorPathIdx].Value)” $procName = Split-Path $procPath -Leaf -ErrorAction SilentlyContinue $creatorName = Split-Path $creatorPath -Leaf -ErrorAction SilentlyContinue Write-Host ” $time | $procName <- $creatorName”}18:41:20 | UKAO.exe <- explorer.exe18:41:23 | UKAO.exe <- runonce.exe18:41:24 | hx.exe <- UKAO.exe ← 抓到了!18:44:44 | UKAO.exe <- explorer.exe18:44:48 | UKAO.exe <- runonce.exe18:44:48 | hx.exe <- UKAO.exe ← 再次确认!
runonce.exe / explorer.exe ↓ UKAO.exe ↓ hx.exe(释放到 Temp 目录)
本文链接:https://www.kinber.cn/post/6755.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝:

支付宝微信扫一扫,打赏作者吧~
