Forensics
goodluks1
参考链接:https://blog.phionify.web.id/post/writeup-bsidessf19-ctf-forensic/
在拿到img文件之后,首先查看文件类型,是个MBR启动项。
root@automne:/Pentest# file goodluks1.img
goodluks1.img: DOS/MBR boot sector; partition 1 : ID=0x83, start-CHS (0x0,32,33), end-CHS (0x10,81,1), startsector 2048, 260096 sectors, extended partition table (last)
接着挂载镜像失败,尝试一通修复,并没有结果。
直到mount指定offset之后出现crypto_LUKS字符串,经过搜索才发现是Linux下的分区加密技术( Linux Unified Key Setup (LUKS))
赛后重新总结此题,发现可以使用PhotoRec & TestDisk工具来修复。
执行如下命令,在可视化界面中进行操作,注意选择ext4
photorec goodluks1.img
修复后的文件会在当前目录下生成一个recup_dir.1的文件夹,
root@automne:/Pentest/recup_dir.1# ls
f0000000.luks report.xml
然后输入下面的命令就可以开始解密了
cryptsetup luksOpen f0000000.luks showme
但是这里需要提供密码,还提供了一张图片,明显密码就在图片里
脑洞题啊,根据照片里的“EFF Membership”,可以定位到一个网站(https://www.eff.org/dice)和字典(https://www.eff.org/files/2016/07/18/eff_large_wordlist.txt)
从字典里取对应的数据,得到
wages upturned flogging rinse landmass number
这个就是密码了,在上面的命令的输入框里填入,就可以解密了
最终,挂载解密后的镜像(/dev/mapper/showme),即可得到flag。
goodluks2
参考链接:https://teamrocketist.github.io/2019/03/05/Forensics-BsidesSF-2019-goodluks2/
可怕,解压后32G的文件,下班回来一晚上又这样没了,好气啊。
root@automne:/Pentest# file goodluks2.img
goodluks2.img: DOS/MBR boot sector; partition 1 : ID=0x83, start-CHS (0x0,32,33), end-CHS (0x51,85,4), startsector 2048, 67106816 sectors, extended partition table (last)
下面说明查看offset的两种方法:
1.使用parted,下图标记处的1048576就是offset
2.使用fdisk,2048*512=1048576
拿到offset之后,直接mount会提示LUKS加密
使用如下命令,将镜像文件虚拟成块设备
losetup --offset 1048576 /dev/loop8 goodluks2.img
然后使用下面的命令将payload offset打印出来,可见是4096
cryptsetup luksDump /dev/loop8
接着使用dd将块设备的指定偏移dump出来,得到LUKS_Header.dd
dd if=/dev/loop8 of=LUKS_Header.dd bs=521 count=4096
然后就是使用hashcat加载rockyou.txt(kali下/usr/share/wordlists自带)去爆破这个文件头hash
在kali虚拟机里使用hashcat,提示内存不足,所以直接在windows下爆破。
在hashcat安装目录,使用如下命令:
hashcat64.exe -D 1,2 -a 0 -m 14600 LUKS_Header.dd rockyou.txt
跑了25分钟了,还没出来,底下的命令不用管,后台一直在处理。
随着笔记本的CPU声响的降低,我告诉自己,破出来了,耗时34分钟。
拿到密码gaffer3后,就可以破解luks了。
使用下面的命令:
cryptsetup luksOpen /dev/loop8 luks2
输入密码:gaffer3
然后到/dev/mapper/里将luks2挂载到/mnt里
即可读取到flag
goodluks3
参考链接:https://teamrocketist.github.io/2019/03/05/Forensics-BsidesSF-2019-goodluks3/
提供的是加密后的磁盘镜像和内存文件。
遇到内存文件,原则上会使用volatility去处理,但是这里无法直接识别,对于Linux内存需要定制profile,比较麻烦。
换个思路。
对于luks加密的磁盘和内存文件,一般是想让我们找到master key再处理,参考下图。
$ findaes.exe D:\Learning\CTF\BSidesSF_3_5\goodluks3\goodluks3.mem
Searching D:\Learning\CTF\BSidesSF_3_5\goodluks3\goodluks3.mem
Found AES-256 key schedule at offset 0x895dd88:
b0 7a 29 f5 44 15 47 76 57 04 6e ec d3 03 f5 bd af a4 e6 df b2 71 01 ab af 7e 22 e1 23 94 15 f5
Found AES-256 key schedule at offset 0x895df78:
8e 8c 3a 67 eb 11 54 6c b1 cc 7d 0f cc 85 e8 43 30 7c 16 d4 7f 86 08 a1 0f 59 3d 4c 31 0f c8 6a
可见,拿到两个AES-256 key。
使用parted命令
parted goodluks3.img
输入交互命令得到下面的信息:
(parted) U
Unit? [compact]? B
(parted) print
Model: (file)
Disk /Pentest/goodluks3.img: 4294967296B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1048576B 2999975935B 2998927360B primary ext4 boot
2 2999975936B 4000317439B 1000341504B primary
3 4000317440B 4293918719B 293601280B primary linux-swap(v1)
将第二部分挂载到loop块:
losetup --offset 2999975936 /dev/loop9 goodluks3.img
然后将上面得到的两个AES-256的key拼接到一起,格式化后存到key0里。
echo '8e 8c 3a 67 eb 11 54 6c b1 cc 7d 0f cc 85 e8 43 30 7c 16 d4 7f 86 08 a1 0f 59 3d 4c 31 0f c8 6a b0 7a 29 f5 44 15 47 76 57 04 6e ec d3 03 f5 bd af a4 e6 df b2 71 01 ab af 7e 22 e1 23 94 15 f5' | tr -d ' ' | xxd -r -p > key0
然后指定master-key-file参数即可
cryptsetup luksOpen --master-key-file key0 /dev/loop9 luks3
然后就是挂载一条龙,前面两题已经操作过,直接上图
通过这三道题的学习,对于Linux下的LUKS加密有了更多认识。