使用PowerShell正则匹配多行,提取mimikatz输出的User与NTLM哈希
用PowerShell正则从Mimikatz输出中提取User与NTLM哈希信息
嘿,刚好做过类似的安全审计场景,我来给你捋清楚怎么用PowerShell正则从Mimikatz的输出里精准提取User和对应的NTLM哈希信息~
先明确需求背景
你提供的Mimikatz输出里,部分用户条目会跟着对应的NTLM哈希行,有些则没有。我们需要把每个用户和它的哈希(如果存在)配对提取出来,格式就像你要的User : admin Hash NTLM: f1320e0960da374b88e40cffbec44885这样。
解决方案代码
首先把Mimikatz的输出存为变量(或者直接从文件读取,代码里有标注),然后用正则匹配处理:
# 模拟Mimikatz的输出内容,也可以换成从文件读取:$mimikatzOutput = Get-Content "mimikatz_output.txt" -Raw $mimikatzOutput = @" RID : 000001f4 (500) User : Administrator RID : 000001f5 (501) User : Guest RID : 000001f7 (503) User : DefaultAccount RID : 000001f8 (504) User : WDAGUtilityAccount Hash NTLM: 6373ee9aae046ab1319d89b1cfd36306 RID : 000003e9 (1001) User : admin Hash NTLM: f1320e0960da374b88e40cffbec44885 "@ # 定义正则模式,适配多行关联的用户与哈希 $regexPattern = '(?s)RID : .*? User : (\S+)\s*(?:Hash NTLM: ([0-9a-f]{32}))?' # 执行全局匹配 $matchResults = [regex]::Matches($mimikatzOutput, $regexPattern) # 遍历结果,输出整理后的信息 foreach ($result in $matchResults) { $username = $result.Groups[1].Value $ntlmHash = $result.Groups[2].Value # 按需输出:如果只想要有哈希的用户,就去掉else分支 if ($ntlmHash) { Write-Host "User : $username Hash NTLM: $ntlmHash" } else { Write-Host "User : $username - 未找到对应NTLM哈希" } }
正则模式解释
给你拆解下这个正则的关键部分,方便你根据实际输出调整:
(?s):启用单行模式,让.可以匹配换行符,这样就能跨行处理用户行和下一行的哈希行RID : .*? User : (\S+):匹配RID开头的行,捕获用户名(\S+匹配非空白字符,覆盖大部分用户名格式)\s*:匹配用户行和哈希行之间的所有空白(包括换行、空格)(?:Hash NTLM: ([0-9a-f]{32}))?:可选的哈希匹配组,?:表示这是个非捕获组,?表示这个组可以不存在;[0-9a-f]{32}精准匹配32位十六进制的NTLM哈希格式
输出效果
运行上面的代码后,你会得到整理后的结果:
User : Administrator - 未找到对应NTLM哈希 User : Guest - 未找到对应NTLM哈希 User : DefaultAccount - 未找到对应NTLM哈希 User : WDAGUtilityAccount Hash NTLM: 6373ee9aae046ab1319d89b1cfd36306 User : admin Hash NTLM: f1320e0960da374b88e40cffbec44885
如果只需要提取有哈希的用户,直接删掉循环里的else分支就行~
内容的提问来源于stack exchange,提问作者Shuzheng
相关产品推荐
相关产品推荐

