docker 使用

# 前言

docker 是一款精简的虚拟机。

image 镜像:储存固定的系统镜像。类似模板,类,或者类似 VMware 虚拟机的快照。

container 容器:从镜像生成出的实例。类似成品,对象,或者正常情况的 vmware 虚拟机。储存运行时的任何修改。

一个 image 可以生成出很多 container。container 可以保存为 image,然后供自己或他人后续使用。

# 包含

虚拟机包含的软件。

  • pwntools —— CTF framework and exploit development library
  • pwndbg —— a GDB plug-in that makes debugging with GDB suck less, with a focus on features needed by low-level software developers, hardware hackers, reverse-engineers and exploit developers
  • pwngdb —— gdb for pwn
  • ROPgadget —— facilitate ROP exploitation tool
  • roputils —— A Return-oriented Programming toolkit
  • one_gadget —— A searching one-gadget of execve(‘/bin/sh’, NULL, NULL) tool for amd64 and i386
  • angr —— A platform-agnostic binary analysis framework
  • radare2 —— A rewrite from scratch of radare in order to provide a set of libraries and tools to work with binary files
  • seccomp-tools —— Provide powerful tools for seccomp analysis
  • linux_server[64] —— IDA 7.0 debug server for linux
  • tmux —— a terminal multiplexer
  • ltrace —— trace library function call
  • strace —— trace system call

# ubuntu 初始化脚本

pwndbg 仅负责 ubuntu22.04 版本及以上的可用性。在低版本可能不适用。github 尤其指出了 ubuntu18.04 已停止支持并给出了最后版本的代码。在安装时还需将 setup.sh 内的 git submodule update --init --recursive 注释掉,因为文件夹内不含 .git 文件夹并且不能更新至最新库。

同时需要设置 locale,使得 LC_CTYPE=en_US.UTF-8.

#!/bin/sh
cd /root/
unminimize
apt install vim
apt install git
apt install python3-pip
#pip3 install setuptools
pip3 install --upgrade pip setuptools

sudo pip3 install pwntools

# git clone https://github.com/pwndbg/pwndbg.git
if [ ! -f '2023.07.17.tar.gz' ]; then
	wget https://github.com/pwndbg/pwndbg/archive/refs/tags/2023.07.17.tar.gz
fi
tar -xzvf 2023.07.17.tar.gz
mv pwndbg* ./toolbox/pwndbg
cd ./toolbox/pwndbg
./setup.sh


# docker 容器

  • ubuntu18.04 skysider/pwndocker
docker pull skysider/pwndocker
  • pwndocker

# included glibc

Default compiled glibc path is /glibc .

  • 2.19 —— ubuntu 12.04 default libc version
  • 2.23 —— ubuntu 16.04 default libc version
  • 2.24 —— introduce vtable check in file struct
  • 2.27 —— pwndocker default glibc version
  • 2.28~2.31 —— latest libc versions

# 使用

建议用官方的使用姿势,用如下命令 run 起来

docker run -d \
	--rm \
	-h ${ctf_name} \
	--name ${ctf_name} \
	-v $(pwd)/${ctf_name}:/ctf/work \
	-p 23946:23946 \
	--cap-add=SYS_PTRACE \
	skysider/pwndocker

其中有两个重要的参数
- v (pwd)/(pwd)/{ctf_name}:/ctf/work 是将当前目录下的文件映射到 docker /ctf/work 目录下
这样你在物理机修改文件,docker 里面也会发生变化,就不用再 docker cp 了

–cap-add=SYS_PTRACE 这个参数也是要一定加的,不然 docker 里面没法用 gdb 调试。

可以把上述命令放到 pwndocker_run.sh 里面 方便下次使用

# ?多终端调试

然后调试脚本时,要先进去 tmux ,python 脚本里面指定终端为 tmux

context.terminal = ['tmux', 'sp', '-h']

就可以 gdb.attach (p) 了 如下图

docker run -itd --name u18 ubuntu:18.04 /bin/bash
docker cp -L u18:/lib/x86_64-linux-gnu/libselinux.so.1 .
docker cp -L u18:/lib/x86_64-linux-gnu/libpcre2-8.so.0 .
docker cp libselinux.so.1 pwn:/glibc/2.28/64/lib/
docker cp libpcre2-8.so.0 pwn:/glibc/2.28/64/lib/

# docker 进程

docker 进程启动、停止、重启,常见的三种 case

service docker start	# 启动 docker
service docker stop		# 关机 docker
service docker restart	# 重启 docker

# 镜像操作

镜像作为容器执行的前提条件,一般需要掌握的几个命令无非是搜索,下载,删除,创建

docker images		# 镜像列表
docker search xxx	# 检索镜像,从镜像仓库中检索
docker pull xxx		# 下载镜像
docker rmi xxx		# 删除镜像

关于创建镜像,有必要稍微详细一点点

docker commit -m="首次提交" -a="一灰灰Blog" dd85eb055fe8 yh/centos:v0.1	# 通过容器创建镜像
docker history yh/centos	# 镜像历史查询

上面的几个参数进行说明

  • -m 和 git 的提交一样,后面更上描述信息
  • -a 版权声明,这个东西是我创建的,有啥问题,找我
  • dd85eb055fe8 容器 id
  • yhh/quick-os:0.1 创建的镜像名

# 容器操作

接下来就是正菜了,容器的各种操作,启动,关闭,重启,日志查询以及各种进入容器内部搞事情

# 创建

万事开头第一步,加载镜像,创建容器

docker run 镜像名:版本 程序指令

run 后面可以跟很多的参数,比如容器暴露端口指定,存储映射,权限等等,由于参数过多,下面只给出几个不同的例子,来具体的演示参数可以怎么加 +

# 常用参数

参数 示例 作用
-i 打开 STDIN,支持交互
-t 支持终端登陆
-v 设置共享文件夹。宿主目录:容器目录
-d 设为后台运行
–name –nam=u18 指定容器名称
-p -p 8080:80 暴露端口。宿主端口:容器端口
–restart –restart=always 程序终止后是否重启

# 示例

创建交互型容器

docker run -it centos:latest /bin/bash

创建容器后运行在后台

docker run -i -t -d centos:latest

创建容器,运行后台,结束后自动重启,设置名称、端口、共享目录。

docker run -d --restart=always --name=yhh_centos -p 8080:80 -v /home/yihui/html/www:/var/www centos:latest

# 基础操作

容器创建完毕之后,就是一些基本操作了,启动、停止、重启、删除

docker ps -a		# 查看容器列表, 列出所有的容器
docker start xxx	# 启动容器,start 后面可以跟上容器名,或者容器 id
# (这里的 xxx 可以是容器名:yhh_centos 也可以是容器 id:f57398ab22c5)
docker stop xxx		# 关闭容器
docker restart xxx	# 重启
docker rm xxx		# 删除

在查看容器列表时,如果某个容器的启动参数特别长,直接使用 docker ps -a 会发现看不到完整的启动命令,这个时候可以带上参数 --no-trunc 来显示完整命令

docker ps -a --no-trunc

# 高级操作

接下来进入一些容器的高级操作技巧(实际上也并没有特别酷炫)

为了演示一些进阶的内容,这里创建一个容器作为测试

docker run -it -d --name=yhhos centos

# 容器日志查询

日志,定位问题的神器

docker logs yhhos	# 查询 xxx 容器的日志

基本上不太会直接使用上面的命令,因为上面把所有的日志都打印出来了,可以直接晃瞎我们的钛合金 x 眼

一般日志可以加两个参数 -f , -t

docker logs -f -t --since="2019-05-11" --tail=10 yhhos
  • --since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
  • -f : 查看实时日志
  • -t : 查看日志产生的日期
  • --tail=10 : 查看最后的 10 条日志。

# 文件拷贝

将容器的某个文件捞出来;或者强塞,一个 cp 即可

# 将当前目录的 test.md 文件拷贝到容器的 /tmp 目录下
docker cp test.md yhhos:/tmp
# 将容器的 /tmp/test.md 目录拷贝到当前目录下
docker cp yhhos:/tmp/test.md ./out.md

# 进入容器

进入容器内部,然后就可以为所欲为了…

docker exec -it yhhos /bin/bash

# 获取容器所有信息

docker inspect yhhos

# 环境变量设置

docker 环境变量设置_dockerfile env path-CSDN 博客

# tmux

用于在 docker 同时运行多个终端。尤其是在使用 gdb.attach() 时十分有用。

更新于

请我喝[茶]~( ̄▽ ̄)~*

Walt CSZ 微信支付

微信支付

Walt CSZ 支付宝

支付宝