我使用mimikatz
提取NTLM哈希值进行安全审核。 mimikatz
的输出如下:
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
我想抓住“用户”和“哈希NTLM”,即
User : admin
Hash NTLM: f1320e0960da374b88e40cffbec44885
为此,我使用以下正则表达式:
[regex]$regex = '(?m)(User\s:\s\w+\r\n\s*Hash NTLM:\s\w+)'
现在,如果我直接在mimikatz
输出上使用正则表达式:
$ntlm = Invoke-Expression -Command "mimikatz.exe ""lsadump::sam /sam:C:\sam /system:C:\system"" exit"
[regex]$regex = '(?m)(User\s:\s\w+\r\n\s*Hash NTLM:\s\w+)'
$regex.Matches($ntlm).value
什么都没有。
但是,如果我首先将输出存储到文件然后使用-Raw
读取它,那么它可以正常工作:
$ntlm = Invoke-Expression -Command "mimikatz.exe ""lsadump::sam /sam:C:\sam /system:C:\system"" exit"
$ntlm | Out-File -FilePath "C:\Users\nlykkei\Desktop\mimikatz.txt"
$Text = Get-Content "C:\Users\nlykkei\Desktop\mimikatz.txt" -Raw
$regex.Matches($Text).value
在这种情况下,将返回以下行:
User : WDAGUtilityAccount
Hash NTLM: 6373ee9aae046ab1319d89b1cfd36306
User : admin
Hash NTLM: f1320e0960da374b88e40cffbec44885
如何在不将输出存储到文件的情况下进行正确匹配?我知道\r\n
,但它们似乎不起作用。
答案 0 :(得分:2)
在命令末尾添加Out-String
,将其首先转换为text:
$ntlm = Invoke-Expression -Command "mimikatz.exe "".... exit | Out-String"
否则powershell将威胁它作为对象,而正则表达式只知道文本......
就像在第二段代码中使用Get-Content -Raw
一样。