PWN出题-docker

D0wnBe@t Lv4

前言

该文章简单介绍一下pwn出题的基本过程,仅限于docker部分,至于传到写题目的服务器上还没测试过.

Docker

第一部分-安装

引自GPT

  • 安装相关依赖
1
sudo apt install apt-transport-https ca-certificates curl software-properties-common
  • 添加docker官方的GPG密钥
1
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  • 添加docker的APT仓库
1
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 更新
1
sudo apt update
  • 安装docker
1
sudo apt install docker-ce
  • 启动docker并设置为开机自启
1
2
sudo systemctl start docker
sudo systemctl enable docker
  • 以非root用户运行docker(可选,若不设置每次docker要以sudo启动)
1
2
sudo usermod -aG docker $USER
# 然后重新登陆一次,或者:newgrp docker
  • 简单测试:
1
docker run hello-world

效果:

若是不成功就说明被墙了,靠自己解决吧.

第二部分-指令

常用的

1
2
3
4
5
6
7
8
9
10
11
12
docker version #查看版本
docker info # 查看 Docker 的系统信息,包括容器和镜像数量等

docker build -t <name> . # 制作镜像,注意这里有个点
docker images # 查看制作的镜像
docker rmi <id> # 删除本地镜像

docker run -dit --name <image_name> --rm -p 9999:9999 -v $(pwd):/app <id> # 使镜像run起来
docker ps # 查看正在运行的容器

docker search <name> # 在 Docker Hub 中搜索镜像。
docker save -o <file> <image> # 保存镜像到本地文件。

容器管理

指令 描述
docker ps 查看运行中的容器列表。
docker ps -a 查看所有容器(包括已停止的容器)。
docker run <options> <image> 创建并启动一个容器。
docker start <container> 启动已停止的容器。
docker stop <container> 停止运行中的容器。
docker restart <container> 重启容器。
docker rm <container> 删除容器。
docker logs <container> 查看容器的日志输出。
docker exec -it <container> <command> 在容器中运行命令(交互模式)。
docker attach <container> 附加到容器的控制台。
docker kill <container> 强制停止容器。

常用参数

  • -d:后台运行容器(detached 模式)。
  • -p:端口映射,例如 -p 8080:80
  • -v:挂载数据卷,例如 -v /host/path:/container/path
  • --name:为容器指定名称。
  • --rm:容器退出后自动删除。
  • --network:指定网络。

第三部分-dockerfile

该部分跟着下面的pwn出题一起说吧

PWN出题

xinetd

项目地址:https://github.com/CTF-Archives/ctf-docker-template

使用:

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

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

  • 相关使用项目中也说得比较清楚,比如说我们要出一个ubuntu18.04环境下的题目,那么进入到该项目的ubuntu18.04的目录下,将我们的程序放入到src的目录下即可,注意程序名字设置为attachment,如果要更改的话要修改下面的地方:

测试

  • 将一写好的且在ubuntu18.04下编译好的attachment可执行文件,放入到./src里面,然后制作镜像:
1
docker build -t ezstack . # ezstack自己取得镜像名字

这样便是制作好了镜像文件,然后让它run起来

1
docker run -dit --name ezstack --rm -p 9999:9999 -v $(pwd):/app 652fe6597d2a

选项详解:

  • **-d**:后台运行容器(detached 模式)。

  • **-i**:让容器保持交互状态(即使没有终端连接)。

  • **-t**:分配一个伪终端(TTY),通常和 -i 一起使用。

  • **--name ezstack**:为容器命名为 ezstack,方便后续操作。

  • **--rm**:容器退出后自动删除,确保运行的容器不会占用多余的存储。

  • **-p 9999:9999**:将主机的 9999 端口映射到容器的 9999 端口。这允许从主机访问容器的服务。

  • -v $(pwd):/app

    将当前目录挂载到容器中的 ./app目录下

    • $(pwd) 是主机当前目录的路径。
    • /app 是容器内的路径。
      挂载后,主机目录中的文件可以直接在容器内访问,适合开发和调试。

652fe6597d2a
这是一个镜像 ID,表示使用该镜像来启动容器。镜像 ID 通常可以通过 docker images 命令找到。

这样便是说明该容器已经在运行了,并且影射了端口,下面我们来测试一下连接以及脚本

  • 连接
1
nc -vz ip 9999 # 仅测试是否会连接上

很明显是布置成功了,下面测试一下脚本:

  • 脚本:

Dockerfile

  • 主要关注于Dockerfile,ctf.xinetd,flag.sh,start.sh

  • 关于这部分跟平台有关,不同平台的要求或许有不同,这里贴一份天权信安出题的一份dockerfile

Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
FROM ubuntu:18.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 && apt-get install -y xinetd build-essential

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 && \
cp /usr/bin/timeout /home/ctf/bin

COPY ./ctf.xinetd /etc/xinetd.d/ctf
COPY ./flag.sh /tmp
COPY ./src/attachment /home/ctf
COPY ./flag /home/ctf
COPY ./fake_flag /home/ctf
COPY ./start.sh /home/ctf
RUN chmod 777 /tmp/flag.sh

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

RUN echo "Blocked by ctf_xinetd" > /etc/banner_fail
RUN echo 'ctf - nproc 1500' >>/etc/security/limits.conf

CMD ["/bin/bash", "-c", "/etc/init.d/xinetd start; trap : TERM INT; sleep infinity & wait"]
EXPOSE 9999

ctf.xinetd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
service ctf
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
type = UNLISTED
port = 9999
bind = 0.0.0.0
server = /usr/sbin/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
}

flag.sh

1
2
3
4
5
6
7
8
9
10
11
#! /bin/bash
name=`basename $0 .sh`
flag=$TQ_FLAG
if [ ! -n "$TQ_FLAG" ] ;then
echo "Incomplete Parameter!"
else
echo "$flag" > /home/ctf/flag
chmod 644 /home/ctf/flag
rm -rf /tmp/flag.sh
fi
exit 0

start.sh

1
2
3
4
#!/bin/sh
# Add your startup script
echo $TQ_FLAG>/home/ctf/flag
chmod 755 /home/ctf/flag

上传GZ-CTF

  • 这部分以后有时间再写吧
  • 标题: PWN出题-docker
  • 作者: D0wnBe@t
  • 创建于 : 2024-12-03 13:10:49
  • 更新于 : 2024-12-03 14:17:44
  • 链接: http://downbeat.top/2024/12/03/PWN出题-docker/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论