SharpSniper利用分析
0x00 前言
SharpSniper用於在域環境中找到指定域用戶的IP地址,需要具有讀取域控制器日誌的許可權,地址:https://github.com/HunnicCyber/SharpSniper
本文將要對SharpSniper的實現原理進行分析,擴展用法,分別介紹如何使用wevtutil.exe和powershell腳本實現相同的功能,分享其中需要注意的細節。
0x01 簡介
本文將要介紹以下內容:
·SharpSniper實現原理
·使用wevtutil實現
·使用powershell實現
0x02 SharpSniper實現原理
通過查詢域控制器上的用戶登錄日誌(Event ID:4624),獲得域用戶使用過的IP地址。
具體實現如下:
1.通過查詢日誌獲得域用戶使用過的IP
XPath查詢條件(以查詢用戶testb為例):
"Event[System[(EventID=4624)] and EventData[Data[@Name="TargetUserName"]="testb"]]"
對應代碼地址:https://github.com/HunnicCyber/SharpSniper/blob/master/QueryDC.cs#L16
2.通過正則表達式過濾出域用戶使用過的IP
正則表達式:
"\b\d\.\d\.\d\.\d\b"
·\b表示單詞的前或後邊界
·\d表示字元個數在1到3位之間
·.表示匹配字元"."
對應代碼地址:
https://github.com/HunnicCyber/SharpSniper/blob/master/Program.cs#L54
0x03 使用wevtutil實現
1.查詢指定用戶(以查詢用戶testb為例)的登錄日誌
cmd命令如下:
wevtutil qe security /format:text /q:"Event[System[(EventID=4624)] and EventData[Data[@Name="TargetUserName"]="testb"]]"
包括每條日誌的詳細信息,如下圖:
2.從詳細信息中提取出ip
這裡可以藉助find命令進行篩選。
cmd命令如下:
wevtutil qe security /format:text /q:"Event[System[(EventID=4624)] and EventData[Data[@Name="TargetUserName"]="testb"]]"|find "Source Network Address"
篩選後的結果如下圖:
從日誌中提取出用戶testb使用過的所有IP地址。
補充:XPath查詢條件的編寫
可以使用Event Viewer自動生成需要的XPath語句。
1.打開Event Viewer
cmd執行:eventvwr.msc
2.選擇Create Custom View..
如下圖:
3.設置查詢條件後選擇XML標籤
如下圖:
自動生成需要的XPath語句,如下圖:
4.使用wevtutil調用查詢語句的兩種方法
(1)按照/q參數的格式進行修改
需要提取自動生成的XPath語句中Select標籤中的內容。
(2)通過讀取文件調用查詢
直接使用自動生成的XPath語句。
將步驟3中的查詢語句保存到文件,例如custom1.xml。
讀取文件調用查詢的命令如下:
wevtutil qe custom1.xml /sq:true /rd:true /f:text
0x04 使用powershell實現
1.查詢指定用戶(以查詢用戶testb為例)的登錄日誌
Get-WinEvent -LogName "security" -
FilterXPath "Event[System[(EventID=4624)] and EventData[Data[@Name="TargetUserName"]="testb"]]"|Format-List
包括每條日誌的詳細信息,如下圖:
2.從詳細信息中提取出ip的三種方法
(1)使用find命令
Get-WinEvent -LogName "security" -
FilterXPath "Event[System[(EventID=4624)] and EventData[Data[@Name="TargetUserName"]="testb"]]"|Format-List|find "Source Network Address"
結果如下圖:
(2)通過正則表達式進行過濾
第一種實現方法:
使用SharpSniper中的正則表達式,對應的powershell命令如下:
$events = Get-WinEvent -LogName "security" -FilterXPath "Event[System[(EventID=4624)] and EventData[Data[@Name="TargetUserName"]="testb"]]"
$i=0
while ($i -lt $events.length) {
$IP=[regex]::matches($events[$i].Message, "\b\d\.\d\.\d\.\d\b")
Write-Host $IP
$i
}
結果如下圖:
第二種實現方法:
搜索關鍵詞"Source Network Address:",對應的powershell命令如下:
$events = Get-WinEvent -LogName "security" -FilterXPath "Event[System[(EventID=4624)] and EventData[Data[@Name="TargetUserName"]="testb"]]"
$i=0
while ($i -lt $events.length) {
$IP=[regex]::matches($events[$i].Message, "Source Network Address:(. )") | %{$_.Groups[1].Value.Trim()}
Write-Host $IP
$i
}
結果如下圖:
(3)先轉換成xml格式,再進行篩選
在輸出時,只有Message列,無法選擇只輸出"Source Network Address"的內容。
這裡如果將輸出內容轉換為xml格式,"Source Network Address"對應的列為ipaddress。
參考資料:
https://blog.51cto.com/beanxyz/1695288
對應的powershell命令如下:
$Events = Get-WinEvent -LogName "security" -FilterXPath "Event[System[(EventID=4624)] and EventData[Data[@Name="TargetUserName"]="testb"]]"
ForEach ($Event in $Events) {
$eventXML = [xml]$Event.ToXml()
For ($i=0; $i -lt $eventXML.Event.EventData.Data.Count; $i ) {
Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name $eventXML.Event.EventData.Data[$i].name -Value $eventXML.Event.EventData.Data[$i]."#text"
}
}
$events|select ipaddress
結果如下圖:
補充:使用powershell調用自動生成的XPath查詢條件
參照0x03中的內容,使用Event Viewer自動生成需要的XPath語句。
直接保存在變數$xml中並進行調用,對應的powershell命令如下:
$xml = @"
*[System[(EventID=4624) and TimeCreated[timediff(@SystemTime)
"@
Get-WinEvent -FilterXml $xml
0x05 小結
本文分析了SharpSniper的實現原理,擴展用法,分別介紹如何使用wevtutil.exe和powershell腳本實現相同的功能,可以用來獲取域環境中關鍵用戶使用過的IP。
註:本文為 3gstudent 原創稿件,授權嘶吼獨家發布