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{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"
- \b表示单词的前或后边界 \d{1,3}表示字符个数在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命令进行筛选
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
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{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b')
Write-Host $IP
$i++
}
结果如下图 第二种实现方法: 搜索关键词"Source Network Address:",对应的powershell命令如下:
"Source Network Address:"
$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
"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
$xml = @'
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(EventID=4624) and TimeCreated[timediff(@SystemTime) <= 604800000]]]</Select>
</Query>
</QueryList>
'@
Get-WinEvent -FilterXml $xml