2026盘古石杯决赛服务器复盘-陈志鹏ubuntu检材详细解题思路-通过ai学取证系列

作者:0xSec笔记本 发布:2026-06-30 08:09 收录:2026-09-03 09:16 2 次阅读 约 4961 字
摘要:📢 免责声明 本文所述技术仅用于合法授权的安全研究、教学演示及防御机制开发。
推荐理由:本文涵盖「Kubernetes」、「服务器取证」、「盘古石杯」等多个主题,重点关注 Kubernetes。

      📢 免责声明        

本文所述技术仅用于合法授权的安全研究、教学演示及防御机制开发。作者及发布平台不承担因读者误用、滥用本内容所导致的任何法律责任。请严格遵守《中华人民共和国网络安全法》及相关法律法规。

服务器分析2-陈志鹏ubuntu检材

2026 盘古石杯总决赛,服务器赛道难啃的一台靶机——一台 Ubuntu,扛起了一整套"暗网商城 + 远控 + 翻Q"的犯罪基础设施。

这台 ubuntu 检材是本届盘古石杯决赛服务器组中的其中一台,对应 Q56–115 共 60 道串题。和常规取证不同,它不考"翻日志找一个文件"那种单点题,而是把 C2 远控、OpenVPN、Tor/Privoxy 暗网入口、Kubernetes 集群、商城源码与凭据、MySQL8 业务库 六大子系统,全部塞进同一台服务器——每一组都是环环相扣的串题,牵一发动全身,正是决赛级别该有的强度。

出题人还埋了不少"坑":两份伪造的 netplan 网卡配置专门误导仿真启动;真正的答案有的藏在 etcd 的 ConfigMap 里,有的要离线跑起 MySQL8 才能读出,还有的只能回源码抠常量——纯靠单一手段,很容易卡死在中途。


整体解题思路:

这60题考的是 同一台Ubuntu 服务器上的一套 “暗网电商”+ “远控”基础设置,拆成6个子系统,每个子系统是一组“串题”。


服务器 仿真

  1. 子系统①:C2 远控(先做,占 8080)
# 启动systemctl start c2serverss -tlnp | grep 8080          # 确认 python3 在听 0.0.0.0:8080

  1. 子系统②:OpenVPN(管理端占 8081)
# 启动systemctl start openvpn-admin openvpn@serverss -tlnp | grep 8081

  1. 子系统③:Tor 暗网 / Privoxy(与 K8s 不冲突,可常驻)
# 启动systemctl start tor@default privoxyss -tlnp | grep -E '9050|8118'

  1. 子系统④:Kubernetes(关键!活集群是kind,藏在Docker里)
    1. 拉起 kind集群
# (1) 确保 8080/8081(kind 节点要用),停掉 C2 和 VPN 管理端  systemctl stop c2server openvpn-admin# (2) 启动 docker  systemctl start docker  docker ps -a						# 看到 forensics-control-plane# (3) 如果 forensics-control-plane 没启动  docker start forensics-control-plane# (4) 等控制面起来;之后用 docker exec 进节点跑 kubectl  # 创建一个临时的快捷命令  alias K='docker exec forensics-control-plane kubectl'  K get nodes			# Ready 即成功  K get pods -A		# 看到 etcd/apiserver/coredns + shop 应用  
排障要点:若日志报 `have an old IPv4 address but no current IPv4`节点丢了网络/旧IP → 重新接回 kind 网(固定 IP 172.18.0.2)再启动执行docker network connect --ip 172.18.0.2 kind forensics-control-plane 2>/dev/null若 `docker start` 报 `address already in use 8080/8081`,就是第 (1) 步没停 C2/VPN

  1. 子系统:商城数据库

 #  商城真实数据在 `/data/mysql/shopdb/*.ibd`(InnoDB 每表一个文件)。

# 1.确认数据库位置,接上一个模块通过获取到的数据库账号密码进行访问。发现返回为空 docker exec forensics-control-plane kubectl exec -n shop deploy/mysql -- \  mysql -uroot -pshoproot123 shopdb -e 'SHOW TABLES;'# 2.在 /data/mysql/shopdb/ 中发现大量的 ibd 文件  ll -l /data/mysql/shopdb/# 3.通过 ibd2sql 进行读取数据      (1)安装:# Kali / 有网的机器上拉取(纯 Python,无第三方依赖)      git clone --depth 1 https://github.com/ddcw/ibd2sql.git    # 若靶机无外网:在有网机器 clone 后 scp 过去      scp -r ibd2sql root@10.233.233.10:/tmp/ibd2sql

⚠️中文显示坑:ibd2sql 会对部分字节做转义,终端按 latin1 渲染会出现乱码(如 ç”µå­)。
解决:gen categories --sql > cat.sql 后用 UTF-8 编辑器打开看;或与"起库法"交叉验证。


56. 分析陈志鹏ubuntu检材,给出C2 服务内部绑定端口?[答案格式:四位数字]

答案:8080

文件目录:ubuntu-vg(xQD2Mx-eyu0-fW0N-cCqf-5p10-ijs5-7y4Nyc)/分区0/opt/c2server/c2_server.py


57. 分析陈志鹏ubuntu检材,给出OpenVPN 网页管理服务端口?[答案格式:四位数字]

答案:8081

文件目录1:/opt/openvpn_admin/README.txt

文件目录2:/opt/openvpn_admin/openvpn_admin.py


58. 分析陈志鹏ubuntu检材,给出K8s 商城应用对外端口?[答案格式:五位数字]

答案:30080

命令:K get svc -A | grep -E 'shop|mysql|redis'


59. 分析陈志鹏ubuntu检材,给出K8s API Server HTTPS 端口?[答案格式:四位数字]

答案:6443

命令:docker exec forensics-control-plane grep api /etc/kubernetes/manifests/kube-apiserver.yaml

知识点:/etc/kubernetes/manifests/kube-apiserver.yaml是Kubernetes 控制平面(Control Plane)中 API Server 的静态 Pod(Static Pod)配置文件。一句话理解:"告诉 kubelet:请启动一个 kube-apiserver 容器,并按照这里面的参数运行。"


60. 分析陈志鹏ubuntu检材,给出Tor 客户端 SOCKS5 监听端口?[答案格式:四位数字]

答案:9050

文件目录:/etc/tor/torsocks.conf


61. 分析陈志鹏ubuntu检材,给出Privoxy HTTP 代理端口?[答案格式:四位数字]

答案:8118

文件目录:/etc/privoxy/config


62. 分析陈志鹏ubuntu检材,给出商城后端 Docker 内部监听端口?[答案格式:四位数字]

答案:5000

命令:K get svc -A | grep -E 'shop|mysql|redis'


63. 分析陈志鹏ubuntu检材,给出MySQL 服务端口?[答案格式:四位数字]

答案:3306

命令:K get svc -A | grep -E 'shop|mysql|redis'


64. 分析陈志鹏ubuntu检材,给出Redis 集群监听端口?[答案格式:四位数字]

答案:6379

命令:K get svc -A | grep -E 'shop|mysql|redis'


65. 分析陈志鹏ubuntu检材,给出OpenVPN 客户端默认虚拟网段是多少?[答案格式:192.168.1.0/24]

答案:10.8.0.0/24

文件目录:/etc/openvpn/server.conf


66. 分析陈志鹏ubuntu检材,给出K8s Pod 网段是多少?[答案格式:172.16.0.0/16]

答案:10.244.0.0/16

命令:docker exec forensics-control-plane cat /etc/kubernetes/manifests/kube-controller-manager.yaml

知识点:/etc/kubernetes/manifests/kube-controller-manager.yaml 一个 静态 Pod(Static Pod)配置文件,作用是告诉 kubelet 如何启动 kube-controller-manager。一句话Controller Manager 就是 Kubernetes 的"后台管理员",负责不断检查集群状态,并让实际状态(Actual State)向期望状态(Desired State)靠拢。


67. 分析陈志鹏ubuntu检材,给出隐藏服务中 HTTP(80)转发到本机哪个端口?[答案格式:五位数字]

答案:30080

文件目录:/etc/tor/torrc

题目解析:(隐藏服务 80 的后端,即商城)能出商城页


68. 分析陈志鹏ubuntu检材,给出隐藏服务中 HTTPS(443)转发到本机哪个端口?[答案格式:五位数字]

答案:30443

文件目录:/etc/tor/torrc


69. 分析陈志鹏ubuntu检材,给出Nginx 指向内部 DNS 的集群 IP 是什么?[答案格式:10.10.10.10]

答案:10.96.0.10

命令:K get svc -n kube-system kube-dns


70. 分析陈志鹏ubuntu检材,给出处理暗网请求的本地 HTTP 代理工具名?[答案格式:nginx]

答案:privoxy

文件目录:/etc/privoxy

题目解析:forward-socks5t .onion 127.0.0.1:9050 . → 这是 Privoxy(HTTP 代理)的配置

方向① 出站:本机访问别人的暗网(Privoxy → Tor)

浏览器/程序(HTTP) ──> Privoxy(8118) ──forward-socks5t──> Tor SocksPort 9050 ──> 访问 xxx.onion

  • forward-socks5t .onion 127.0.0.1:9050:Privoxy 看到目标是 .onion,就把请求交给本机 9050。
  • SocksPort 0.0.0.0:9050:Tor 正好在 9050 收 SOCKS5 请求,替你出网到暗网。
  • SocksPolicy accept 内网段 / reject *:限制只有内网能用这个 9050 代理,外人不能蹭。
  •  这就是 9050 把两段配置"焊"在一起的地方——Privoxy 的转发目标 = Tor 的监听端口。

方向② 入站:别人通过暗网访问"你"(Tor 隐藏服务,跟 Privoxy 无关)

外部 Tor 用户 ──> 你的 xxxx.onion:80/443 ──Tor映射──> 本机 30080 / 30443(商城)

  • HiddenServiceDir /var/lib/tor/hidden_service/:这个目录里生成你的 .onion 域名(hostname 文件)和私钥。
  • HiddenServicePort 80 127.0.0.1:30080:暗网访客访问你站点的 80 端口,Tor 转给本机 30080(就是 K8s 商城的 NodePort)。
  • HiddenServicePort 443 127.0.0.1:30443:同理 443→30443。
  • ControlPort 9051:Tor 的管理控制端口(改配置/查状态用)。


71. 分析陈志鹏ubuntu检材,给出OpenVPN 后台管理员用户名?[答案格式:root]

答案:admin

文件目录:/opt/openvpn_admin/README.txt


72. 分析陈志鹏ubuntu检材,给出OpenVPN 后台管理员密码?[答案格式:password123]

答案:vpnadmin123

文件目录:/opt/openvpn_admin/README.txt


73. 分析陈志鹏ubuntu检材,给出商城管理后台管理员账号?[答案格式:manager]

答案:admin

命令:K  get deploy shop-admin -n shop -o jsonpath='{..env}'

解题思路:查看 Deployment 环境变量。K get deploy shop-admin -n shop -o yaml

Deployment 环境变量常有的东西:

数据库地址

数据库账号密码

Redis 密码

JWT 密钥

默认管理员账号

默认管理员密码

第三方 API Key

容器运行模式


74. 分析陈志鹏ubuntu检材,给出商城管理后台管理员密码?[答案格式:secret999]

答案:shopadmin123

命令:K  get deploy shop-admin -n shop -o jsonpath='{..env}'


75. 分析陈志鹏ubuntu检材,给出商城容器连接 MySQL 的 root 口令是什么?[答案格式:dbrootpwd]

答案:shoproot123

命令:K get deploy mysql -n shop -o jsonpath='{..env}'; echo


76. 分析陈志鹏ubuntu检材,给出商城前端连接 MySQL 的普通用户名是什么?[答案格式:dbuser]

答案:shopuser

命令:K  get deploy shop-admin -n shop -o jsonpath='{..env}'


77. 分析陈志鹏ubuntu检材,给出商城前端连接 MySQL 的普通用户密码是什么?[答案格式:dbpass]

答案:shoppass123

命令:K  get deploy shop-admin -n shop -o jsonpath='{..env}'


78. 分析陈志鹏ubuntu检材,给出Tor 暗网完整域名是什么?[答案格式:examp1e2abc3def4.onion]

答案:l42ng3rwghu7ytbo7nxuj7xh5mkomxlufqzsaeshu4j7qrly356e3aqd.onion

文件路径1-用户创建:/root/onion_address.txt

文件路径2-Tor自动生成-Tor 隐藏服务的标准工作目录:/var/lib/tor/hidden_service/hostname


79. 分析陈志鹏ubuntu检材,给出K8s 管理员凭据文件路径?[答案格式:/etc/config.yaml]

答案:/etc/kubernetes/admin.conf


80. 分析陈志鹏ubuntu检材,给出Docker cgroup 驱动模式?[答案格式:cgroupfs]

答案:systemd

命令:docker info

题目解析:Cgroup Driver 作用 管理资源。


81. 分析陈志鹏ubuntu检材,给出商城分类表主类目预设数?[答案格式:两位数字]

答案:10

命令: gen categories | grep -ic 'insert'

解题思路:题目重点:分类表 数量-计数题


82. 分析陈志鹏ubuntu检材,给出脚本预设的商品类别数组首位品类叫什么?[答案格式:家用电器]

答案:电子产品

⚠️中文显示坑:ibd2sql 会对部分字节做转义,终端按 latin1 渲染会出现乱码(如 ç”µå­)。
解决:gen categories --sql > cat.sql 后用 UTF-8 编辑器打开看;或与"起库法"交叉验证。
本案已交叉确认:Q82=电子产品、Q89=阿迪跑鞋6(下标 5)



83. 分析陈志鹏ubuntu检材,给出虚拟注册用户总批数?[答案格式:四位数字]

答案:1000

命令:gen users | grep -ic 'insert'

解题思路:题目重点:用户表 数量-计数题


84. 分析陈志鹏ubuntu检材,给出虚拟商品总批数?[答案格式:四位数字]

答案:2000

命令:gen products | grep -ic 'insert'

解题思路:题目重点:产品表 数量-计数题


85. 分析陈志鹏ubuntu检材,给出生成的订单记录总条数?[答案格式:四位数字]

答案:5000

命令:gen orders | grep -ic 'insert'

解题思路:题目重点:订单表 数量-计数题

86. 分析陈志鹏ubuntu检材,给出商品 ID 123 的 SKU是什么?[答案格式:SKU000000]

答案:SKU000123

命令0:ddl products

命令1:gen products| grep -i '123'

解题思路:题目重点:产品表 按主键 ID 取某条记录 123


87. 分析陈志鹏ubuntu检材,给出第 888 号订单的用户 ID是多少?[答案格式:三位数字]

答案:889

命令0:ddl orders

命令1:gen orders | grep -i '888'

解题思路:题目重点:订单表 按主键 ID 取某条记录 888


88. 分析陈志鹏ubuntu检材,给出第 2024 条评价的商品 ID 是多少?[答案格式:两位数字]

答案:25

命令0:ddl reviews

命令1:gen reviews | grep -i '2024'

解题思路:题目重点:评价表 按主键 ID 取某条记录 2024


89.  89分析陈志鹏ubuntu检材,给出"阿迪跑鞋"在商品字典中的下标编号是多少?[答案格式:一位数字]

答案:5

为什么找 etcd 呢?因为那是 etcd 的数据库文件,而 Kubernetes 把所有对象(包括注入代码的 ConfigMap)都存在 etcd 里。

id=6 商品名 → 阿迪跑鞋6,下标=(6-1)%10=5

# 1. 定位 etcd 库(K8s 对象/代码都在这)ls -lh /var/lib/etcd/member/snap/db
# 2. 搜关键词(变量名 或 已知中文前缀);-a 把二进制当文本grep -ac '阿迪跑鞋' /var/lib/etcd/member/snap/db          # 确认命中grep -aob 'PRODUCT_NAME_PREFIXES' /var/lib/etcd/member/snap/db | head   # 找偏移
# 3. 抠出数组定义 + 生成函数python3 - <<'PY'db=open('/var/lib/etcd/member/snap/db','rb').read()i=db.find(b'PRODUCT_NAME_PREFIXES = (')print(db[i:i+520].decode('utf-8','replace'))PY或者纯 grep 版(不写 python):grep -aA14 'PRODUCT_NAME_PREFIXES = (' /var/lib/etcd/member/snap/db | head -16
思路总结(为什么这样找)1. 商品名是代码生成的 → 要找代码。2. 代码是怎么进容器的?K8s 里常见两种:打进镜像、或用 ConfigMap 注入。本案 shop-admin 的 command 是 python /app/decrypt_runner.py /app/app.py.enc /app/app.py → 代码是运行时注入/解密的,不在镜像里写死。3. ConfigMap 是 K8s 对象,而 K8s 的所有对象(Pod/Service/ConfigMap/Secret…)都不落成磁盘文件,统一存进 etcd。etcd 是 K8s 唯一的"数据库/唯一事实来源"4. etcd 把数据持久化到磁盘,文件就是 <data-dir>/member/snap/db。→ 所以要离线找 ConfigMap 里的代码,就去 etcd 的 db 文件 grep。- 法 1:etcd 静态 Pod 清单 etcd.yaml 里写着 --data-dir=/var/lib/etcd → 数据库就在 /var/lib/etcd/member/snap/db(etcd 用 boltdb,固定子路径 member/snap/db)。- 法 2:直接 find / -path '*/member/snap/db' → 找到两份:  - /var/lib/etcd/member/snap/db(宿主机原 kubeadm 集群的,含完整商城代码 = 我们用的)  - /var/lib/docker/volumes/…/lib/etcd/…/db(kind 集群那套的副本)

找到 etcd 数据库的几种通用方法(从零)# ① 直接按 etcd 固定子路径找文件find / -path '*/member/snap/db' 2>/dev/null# ② 看 etcd 启动参数里的 data-dirgrep -r 'data-dir' /etc/kubernetes/manifests/etcd.yaml         # 静态Podps -ef | grep etcd | grep -o '\-\-data-dir=[^ ]*'             # 运行态进程# ③ 知道是 kubeadm 默认部署,直接奔默认目录ls /var/lib/etcd/member/snap/db

90. 分析陈志鹏ubuntu检材,给出user77 密码入库后的 MD5?[答案格式:md5后四位]

答案:a3a9

命令0:ddl users

命令1:gen users | grep -i 'user77'

解题思路:题目重点:用户表 按主键 ID 取某条记录 77


91. 分析陈志鹏ubuntu检材,给出user999 密码入库后的 MD5?[答案格式:md5后四位]

答案:8f86

命令0:ddl users

命令1:gen users | grep -i 'user999'

解题思路:题目重点:用户表 按主键 ID 取某条记录 99


92. 分析陈志鹏ubuntu检材,给出购物车新记录默认商品数量是多少?[答案格式:一位数字]

答案:1

命令:ddl cart

解题思路:题目重点:购物车表 找 `quantity` int DEFAULT '1' 


93. 分析陈志鹏ubuntu检材,给出商城 Pod 部署命名空间?[答案格式:default]

答案:shop

命令:K get pod -A  或  K get pod ns


94. 分析陈志鹏ubuntu检材,商城 MySQL 数据库名?[答案格式:ecommerce]

答案:shopdb

命令:K get deploy shop-admin -n shop -o jsonpath='{..env}'; echo


95. 分析陈志鹏ubuntu检材,给出user1 对应手机号?[答案格式:11位数字]

答案:13800000001

命令:gen users | grep -i 'user1'

解题思路:用户表


96. 分析陈志鹏ubuntu检材,给出C2 虚假 Agent 数上限?[答案格式:两位数字]

答案:80

文件目录:/opt/c2server/c2_server.py


97. 分析陈志鹏ubuntu检材,给出C2 日志保留条数上限?[答案格式:五位数字]

答案:10000

文件目录:/opt/c2server/c2_server.py


98. 分析陈志鹏ubuntu检材,给出Agent ID 的 MD5 值?[答案格式:md5后四位]

这个题目不确定,只找到了sha256,截取 的 32位;

欢迎大佬指点


99. 分析陈志鹏ubuntu检材,给出上传结果到 C2 的 URL?[答案格式:/upload/]

答案:/result/

文件:/opt/c2server/c2_server.py


100. 分析陈志鹏ubuntu检材,给出受控主机列表 API 路径?[答案格式:/api/list]

答案:/api/agents

文件:/opt/c2server/c2_server.py


101. 分析陈志鹏ubuntu检材,给出受控端轮询 C2 新指令的 URL?[答案格式:/poll/]

答案:/beacon/

文件:/opt/c2server/c2_server.py

题目解析:轮询(polling/beacon),被控端不会被服务器主动连接(它通常在内网,有防火墙),所以反过来--它每隔一段时间主动去问服务器“有没有新任务给我?”。这种周期性“打卡上线”行为就叫轮询。


102. 分析陈志鹏ubuntu检材,给出向 Agent 下发命令的 URL?[答案格式:/execute/]

答案:/cmd/

文件:/opt/c2server/c2_server.py


103. 分析陈志鹏ubuntu检材,给出C2 后台管理面板使用什么语言开发?[答案格式:nodejs]

答案:python

文件目录:/opt/c2server/c2_server.py


104. 104 分析陈志鹏ubuntu检材,给出C2 伪随机种子 Seed?[答案格式:三位数字]

这题不确定

答案:42

文件目录:/opt/c2server/c2_server.py


105. 105 分析陈志鹏ubuntu检材,给出屏蔽 C2 假数据的环境变量名?[答案格式:NO_MOCK_DATA]

答案:C2_NO_SEED


106. 分析陈志鹏ubuntu检材,给出K8s CRI Socket 路径?[答案格式:unix:///var/run/docker.sock]

答案:unix:///run/containerd/containerd.sock

命令:docker exec forensics-control-plane grep -iE 'container' /var/lib/kubelet/kubeadm-flags.env

题目解析:考点:Kubernetes 使用的容器运行时(CRI)通过哪个 socket 与 Docker/容器运行时通信。

kubeadm 安装的 kubelet,启动参数不是写在配置文件里,而是写在 systemd + kubeadm 生成的 env 文件里。


107. 分析陈志鹏ubuntu检材,给出K8s 集群使用的网络插件名?[答案格式:calico]

答案:kindnet

命令:docker exec forensics-control-plane cat /etc/cni/net.d/10-kindnet.conflist

知识点:/etc/cni/net.d 是CNI 网络插件的配置文件,kubelet 会读取这里的配置,决定如何给 Pod 配置网络。


108. 分析陈志鹏ubuntu检材,给出shop-admin 部署副本数?[答案格式:一位数字]

答案:1

命令:K get deploy -n shop    


109. 分析陈志鹏ubuntu检材,给出nginx 前端部署副本数?[答案格式:一位数字]

答案:2

命令:K get deploy -n shop   

解题思路:shop-app==前端nginx


110. 分析陈志鹏ubuntu检材,给出Flask 健康检查路由路径?[答案格式:/status]

答案:/health


111. 分析陈志鹏ubuntu检材,给出登录后 sessionStorage 键名?[答案格式:auth_token]

答案:dm_user


112. 分析陈志鹏ubuntu检材,给出Nginx 代理 DNS 超时时间?[答案格式:30s]

答案:15s


113. 分析陈志鹏ubuntu检材,给出OpenVPN 状态日志路径?[答案格式:/var/log/vpn.log]

答案:/var/log/openvpn/openvpn-status.log

文件目录:/etc/openvpn/server/server.conf


114. 分析陈志鹏ubuntu检材,给出EasyRSA 客户端密钥位数?[答案格式:四位数字]

答案:2048

命令:openssl x509 -in /etc/openvpn/easy-rsa/pki/issued/client1.crt -noout -text | grep 'Public-Key'


115. 分析陈志鹏ubuntu检材,给出暗网响应 Header 名称?[答案格式:X-Hidden-Service]

答案:X-Onion-Service

命令:strings /var/lib/etcd/member/snap/db | grep 'add_header X-'


利用AI搭建电子数据取证实验室管理系统赋能实战工作

快更新你的Codex,Codex 这个 Bug,足以"写穿"你的固态硬盘

2026 年第三届 “聚合 獬豸杯” WP|通过ai学取证系列|检材3-服务器取证详细解题思路


转载声明:本文转载自原发布平台 (作者:0xSec笔记本), 原文标题《2026盘古石杯决赛服务器复盘-陈志鹏ubuntu检材详细解题思路-通过ai学取证系列》, 查看原文。 版权归原作者及原发布平台所有,本站仅作收录与展示,未对正文内容作实质性修改; 若涉及侵权请联系本站处理。