笔记 & WP

IOT-qenu模拟

Word count: 1.2kReading time: 5 min
2024/03/12

DDDD

近期准备西湖论剑的比赛,之前对IOT安全这方面有着一丢丢的研究,这篇来主要讲一下qemu模拟,以及我遇到的槽点,特别是针对于使用WSL

为什么要用qemu模拟

笔者之前在复现路由器等漏洞的时候,都是用qemu的用户模拟,我们需要去patch一些东西才可以完成模拟,并且在qemu的用户模拟下,我们不能完完全全的模拟真实的环境

因此我们可能会用到工具类似于FirmAE等等,但是这类工具模拟出来的系统有时候并不能完全可以使用,我们可以进入系统内解决,但有时候系统都进不去还是蛮搞的,因此研究qemu的系统模拟就显得尤为重要了

网上常见的qemu模拟

基本上是直接用安装好系统的磁盘占大多,主要是图个方便,可以参考这个文章

但是抱着如果以后的固件系统的glibc版本会越来越高,最好是学习一下怎么安装一个qemu系统

安装系统

这里是参考这个大佬的文章

首先我们肯定是要安装qemu

1
sudo apt-get install qemu-system-mipsel qemu-utils

下载系统必要文件

我们可以通过这个网址去看现在的debian的系统,我们主要也是下载最重要的安装&启动文件,这里我们用wget下载下来

1
wget http://ftp.debian.org/debian/dists/stable/main/installer-mipsel/current/images/malta/netboot/initrd.gz
1
wget http://ftp.debian.org/debian/dists/stable/main/installer-mipsel/current/images/malta/netboot/vmlinuz-6.1.0-18-4kc-malta

创建磁盘

这里这个磁盘也就是我们安装系统的系统盘

1
qemu-img create -f qcow2 debian.qcow2 8g

安装 Debian MIPSEL

这里我们需要将上述的三个文件放到通过文件夹下,以便我们启动安装

1
2
3
4
5
6
qemu-system-mipsel -M malta \
-m 256 -hda debian.qcow2 \
-kernel vmlinuz-5.10.0-18-4kc-malta \
-initrd initrd.gz \
-append "console=ttyS0 nokaslr" \
-nographic

安装过程基本上也跟参考文章一致,可以自己去对照操作,这里不重复搬运

安装 bootloader

这里实际上就是提取我们启动系统磁盘的文件,在我们创建的磁盘的/boot文件下

提取文件

因为这里qemuqcow2的格式的磁盘,我们如果要挂在磁盘还需要其他的操作

这里参考文章有点小小错误就是把磁盘以img结尾,导致我以为我一直没有安装成功

挂载磁盘
1
2
3
sudo modprobe nbd mac_part=16
sudo qemu-nbd -c /dev/nbd0 debian.qcow2
sudo mount /dev/nbd0p1 /tmp/temp
提取
1
2
cp -r /tmp/temp/boot/initrd.img-5.10.0-18-4kc-malta .
cp -r /tmp/temp/boot/vmlinuz-6.1.0-18-4kc-malta .
取消挂载
1
2
sudo umount /tmp/temp
sudo qemu-nbd -d /dev/nbd0

正式启动虚拟机

start.sh脚本

1
2
3
4
5
6
sudo qemu-system-mipsel -M malta \
-m 1024 -hda debian.qcow2 \
-kernel vmlinuz-6.1.0-18-4kc-malta \
-initrd initrd.img-6.1.0-18-4kc-malta \
-append "root=/dev/sda1 console=ttyS0 nokaslr" \
-nographic

配置网络

由于也是接触不久qemu,不算是最佳方案去联网,参考文章

安装工具

1
sudo apt-get install uml-utilities

创建一张虚拟TUN网卡

1
sudo tunctl -t tap0 -u root # 这里可以是你自己的用户名

将网卡设置为任何人都有权限使用:

1
sudo chmod 0666 /dev/net/tun

设置ip地址

不能跟自己本地的任何ip有冲突

1
sudo ifconfig tap0 192.168.2.1 up

为虚拟机开启IP数据包转发

1
2
echo 1 > /proc/sys/net/ipv4/ip_forward   #只能在root环境下执行
sudo iptables -t nat -A POSTROUTING -j MASQUERADE

这里我们可以直接修改系统配置,以后就不用进入root去执行了

1
2
vim /etc/sysctl.conf
#将 net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1

现在我们的启动脚本

1
2
3
4
5
6
7
sudo qemu-system-mipsel -M malta \
-m 1024 -hda debian.qcow2 \
-kernel vmlinuz-6.1.0-18-4kc-malta \
-initrd initrd.img-6.1.0-18-4kc-malta \
-append "root=/dev/sda1 console=ttyS0 nokaslr" \
-net nic -net tap,ifname=tap0 \
-nographic

槽点

我们还需要进入到qemu系统里面去配置IP,而且容易掉ip

1
ip addr add 192.168.2.2/24 dev <虚拟的内部自己网卡>

然后我们还需要设置网关

1
ip route add default via 192.168.2.1

这样应该可以联网了 (butWSL不行)

不愧是之前学网络的,研究了半天发现,qemu出去的包是没有问题的,但是一旦出去了WSL网络,就回不来,那么真相只有一个!

windows没有对应的路由!!!!!!!

1
route add 192.168.2.0 mask 255.255.255.0 172.20.96.1

这里自己需要对应修改qemu的网段,以及wsl的网关,就是windowswslip地址

最后

可以直接在qemu的启动脚本上配置网络

1
vim /etc/qemu-ifup
1
2
3
4
5
6
7
tunctl -u root -t $1

echo sudo chmod 0666 /dev/net/tun
chmod 0666 /dev/net/tun

ifconfig tap0 192.168.2.1 up
iptables -t nat -A POSTROUTING -j MASQUERADE
CATALOG
  1. 1. DDDD
    1. 1.1. 为什么要用qemu模拟
    2. 1.2. 网上常见的qemu模拟
    3. 1.3. 安装系统
      1. 1.3.1. 下载系统必要文件
      2. 1.3.2. 创建磁盘
      3. 1.3.3. 安装 Debian MIPSEL
      4. 1.3.4. 安装 bootloader
        1. 1.3.4.1. 提取文件
          1. 1.3.4.1.1. 挂载磁盘
          2. 1.3.4.1.2. 提取
          3. 1.3.4.1.3. 取消挂载
    4. 1.4. 正式启动虚拟机
    5. 1.5. 配置网络
      1. 1.5.1. 安装工具
      2. 1.5.2. 创建一张虚拟TUN网卡
        1. 1.5.2.1. 将网卡设置为任何人都有权限使用:
        2. 1.5.2.2. 设置ip地址
        3. 1.5.2.3. 为虚拟机开启IP数据包转发
      3. 1.5.3. 现在我们的启动脚本
        1. 1.5.3.1. 槽点
      4. 1.5.4. 最后