PWN出题-docker
前言
该文章简单介绍一下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 | sudo systemctl start docker |
- 以非root用户运行docker(可选,若不设置每次docker要以sudo启动)
1 | sudo usermod -aG docker $USER |
- 简单测试:
1 | docker run hello-world |
效果:
若是不成功就说明被墙了,靠自己解决吧.
第二部分-指令
常用的
1 | docker version #查看版本 |
容器管理
指令 | 描述 |
---|---|
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 | FROM ubuntu:18.04 |
ctf.xinetd
1 | service ctf |
flag.sh
1 |
|
start.sh
1 |
|
上传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 进行许可。