GZCTF动态flag部署教程

如何在GZCTF部署简单的Web和PWN动态flag?

前言

作者想要打造一个属于我们00后自己的CTF平台,欢迎CTFSer们来投稿题目,后台菜单栏加群,服务器已经备好,上行50M,下行100M,物理机,配置不够再加,里面的题目主打一个有趣,社工,烧脑,不当人,哈哈哈,地址:http://ctf54cto.com,感谢 武汉网盾科技公司 的服务器支持

image-20240901215839189

不知道为什么今天,我的dockerHub push的时候连接超时,只能本地演示了,不上传到自己的dockerhub,如果你们有自己的加速源,当然也可以之际push到自己的dockerHub仓库。

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>

image-20240901170141470

我所使用的平台无需暴露端口,如有需要可以使用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

目录结构

image-20240901174946325

确保你已经docker login,拥有自己的docker账号

使用build命令,构建本地的题目镜像,xiaoyuss为你的docker镜像名,可以参考我以前的文章,webtest为镜像名(自定义),"."为版本号,代表latest,也可以自定义,不过拉取时记得加上版本号

docker build -t name/webtest .

image-20240901175545428

接下来部署题目,类型记得选择动态容器,不同平台可能有所不同,这里以GZCTF为例。

image-20240901180107010

启动赛题

image-20240901180514607

flag随机生成成功

image-20240901180646201

PWN篇

首先下载一个库,pwn题基本逻辑一般为利用栈溢出漏洞,打通后得到shell权限,因此把flag文件放在容器的根目录或其他目录下即可,为了安全,这里在ctf_xinetd基础上做出一些修改来进行pwn题的部署

git clone https://github.com/Eadom/ctf_xinetd.git
cd ctf_xinetd

image-20240901215141316

修改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}这个变量,不然随机不成功

image-20240901212506449

打包到本地Docker仓库

docker build -t xiaoyuss/pwntest .

image-20240901202601121

编辑题目的时候注意端口

image-20240901213607620

启动实例

image-20240901213341357

image-20240901213332105

提交flag测试

image-20240901213452293

本站内容部分转载于互联网,并不代表本站立场!如若本站内容侵犯了原著者的合法权益,可联系我们进行处理! 拒绝任何人以任何形式在本站发表与中华人民共和国法律相抵触的言论!
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容