漏洞复现
基础环境
测试服务器:Win7虚拟机
测试服务器IP:192.168.220.134
软件版本:SunloginClient_11.0.0.33162_X64
EXP下载地址: https://github.com/Mr-xn/sunlogin_rce (感谢开源作者)
复现流程
在Win7虚拟机里执行 SunloginClient_11.0.0.33162_X64.exe

查看对外开放端口,这里为49218,这个端口不是固定的,重启程序会变。

配合查找的命令
1 2 | netstat - ano | findstr LISTEN
tasklist | findstr SunloginClient
|
测试exp,命令执行成功,是system权限

漏洞原理分析
EXP源码分析
其实直接看exp源码,也能猜个差不多,莫过于
1.授权认证出了问题,任意用户可以获得访问令牌;
2.存在命令注入问题

对导致命令执行的url进行url解码可以看的更清楚些

流量分析
执行exp,并使用wireshark抓包
抓包时可以使用bpf语句过滤掉无关的报文,如
1 | host 192.168 . 220.134 and tcp port 49168
|

对抓包结果进行分析
请求令牌,存在未授权访问的问题

命令执行,存在命令注入的问题

为了定位命令执行的关键代码位置
行为分析
使用 Procmon 对程序进行行为分析,找到命令执行的关键函数,CreateProcessA。其实不用找,大概也能猜出来,可以把常见造成命令执行的函数都下个断点,断下来之后再进行判断。


动态调试
小技巧,使用PsExec得到system权限
以system权限启动x64dbg,以方便附加调试目标进程

在调试时需要隐藏调试器,否则在调试过程中会报异常
对CreateProcessA函数下断点,然后执行exp触发断点

静态分析
有个upx壳,使用“upx -d”直接脱掉。脱掉后的程序直接运行的话,还是会报错,没有探究原因,不过ida可以正常分析了。

根据动态调试的结果,可以很快定位到关键代码位置。找到URL路由,这可以用来分析其他api功能。另外,发现除了exp里提到的ping可以导致命令执行,nslookup也是可以的,可以自行编写脚本测试。


渗透测试
编写Goby脚本
配置“漏洞信息”

这里的指纹信息十分关键,Goby在扫描的时候,会先扫描资产,这个指纹就是用来判断资产种类的,匹配上指纹之后,才会打对应的poc。指纹的好坏,直接决定了扫描速度。
Goby语法和fofa是一致的,这里匹配的是"GET /"的应答,因为Goby在做资产探测的时候不会探测太多URL。
1 | body = "Verification failure" && body = "false" && header = "Cache-Control: no-cache" && header = "Content-Length: 46" && header = "Content-Type: application/json"
|
配置“扫描测试”
扫描测试有两个步骤,1.获得访问令牌CID;2.带令牌执行命令。
Test1
访问获取令牌的URL

指纹判断,如果访问成功,则根据正则提取CID

可以用python快速测试正则
1 2 3 4 5 6 | import re
a = r
filter = re. compile (r )
res = filter .findall(a)
print (res)
|
Test2
带Cookie访问命令执行的URL,上一步设置的变量CID可以套三个大括号来使用,即{{{CID}}}


测试效果
测试效果,发现漏洞。

测试过程可以使用wireshark抓包来辅助poc编写,也可以参考老的poc脚本,其目录在
goby-win-x64-1.8.293\golib\exploits\user
或者通过poc管理导出来也是可以的。

态势感知
流量监测
尽可能多的生成多种形式的攻击流量
考虑合理变形,尽可能多的生成多种形式的攻击流量,以便用来测试检测规则。

打poc的同时,用wireshark抓包,这里得到攻击流量包sunlogin_rce_multi_payload.pcap

编写规则并测试
测试环境为 Kali-Linux-2021.2-vmware-amd64,suricata版本为6.0.4 。
根据payload编写pcre正则
1 | / \ / check?. * cmd[\s] * ? = (?:ping|nslookup). * ?(?:\.\.\ / |\.\.\\) /
|
正则解释
1 2 3 | [\s] * ? = 匹配任意个空白符,非贪婪匹配,匹配最近的“ = ”
(?:ping|nslookup) 匹配 ping 或 nslookup,?:表示不获取匹配结果
(?:\.\.\ / |\.\.\\) 匹配 .. / 或 ..\
|
测试pcre正则
1 2 | apt install pcre2 - utils
pcre2test
|

编写suricata规则
(此规则可以应对正常攻击和部分变形,但依然存在被绕过的可能。规则写严了容易漏报,写松了容易误报,另外还应该要考虑报文分片传输、丢包的问题。)
vim /etc/suricata/rules/test.rules
1 | alert http any any - > any any (msg: "CNVD-2022-10270 SunloginClient RCE" ; pcre: "/\/check?.*cmd[\s]*?=(?:ping|nslookup).*?(?:\.\.\/|\.\.\\)/U" ; classtype:attempted - admin; sid: 22022801 ; rev: 2 ;)
|
/U 里的 U 表示在标准uri 上进行 pcre 匹配(区别于http_raw_uri,类似于http_uri,相当于URL解码后再匹配)。
vim /etc/suricata/suricata.yaml
测试suricata规则,5条攻击报文触发了5次告警,测试成功。
1 | suricata - r sunlogin_rce_multi_payload.pcap
|

流量监测相关资料
https://suricata.readthedocs.io/en/suricata-6.0.0/rules/
https://rocknsm.io/
https://github.com/arkime/arkime
终端监测
windows下的事件监控可以用sysmon,Linux下则可以用auditd,然后借助wazuh来管理日志。

1 | 事件查看器 - >应用程序和服务日志 - >Microsoft - >Windows - >Sysmon
|

终端监测相关资料
https://www.sysgeek.cn/sysmon/
https://www.maliciouskr.cc/2018/11/15/使用OSSEC构建主机层入侵检测/
https://blog.csdn.net/single7_/article/details/110038117
2022 KCTF春季赛【最佳人气奖】火热评选中!快来投票吧~
最后于 2022-3-5 00:09
被Jtian编辑
,原因: 补充与纠错