简单介绍
比赛规则(新):
-
每个队伍分配到一个docker主机,给定ctf用户权限,通过制定的端口和密码进行连接;
-
每台docker主机上运行一个web服务或者其他的服务,需要选手保证其可用性,并尝试审计代码,攻击其他队伍;
-
比赛开始后,前30分钟,选手维护各自的主机,在这个阶段,所有的攻击和服务不可用不影响分数;
-
选手可以通过使用漏洞获取其他队伍的服务器的权限,读取他人服务器上的flag并提交到指定的flag服务器:
http://flag服务器IP:端口/fflag_file.php?token=队伍token&flag=获取到的flag 来获得相应的分数。
例如:flag server地址为8.8.8.8,端口为8080,队伍token为team1,flag为40ed892b93997142e46124516d0f5ac0,则请求http://8.8.8.8:8080/fflag_file.php?token=team1&flag=40ed892b93997142e46124516d0f5ac0来获得相应分数。
每次成功攻击可获得2分,被攻击者扣除2分;有效攻击两分钟一轮;
-
选手需要保证己方服务的可用性,每次服务不可用,扣除1分,服务可用,加1分;服务检测两分钟一轮;
-
选手可以从flag服务器上获取所有的攻击情况以及当前的分数:
攻击情况url地址:http://flag服务器IP:端口/result.txt
得分情况地址:http://flag服务器IP:端口/score.txt
平台搭建
因为平台已经做的比较集成化,所以安装还是很简单的。博主使用的是ubuntu安装。
-
首先需要下载赛题项目
旧 git clone https://github.com/zhl2008/awd-platform #这一条命令可以将文件下载到当前工作目录,文件名为awd-platform 新 git clone https://gitee.com/jikemofan/awd-platform.git
因为项目地址是在github上面,所以对某些国内用户可能会有一些网络问题,这里博主搬运了一下,上传到csdn上面了。(点击前往)
-
然后需要下载docker
sudo apt install docker.io
这里如果没有更换apt源可能会比较慢,网上搜了一个教程(点击前往),这里不做赘述。
-
下载docker镜像
sudo docker pull zhl2008/web_14.04 ##下载镜像文件 sudo docker tag zhl2008/web_14.04 web_14.04 ##更改镜像名称
这里可能会比较慢,换一下docker源就可以了vi /etc/docker/daemon.json
在文件中输入
{ "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"] }
重启服务,之后再次尝试下载
service docker restart
下载好之后改名
启动比赛
-
首先是确认赛题和队伍数量
这里的web开头的都是赛题
输入命令创建队伍cd ~/awd-platform #切换到第一步下载的赛题项目文件夹下面 python batch.py web_yunnan_simple 2
这里创建了2个队伍,赛题是web_yunnan_simple
-
根据赛题修改check.py(awd-platform/check_server/目录下)文件,找到check类
class check(): def __init__(self): print "checking host: "+host def index_check(self): res = http('get',host,port,'/','',headers) if 'Home' in res: return True if debug: print "[fail!] index_fail" return False def test_check(self): res = http('get',host,port,'/about.php?file=header.php','',headers) if 'About' in res: return True if debug: print "[fail!] test_fail" return False def test_check_2(self): headers['Cookie'] = '' data = 'key=1' res = http('get',host,port,'/services.php',data,headers) if 'Services' in res: return True if debug: print "[fail!] test_2_fail" return False
-
修改flag刷新时间,同样是check.py文件中,默认120s,2分钟
-
创建好队伍后就可以开始比赛了,输入命令启动比赛
python start.py ./ 2
-
查看创建的队伍机器
输入命令查看创建的虚拟靶机(docker创建的是容器,大家可以理解成为是虚拟机,不做详细介绍)
docker ps
可以看到这里多了2个名字分别为team1和team2的容器,并且观察这2行记录可以得到如下信息。主机端口 team1靶机端口 team2靶机端口 8801 80(web服务端口) 8802 80(web服务端口) 2201 22 (ssh连接端口) 2202 22 (ssh连接端口) -
此时可以访问一下team1的网站
-
运行修改过后的check.py文件
得分
-
首先看一下当前比分,有2个地方可以看到。
第一个,访问http://ubuntu主机IP地址:8080/score.txt
很简陋,可以去找一个好看的替换它。
第二个,在ubuntu终端运行check.py脚本
-
现在模拟一下team2队拿下team1的flag
从team1的网站下手,观察了一下为网页,发现网站首页底部有一个命令注入点
3.尝试找到flag
首先尝试ls根目录
发现可以直接输出根目录信息,并且找到敏感信息flag,接下来继续在命令注入点输入cat /flag
成功找到一个flag。
-
提交fiag给自己的队伍加分。
加分的方法是访问一个为地址并且以get的形式上交flag
http://ubuntu主机IP地址:8080/flag_file.php?token=teamx&flag=xxxx (x为队伍号)
上传flag,flag正确的话就会显示success(有可能会提示没有这个flag,有可能是flag刷新了,重新去获取一下flag,用新的flag提交)
-
现在还没有过30分钟的准备阶段,所以现在的攻击是不得分的。
结束比赛
sudo python stop_clean.py