
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
用于轻松设置"PWN"挑战的Docker容器,提供沙箱环境和灵活的配置选项,帮助快速部署安全可控的挑战环境。
使用此容器时,需通过以下模板创建docker-compose.yml。简单场景下无需编写Dockerfile。
yamlservices: chall: image: docker.xuanyuan.run/cybersecnatlab/challenge-jail:<tag>@sha256:<digest> restart: unless-stopped init: true privileged: true ports: - 'HOST_PORT:1337' volumes: - './PATH/TO/CHALLENGE_EXECUTABLE:/home/user/chall:ro' # 挑战可执行文件 - './PATH/TO/CUSTOM_LOADER:/home/user/ld-linux.so:ro' # 可选:自定义加载器 - './PATH/TO/CUSTOM_LIBRARIES_DIR:/home/user/libs:ro' # 可选:自定义库目录 # 可选:自定义命令行(默认:["/home/user/chall"]) command: ["/home/user/chall", "--example", "custom", "args", "here"] environment: - 'BINDMOUNTS=/container/path:/jail/path,...' # 默认:未设置 - 'FLAG=flag{hello_world_[random 8]}' # 默认:未设置(无flag) - 'FLAG_IN_ENV=false' # 默认:false - 'FORWARD_STDERR=false' # 默认:false - 'FORWARDED_ENV=FOO,BAR,...' # 默认:未设置 - 'LOG_STDERR=false' # 默认:false - 'NETWORK=false' # 默认:false - 'POW_BITS=26' # 默认:未设置(无PoW) - 'POW_BYPASS_HASH=...' # 默认:未设置(无PoW绕过) - 'RLIMIT_AS=8192' # 默认:4096(4GiB) - 'RLIMIT_FSIZE=16' # 默认:1(1MiB) - 'RLIMIT_NOFILE=128' # 默认:32 - 'RLIMIT_STACK=99' # 默认:容器软限制 - 'SET_INTERPRETER=/home/user/ld-linux.so' # 默认:未设置(使用容器加载器) - 'SET_RPATH=/home/user/libs' # 默认:未设置(使用容器库) - 'TEMPDIRS=/path/to/a:/path/to/b:...' # 默认:未设置 - 'TEMPDIRS_SIZE=4194304' # 默认:4194304(4MiB) - 'TIMEOUT=60' # 默认:60 # 可选:在FORWARDED_ENV中指定的自定义环境变量 - 'FOO=69420' - 'BAR=Hello, World!'
注意:cybersecnatlab/challenge-jail:latest标签不存在,这是故意设计的以避免错误。您必须通过cybersecnatlab/challenge-jail:<tag>@sha256:<digest>固定到特定版本。SHA256摘要可在Docker Hub的"Tags"部分选择特定标签后获取。
容器至少需要具备正确调用https://github.com/google/nsjail的能力:必须通过docker命令行的--privileged选项或在docker-compose.yml中设置privileged: true运行。
https://hub.docker.com/r/cybersecnatlab/socaz用作TCP分叉服务器来执行挑战。若通过FLAG环境变量提供flag模板,socaz会为每个新连接生成flag。https://github.com/google/nsjail用于沙箱隔离,仅通过环境变量暴露部分配置选项,目前不支持自定义nsjail配置。
默认情况下,每次连接后在沙箱中执行的命令是/home/user/chall(无参数)。可通过docker-compose.yml中服务的command:键指定自定义命令和参数。无论何种情况,执行命令的工作目录均为/home/user。
注意:尽管command:键支持多种语法,但为避免歧义,建议使用数组语法,例如:["/path/to/exe", "--foo", "bar"]。
配置通过docker-compose.yml中的环境变量完成,这些变量不会对挑战可执行文件可见。
| 变量名 | 默认值 | 接受值 | 描述 |
|---|---|---|---|
BINDMOUNTS | 未设置 | 逗号分隔的src:dst挂载规范列表 | 在沙箱内以只读绑定挂载的路径。每个挂载规范(src:dst)会向nsjail命令行添加一个--bindmount_ro。src是容器内路径,dst是沙箱内挂载路径。 |
FLAG (1) | 未设置(无flag) | https://hub.docker.com/r/cybersecnatlab/socaz flag模板字符串 (1) | 挑战使用的flag。若设置,会在每次连接时传递给https://hub.docker.com/r/cybersecnatlab/socaz (1),并在沙箱内的/home/user/flag路径可用。 |
FLAG_IN_ENV | false | true, false, 1, 0 | 是否将flag保留在FLAG环境变量中,而非写入文件(经https://hub.docker.com/r/cybersecnatlab/socaz解析后)。 |
FORWARD_STDERR | false | true, false, 1, 0 | 是否通过网络转发挑战的标准错误输出。会向socaz传递--stderr。与LOG_STDERR=true不兼容。 |
FORWARDED_ENV (2) | 未设置 | 逗号分隔的环境变量名列表 | 需转发给程序的环境变量列表。默认仅当FLAG_IN_ENV启用时转发FLAG。无论如何,部分知名变量会被设置(非转发)(2)。 |
LOG_STDERR | false | true, false, 1, 0 | 是否由https://hub.docker.com/r/cybersecnatlab/socaz记录挑战的标准错误输出(可在Docker日志中查看)。会向socaz传递--debug。与FORWARD_STDERR=true不兼容。 |
NETWORK | false | true, false, 1, 0 | 是否启用网络访问。若为true,会向nsjail命令行添加--disable_clone_newnet。 |
POW_BITS | 未设置(无PoW) | 非负整数 | 新连接在启动挑战前需完成的工作量证明(PoW)位数(由https://hub.docker.com/r/cybersecnatlab/socaz实现)。 |
POW_BYPASS_HASH | 未设置(无PoW绕过) | SHA-1哈希字符串(恰好40个十六进制字符) | 用于绕过PoW的令牌哈希。若POW_BYPASS_HASH设为sha1(TOKEN),则输入99:TOKEN可通过PoW检查(由https://hub.docker.com/r/cybersecnatlab/socaz实现),便于检查器绕过PoW。 |
RLIMIT_AS | 4096 | 非负整数 | setrlimit(2)的RLIMIT_AS(单位MiB):进程虚拟地址空间最大值。传递给nsjail的--rlimit_as选项。 |
RLIMIT_FSIZE | 1 | 非负整数 | setrlimit(2)的RLIMIT_FSIZE(单位MiB):新创建文件的最大大小。传递给nsjail的--rlimit_fsize选项。 |
RLIMIT_NOFILE | 32 | 非负整数 | setrlimit(2)的RLIMIT_NOFILE:进程可打开的最大文件描述符数加1。传递给nsjail的--rlimit_nofile选项。 |
RLIMIT_STACK | 容器软限制 | 非负整数 | setrlimit(2)的RLIMIT_STACK(单位MiB):进程栈的最大大小。传递给nsjail的--rlimit_stack选项。 |
SET_INTERPRETER | 未设置(使用容器加载器) | 容器内绝对路径 | 挑战二进制文件使用的动态加载器路径。若提供,会通过https://manpages.ubuntu.com/manpages/jammy/en/man1/patchelf.1.html将挑战二进制的PT_INTERP修改为该路径。 |
SET_RPATH | 未设置(使用容器库) | 容器内绝对路径 | 包含挑战二进制所需库的目录路径。若提供,会通过https://manpages.ubuntu.com/manpages/jammy/en/man1/patchelf.1.html将挑战二进制的DT_RPATH修改为该路径。 |
TEMPDIRS (3) | 未设置(无临时目录) | 冒号分隔的绝对目录路径列表 | 在沙箱内创建为临时可写tmpfs挂载的目录 (3)。每个路径会向nsjail命令行添加一个--mount选项。适用于挑战二进制需要创建文件的场景。 |
TEMPDIRS_SIZE | 4194304(4MiB) | 非负整数 | TEMPDIRS中指定的tmpfs挂载大小(单位字节)。为每个挂载设置size=挂载选项。 |
TIMEOUT | 60 | 正整数 | 挑战二进制被终止前的超时时间(单位秒)。传递给nsjail的--time_limit选项。 |
(1) FLAG指定的字符串由socaz处理,可包含生成实际flag内容的指令(模式)。详情参见https://hub.docker.com/r/cybersecnatlab/socaz。每次连接服务时,socaz会生成新flag,供该连接期间使用。
(2) 部分知名变量(HOME、USER、PATH、PWD、OLDPWD、SHLVL)始终会被设置,与FORWARDED_ENV指定的变量名无关。为避免问题,不建议在此指定其他配置环境变量(风险自负)!以下划线开头或包含空格的变量名不被接受。
(3) 若TEMPDIRS未显式指定,Docker容器中已存在的临时目录(如/tmp、/dev/shm等)也会在沙箱内存在,但为只读。
可通过以下方式设置自定义动态加载器和/或动态库:
通过SET_INTERPRETER和SET_RPATH配置环境变量(见配置说明)。要求挑战可执行文件为ELF二进制且位于容器内/home/user/chall路径。容器启动时会通过https://manpages.ubuntu.com/manpages/jammy/en/man1/patchelf.1.html补丁设置PT_INTERP和/或DT_RPATH。
yamlvolumes: - './challenge:/home/user/chall:ro' - './libs:/home/user/libs:ro' environment: - 'SET_RPATH=/home/user/libs' - 'SET_INTERPRETER=/home/user/libs/ld-linux.so'
注意:此方法会在容器启动时修改挑战二进制,导致容器内的二进制与原始文件略有不同。简单场景下无影响,但若挑战依赖未修改的二进制(如计算内存区域哈希等),可能出现问题。
提供已设置自定义加载器和/或库的挑战二进制。即二进制本身已在PT_INTERP程序头中声明自定义解释器路径,和/或在动态段中声明DT_RPATH或DT_RUNPATH自定义库搜索路径。详情参见https://manpages.ubuntu.com/manpages/jammy/en/man8/ld.so.8.html。这些路径需指向容器内目录(如通过额外卷挂载)。
yamlvolumes: # 二进制已配置使用/home/user/libs内的库和/或加载器 - './challenge:/home/user/chall:ro' - './libs:/home/user/libs:ro'
通过BINDMOUNTS环境变量设置自定义绑定挂载,在沙箱内替换系统库目录(见配置说明)。
yamlvolumes: - './libs:/lib/custom:ro' environment: # 替换沙箱内的/lib/x86_64-linux-gnu目录 - 'BINDMOUNTS=/lib/custom:/lib/x86_64-linux-gnu'
注意:此方法会导致挑战二进制无法执行/bin等目录中的现有二进制(需原始库支持),除非同时替换/bin以使用新库。
简单场景下,可通过https://manpages.ubuntu.com/manpages/jammy/en/man1/ldd.1.html在构建二进制的主机系统上自动收集动态链接库(包括加载器):
bashmkdir libs ldd binary | awk '/=>/ {print $3; next}; /ld-linux/ {print $1};' | xargs -I X cp X libs
然后可在容器中使用这些库和加载器:
yamlvolumes: # ... - './libs:/home/user/libs:ro' environment: # ... - 'SET_INTERPRETER=/home/user/libs/ld-linux-x86-64.so.2' - 'SET_RPATH=/home/user/libs'
复杂场景下,可通过自定义Dockerfile从其他系统/发行版构建/复制/安装库,避免分发大型库文件:
dockerfileFROM docker.xuanyuan.run/weird-distro:xxx AS weird-distro # 可选构建步骤... FROM docker.xuanyuan.run/cybersecnatlab/challenge-jail:ubuntu-noble@sha256:XXXXXXXXXX COPY --from=weird-distro /lib/x86_64-linux-gnu /home/user/libs
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务