本文你将学习到如何在KVM加速的Qemu中运行Android Oreo (8.1.0) 系统,并通过我们的Linux x86_64主机上运行的Burp Suite,转发所有来自Android的流量。你将需要用到以下软件:
Linux Mint 19.1 (x86_64) 作为我们的主机系统(内核中内置了KVM支持)
Qemu(https://github.com/qemu/qemu)
Android 8.1.0(https://www.fosshub.com/Android-x86.html)
Burp Suite community(https://portswigger.net/burp/communitydownload)
我通常会从源码构建Qemu,通过git下载源码就足以构建完整的模拟器。
$ mkdir build $ cd build $ ../configure $ make# make install
想要拦截来自Android的SSL流量,我们必须将自生成的证书添加到系统cacert store(稍后会对此进行介绍)。
我当前正在使用的是以下网络脚本,用于我所有的qemu模拟。你也可以根据你的需要随时进行更改。
在我们的Linux x86_64主机上,我们需要以下脚本:
/etc/qemu-ifup
以及网络共享脚本(必须以root权限在qemu模拟器之前启动)(在Debian/Ubuntu上通过运行sudo apt-get install uml-utilities bridge-utils命令获取tunctl和brctl命令)
tunctl -t tap0 -u user ifconfig tap0 up brctl addbr br0 brctl setfd br0 0ifconfig br0 10.0.2.2 netmask 255.255.255.0 broadcast 10.0.2.255 up brctl addif br0 tap0 ifconfig tap0 0.0.0.0sysctl net.ipv4.ip_forward=1iptables --table nat -A POSTROUTING --out-interface wlan0 -j MASQUERADE
一旦我们准备好了所有这些,现在我们来安装最新的Android (x86_64),并运行它。
我们将在一个名为$ANDROID-QEMU的目录中工作(你可以随意调用它,我只是在这里给它分配了一个虚拟变量名),并创建一个10 Gigs大小的虚拟disk.img。同时,请确保你将Android iso移动到了该目录
$ mkdir $ANDROID-QEMU $ qemu-img create -f qcow disk.img 10G
接下来,我们将使用以下加载脚本运行安装程序
qemu-system-x86_64 -enable-kvm -boot d -cpu host -m 2048 -hda disk.img -cdrom android-x86_64-8.1-r2.iso -net nic -net tap
请确保你按如下方式设置了WiFi:
SSID: VirtWifi (Define as maual) no DHCP – Static IP – 10.0.2.12 Gateway 10.0.2.2 DNS 8.8.8.8
在进行了系统更新,网络测试等工作后。现在我们已准备好了进入下一阶段,在Android系统cacert目录中安装一个自定义CA,这样我们就可以截获Burp Suite中的传出/传入HTTPS流量。我所知道的唯一方法,是将自定义证书添加到/system/etc/security/cacert中的根文件系统中。
让我们关闭模拟器(从Qemu关闭ACPI将触发Android的关闭菜单)
让我们先从Linux主机挂载Qemu qcow2 image。
# apt-get install libguestfs-tools # cd $ANDROID-QEMU# mkdir img # guestmount -a disk.img -m /dev/sda1 img/ # cd img# cd android-8.1-r2/ # ls -latotal 867056drwxr-xr-x 3 root root 4096 Jul 7 22:11 . drwxr-xr-x 5 root root 4096 Jul 7 22:11 .. drwxrwx--x. 34 user user 4096 Jul 7 22:12 data -rw-r--r-- 1 root root 1358699 Jul 7 22:11 initrd.img -rw-r--r-- 1 root root 7437056 Jul 7 22:11 kernel -rw-r--r-- 1 root root 1424814 Jul 7 22:11 ramdisk.img -rw-r--r-- 1 root root 877621248 Jul 7 22:11 system.sfs
这里我们重点关注system.sfs文件,因为它包含了我们需要的系统cacert文件
# cp system.sfs ../.. // we are copying the system.sfs away # cd ../.. # umount img # mkdir SYS# mv system.sfs SYS # cd SYS # unsquashfs system.sfs // extracting the system.sfs # cd squashfs-root # ls -la total 2066844drwxrwxrwx 3 user user 4096 Jul 8 21:42 . drwxr-xr-x 3 root root 4096 Jul 8 21:40 .. -rw-r--r-- 1 user user 2318401536 Jul 8 21:43 system.img $ANDROID-QEMU/SYS/squashfs-root# file system.img system.img: Linux rev 1.0 ext4 filesystem data, UUID=da594c53-9beb-f85c-85c5-cedf76546f7a, volume name "system" (needs journal recovery) (extents) (large files)
让我们在这里创建一个名为img的新挂载目录
现在,我们终于进入到了Android rootfs中,现在让我们添加自定义证书。
我们将通过OpenSSL创建一个自定义证书,并将其导入Burp放置到Andriod中。
$ cd $CERTIFICATE-LOCATION //lets create some dummy cert directory$ openssl req -x509 -days 730 -nodes -newkey rsa:2048 -outform der -keyout server.key -out ca.der -extensions v3_ca $ openssl rsa -in server.key -inform pem -out server.key.der -outform der $ openssl pkcs8 -topk8 -in server.key.der -inform der -out server.key.pkcs8.der -outform der -nocrypt $ openssl x509 -inform der -in ca.der -out ca.pem $ openssl x509 -inform PEM -subject_hash_old -in ca.pem | head -1Check the hash value and change accordingly $ cp ca.pem abcdefg1.0$ openssl x509 -inform PEM -text -in ca.pem -out /dev/null>> abcdefg1.0And move to the extracted image on Android # mv abcdefg1.0 $ANDROID-QEMU/SYS/squashfs-root/img/etc/security/cacerts
现在,让我们把所有这些都整合到一起
首先,卸载system.img
# cd $ANDROID-QEMU/SYS/squashfs.root/ # umount img # rm -rf img # cd .. # mkdir BACKUP # mv system.sfs BACKUP/ // backup the original system.sfs # mksquashfs squashfs-root system.sfs -b 131072 // pack everything back up
Lets mount the qemu2 image agin # cd $ANDROID-QEMU/ # guestmount -a disk.img -m /dev/sda1 img/ # cd img# cd android-8.1-r2 # rm system.sfs // remove the original system.sfs # cp ../../SYS/system.sfs . // copy over the new modified one # cd ../.. # umount img
现在我们已经准备就绪,首先让我们为Android准备一个加载脚本
qemu-system-x86_64 -enable-kvm -boot c -cpu host -m 2048 -hda disk.img -cdrom android-x86_64-8.1-r2.iso -net nic -net tap
现在,我们可以通过执行上述操作来验证修改后的Android启动(将其保存为shell脚本用于后续的使用),如果一切顺利,你应该可以看到Android界面。
现在,让我们在Linux机器上启动Burp Suite并导入自定义生成的SSL证书,如下所示
加载后,我们设置Burp Suite在br0接口@ 10.0.2.2上侦听
接下来,我们需要告诉Android用于WiFi连接的代理地址和端口,我们只需重新配置网络即可(这里我花了一点时间才找到,代理设置被隐藏在了Oreo中)。
它必须看起来像上面一样。
配置完成后,我们就可以通过模拟Android上的Burp Suite来拦截所有流量了!
致谢:感谢Awakenned提供的方法
P.S 你可以尝试通过内置的终端模拟器添加CA证书;通过su提升到root权限
但是你会收到一条关于“read-only file system”的消息
我不确定如何使用RW标签在live system上remount。
也可以在Linux主机上安装adb工具:
sudo apt-get install android-tools-adb android-tools-fastboot
我们使用nmap扫描远程Android(IP分配为10.0.2.12)。
我们可以通过以下命令将adb启动到远程系统:
但我们仍坚持使用RO文件系统。
adb remount将/system部分置于可写入的模式,默认情况下/system部分是只读模式的。这个命令只适用于已被root的设备。
在将文件push到/system文件夹之前,必须先输入命令adb remount。
adb remount’的作用相当于:
adb shell mount -o rw,remount,rw /system
*参考来源:astr0baby,FB小编secist编译,转载来自FreeBuf
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.