近年来各种大规模的红蓝对抗逐渐兴起,攻防实战受到了更多的重视。对抗时红队模拟真实黑客的攻击行为,对企业网络应用系统进行渗透攻击,最终能发现企业平时未注意到的风险点,达到完善企业的安全体系的目的。
本文站在红队攻击的角度,介绍一种在红队攻击初期快速通过已知Nday漏洞获取入口权限的思路,并编写成工具供红队渗透测试人员使用。
在红蓝对抗中红队的攻击流程大致可总结为以下几点
情报收集 => 入口权限获取 => 内网信息探测 => 横向移动 => 权限维持
本文主要针对第二步入口‘入口权限获取‘展开讨论。
在真实的企业网络中内网往往是脆弱的,通过一个入口权限进入内网后往往可以上线大量内网机器。所以入口权限的获取至关重要。
在大型的红蓝对抗中,要对一定地区的企业应用进行打击,红队初期拿到目标有时会涉及成百上千个url和ip。
在如此庞大的目标面前,初期通过常规渗透测试手法对单一系统进行测试是不合理的,这样难以涉及到全部目标并且容易漏掉容易出现问题的系统。
比较流行的方法是用工具批量化扫描,比如用goby + awvs + xray等常见漏洞扫描工具进行联动,以达到批量测试目标获取入口权限的目的。
利用漏扫联动批量扫描的确是一个很好打点方法,但避免不了效率慢,ip被ban,流量易被检测的问题。
所以在红队攻击的初期应该重将心放在各种主流 "中间件 + 开源程序 + Web服务组件" 历史上爆出的各种Nday漏洞的检测上面,通过这些漏洞的利用,我们可以很容易的getshell后进入内网。
这里列举一些常见漏洞组件
struct2 (s2系列rce)
thinkphp系列 (tp2x,3x,5x的代码执行等)
Jekins (未授权访问,命令执行等)
weblogic (CVE-2020-2551,CVE-2019-2729等)
Jboss (反序列化CVE-2015-7501,CVE-2017-7504,CVE-2017-12149)
各类开源cms的漏洞 (如wordpress,drupal ,discuz,joomla, 帝国cms,织梦cms等)
常见编辑器的历史漏洞 (如ueditor编辑器解析漏洞,各种越权和后台地址泄露等)
常见OA漏洞 (用友,泛微,致远,金蝶等)
各种网关防火墙nday,redis未授权,mongodb未授权,mysql认证绕过等
在信息收集时EHole是一款优秀的红队工具,它可以从大量杂乱的资产中找到这些易受攻击的系统,红队人员再利用对应组件的poc验证目标系统是否存在漏洞,以达到快速获取入口权限的目的。
项目地址:https://github.com/popmedd/EHole
* POC:可以理解为一段验证漏洞是否存在的程序,如果验证成功,poc可以将漏洞存在的消息返回通知我们。一个poc往往对应一个或一类漏洞,并且poc只提供验证的功能,不会利用漏洞对目标造成危害。
* EXP:即为一段利用漏洞的程序,与poc对应,exp提供攻击功能,exp通过利用漏洞攻击目标以发挥这个漏洞带来的危害。
在识别到常见组件后,我们往往会利用该组件历史漏洞的poc,来验证是否有漏洞的存在
如果验证成功再利用该漏洞对应的exp攻击目标系统,以获取我们想要的信息,这需要红队测试人员在平时对常见组件的漏洞足够了解,需要收集大量的poc/exp并能够及时对相应漏洞进行复现和利用。
对于红队人员来说,最好的情况是利用exp返回一个主机shell,这将直接进入内网渗透阶段。
所以在红队攻击初期,一些危害性大的漏洞如 RCE,反序列化,任意文件上传等往往得到格外的青睐,通过对这些漏洞的检测利用我们可以很容易的打通入口隧道进入内网。
而反之xss,crsf,业务逻辑漏洞,甚至是一些以时间为成本的sql注入在初期显得不是特别重要,这些可以在攻击中后期进行挖掘利用。
goby提供poc验证的功能,并且goby收集的poc基本都能获取到主机的shell权限,满足红队初期优先检测高危漏洞的观念,但也有很明显的不足之处
在红蓝攻防中红队时间紧任务重,一是goby的扫描速度堪忧,再者普通版goby中poc不能及时更新到新爆的高危漏洞,并且用goby只进行高危poc的检测扫描无疑大材小用的。
为了解决这种情况,我们可以编写扫描器来快速对大量目标进行高危漏洞的poc验证。
要编写一款适合红队快速打点的扫描器。
扫描器的核心思想在于收集大量常见组件高危漏洞的poc,然后编写一个框架加载这些poc,批量对多个目标进行fuzz测试。
这款专为红队定制的扫描器旨在只要扫出漏洞即可搜索对应exp获取目标shell权限。
因为常见的poc都是以python脚本的形式分布在互联网上,所以用python编写扫描器框架可以很容易的加载调用这些poc进行漏洞验证,我们只需要不断收集这些poc并稍加改动即可。
我们可以将一个poc编写成一个检测漏洞是否存在的函数存在扫描器的poc模块中,并用框架去调用这些漏洞验证函数。
一个漏洞验证函数的编写思路可以如下:
函数的返回结果以字典的形式返回并且具有name和vulnerable两个键值,name说明漏洞名称,vulnerable通过True和False的状态表明漏洞是否存在
示例函数如下(以 thinkphp5.0.22/5.1.29 的命令执行漏洞为例)
def thinkphp5022_5129_rce(url):
relsult = {
'name': 'Thinkphp5 5.0.22/5.1.29 Remote Code Execution Vulnerability',
'vulnerable': False
}
try:
......
(用任意方法检测漏洞)
......
if 存在漏洞:
relsult['vulnerable'] = True # 将relsult的vulnerable的值置为True
relust['xxxxx'] = 'xxxxx' # 可以添加该漏洞相关来源等信息
......
return relsult # 将vulnerable值为True的relsult返回
else: # 不存在漏洞
return relsult # 若不存在漏洞将vulnerable值为False的relsult返回
execpt:
return relsult
这样扫描器框架可以通过通过调用这个函数来实现poc的扫描验证,通过返回字典中的vulnerable值来判断漏洞是否存在。
POC bomber是笔者编写的一款高危漏洞扫描器,其中集成了各种红队攻击中常见组件高危漏洞的poc并能够多线程多目标进行fuzz测试,是一款专门为红队定制的工具,适合在红队攻击初期快速找到突破口。
项目地址:
https://github.com/tr0uble-mAker/POC-bomber
此款扫描器支持thinkphp全版本,s2全版本,weblogic全版本的漏洞检测,并整合多个hvv高危漏洞,poc有的是网上收集有的是笔者自己编写,是很多扫描器的集合体,并且poc经过改动后误报率很低,能大大减少红队人员的手工验证漏洞时间。
扫描器检测结果:
目前项目的poc在不断更新中并及时更新最新高危漏洞的poc验证(包括最近的泛微任意文件上传-CNVD-2021-49104)