虚拟机获取
在其官网存在虚拟机版本供其下载,这里我下载的是ova虚拟机镜像。
打开虚拟机镜像
直接使用7z工具进行打开,可以看到本质是zip压缩包文件,内为vmdk格式镜像
继续打开vmdk文件,发现为两个img镜像组成。
0.img
0.img文件为系统启动镜像,负责系统启动初期的运行和解密分区等流程。
在
GRUB中配置了密码,防止直接修改GRUB参数绕过。虽然可以直接删除密码绕过。。。
使用
hexdump查看文件,发现以下文件是加密的,而不是直接的img文件:initramfs-0-rescue-795882a352b9438790405ff6361875b5.imginitramfs-4.19.181.img
而
initramfs-4.19.181kdump.img作为kdump使用并未加密。
1.img
root和app分区为LUKS加密,其余分区为xfs分区。
解密initramfs
分析不了一点vmlinuz引导,直接简单点,使用虚拟机运行,引导至系统启动后进行暂停虚拟机拍摄快照。
找到虚拟机文件,找到快照文件
*.vmem
使用
010edit打开该文件,并搜索关键词。如:initramfs可以看到搜索到了shell解密
initramfs.img命令openssl rc4 -K a5a7391025cd4052b3fd170e3c749163 -nosalt -e -nopad -in "$outfile" -out /boot/initramfs.img
使用rc4密钥可以成功解密该img文件。
如果出现
40A712850E7F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:349:Global default library context, Algorithm (RC4 : 37), Properties ()
则说明openssl版本较高,使用低版本即可解决。或者使用工具解密https://tomeko.net/bin/RC4/FileEncryptDecrypt.zip
By https://tomeko.net/online_tools/rc4.php?lang=en
解密后文件可以使用7z工具打开。
在
/etc/crypttab文件中存在解密方法root /dev/disk/by-uuid/84b916e1-2242-409d-b2ba-ebf149be7a9a /etc/.appconf/.ramfs
发现相关目录下存在两个文件,一个4k大小的乱码文件,一个headerless的LUKS加密分区文件。
通过搜索内存中
cryptsetup命令,发现一处解密的方法。
继续搜索发现
.ramfs文件为使用GPG加密的密文,其内容为LUKS加密分区的密码。
搜索不到相关的GPG解密key信息,只好作罢。
解密LUKS加密分区
再次回到快照文件,这次直接使用工具搜索AES的key。
这里使用aeskeyfind
,可以搜索到一些KEY信息。(这里没保存截图)因为LUKS分区默认的master-key是32位的byte,所以排除非16位的byte(显示的hex是字符串类型,所以实际上是32/2大小)。剩下的结果使用python进行排列组合。
strings = [
"96448b38426076d0332f917d3b28741f4f02d41e32928056b3bb1649526ce8c2",
"e537e35b305f61e3a674c9d0e1344af261c7e1047a1f363bbb0997f84e460ddc",
"22d7beb261f134f98e4806504eccd8293c4b5703828d4ac32a510519a43ff836",
"6b044f66ebbd881dc5954bc69958319a857e9993fd33b17f8f30de266fd32ae9",
"f2d2ae5c0c849f554da11aed169de5b6f76d1a7258be41b8e399862ac82b1040",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
"db27271c5486bd6820f4603eeb4b6457d3c11f6f1f3e79b9f05ebc83d22581f6",
"0414dee9cab868f11977ab9552f3b48b632039848143fa8c3dc7d3dd71c86208",
"29fd7e7664257fd4de1c8be84530d5d360330aa54c2ffabc934f1925eaaf394e",
"509fa5d0157b2fcca0ce7c3d4c31e6a5d442aae9c9119ea9e660db984a8fe106",
"78d094ecbe61fd098905748ff4a015d45cb0802ea48ea07f0b9d93e03613da36",
"f918c5501338737c1e41d243c3edcccb35e1f1129894744aeb58e02096f44281",
"90152e70bfe5fe834e941abd2778f5371a311753e14cada68cb5c3d1ee089f43",
"36ea213eed82e4cc00be713b6d1f25a5b784a9a0c6c579f968523f725f09bec4",
"caee146e5c6e6d8745b63575df55ff92e7290a816a538f76685f86e9fcfd01a1",
"3266b9a1fda52877c9f2d1f44c9e071290d055ff017a244011a71a4075958091"
]
import itertools
for idx, (a, b) in enumerate(itertools.permutations(strings, 2)):
combined_hex = a + b
combined_bytes = bytes.fromhex(combined_hex)
print(f"{idx+1}")
with open(f"{idx+1}.txt", "wb") as f:
f.write(combined_bytes)
这里共生成了240中组合。再次使用shell脚本去暴力枚举出正确的key。
#!/bin/bash
start=1
end=240
for ((i=$start; i<=$end; i++))
do
key_file="1.txt"
if [ $i -gt 1 ]; then
key_file="${i}.txt"
fi
output=$(cryptsetup luksOpen /tmp/root.img rootenc --master-key-file="$key_file" 2>&1)
if [[ "$output" != *"Volume key does not match the volume."* ]]
then
echo "Found matching key in file: $key_file"
echo "$output"
fi
done
经过计算,发现48.txt的master-key可以进行解密。
6b 04 4f 66 eb bd 88 1d c5 95 4b c6 99 58 31 9a
85 7e 99 93 fd 33 b1 7f 8f 30 de 26 6f d3 2a e9
22 d7 be b2 61 f1 34 f9 8e 48 06 50 4e cc d8 29
3c 4b 57 03 82 8d 4a c3 2a 51 05 19 a4 3f f8 36
同样方法,另一个加密分区的master-key也破解出来了16.txt。
e5 37 e3 5b 30 5f 61 e3 a6 74 c9 d0 e1 34 4a f2
61 c7 e1 04 7a 1f 36 3b bb 09 97 f8 4e 46 0d dc
96 44 8b 38 42 60 76 d0 33 2f 91 7d 3b 28 74 1f
4f 02 d4 1e 32 92 80 56 b3 bb 16 49 52 6c e8 c2
master-key与key-file
在cryptsetup中,存在key-file和–master-file的参数项,他们之间的关系为:
因为分区加密很耗时间,为了节省资源,加密逻辑如下:
- 用户密码key使用算法加密master-key并保存加密后的master-key信息。
- master-key进行分区加密。
所以,如果用户更改了key-file,只需要计算出加密后的master-key更新即可。大大缩减了资源消耗。
这里很明显,即使用户更改了密码,但是master-key是不会更改的(每改密码一次都要全加密分区重新计算读写不现实)。我们只需要知道master-key的信息照样可以在不知道密码的情况下解密LUKS加密分区。
挂载lvm文件为分区
使用下面命令进行挂载
# 挂载lvm文件为回环设备并显示分配的设备名
sudo losetup -f --show xxx.lvm
# 列出/dev/loop0设备上物理卷信息
sudo pvs /dev/loop0
# 激活卷组cl(上一步命令中获取) 中的所有物理卷
sudo vgchange -ay cl
# 扫描系统中已识别到的lvm分区的信息
sudo vgscan
# 获取设备块信息
lsblk
经过上面的命令,可以成功挂载lvm文件为分区。
挂载xfs分区
使用命令进行挂载
sudo mount -t xfs /dev/mapper/分区名 <挂载点>