pwn-ubuntu_16.04

环境说明

提供 Ubuntu 16.04 GLIBC 2.23 的基础环境,并已经添加 lib32z1 + xinetd 软件包,并基于 xinetd 实现服务转发,默认暴露端口位于9999

实现:当选手连接到对应端口(默认为9999端口,默认选手使用 netcat )的时候,运行 程序文件,并将会话转发至选手的连接

镜像做到:

  • 选手通过端口连接到容器/靶机
  • xinted服务检测到连接,启动一个 chroot 会话
  • chroot 通过参数 --userspec=1000:1000 /home/ctf 限制了程序运行时的账户权限,并更改了程序运行时的root根目录环境位置为 /home/ctf ,然后在限制环境中启动程序
  • xinted 将程序会话转发给选手的连接

如何使用

将程序文件放入 ./src 目录即可,文件名请修改为 attachment 作为文件名,便于镜像定位程序位置

如果需要更改为自己的文件名,需要在 ./config/ctf.xinetd./Dockerfile 和 ./service/docker-entrypoint.sh 中进行修改

程序放置进 ./src 目录之后,执行

docker build .

即可开始编译镜像

也可以在安放好程序文件之后,直接使用 ./docker/docker-compose.yml 内的 docker-compose 文件实现一键启动测试容器

cd ./docker
docker-compose up -d

整理文件创建

图片[1]-pwn-ubuntu_16.04-松鼠博客

Github:https://github.com/CTF-Archives/ctf-docker-template/tree/main/pwn-ubuntu_16.04/src

config目录下面有ctf.xinetd

service ctf
{
    disable = no
    socket_type = stream
    protocol    = tcp
    wait        = no
    user        = root
    type        = UNLISTED
    port        = 9999
    bind        = 0.0.0.0
    # 设置xinetd连接启动后的服务程序
    server      = /usr/sbin/chroot
    # 设置chroot的相关参数
    server_args = --userspec=1000:1000 /home/ctf ./attachment
    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
}

docker目录下面有docker-compose.yml

version: '3'
services:
  test:
    build: ../
    environment:
      # 仅为测试用flag
      FLAG: "flag{a63b4d37-7681-4850-b6a7-0d7109febb19}"
    ports:
      # 设置了暴露端口
      - 9999:9999
    restart: unless-stopped

service目录下面有docker-entrypoint.sh

#!/bin/sh

# Get the user
user=$(ls /home)

# Check the environment variables for the flag and assign to INSERT_FLAG
if [ "$DASFLAG" ]; then
    INSERT_FLAG="$DASFLAG"
    export DASFLAG=no_FLAG
    DASFLAG=no_FLAG
elif [ "$FLAG" ]; then
    INSERT_FLAG="$FLAG"
    export FLAG=no_FLAG
    FLAG=no_FLAG
elif [ "$GZCTF_FLAG" ]; then
    INSERT_FLAG="$GZCTF_FLAG"
    export GZCTF_FLAG=no_FLAG
    GZCTF_FLAG=no_FLAG
else
    INSERT_FLAG="flag{TEST_Dynamic_FLAG}"
fi

# 将FLAG写入文件 请根据需要修改
echo $INSERT_FLAG | tee /home/$user/flag

# 赋予程序运行权限
chmod 711 /home/ctf/attachment

/etc/init.d/xinetd start;
sleep infinity;

src目录下面很重要,就是把自己写好的C语言gcc之后打包成二进制将名称改为attachment,如果你要自定义自己名字就得要找到相应的位置去修改它。

图片[2]-pwn-ubuntu_16.04-松鼠博客
图片[3]-pwn-ubuntu_16.04-松鼠博客

将上面两个地方改成自己的文件命名的名称即可

Dockerfile文件里面的代码要改

FROM ubuntu:16.04

# 制作者信息
LABEL auther_template="CTF-Archives"

# apt更换镜像源,并安装相关依赖
RUN sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list && \
    sed -i 's@//.*security.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
RUN apt-get update && apt-get -y dist-upgrade && \
    apt-get install -y lib32z1 xinetd

# 新建用户,并进行账户改变
RUN useradd -m ctf
WORKDIR /home/ctf

# 复制相关lib,并处理环境
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/*

# 设置xinetd启动之后,chroot限制能使用的bin程序
RUN mkdir /home/ctf/bin && \
    cp /bin/sh /home/ctf/bin && \
    cp /bin/ls /home/ctf/bin && \
    cp /bin/cat /home/ctf/bin && \
    cp /usr/bin/timeout /home/ctf/bin

# 部署xinetd服务
COPY ./config/ctf.xinetd /etc/xinetd.d/ctf
RUN echo "Blocked by ctf_xinetd" > /etc/banner_fail

# 复制容器启动脚本
COPY ./service/docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh

# 部署程序
COPY ./src/attachment /home/ctf/attachment

# 初始化flag
RUN chown -R root:ctf /home/ctf && \
    chmod -R 750 /home/ctf && \
    touch /home/ctf/flag && \
    chmod 744 /home/ctf/flag

EXPOSE 9999

# 指定容器入口点
ENTRYPOINT ["/bin/bash","/docker-entrypoint.sh"]

Dockerfile里面部署程序如果要自定义也需要改如果不自定义名称的话直接将文件名称改成attachment

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容