最近参加了一场线下的awd攻防对抗赛,初次接触到这种模式,实在太有攻防的感觉了,本次一共有三十多队。比赛一共有多个环境,有web和pwn的。本文着重讲web环境的个人领会到的技巧和心得。
首先我们目标是除了攻陷其他队维护的web服务器之外,并且还要修复自己服务器的漏洞以防被别人拿下,把其他队服务器拿下后并提交根目录路径中的flag才能得分,10分钟一回合刷新一次flag,每回合提交flag可以得分,服务器环境会自动抓数据包保存到本地可以自己分析,被别人getshell提交自己服务器flag会扣分,服务宕掉也会扣分。
所以总体的意思就是,要做的有挖洞,补洞,溯源分析,还原攻击,可持续访问。每10分钟就要攻击一次所有队伍的服务器,拿到flag,加分。但自己的服务器被攻陷,就要扣分;服务无法运行,也要扣分。但实际上很可能大屏幕写着自己的服务被攻陷,自己都不知道发生了什么事,怎么被打死的?为什么用同样的漏洞打回去不行?除此之外本次比赛还多了一些规则:
1.禁止对赛题服务发起任何形式的资源消耗型拒绝服务攻击;
2.禁止对赛题以外的比赛平台发起攻击,不能提权root,违者取消参赛资格;
3.禁止参赛战队使用通用防御方法,违者取消参赛资格。
所以这里可以看出一些手段,如果没有特别说明,我们可以先把自己服务器提权,上通用waf。
接下来是一些关键心得与技巧:
1、一开局时,需要队员的配合,一位队员负责去web页面挖漏洞,一位队员把代码download下来进行代码审计。最后一位队员负责先码好批量getshell的模板和批量提交flag的模板,有这个对于比赛来说提高效率非常重要,也是决定胜利的关键。(这里附上一个我自己写的批量漏洞利用模板,写了注释结合理解)
2、在别人队拿下自己队的服务器的时候,而自己队又还没挖到漏洞的时候,码代码那位队员可以来分析流量进行分析别人怎么利用漏洞的。这样是这种情况下最能拿分的方法。
这次我们挖到了一个任意文件上传漏洞,上传的木马被人删得剩一两台的时候。中后期基本被别人修补得没办法利用了。所以我们抓包分析到一个别人的马是直接拿到flag的,所以我们重放他们队的数据包,去打其他队,又拿到了三四队的flag。
除此之外,我们修补了上传的漏洞时候,但还是屡屡被getshell。我们从流量中寻找问题,才发现了在一个cookie中发现一个反序列化的漏洞可以读取文件。重放之后又可以拿到几队的flag了。(但还是有些队宁愿服务down掉扣分也不让其他队得分...报复社会心态)
3、尽量保证自己的webshell隐蔽和不被其他队利用。然后我看到一个比较有意思的马,理解p神的文章自己改进了一下。(过waf的话还是别指望这个,主要是防止其他队通用)增加了cookie字段并进行校验,具体详细知识点可以参考p神的无字母webshell文章。附上webshell:
因为加了else{header('HTTP/1.1404 NotFound');},如果没有带该cookie去访问,除了页面会显示404,真实状态码也会返回404,但实际上这个页面是存在的,只是被php代码改了。
但增加了cookie字段如何用菜刀连接?其实可以打开cknife界面添加路径后,右键设置,添加请求头中,增加cookie字段,如果c刀不带这个cookie去访问的话,是用不到这个马的。(为了更好地隐藏文件,或者考虑到一些队伍不敢乱删文件,所以文件名字改成了.server_conf.php)C刀设置请求头保存后连接的时候抓到的数据包是这样的:
这样就能顺利有效的连上webshell了
真正有效防止别人利用自己的webshell其实可以timestamp和nonce来做数字签名校验,具体可以参考这篇文章:https://blog.csdn.net/koastal/article/details/53456696
但由于怕服务器的时间有可能不准导致做了签名校验的webshell不能使用,所以没有加这种校验功能,于是简单的做了代码混淆。别人就没有那么轻易看懂的或者破解我们的源码了(比赛断网,无法在线解码):(简单混淆后还是可以连上的php↑)
然后抓取到获取flag的数据包就可以写批量拿flag的脚本了。
4、有些队伍可能比较关注http流量,很大几率我们的webshell被发现,可以使用多种可持续访问的方式进行维持拿flag得分,比如说上传一个ssh密钥上传到目标服务器上可以实现ssh免密码登陆,或者可以nc开端口进行监听,(后门注入到进程的权限要求可能比较高,而且比赛要求不能提权)。
SSH免密码登陆的过程:
首先在自己主机上生成公钥私钥,将公钥通过webshell传到目标主机上,要重命名成authorized_keys,然后我们主机向目标主机发送一个ssh连接请求。目标主机得到我们主机的信息后,在authorized_key中查找,如果有相应的用户名,则随机生成一个字符串,并用我们主机的公钥加密,发送给我们主机。我们主机得到目标主机发来的消息后,使用私钥进行解密,然后将解密后的字符串发送给目标主机。目标主机进行和生成的对比,如果一致,则允许免登录。
附上其他一些可持续访问的方式:
Windows生成后门:
linux生成后门:
5、简单防御的方法:除了修复代码外还可以在服务器部署文件监控的脚本,这样能快速找到新增的木马或者哪些页面被修改过,或者可以设置文件属性不能修改。
附上一个windows下的批处理脚本参考:
REM writed by3s_Nwgeek
@echo off&Setlocalenabledelayedexpansion
REM 指定路径
cd /dC:\Users\\Desktop\1
:cleanwebshell
for /r . %%a in (*)do (
REM 指定时间
if "%%~ta"gtr "2018/06/19 21:41" echo had been delete "%%a"
)
@ping nullnullnull-n 1 >nul
goto :cleanwebshell
注意:更改时间,此脚本会删除该时间后增加修改的文件(如果有bug不能删除文件,一定是系统时间格式不对,注意更改)
6、总结:当后门持续隐藏得越久,分值拿得越多,除了上传漏洞,还可以尝试弱口令、对应cms RCE漏洞进行getshell,方法思路不要太固定太套路。本次比赛获益良多,知道了自己很多方面的知识还要补充,见识到了各路神仙打架是怎样的,这种模式和普通的ctf做题模式不一样,初次接触,有不对或者能改进的地方多多指教。
版权声明
本文系作者授权合天智汇发表,未经许可,不得转载。
本文仅用于普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征等,若读者因此做出危害网络安全的行为后果自负,与合天智汇以及原作者无关,特此声明。
网友评论