~ 今日之事,尽心尽力 ~
前言
作者想要打造一个属于我们00后自己的CTF平台,欢迎各位有志人士们来投稿题目,后台菜单栏加群,服务器已经备好,上行50M,下行100M,物理机,配置不够再加,里面的题目主打一个有趣,社工,烧脑,不当人,哈哈哈
地址:http://ctf.54cto.com
非常感谢 武汉网盾科技公司 的服务器支持
正式开始
继上一篇:从0-1搭建开源GZCTF比赛平台教程,Docker部署,添加题目,小白都能看懂!
不知道为什么今天,我的dockerHub push到自己仓库的时候,连接超时,只能本地演示了,不上传到自己的dockerhub,如果你们有自己的加速源,当然也可以之际push到自己的dockerHub仓库。
docker的使用教程可以参考我的这篇文章:搭建高效攻防靶场vulfocus与Docker仓库管理实战
Web篇章
web题,首先是需要按照常规逻辑写一个网页,这里就写一个带flag的简单网页,把flag放在源代码里,并注释掉。创建一个html文件,代码如下
<!DOCTYPE html>
<html>
<head>
<title>签到</title>
</head>
<!--flag{testflag}-->
<body>
<?php
echo "Do u want 2 sign??<br>";
?>
</body>
</html>
我所使用的平台无需暴露端口,如有需要可以使用EXPOSE 80暴露80端口。接下来实现动态flag,还记得上面提到的flag.sh吗,先来看一下它的代码,同样相关解释写在注释里,正式使用记得删掉注释。
#!/bin/sh #必需的东西没什么好讲的
sed -i "s/flag{testflag}/$GZCTF_FLAG/" /var/www/html/index.php #使用平台的动态flag替换
# index.php中的flag,这里我使用的平台为GZCTF,因此动态flag环境变量为$GZCTF_FLAG,其他平台一般为$FLAG
export GZCTF_FLAG="" #这一句暂时不知道什么作用,但是要写着
flag.sh文件完整内容
#!/bin/sh
sed -i "s/flag{testflag}/$GZCTF_FLAG/" /var/www/html/index.php
export GZCTF_FLAG=""
接下来编写Dockerfile,各语句解释就写在后面的注释里吧,正式编写请删掉注释。
FROM ctftraining/base_image_nginx_mysql_php_56 #web题docker基础镜像,这里使用ctftraing打包好
的,包含了基础的nginx,mysql,php环境,并且会自动运行flag.sh脚本(后面会提到),本题使用php环境。
COPY src /var/www/html # 将你编写的网页源码复制到docker容器中,这里为php网页,因此只需要
复制源码到/var/www/html就可以了,其他类型网页按照实际部署情况COPY到docker中相应目录下就可以了
RUN mv /var/www/html/flag.sh / #把你源码中的flag.sh复制到根目录以便自动执行
&& chmod +x /flag.sh #添加运行权限
Dockerfile完整内容
FROM ctftraining/base_image_nginx_mysql_php_56
COPY src /var/www/html
RUN mv /var/www/html/flag.sh /
&& chmod +x /flag.sh
目录结构
确保你已经docker login
,拥有自己的docker账号
使用build命令,构建本地的题目镜像,xiaoyuss为你的docker镜像名,可以参考我以前的文章,webtest
为镜像名(自定义),"."
为版本号,代表latest
,也可以自定义,不过拉取时记得加上版本号
docker build -t name/webtest .
接下来部署题目,类型记得选择动态容器,不同平台可能有所不同,这里以GZCTF为例。
启动赛题
flag随机生成成功
PWN篇
首先下载一个库,pwn题基本逻辑一般为利用栈溢出漏洞,打通后得到shell权限,因此把flag文件放在容器的根目录或其他目录下即可,为了安全,这里在ctf_xinetd基础上做出一些修改来进行pwn题的部署
git clone https://github.com/Eadom/ctf_xinetd.git
cd ctf_xinetd
修改Dockerfile如下内容
FROM ubuntu:16.04
RUN sed -i "s/http://archive.ubuntu.com/http://mirrors.tuna.tsinghua.edu.cn/g" /etc/apt/sources.list &&
apt-get update && apt-get -y dist-upgrade &&
apt-get install -y lib32z1 xinetd
RUN useradd -m ctf
WORKDIR /home/ctf
RUN cp -R /lib* /home/ctf &&
cp -R /usr/lib* /home/ctf
RUN mkdir /home/ctf/dev &&
mknod /home/ctf/dev/null c 1 3 &&
mknod /home/ctf/dev/zero c 1 5 &&
mknod /home/ctf/dev/random c 1 8 &&
mknod /home/ctf/dev/urandom c 1 9 &&
chmod 666 /home/ctf/dev/*
RUN mkdir /home/ctf/bin &&
cp /bin/sh /home/ctf/bin &&
cp /bin/ls /home/ctf/bin &&
cp /bin/cat /home/ctf/bin
COPY ./ctf.xinetd /etc/xinetd.d/ctf
COPY ./flag.sh /flag.sh
RUN echo "Blocked by ctf_xinetd" > /etc/banner_fail
RUN chmod +x /flag.sh
COPY ./bin/ /home/ctf/
RUN chown -R root:ctf /home/ctf &&
chmod -R 750 /home/ctf &&
chmod 740 /home/ctf/flag
CMD ["/flag.sh"]
EXPOSE 70
修改后的ctf.xinetd
service ctf
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
type = UNLISTED
port = 70
bind = 0.0.0.0
server = /usr/sbin/chroot
# replace helloworld to your program
server_args = --userspec=1000:1000 /home/ctf ./pwn#pwn为二进制可执行文件的文件名
banner_fail = /etc/banner_fail
# safety options
per_source= 10 # the maximum instances of this service per source IP address
rlimit_cpu= 20 # the maximum number of CPU seconds that the service may use
#rlimit_as = 1024M # the Address Space resource limit for the service
#access_times = 2:00-9:00 12:00-24:00
}
把"start.sh"改为"flag.sh",以下为flag.sh的具体内容
#!/bin/sh
# Add your startup script
#!/bin/sh
sed -i "s/flag{pwntestflag}/$GZCTF_FLAG/" /home/ctf/flag
export GZCTF_FLAG=""
# DO NOT DELETE
/etc/init.d/xinetd start;
sleep infinity;
然后修改flag的内容为flag{pwntestflag}
这个变量,不然随机不成功
打包到本地Docker仓库
docker build -t xiaoyuss/pwntest .
编辑题目的时候注意端口
启动实例
提交flag测试
记忆犹新
【渗透测试】ATT&CK靶场一,phpmyadmin,域渗透,内网横向移动攻略
原文始发于微信公众号(泷羽Sec):如何在GZCTF部署简单的Web和PWN动态flag?
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论