GitHub与Ekoparty 2023夺旗赛

GitHub与Ekoparty 2023夺旗赛

💡 原文英文,约1800词,阅读约需7分钟。
📝

内容提要

GitHub赞助并参与了Ekoparty 2023夺旗赛的挑战,重点关注GitHub和Git功能。挑战包括隐写术、代码注入、GitHub Actions漏洞和Git仓库取证。参赛者需要解决这些挑战以找到隐藏的旗帜。GitHub感谢Ekoparty提供的贡献机会。

🔎

延伸解读

从CTF看GitHub Actions的典型风险

文章中的挑战2和挑战3分别演示了GitHub Actions的两类常见漏洞:一是直接解析不可信输入(如issue正文)导致代码注入;二是在pull_request_target上下文中运行来自fork的代码,使得攻击者能获取仓库机密。这些挑战基于GitHub Security Lab的系列文章设计,提醒开发者在编写工作流时需严格区分可信与不可信数据,并谨慎使用pull_request_target。

Git仓库取证:细节与历史的重要性

挑战4和挑战5聚焦Git仓库取证。挑战4要求玩家通过对比远程仓库与官方git.git的标签差异,发现隐藏的额外标签;挑战5则利用Dockerfile提示和配置特性(如allowanysha1inwant)恢复已删除的提交。这些挑战表明,Git仓库中的历史记录、标签和配置可能泄露敏感信息,安全审计时应关注非常规的引用和对象。

隐写术挑战的教育意义

挑战1通过README.md中的同形异义字符隐藏旗帜,展示了隐写术在看似普通文本中的运用。虽然手动检查有可能发现,但程序化方法更可靠。这提醒安全从业者,在代码仓库等文本环境中,非ASCII字符可能被用于隐藏信息,自动化检测工具应能识别异常字符集。

❓

Q&A

GitHub在Ekoparty 2023 CTF中提供了哪些类型的挑战?

GitHub提供了五个挑战,涵盖隐写术、代码注入、GitHub Actions漏洞利用和Git仓库取证。具体包括:挑战1(隐写术-简单)、挑战2(代码注入-简单)、挑战3(Fork & Knife-Web简单)、挑战4(Git #1-取证简单)、挑战5(Git #2-取证中等)。

如何解决Ekoparty 2023 CTF中的隐写术挑战(挑战1)?

挑战1要求玩家在私有仓库的README.md中找到隐藏的旗帜。旗帜由非字母数字字符组成,可通过编程方式提取,例如使用Python脚本过滤出非匹配字符。由于提交系统不支持这些字符,需将其转写为小写a-z等效字符。

挑战2(Snarky Comments)中的代码注入漏洞是如何产生的?

漏洞源于工作流直接解析issue body中的原始输入,并将其用于环境变量TEACHER和REVIEW的赋值。攻击者可以在issue body中注入命令,例如$(echo $db_pass | rev),从而泄露存储在secrets.FLAG中的旗帜。

挑战3(Fork & Knife)中pull_request_target的风险是什么?

使用pull_request_target时,工作流可以访问目标仓库的secrets,即使PR来自fork。攻击者可以修改fork中的代码(如build.sh)来读取环境变量EXPECTED_OUTPUT(包含旗帜),并通过输出到stderr或发送到远程监听器等方式绕过自动脱敏。

在挑战4(Git #1)中,如何找到隐藏的旗帜?

玩家通过SSH连接到远程服务器(git-shell环境),克隆git.git仓库。该仓库是官方git仓库的副本,但多了一个标签v2.34.9。检出该标签后,可找到flag1.txt。也可通过添加远程仓库并比较标签来发现差异。

挑战5(Git #2)如何利用Dockerfile中的信息获取第二个旗帜?

从挑战4的Dockerfile可知另一个仓库git-local,且有一个被移除的标签secondflag,其提交哈希存储在~/flagref中。利用修改后的git-upload-pack(支持want-ref和路径遍历)读取flagref获取哈希,然后从git-local中检出该提交,得到flag2.txt。

🏷️

标签

➡️

继续阅读