在日常工作中,我们常常会监测到办公网发出的恶意域名请求。然而,由于缺乏EDR工具的辅助,我们在定位这些恶意请求时效率往往较低。因此,我们总结了一些有助于提高定位效率的方法,包括开源工具使用和借助系统自身日志分析。这些方法都可以帮助我们更快速、准确地定位办公网发出恶意域名请求的进程,提高我们的安全响应能力。
思考这个问题的时候,首先想到的是借助现有安全工具,于是调研了多款具备网络监控能力的工具,下面展示可以满足需求的两款工具的实际使用效果。
火绒剑Mac版
火绒提供了对进程进行网络监控的能力。
实际测试中,开启对dns请求的过滤,并没有任何输出。但是对于dns解析固定的域名,可以通过开启监控,过滤指定ip来协助定位。
DNSMonitor
DNSMonitor是一款利用 Apple 的Network Extension Framework监控 DNS 请求和响应的开源安全工具。
项目地址:https://github.com/objective-see/DNSMonitor
下载地址:https://objective-see.org/products/utilities.html
使用方法:
将软件解压至Applications目录,运行后允许加载系统扩展和监控dns流量即可使用。
DNSMonitor.app/Contents/MacOS/DNSMonitor -h
DNSMonitor usage:
-h or -help display this usage info
-json output is formatted as JSON
-pretty JSON output is 'pretty-printed'
监控效果如下,可以获取执行dns请求的程序路径和进程ID,能够完美匹配需求。
macOS统一日志是一种全新的日志系统,在Mac OS X 10.12 Sierra中首次引入。它将多个日志来源整合到一个统一的日志文件中,包括系统日志、应用程序日志和安全日志等。其中包含了DNS请求日志,但是默认是被作为私有数据日志记录的,需要手动开启。在Sierra后的不同的系统版本中有不同的启用方式。
从Sierra到Mojave
在终端中运行下列命令即可开启sudo log config --mode "private_data:on"
Catalina <10.15.3
上述方法在Catalina中不再有效。研究员Saagar Jha提供了一款PrivateLogs工具用于开启私有数据日志。
在终端中运行下列命令即可开启
$ PrivateLogs enable
$ PrivateLogs status
enabled
PrivateLogs工具:https://saagarjha.com/blog/2019/09/29/making-os-log-public-on-macos-catalina/#putting-it-all-together
Catalina 10.15.3+
在更高的版本中,可以通过安装描述文件,打开私有数据日志
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>ManagedClient logging</string>
<key>PayloadEnabled</key>
<true/>
<key>PayloadIdentifier</key>
<string>com.apple.logging.ManagedClient.1</string>
<key>PayloadType</key>
<string>com.apple.system.logging</string>
<key>PayloadUUID</key>
<string>ED5DE307-A5FC-434F-AD88-187677F02222</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>System</key>
<dict>
<key>Enable-Private-Data</key>
<true/>
</dict>
</dict>
</array>
<key>PayloadDescription</key>
<string>Enable Unified Log Private Data logging</string>
<key>PayloadDisplayName</key>
<string>Enable Unified Log Private Data</string>
<key>PayloadIdentifier</key>
<string>C510208B-AD6E-4121-A945-E397B61CACCF</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>D30C25BD-E0C1-44C8-830A-964F27DAD4BA</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>
效果如下:
日志查询方式
在终端中运行下列命令,可检测是否开启成功
$ sudo log config --status
System mode = INFO PRIVATE_DATA
在终端中运行下列命令,可以查询近一小时的日志
log show --last 1h --predicate 'eventMessage CONTAINS[cd] "dns"' |grep "mDNSResponder" |grep "START PID"
效果如下:
备注:只能查询开启私有数据日志记录之后的日志,历史日志仍以私有日志形式展示。实际测试中在Ventura只显示了部分私有数据日志,精力有限,未跟进探究。
以上几种方式各有优缺点。DNSmonitor可以完美解决开篇的问题,而火绒在此设定场景下的监控能力对比DNSmonitor稍有不足,但是其能力也不限于网络监控。如果不想借助第三方工具,可以按系统版本参照上文对应方法开启私有数据日志,另外不信任第三方描述文件的话,也可以参照官方文档自行编写。
官方文档:https://developer.apple.com/documentation/devicemanagement/systemlogging
微软的Sysmon 10,集成了DNS查询记录功能,此功能将允许Sysmon用户在受监视的计算机上记录进程所执行的DNS查询。从功能介绍来看,是契合需求的。
通过官方下载地址下载,cmd命令窗口执行sysmon.exe -accepteula -i sysmonconfig-export.xml
命令进行安装,配置文件来自Github开源项目sysmon-config。
官方下载地址:https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon
sysmon-config:https://github.com/SwiftOnSecurity/sysmon-config
安装成功后即可在事件查看器中的应用程序和服务日志/Microsof /Windows/Sysmon/Operational 查看dns请求日志,事件ID为22。
如果想查询特定的域名,需要编辑xml格式的查询语句进行筛选,这里直接贴一段powershell脚本,可查询指定时间内的指定域名以及发起dns请求的用户和进程id。
#查询过去1小时内,事件ID为22,域名为www.baidu.com的日志
$xml ='<QueryList>
<Query Id="0" Path="Microsoft-Windows-Sysmon/Operational">
<Select Path="Microsoft-Windows-Sysmon/Operational">*[System[(EventID=22)
and TimeCreated[timediff(@SystemTime) <= 3600000]]] and *[EventData[Data[@Name="QueryName"] and (Data="www.baidu.com")]]</Select>
</Query>
</QueryList>'$events = Get-WinEvent -FilterXml $xml
$i=0
while ($i -lt $events.length) {
$time=$events[$i].TimeCreated
$dns=[regex]::matches($events[$i].Message, 'QueryName:(.+)') | %{$_.Groups[1].Value.Trim()}
$id=[regex]::matches($events[$i].Message, 'ProcessId:(.+)') | %{$_.Groups[1].Value.Trim()}
$user=[regex]::matches($events[$i].Message, 'User:(.+)') | %{$_.Groups[1].Value.Trim()}
Write-Host $time,' QueryName:'$dns' ','ProcessId:'$id' ','User:'$user
$i++
}
执行效果如下:
https://github.com/SwiftOnSecurity/sysmon-config
https://huorong.cn/info/1620802825658.html
https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon
https://georgegarside.com/blog/macos/sierra-console-private/#google_vignette
https://saagarjha.com/blog/2019/09/29/making-os-log-public-on-macos-catalina/
转载:https://www.anquanke.com/post/id/287604
作者:陌陌安全
欢迎大家去关注作者
欢迎师傅加入安全交流群(qq群:611901335),或者后台回复加群
如果想和我一起讨论,欢迎加入我的知识星球!!!
扫描下图加入freebuf知识大陆
师傅们点赞、转发、在看就是最大的支持
后台回复知识星球或者知识大陆也可获取加入链接(两个加其一即可)