记我的第一次 CTF: Hackergame 2022
October 29, 2022 · 86 min read
送你一个 Shell 当见面礼(逃
这篇博客的阅读时间估计不对。你并不需要 80 分钟来阅读本文。
个人总结
这是我第一次参加 CTF 比赛,最后混了个 34 名,感觉还不错。曾经就听说过 CTF 这个比赛,不过一直没有进一步了解,也没有参加过。在 Hackergame 2022 开始之前,我所做的准备也只是逛了逛 CTF Wiki, 从 CTFHub 上刷了些 web 题。
最后这个比赛名次对于我这种 CTF 萌新来说还是蛮高的。不过能取得这样一个名次,还是和我平时的积累有很大关系的。虽然我平时并不关注 CTF 相关的内容,但是作为一个可能即将成为程序员的人,我还是一直比较在乎自己编写的代码的安全性的,XSS、提权漏洞、缓冲区溢出这些操作我都是比较熟悉的,不过我一般都是在编写代码时以一种防御性的姿态来避免这些攻击发生在我自己的代码上,这次比赛使我第一次体会到作为攻击者去利用这些漏洞是什么体验。
最近在看 CSAPP,十几天前刚学会了 x86 汇编,没想到就在 flag 自动机那道题里用到了。不过作为日常 Linux 用户而言,好几道题(家目录里的秘密/传达不到的文件)确实只需要一些基础的搜索和再正常不过命令行操作就可以完成。
然而作为一名数学院的学生,我一道正经的数学题都没做出来,实在是有些丢数学院的脸了。(算了,我们专业被开除出数学籍了,统计学算个屁的数学)。
密码学题我连题都看不懂,除了惜字如金第一题我知道该怎么做,但是懒得写了。
量子藏宝图那道题考察了一些需要现学现卖的新知识,出的不是很难,所以我这种混子得以在纸上计算来把 128 - 4 * 8
个 bit 翻译成 12 个字符。
明年我如果还有时间,一定会再次参加 Hackergame 的!
比赛体验
比赛体验极佳。除了
- 有时需要重启到 Windows 系统之外
- 光与影在 Linux + Firefox 下跑起来只有 10 fps,不过误伤大雅
- Killed
(大佬太多了,你们把我从前 30 名里挤出来了)
Write Up Part I
我把 Write Up 分成好几个部分写只是为了防止右边导航栏溢出而已,没别的意思。一个小节里面标题堆得太多了会导致右边导航栏显示不下。
签到
打开签到题,就看到了经典的(对于我这种人工智能相关专业的人而言)手写数字识别。嗯。。。最后一个框倒计时 0 秒,很显然是不可能让你直接手签 2022 过掉的。
为了观察浏览器与服务器数据交流的格式,我手签了一个,点击提交按钮,发现直接跳转到了 http://202.38.93.111:12022/?result=2?5?
那么,我们就可以合理的怀疑 http://202.38.93.111:12022/?result=2022 这个网址能把我们心心念念的 flag 送给我们。果然,flag 就这样到手了。(然鹅此时一血已经被手快的人拿走了)
猫咪问答喵
参加猫咪问答喵,参加喵咪问答谢谢喵。
中国科学技术大学 NEBULA 战队(USTC NEBULA)是于何时成立的喵?
Question
- 中国科学技术大学 NEBULA 战队(USTC NEBULA)是于何时成立的喵?
提示:格式为 YYYY-MM,例如 2038 年 1 月即为 2038-01。
Google 搜索 中国科学技术大学 NEBULA 战队(USTC NEBULA)
喵, 发现第一个结果中提到喵
中国科学技术大学“星云战队(Nebula)”成立于 2017 年 3 月,“星云”一词来自中国科学技术大学 BBS“瀚海星云”,代表同学们对科学技术的无限向往和追求。战队现领队为网络空间安全学院吴文涛老师,现任队长为网络空间安全学院李蔚林、童蒙和武汉。战队核心成员包括了来自网络空间安全学院、少年班学院、物理学院、计算机学院等各个院系的同学,充分体现了我校多学院共建网络空间安全一级学科的特点。战队以赛代练,以赛促学,在诸多赛事中获得佳绩。
所以喵可以确定此题答案为 2017-03
喵.
请问这个 KDE 程序的名字是什么?
Question
- 2022 年 9 月,中国科学技术大学学生 Linux 用户协会(LUG @ USTC)在科大校内承办了软件自由日活动。除了专注于自由撸猫的主会场之外,还有一些和技术相关的分会场(如闪电演讲 Lightning Talk)。其中在第一个闪电演讲主题里,主讲人于 slides 中展示了一张在 GNOME Wayland 下使用 Wayland 后端会出现显示问题的 KDE 程序截图,请问这个 KDE 程序的名字是什么?
提示:英文单词,首字母大写,其他字母小写。
Google 搜索 中国科学技术大学 软件自由日 LUG@USTC
喵,一个来自 Google Groups 网站的搜索结果 中提到喵
往届活动和详细介绍见:https://lug.ustc.edu.cn/wiki/lug/events/sfd
打开此链接可以看到 2022 年 SFD 活动的详细信息喵,表格中有一行
讲者 主题 资料 陶柯宇 闪电演讲:《GNOME Wayland 使用体验:一个普通用户的视角》 Slides
打开 Slides 喵, 在第 15 页可以找到题目所述截图喵。
图片里菜单项里 Configure Kdenlive
很显然写明喵应用程序的名称。
Firefox 浏览器能在 Windows 2000 下运行的最后一个大版本号是多少?
Question
- 22 年坚持,小 C 仍然使用着一台他从小用到大的 Windows 2000 计算机。那么,在不变更系统配置和程序代码的前提下,Firefox 浏览器能在 Windows 2000 下运行的最后一个大版本号是多少?
提示:格式为 2 位数字的整数。
Google 搜索 Firefox 浏览器能在 Windows 2000 下运行的最后一个大版本号是多少
喵。然而第一页上没什么有效信息喵。自然而然想到用英文搜索喵。
谷歌直接把结果加粗丢给咱喵,好耶!
首个变动此行为的 commit 的 hash
Question
- 你知道 PwnKit(CVE-2021-4034)喵?据可靠谣传,出题组的某位同学本来想出这样一道类似的题,但是发现 Linux 内核更新之后居然不再允许 argc 为 0 了喵!那么,请找出在 Linux 内核 master 分支(torvalds/linux.git)下,首个变动此行为的 commit 的 hash 吧喵!
提示:格式为 40 个字符长的 commit 的 SHA1 哈希值,字母小写,注意不是 merge commit。
首先当然要 Clone Linux 的代码仓库喵(这仓库好大喵。。。需要一段时间才能克隆下来喵):
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
然后在执行了 n 多次 Google 搜索之后喵,kxxt 发现加上搜索条件 site:kernel.org
之后再搜索 CVE-2021-4034
就能在第一个搜索结果中看到相关的 PATCH 喵。
这个 PATCH 改动了 fs/exec.c
这个文件喵。咱喵可以合理的推测对于 CVE-2021-4034
的修复应该发生在这个文件喵(懒的管这个 PATCH 是否被合并了)。
用 VSCode 打开 Linux 仓库喵,等它加载完成喵(等待 Activating Extensions),打开 fs/exec.c
然后在 TIMELINE
面板(应该是 Git Lens 插件的功能)下面用肉眼搜索相关改动喵。
很快就找到了喵。右键复制 Commit ID, 此题就结束了喵。
你知道猫咪在连接什么域名吗?
Question
- 通过监视猫咪在键盘上看似乱踩的故意行为,不出所料发现其秘密连上了一个 ssh 服务器,终端显示
ED25519 key fingerprint is MD5:e4:ff:65:d7:be:5d:c8:44:1d:89:6b:50:f5:50:a0:ce.
,你知道猫咪在连接什么域名吗?
提示:填写形如 example.com 的二级域名,答案中不同的字母有 6 个。
这道题 kxxt 一开始真的没搜到喵。想要暴搜却发现状态空间太大了,搜不完喵。后来 Google 搜索 public ssh server
点进第一个结果找到了答案喵。
Caution
其实我一开始搜索的时候就找到了这个帖子,不过我当时并没有耐心看完所有的回答喵。当时我看了 Accepted Answer 里没有我想找的东西就把这个 tab 杀掉了。
现在想来看看其他回答也是很有必要的喵,毕竟 Accepted Answer 是提问者采纳的回答,并不是最适合所有人的回答。而且我第一次访问到这个链接的时候甚至都没有注意到第二个回答的 Up Vote 比 Accepted Answer 更多.
想不到吧,sdf.org 除了 ssh server 之外还有 minecraft server (
“网络通”定价为 20 元一个月是从哪一天正式实行的?
Question
- 中国科学技术大学可以出校访问国内国际网络从而允许云撸猫的“网络通”定价为 20 元一个月是从哪一天正式实行的?
提示:格式为 YYYY-MM-DD,例如 2038 年 1 月 1 日,即为 2038-01-01。
这道题目我是真的没有搜出来喵,不过得益于题目的状态空间比较小(一年 365 天,按 10 年算,不也就 3650 种情况喵?),最后我靠暴搜解出了这道题。
话不多喵,直接上脚本喵:
代码很简单喵,我就略过不讲喵。更换年份直接修改脚本就可以喵。最后跑出来是 2003年3月1日喵。真的很搞人心态喵,咱喵从 2015 年一路试到 2003 年才作出来。
喵~
参加猫咪问答喵,参加喵咪问答谢谢喵。
喵喵结束,变回人形喽。
家目录里的秘密
Question
实验室给小 K 分配了一个高性能服务器的账户,为了不用重新配置 VSCode, Rclone 等小 K 常用的生产力工具,最简单的方法当然是把自己的家目录打包拷贝过去。
但是很不巧,对存放于小 K 电脑里的 Hackergame 2022 的 flag 觊觎已久的 Eve 同学恰好最近拿到了这个服务器的管理员权限(通过觊觎另一位同学的敏感信息),于是也拿到了小 K 同学家目录的压缩包。
然而更不巧的是,由于 Hackergame 部署了基于魔法的作弊行为预知系统,Eve 同学还未来得及解压压缩包就被 Z 同学提前抓获。
为了证明 Eve 同学不良企图的危害性,你能在这个压缩包里找到重要的 flag 信息吗?
公益广告:题目千万条,诚信第一条!解题不合规,同学两行泪。
解压缩之后直接搜索 flag
, 第一个 flag
就有了,非常简单。
然后打开 rclone 的配置文件 user/.config/rclone/rclone.conf
:
[flag2]type = ftphost = ftp.example.comuser = userpass = tqqTq4tmQRDZ0sT_leJr7-WtCiHVXSMrVN49dWELPH1uce-5DPiuDtjBUN3EI38zvewgN5JaZqAirNnLlsQ
发现 pass
是一个晦涩难懂的字符串,我们可以断定 flag2 就藏在这段密码里。
然后搜索 Google 搜索 decrypt rclone passwd in config
, 点进第一个搜索结果。
帖子里提到了密码是用一个死密钥加密的,所以我们能够对它进行解密,同时作者也给出了一段破解密码的 golang 程序和 Go Playground 链接。
The password that is saved on
crypt
remotes on~/.config/rclone.conf
is encrypted with a hardcoded key, therefore it can be recovered.I’ve copied some code from the rclone source tree and added a line to make it easier for people to run it.
Just go to
https://play.golang.org/p/IcRYDip3PnE
and replace the stringYOUR PSEUDO-ENCRYPTED PASSWORD HERE
with the actual password that is written in your~/.config/rclone.conf
file, then click “Run”.
那我们把加密(或者说混淆)过的密码输入到里面,运行代码,就得到了 flag。
吐槽:你们 Go Playground 怎么不带语法高亮啊!!!!!!我眼睛要瞎了🫠🫠🫠🫠🫠🫠
HeiLang
Question
来自 Heicore 社区的新一代编程语言 HeiLang,基于第三代大蟒蛇语言,但是抛弃了原有的难以理解的 |
运算,升级为了更加先进的语法,用 A[x | y | z] = t
来表示之前复杂的 A[x] = t; A[y] = t; A[z] = t
。
作为一个编程爱好者,我觉得实在是太酷了,很符合我对未来编程语言的想象,科技并带着趣味。
我们直接写一个脚本将 Heilang 的玄学语法转换成正常 Python 语法, 然后运行转换后的脚本就得到了 flag:
Xcaptcha
题目懒的贴了。
捕获几个网络请求能看出来要计算的数字在 html 里,用 htmlq
提取出来应该很方便。高精度?果断上 Python!
失败的尝试
嗯,这不就是一秒内完成三个高精度整数加法的事,这还难得到我?于是就有了下面的 Python 脚本和 bash 混合编程
WoC!怎么TLE了???我明明没有超时呀???于是 kxxt 就被卡(qia, 三声)在这里很久
修正
后来我用 httpie
手动和题目交互,发现原来是 GET 请求有对 Cookie 做修改。而我之前一直用的从浏览器里复制出来的 Cookie 😢😭😓。
然后就直接把所有逻辑都写在 Python 里了,因为把新 Cookie 传给 Python 不是很方便:
这不,flag 到手了,也没有那么麻烦吗。。。。
旅行照片 2.0(照片分析)
丢给一个在线 EXIF 信息查看器就能得到答案。 推荐:https://exifdata.com/
从众多小米手机的图像中浏览了一番,发现是红米 Note 9: https://www.wikiwand.com/zh-hans/Redmi_Note_9
不过航班我是真的不会找。日本上空这么多航班,我怎么知道是哪一个???(也没找到免费的能看五月份航班数据的网站)
猜数字
一打开 GuessNumber.jvav
, 一股“企业级”应用开发的味道便扑面而来。
首先是一屏 import
s
然后又是大大的面向对象的 GuessNumber
类. 还有为什么要用三个空格缩进。。。
我们在 State
类的 collect
方法 (你可以把鼠标放在加下划虚线的文字上或者触摸它们,kxxt 会自动给您高亮相关代码)和 update
方法中可以发现一个致命的漏洞:
它们判断一个数和被猜数字是否相等的逻辑是:如果这个数既不大于被猜数也不小于被猜数,那么就通过。
然而,众所周知,NaN
既不大于任何一个数,也不小于任何一个数。所以我们把 NaN
交上去就过了。
万恶的网页交不了 NaN
. 欺负我在用手机做题是吧?我掏出了 termux, 熟练的使用 pip
安装了 httpie
。然后左一个 POST
右一个 GET
就把它干掉了。
Write Up Part II
这里放段字,防止两个标题挨得太近出 Bug
LaTeX 机器人
Question
在网上社交群组中交流数学和物理问题时,总是免不了输入公式。而显然大多数常用的聊天软件并不能做到这一点。为了方便大家在水群和卖弱之余能够高效地进行学术交流,G 社的同学制作了一个简单易用的将 LaTeX 公式代码转换成图片的网站,并通过聊天机器人在群里实时将群友发送的公式转换成图片发出。
这个网站的思路也很直接:把用户输入的 LaTeX 插入到一个写好头部和尾部的 TeX 文件中,将文件编译成 PDF,再将 PDF 裁剪成大小合适的图片。
“LaTeX 又不是被编译执行的代码,这种东西不会有事的。”
物理出身的开发者们明显不是太在意这个网站的安全问题,也没有对用户的输入做任何检查。
那你能想办法获得服务器上放在根目录下的 flag 吗?
纯文本
第一个 flag 位于 /flag1
,flag 花括号内的内容由纯文本组成(即只包含大写小写字母和数字 0-9)。
特殊字符混入
第二个 flag 位于 /flag2
,这次,flag 花括号内的内容除了字母和数字之外,还混入了两种特殊字符:下划线(_
)和井号(#
)。你可能需要想些其他办法了。
flag1
flag1 很简单,直接用 \input
宏把 /flag1
文件读进来就行。
花括号被 吃掉了,填 flag 的时候自己补上就行。
flag2
flag2 卡了我很久。后来 Google 搜索 latex raw text
得到的第一个结果 中提到了一个定义新的 environment 使得 $
, &
, #
, ^
, _
, ~
, %
这些特殊字符能够被显示出来的方法。
根据 base.tex
, latex_to_image_converter.sh
的内容,我们可以确定加入了我们的输入之后 tex
文件的样子:
那么我们把下面的 payload 交给 机器人就可以得到 flag2(可怜的花括号还是照样会被吃掉。。。)
Flag 的痕迹
Question
小 Z 听说 Dokuwiki 配置很简单,所以在自己的机器上整了一份。可是不巧的是,他一不小心把珍贵的 flag 粘贴到了 wiki 首页提交了!他赶紧改好,并且也把历史记录(revisions)功能关掉了。
「这样就应该就不会泄漏 flag 了吧」,小 Z 如是安慰自己。
然而事实真的如此吗?
(题目 Dokuwiki 版本基于 2022-07-31a “Igor”)
从自己电脑上运行一个 Dokuwiki 复现一下小 Z 的操作。
mkdir wiki && docker run -d \ --name=dokuwiki \ -e PUID=1000 \ -e PGID=1000 \ -e TZ=Europe/London \ -p 8080:80 \ -v "$(pwd)/wiki":/config \ --restart unless-stopped \ lscr.io/linuxserver/dokuwiki:latest
然后进 localhost:8080 编辑首页, 再做第二次编辑
我们进入到 revisions 页面,发现它有一个 diff 功能,可以显示改动,而且右边有一个链接 Link to this comparison view
, 点击之后 url 里的 do=revisions
变成了 do=diff
。我们可以合理的怀疑小 Z 的 Dokuwiki 没有关掉 diff 功能。我们直接访问 http://202.38.93.111:15004/doku.php?id=start&do=diff 发现我们能够看到小Z 作出的历史改动,便拿到了 flag。
安全的在线测评
Question
传说科大新的在线测评系统(Online Judge)正在锐意开发中。然而,新 OJ 迟迟不见踪影,旧的 OJ 和更旧的 OJ 却都已经停止了维护。某 2022 级计算机系的新生小 L 等得不耐烦了,当即表示不就是 OJ 吗,他 10 分钟就能写出来一个。
无法 AC 的题目
为了验证他写的新 OJ 的安全性,他决定在 OJ 上出一道不可能完成的题目——大整数分解,并且放出豪言:只要有人能 AC 这道题,就能得到传说中的 flag。当然,因为目前 OJ 只能运行 C 语言代码,即使请来一位少年班学院的天才恐怕也无济于事。
动态数据
为了防止数据意外泄露,小 L 还给 OJ 加入了动态数据生成功能,每次测评会随机生成一部分测试数据。这样,即使 OJ 测试数据泄露,攻击者也没办法通过所有测试样例了吧!(也许吧?)
判题脚本:下载
你可以通过 nc 202.38.93.111 10027
来连接题目,或者点击下面的 “打开/下载题目” 按钮通过网页终端与远程交互。