pwn_docker题目部署
zach0ry

docker

Docker 是一个 容器化工具

在不同的环境下,程序可能因为处于不同的环境无法正常运行, docker能把 程序 + 依赖环境 一起打包成一个标准的“盒子”(镜像),然后在任何地方都能运行(容器),容器就是镜像的动态实例.

组成部分

docker主要有四部分:

镜像 (Image)
相当于一个“安装包”或者“模版”。里面写明了操作系统、依赖库、程序文件。

容器 (Container)
镜像运行后的实例,就像“安装包”安装出来并运行的程序。容器是活的,可以改动、运行、停止、删除。

Dockerfile
就是一份“说明书”,写清楚镜像怎么制作。

仓库 (Registry)
存放镜像的地方,比如:

基础操作

1.查看本地镜像

1
docker images

image-20250923144450966

2.构造镜像

生成一个镜像 (Image),存在于本地的 Docker 镜像库里。

1
docker build -t <镜像名[:tag]> (构建上下文目录)

image-20250923150108432

3.上传镜像

1
docker push <IMAGE>([<仓库名>/]<命名空间>/<REPO>:<TAG>)

image-20250923151009446

4.查看本地镜像

1
docker images

image-20250923151131427

5.删除镜像

1
docker rmi -<版本号>

image-20250923151337683

pwn部署

首先要创建自己的阿里云

image-20250923161203795

image-20250923161250351

这些操作好之后在虚拟机中执行以登录自己的阿里云账号(一般登陆一次之后会一直保持登录状态)

image-20250923161338580配置代理

1.开启小猫的Allow LAN (允许局域网连接)

image-20250923153535459

默认情况下,Clash 只监听 本机回环地址(127.0.0.1:7890),只有 Windows 自己能用代理。勾选了 Allow LAN,Clash 会监听 0.0.0.0:7890,也就是允许 局域网内其他设备(虚拟机、Docker 容器、手机等)通过你的电脑的 IP 地址来使用代理

2.然后去查看Windows 宿主机上的虚拟网卡

1
ipconfig.exe

image-20250923155246437

3.文本编辑器打开,写入

1
sudo vim /usr/bin/dockerproxy

4.改宿主机ip和端口输入

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/bin/bash

# Docker 代理管理脚本
# 使用方法: sudo ./docker-proxy.sh [set|unset] [proxy_address]

set -e

# 默认代理地址
DEFAULT_PROXY="网卡:7890"
PROXY_DIR="/etc/systemd/system/docker.service.d"
PROXY_CONF="$PROXY_DIR/http-proxy.conf"

# 显示使用说明
usage() {
echo "使用方法: $0 [set|unset] [proxy_address]"
echo " set [proxy_address] - 设置 Docker 代理 (默认: $DEFAULT_PROXY)"
echo " unset - 取消 Docker 代理配置"
exit 1
}

# 检查是否以 root 权限运行
check_root() {
if [ "$EUID" -ne 0 ]; then
echo "请使用 sudo 或以 root 权限运行此脚本"
exit 1
fi
}

# 设置 Docker 代理
set_proxy() {
local proxy_addr=${1:-$DEFAULT_PROXY}

echo "正在设置 Docker 代理: $proxy_addr"

# 创建配置目录
mkdir -p "$PROXY_DIR"

# 创建代理配置文件
cat > "$PROXY_CONF" << EOF
[Service]
Environment="HTTP_PROXY=http://$proxy_addr"
Environment="HTTPS_PROXY=http://$proxy_addr"
Environment="NO_PROXY=localhost,127.0.0.1,.docker.internal,.hubproxy.docker.internal"
EOF

# 重新加载配置并重启 Docker
systemctl daemon-reload
systemctl restart docker

echo "Docker 代理设置完成"
echo "当前代理配置:"
systemctl show --property=Environment docker
}

# 取消 Docker 代理配置
unset_proxy() {
echo "正在取消 Docker 代理配置"

# 删除代理配置文件
if [ -f "$PROXY_CONF" ]; then
rm -f "$PROXY_CONF"
echo "已删除代理配置文件: $PROXY_CONF"
else
echo "未找到代理配置文件: $PROXY_CONF"
fi

# 重新加载配置并重启 Docker
systemctl daemon-reload
systemctl restart docker

echo "Docker 代理配置已取消"
echo "当前环境变量:"
systemctl show --property=Environment docker
}

# 主程序
main() {
check_root

case "$1" in
set)
set_proxy "$2"
;;
unset)
unset_proxy
;;
*)
usage
;;
esac
}

# 执行主程序
main "$@"

然后赋执行权限

1
sudo chmod +x /usr/bin/dockerproxy
  • 网卡(模糊化处理)→ 宿主机的 IP(在虚拟网络环境下 VM/容器可达的地址)
  • 7890 → 代理软件提供的服务端口(通常是 HTTP/HTTPS 代理,常见于 Clash)
  • 作用:让 Docker 的网络请求走代理,加速/绕过网络限制。
1
DEFAULT_PROXY="网卡:7890"

在宿主机(Windows)上跑 Clash,开了一个代理:

但是在 Kali 虚拟机里跑 Docker,要让 Docker 用这个代理:

  • 在 VM 里写 127.0.0.1:7890 是不对的,因为那是 VM 自己。
  • 要写宿主机在 VM 眼中的地址,比如 网卡:7890。这样 Docker 请求才会正确发到宿主机的代理。

使用

1
2
sudo dockerproxy set#使用代理
sudo dockerproxy unset#取消代理

image-20250923155629113

也可以自定义代理

1
sudo dockerproxy set 172.27.16.1:7890

验证是否走代理

1
docker info | grep -i proxy

image-20250923155742600

HTTP Proxy / HTTPS Proxy → Docker Daemon 的全局网络请求会走 Windows 宿主机上的 Clash 代理

No Proxy → 这些地址不走代理(本机回环和 Docker 内部域名)

(warning是宿主机内核缺少 blkio(块设备限速)的支持,跟代理没关系,可以忽略)

镜像操作

1.先要拉取镜像

1
2
3
4
docker pull ubuntu:22.04
docker pull ubuntu:20.04
docker pull ubuntu:18.04
docker pull ubuntu:16.04

很多时候,Dockerfile 里开头写的是:

1
FROM ubuntu:22.04

那么在 docker build 时,如果本地没有 ubuntu:22.04,Docker 就会自动去拉。

这个操作其实就是提前把它保存在本地,因为它也需要配置代理,刚好测试你的 代理配置是否生效

2.从Github上下载打包好的项目

链接(也需要链接代理)

然后把对应版本的附件重命名之后替换src中的文件就好了

image-20250923160929323

3.最后就是build镜像

image-20250923163445494

push上去

image-20250923163512286

之后在镜像库里就可以找到这个镜像了

最后把这个镜像的完整引用放入网站就可以了

image-20250923162724784

image-20250923163531562

image-20250923163542830