Hackergame 2019 Writeup

开篇废话

今年 ustclug 的 hackergame 结束啦(然而我并没有前100名) 作为一个主力前端的学生 自然是web题目分数最高了~

排名和分数

题目

签到题

如图所示 将 disabled=“disabled” 的attr 删除即可提交flag

flag{需要提交token的题目}

签到题

白与夜

有一只猫的照片(alpha图层玩法)

*之前qq群缩略图和打开是色图也是这样玩的 可以看看这个 github repo

那么很明显 我们只需要把文件拉本地就可以解决 甚至拖动的过程就可以看到我们亲爱的flag(在macOS下)

白与夜

至于官方解法就比我专业多了(

flag{4_B14CK_C4T}

信息安全 2077 (赛博朋克 2077)

这题目黑曜石浏览器(去年hackergame)和之前的红芯浏览器又被拿出来鞭尸了(

既然说2077年 那么我们直接穿越到未来(笑

这次的题甚至帮我们 useragent 都准备好了(去年要到官网F12找ua) 直接送F12 js 吧 (把now改成2077年就可以完成穿越)

(function () {
  var now = 'Wed, 16 Oct 2077 00:00:40 GMT'
  var ua = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) HEICORE/49.1.2623.213 Safari/537.36'
  fetch('flag.txt', {method: 'POST', headers: {'If-Unmodified-Since': now+50000000, 'User-Agent': ua}}).then(function (res) {
    if (res.ok) {
      res.text().then(function (text) {
        prompt('ctf flag is',text)
      })}
  })
})()

信息安全 2077

flag{Welc0me_to_competit1on_in_2077}

宇宙终极问题 42

这道题 Google 找新闻 ~~ 像抄题解一样 ~~(下面子问题我认为我不会也没看了)

https://www.sciencealert.com/the-sum-of-three-cubes-problem-has-been-solved-for-42

再附上一个梗图
梗

flag{需要提交token的题目}

网页读取器

看到这题的时候我又想到之前有个 php 站因为请求用 file_get_contents 没过滤(完全)被日站故事

题目有提供源码 所以我们直接来审计,,,

重点肯定是 check_hostname 函数 即使是不懂 py 的我也一下子看出来了

def check_hostname(url):
    for i in whitelist_scheme:
        if url.startswith(i):
            url = url[len(i):]  # strip scheme
            url = url[url.find("@") + 1:]  # strip userinfo

这里 就是找到 @ 后面 然后只判断 @ 后面是不是合法的

        if not url.find(../") == -1:
        ...... 以下省略

所以即使下面判断得再充分也没用了 我们来构建可以访问 http://web1/flag 的 url

这里提一下 虽然我们过了检测hostname的 但是如果将以下的url直接填过去 也是过不了的(会404)

http://web1/flag@example.com/

这里就要在flag后面加一个 ? 或者 ! 来解决 (至于问为什么的我觉得你可以点 #开篇废话 )是怎么跳转的以及 什么是URL?

flag{UrL_1S_n0t_SO_easy}

达拉崩吧大冒险

这道题我F12弄了几下,然后对输入没有过滤的地方只有料理大市场的地方了(买童子鸡增加攻击力)

不知道后端是用什么写的 但是隐约看得出来这是要我们怼几个大数进去负负得正(溢出)

我这里一开始随便怼了个 -long long 的数 然后再怼了个-1 好像就成功了

达拉崩吧大冒险

flag{what_an_amazing_dream}

然后这题在f12有个隐藏link 洛天依,言和 原创《达拉崩吧》

我看完了 你呢?

Happy LUG

这题 和 ustc 的 tg 群连接一样的 DNS TXT 一找就完事

什么? dig报错?

~> dig "😂.hack.ustc.lug.org" TXT +short 
;; Got bad packet: bad label type

最简单的办法 输入到chrome 然后再复制…

Happy LUG

~> dig "xn--g28h.hack.ustclug.org" TXT +short

flag{DN5_C4N_H4VE_em0ji_haha}

^ 至于为什么要这样 可以看维基百科的解释 https://en.wikipedia.org/wiki/Punycode

献给最好的你

这个也是来源于生活的一个题目 可以搜索下知乎提问

** 这题我直接偷懒用mt管理器解包了 在电脑上操作请自行搜索相关教程&&工具 **

一打开app 播放的自然是 中国科学技术大学校歌 - 《永恒的东风》 (不是目力也不是***)

我们先从资源包里面找下flag关键词

找flag id

对应的id是 7F0E0032

然后我们直接拆dex 对应到了 com/hackergame/eternalEasterlyWind(永恒的东风)/ui.login/LoginViewModel

中间省略(这还能怎么找)

最终登录相关代码 在 com/hackergame/eternalEasterlyWind/data/LoginDatasource 里面

flag相关代码

获得了一串神必字符串 AgfJA2vYz2fTztiWmtL3AxrOzNvUiq==

当我兴高采烈以为直接base64就ok的时候

~> echo "AgfJA2vYz2fTztiWmtL3AxrOzNvUiq==" | base64 -D
?k??g??ؖ??????Ԋ⏎   

¿¿¿ 于是又看了下代码

char charValue = ((Character) it.next()).charValue();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(str3);
if (Character.isUpperCase(charValue)) {
    charValue = Character.toLowerCase(charValue);
} else if (Character.isLowerCase(charValue)) {
    charValue = Character.toUpperCase(charValue);
}

看得出来这是把大写字母换成小写 小写字母换成大写的玩法

~> echo "aGFja2VyZ2FtZTIwMTl3aXRoZnVuIQ==" | base64 -D
hackergame2019withfun!⏎

获得app内的flag 于是打开app 输入 就获得了flag

flag{learn_ab1t_andROID_reverse}

^ 当然肯定还有硬核直接干dex找出flag的 我是不会也不想花这时间了

我想要个家

chroot一把嗦(这玩意也能叫 Linux 基础知识?)

过程就直接看官方的writeup吧 我懒得了( https://github.com/ustclug/hackergame2019-writeups/blob/master/official/%E6%88%91%E6%83%B3%E8%A6%81%E4%B8%AA%E5%AE%B6/README.md

被泄漏的姜戈

参考 4.22哔哩哔哩后台代码泄露事件

然而这一题我一开始在hub上没找到

有图为证

由题目可以找到在github和gitlab托管的repo

https://github.com/openlug/django-common

https://gitlab.com/openlug/django-common

我们 download as zip 下载下来

首先我们要知道这个原理 在 openlug/settings.py 下我们可以看到这个网站是用

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

也就是签名的cookies作为session(可以搜索下 JWTtoken 类似)

于是我们就可以用侧漏的 SECRET_KEY 来构建admin的session cookie(然后我并没有成功)

cd Downloads/django-common-master/
pip3 install -r requirements.txt
python3 manage.py runserver

我们的本地测试服务器就ok了

我们可以看到 views.py 20行有个 authenticate 函数判断用户密码是否正确 因此我们暴力修改这个函数即可,,,

经过一番搜索 我们可以找到 authenticate 函数在 /usr/local/lib/python3.7/site-packages/django/contrib/auth/init.py (Windows自己另外找啦)

然后我们用祖传游标卡尺来找相关代码

又找到了验证密码函数在 backends.py 里面

删除这一行就可以不验证密码直接登录成功了~

删除一行

然后我们取到了带admin的session

sessionid=.eJxVjEEOwiAQRe8ya0PAMNPBpXvPQIZCpWogKe2q8e62SRd1-997fwUvy5z90tLkxwg3MHA5b0H6dyo7iC8pz6r6WuZpDGpX1EGbetSYPvfD_TvI0vJWIzlz7YhwcKhDChSjFUTtWLgjHpDZ2KAtfH_fZDBr:1iMxV9:24FW4GrYTxQo5EAP1Yky9V6WnAI

^ 仅供参考

然后用editthiscookie或者F12到目标网页即可获得flag

flag{Never_leak_your_sEcReT_KEY}

总结

这次的 Hackergame 还是很开心的 而且很多题目基于的是今年的梗/事件 然后我被强制学了 py3 然而苦于高三没有时间肝,最后200名以内也感觉不错就是了~

至于要开IDA的那种反编译题目 还有纯算法的(迫真计算器、红包之类的) 题目太长的 我就完全不会了(真是为难我一个数学30多分的人)

这次还了解了 shellcode x^3 + y^3 + z^3 = 42 的迫真玩意(后面的可以坑同学了)

收获还是挺大的 希望明年能前100 这么早立flag怕是拿不到flag了

最后:

人生苦短,教练我不想学py