前言
文章记录了一次护网前夕跟随同事们做的一次为期一周的演练,本次项目被要求集中在客户现场,由客户提供公网ip作为出口,方便管理,时间较紧,也不太好求助场外大佬,只好自己慢慢啃。
打点探测
根据客户提供的目标信息,我们先通过fofa,xray,securitytrails等工具对其进行了一波信息搜集,因为最后目标资产数量并不多,最后筛选出有用的资产数量七八个,与大佬们各自分工开始测试。
其中一个可疑目标开放了6080端口,下面挂着winmail邮件服务器。
打开就出现了下图所示的登陆界面,登录界面可挖漏洞有登录验证绕过,用户枚举,暴力破解等等。
这里的登陆框是没有验证码的,但是登录的返回信息都一致,只能先尝试爆破一下弱密码。
对可能存在的一些个用户名爆破弱密码无果后,继续探测密码忘记界面。
一般忘记密码界面都能探测用户是否存在,但是此处存在验证码,无奈太菜,测试后没能成功绕过,先放一放,看看此ip其他端口还有啥服务。
用户枚举
既然是邮件服务系统,那么25端口一般是打开的。若smtp服务对某些命令未正确设置的话,也是可能会存在用户名枚举的,先telnet一下目标25端口,看是否能连上。
咱们先通过工具构造好常用名字拼音加域后缀的字典。
使用smtp-user-enum -M RCPT 对邮件系统用户进行枚举,当然,如果工具不齐全的话你也能通过自己telnet手动测试。运气不错,爆出一些用户名。
此处其实还能通过邮件伪造,向域内用户发送钓鱼邮件也是一条路子,但是测试时间只有一周,效果可能很有限,此种方法暂时就被舍弃留作备用了。
进入后台
通过枚举出的用户名开始对各个系统进行爆破。
在漫长的等待后,一个叫XX物业系统的管理后台被爆破成功,看这画风应该是一个点餐系统。
对着功能点到处点点点,轻车熟路的找到几个上传点,开始上传shell。
然而好像事情也没像预期那样,前后端都有白名单验证,经过多次尝试后并没有成功拿下shell,正在一筹莫展之际,队友那传来了有用的信息,他在某个目录下发现了一个疑似备份文件的存在。
下载后发现应该是运维人员打包后忘记删除的备份文件,真是美滋滋,有了源码咱们直接开始审计代码。
审计代码
实战中有利用价值的审计无非就是getshell,那么就重点关注代码执行,文件操作,sql注入的相关关键字。
我们通过对代码的审计,在Update()函数发现了一点蛛丝马迹,此函数在658行会先从用户处获取一个filepath,然后在665行拼接成完整的文件下载路径,可以看到数据都是通过frparam()这个功能接收的,我们跟进frparam()。
frparam()函数就是通过GPC接收数据,然后返回给format_param()函数,这里没有对数据进行任何处理。
跟进format_param(),这里文件路径为字符串,直接看57行,数据首先被htmlspecialchars()与addslashes()函数过滤,然后返回。
回到PluginsController.php 的Update()函数。当获取到远程地址和拼接好本地文件地址后,函数就开始判断我们的action,这里的action值传入方式与上面同理。
我们继续向下审计,这里有个下载功能,获取远程文件的内容通过699行代码保存在本地tmp_path的路径下,这里的$remote_url变量可控,且并未发现有对下载文件的限制,可以尝试使web应用下载自己指定的恶意文件。
但是问题来了,在代码第665行,保存的本地路径后缀是被写死的,咱们下载一个压缩文件也没办法getshell。
我们继续向下审计,看看还有什么内置功能可以让我们绕过这个限制,发现在第720行存在一个file-unzip的功能,顾名思义,应该就是一个文件解压的功能。
跟进第722行,首先判断文件是否存在,存在就调用zip_open() 函数,成功就执行解压操作否则就返回失败。解压的路径为’/A/exts’。
理一下利用思路,先获取远程文件的内容,在本地存成压缩文件,然后解压到他的升级目录下。那么现在基本可以确定,只要我们把远程地址修改为我们自己带有恶意文件的地址,并且下载后通过unzip将其解压那么就能getshell。
说走就走,将包含shell的php文件压缩起来,放到远程服务器上。并构造数据包使download_url指向我们的恶意文件。
返回成功后,继续构造数据包解压我们的恶意文件。
第一个shell
大功告成,成功将shell放到服务器上,心情有一点点小激动。
通过冰蝎连接shell却发现无法执行命令,人生就是这样,有许多的绊脚石,磕磕碰碰。
俗话说得好,不能执行命令的shell不是好shell。
别慌我们先看看phpinfo,看看哪些函数被禁用了
莫得办法,找不到替代函数,那就得绕一下函数禁用,判断是linux系统后,祭出我们绕过payload。
disable_function.工具下载地址:
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
将payload文件上传。
构造执行命令。
Payload:http://xxx/dp1.php?cmd=whoami&outpath=/tmp/xx&sopath=/xxx/dp1.so
这成功执行命令了。
进入内网
因为时间紧迫,前期在外探测已花费太多时间,接下来兵分两路,一路对此系统进行深入探测,另一路直接通过frp代理进内网扩大战果。
敲下ifconfig后系统提示我command not found,难道是没装net-tools??
这种情况一般可以试试使用ip addr命令代替,或者是通过whereis命令搜索一下,然后使用全路径去执行命令,这里选择后者。
既然知道了ip段,按老规矩,先对本网段扫一波ms17010,主机挺多,就是没办法利用,只好另寻出路。
在内网兜兜转转的信息搜集时 发现了一台内网服务器redis未设置密码,咱们先拿一台服务器看看。
先使用ssh-keygen -t rsa命令生成一个公钥。
这里直接用proxychains去连接redis,然后在.ssh文件里写入密钥。
成功获取root权限。
横向扩展
在拿到服务器权限后,通过查看history历史命令,我们获取到一个使用目标企业相关单词+@2020的密码,果然使用这种规则密码的公司挺多,记得以前公司也是这样设置的。
感觉离成功又近了一步。
在使用爆破工具横向时发现只有三台服务器上使用的相同密码,应该是同时期部署的服务器,没办法,有三台是三台,不然还能怎么办。
服务器上面的东西杂而乱,看了几个比较常见的配置文件后实在不知道从哪下手,挨着排查可能时间吃紧,因为演习时间只剩下最后一天。就当我准备换方向的时候队伍里的一个常年接触linux的大佬默默敲了一条命令。
egrep expect /* -rl |grep “.sh”:递归查询包含expect字段的文件。
大佬解释到,运维人员会定期做巡检,采集配置文件、CPU利用率等重要信息备份工作,一般借助 expect 处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成,大大提高系统管理人员的工作效率,所以就有了expect,通过递归查找存在expect字段的文件,就有概率能获取密码信息。
听君一席话,胜读十年书,果然还是吃了文化太少的亏。
通过大佬提供的命令在上千个文件里发现了数十个具有相关内容的bash文件。
Ps:当搜索出的无用文件较多,影响判断时,也可以通过指定目录来进行操作。
egrep expect /{root,home,opt,tmp}/* -rl|grep ".sh"
运气也是实力的一部分,果真在一个叫做liu.sh 的文件中发现了蛛丝马迹。这应该就是大佬口中的运维管理脚本了。
看到密码的时候那个激动啊,马上寄出超级弱口令工具再爆破一次,GG思密达。
至此整个c段基本沦陷,其中还包含了254/253两台主备部署的交换机,但是因为通过修改交换机配置进行跨网段渗透可能存在风险。
Ps:作为一个守法公民,不想提前衣食无忧,所以做对客户核心系统可能产生影响的操作之前,一定要取得客户的同意。
在与客户交流后,客户担心整体网络稳定性,遂放弃了这个想法。还好没冲动。
尾声
梳理一下进攻路线,演习前期首先在外网通过Smtp枚举出用户,借助用户信息爆破进入后台,在后台没办法上传shell,好在找到了备份文件并通过审计源码拿到shell进入了内网,在内网当中发现了一台未授权的redis,又通过其 history获取密码扩展了几台主机,最终配合几台主机上的bash脚本获取到本段大部分主机权限。
在渗透的江湖里,道阻且长。渗透的漫漫长路中并不是每次都会利用多么牛逼的技巧,但每次行动都有值得我们总结的地方。
——END——