使用Powershell正则表达式匹配多行

时间:2018-04-18 10:02:51

标签: powershell

我使用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,但它们似乎不起作用。

1 个答案:

答案 0 :(得分:2)

在命令末尾添加Out-String,将其首先转换为text:

$ntlm = Invoke-Expression -Command "mimikatz.exe "".... exit | Out-String"  

否则powershell将威胁它作为对象,而正则表达式只知道文本......

就像在第二段代码中使用Get-Content -Raw一样。