3gstudent 技术 2019年9月20日发布
收藏
导语:本文将要对SharpSniper的实现原理进行分析,扩展用法,分别介绍如何使用wevtutil.exe和powershell脚本实现相同的功能,分享其中需要注意的细节。
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命令进行筛选。
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{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\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 = @' <QueryList> <Query Id="0" Path="Security"> <Select Path="Security">*[System[(EventID=4624) and TimeCreated[timediff(@SystemTime) <= 604800000]]]</Select> </Query> </QueryList> '@ Get-WinEvent -FilterXml $xml
0x05 小结
本文分析了SharpSniper的实现原理,扩展用法,分别介绍如何使用wevtutil.exe和powershell脚本实现相同的功能,可以用来获取域环境中关键用户使用过的IP。