红队植入式攻击物联网设备实战(第三部分)
这是《红队植入式攻击物联网设备》博客系列的第三部分。我们将基于上一篇文章的内容继续构建,上一篇文章可以在这里找到:第二部分。
如果你还没有阅读之前的博客文章,我建议你先阅读它们,然后再回到这里。
在上一篇文章中,我们介绍了如何使用树莓派Pico作为USB橡皮鸭,并通过附加的LoRa调制解调器扩展其功能,以实现DuckyScript文件的无线执行。
在这篇文章中,我们将更进一步,利用迄今为止所学的一切,并将其提升到11级。
如果你还记得,在本系列的第一篇博客中,我展示了一个树莓派Zero W的例子,它带有一个连接到引脚头的RM95 LoRa模块。
好吧,我们将使用该设置作为本文剩余部分的硬件,以及上一篇博客文章中的自定义Pico/LoRa PCB之一,但这可以轻松替换为Adafruit Feather RP2040 with LoRa或类似设备。
以下是将要使用的硬件:
植入硬件 –
- 树莓派Zero W
- 用于Pi Zero的USB Dongle板
- breakout板上的RFM95 LoRa模块
- 915MHz u.fl天线
操作员硬件 –
关于用于Pi Zero的USB Dongle板的一个说明 – 有多种选择,但到目前为止,我首选的版本是Geek Pi USB Dongle扩展板,可以在亚马逊上以约11美元的价格购买:https://www.amazon.com/GeeekPi-Dongle-Expansion-Raspberry-Inserted/dp/B098JP79ZX。
还有其他选择;正如我所说,我尝试了大多数,它们都适用于此目的。这些USB板的整个目标是提供通过USB Type A端口连接植入物的能力,就像连接USB驱动器一样,而不需要电缆来为Pi供电和传输数据。
在本文的剩余部分,我们将专注于配置Pi Zero,使其向目标计算机呈现为USB以太网设备,并自动分配IP地址,以便植入物和主机可以通过TCP/IP进行通信。
在我看来,这是使用Pi Zero作为物理植入物设置中最困难但最关键的部分。与功能相当有限的树莓派Pico不同,拥有一个完整的Linux计算机作为你的植入物是一个非常强大的工具,并且能够使主机与植入物通信对于最大化平台潜力至关重要。
深入操作
一旦你的硬件准备就绪,你需要在MicroSD卡上安装一个操作系统。我建议使用Raspbian以及树莓派Imager软件将操作系统安装到卡上。在这样做时,建议你启用SSH并配置Wi-Fi,因为这将使只需将Pi Zero W插入主机并开始使用变得更容易。
SD卡准备好后,插入插槽并将USB Dongle插入计算机。一段时间后,它应该启动,你应该能够使用在安装过程中设置的凭据和.local(其中hostname是在安装过程中设置的主机名)SSH进入它。
一旦连接到Pi Zero,确保在更改配置之前安装所有更新。首先,你需要修改位于/boot/config.txt的config.txt文件,并在末尾添加以下行:
此配置选项启用了将很快利用的USB小工具。接下来,使用sudo reboot命令重新启动你的Pi Zero,以便启用USB小工具。
重新启动后,重新连接到你的Pi Zero,你需要创建一个脚本,该脚本将完成配置USB小工具的大部分繁重工作。
这里的脚本几乎是以下博客文章中内容的精确副本:https://jon.sprig.gs/blog/post/2243
我鼓励你阅读它,因为作者很好地解释了“为什么” – 不仅对于这个脚本,而且对于接下来大部分过程。我对作者的代码进行了一些修改,以简化我们的需求,但所有功劳归Jon“The Nice Guy”Spriggs。
你需要做的是使用以下命令将以下脚本复制到位于/opt/implant.sh的文件中:
1
|
sudo nano /opt/implant.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#!/bin/bash
# Based on a combination of: http://www.isticktoit.net/?p=1383
# and: https://www.raspberrypi.org/forums/viewtopic.php?t=260107
# and: https://gist.github.com/schlarpc/a327d4aa735f961555e02cbe45c11667/c80d8894da6c716fb93e5c8fea98899c9aab8d89
# and: https://github.com/ev3dev/ev3-systemd/blob/02caecff9138d0f4dcfeb5afbee67a0bb689cec0/scripts/ev3-usb.sh
configfs="/sys/kernel/config/usb_gadget"
this="${configfs}/Implant"
# Configure values
serial="$(grep 'Serial' /proc/cpuinfo | head -n 1 | sed -E -e 's/^Serial\s+:\s+0000(.+)/\1/')"
model="$(grep 'Model' /proc/cpuinfo | head -n 1 | sed -E -e 's/^Model\s+:\s+(.+)/\1/')"
manufacturer="Raspberry Pi Foundation"
# The serial number ends in a mac-like address. Let's use this to build a MAC address.
# The first binary xxxxxx10 octet "locally assigned, unicast" which means we can avoid
# conflicts with other vendors.
mac_base="$(echo "${serial}" | sed 's/\(\w\w\)/:\1/g' | cut -b 4-)"
ecm_mac_address_dev="02${mac_base}" # ECM/CDC address for the Pi end
ecm_mac_address_host="12${mac_base}" # ECM/CDC address for the "host" end that the Pi is plugged into
rndis_mac_address_dev="${mac_base}22" # RNDIS address for the Pi end
rndis_mac_address_host="32${mac_base}" # RNDIS address for the "host" end that the Pi is plugged into
# Make sure that libComposite is loaded
libcomposite_loaded="$(lsmod | grep -e '^libcomposite' 2>/dev/null)"
[ -z "${libcomposite_loaded}" ] && modprobe libcomposite
while [ ! -d "${configfs}" ]
do
sleep 0.1
done
# Make the path to the libComposite device
mkdir -p "${this}"
echo "0x0200" > "${this}/bcdUSB" # USB Version (2)
echo "0x1d6b" > "${this}/idVendor" # Device Vendor: Linux Foundation
echo "0x0104" > "${this}/idProduct" # Device Type: MultiFunction Composite Device
echo "0x02" > "${this}/bDeviceClass" # This means it is a communications device
# Device Version (this seems a bit high, but OK)
# This should be incremented each time there's a "breaking change" so that it's re-detected
# rather than cached (apparently)
echo "0x4000" > "${this}/bcdDevice"
# "The OS_Desc config must specify a valid OS Descriptor for correct driver selection"
# See: https://www.kernel.org/doc/Documentation/ABI/testing/configfs-usb-gadget
|
保存该文件后,你需要使用以下命令使其可执行:sudo chmod +x /opt/implant.sh
接下来,你需要创建一个服务来自动运行该脚本。为此,在/lib/systemd/systems/Implant.service创建一个名为Implant.service的文件。我使用以下命令来执行此操作:
1
|
sudo nano /lib/system/system/Implant.service
|
将以下脚本粘贴到文件Implant.service中。
1
2
3
4
|
[Unit] Description=Start libComposite
[Service] Type=oneshot
ExecStart=/opt/lib_composite.sh
[Install] WantedBy=multi-user.target
|
保存该文件,然后使用以下命令启用服务:
1
|
sudo systemctl enable Implant.service
|
现在,你需要重新启动你的植入物。
一旦植入物重新启动并重新连接,发出ifconfig命令。你现在应该看到两个接口,usb0和usb1。
由于之前在Jon Spriggs博客文章中讨论的原因,我们配置了两个接口,但我们只真正关心usb1接口,因为它是唯一适用于现代Windows主机的接口。usb0接口用于传统系统,虽然你可能永远不会实际使用它,但我们配置了两个以防万一。
目前,这些接口没有任何配置应用,所以这是下一步。
在/etc/network/interfaces.d/中创建一个名为usb0的文件,并用以下详细信息填充它。你可以使用命令sudo nano /etc/network/interfaces.d/usb0来创建文件。
1
2
3
4
|
allow-hotplug usb0
iface usb0 inet static
address 192.168.254.2
netmask 255.255.255.0
|
保存该文件,并为usb1重复此过程,通过创建文件/etc/network/interfaces.d/usb1并将以下内容保存到其中。
1
2
3
4
|
allow-hotplug usb1
iface usb1 inet static
address 192.168.255.2
netmask 255.255.255.0
|
配置接口后,现在你需要配置DHCP服务以向目标主机发放IP地址。为此,我们将使用dnsmasq,你需要使用以下命令安装它:
1
|
sudo apt install dnsmasq
|
成功安装dnsmasq后,你需要通过编辑位于/etc/dnsmasq.conf的dnsmasq配置文件来配置它。
使用以下命令,你可以创建文件并保存下面的代码:
1
|
sudo nano /etc/dnsmasq.conf
|
1
2
3
4
5
6
7
8
|
interface=usb0
interface=usb1
bind-interfaces
dhcp-range=usb0,192.168.254.3,192.0.2.3,2h
dhcp-range=usb1,192.168.255.3,192.168.255.3,2h
dhcp-option=option:router
|
你刚刚在dnsmasq.conf文件中设置的配置相当简单,但我会提供一个高级概述,以便你不会盲目操作。
前三行只是在dnsmasq中设置接口,但真正重要的是两个dhcp-range行,其中配置了每个接口的DHCP范围,在这种情况下,我们将DHCP范围设置为单个IP地址:192.168.25X.3。这允许目标主机接收一个已知的IP地址,仅此而已!
最后一行有效地告诉dnsmasq在发放DHCP地址时不要设置网关/路由器。我们需要这样做,以便你不干扰主机的路由…目前。
接下来,你需要告诉dnsmasq不要绑定到localhost。你可以通过取消注释/etc/default/dnsmasq的最后一行来说DNSMASQ_EXCEPT=”lo”并保存文件来做到这一点。
你可以使用命令sudo nano /etc/default/dnsmasq来执行此操作。
现在dnsmasq已配置,你需要创建一个shell脚本和一个服务,在接口启动后启动dnsmasq,因为dnsmasq配置需要这些接口作为配置应用的依赖项。
在/opt/dnsmasq.sh创建一个脚本,并使用以下命令插入下面的代码:
1
|
sudo nano /opt/dnsmasq.sh
|
1
2
3
4
5
|
#!/bin/bash
set -x
systemctl disable --now dnsmasq
mv /etc/init.d/dnsmasq /etc/init.d/dnsmasq.initd
sed -i -e "s/Requires=network.target/Requires=network.target sys-subsystem-net-devices-usb0.device sys-subsystem-net-devices-usb1.device/" -e "s~/etc/init.d/dnsmasq ~/etc/init.d/dnsmasq.initd ~g" /lib/systemd/system/dnsmasq.service
|
保存文件并使用以下命令使脚本可执行:
1
|
sudo chmod +x /opt/dnsmasq.sh
|
然后,你需要通过将下面的代码复制到文件/lib/systemd/system/StartDNSMASQ.service中并保存来创建一个单元文件,以在适当的时间启动dnsmasq,使用以下命令:
1
|
sudo nano /lib/systemd/system/StartDNSMASQ.service
|
1
2
3
4
5
6
7
8
9
10
|
[Unit]
Description=Start DNSMasq
After=network-online.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c "/opt/dnsmasq.sh"
[Install]
WantedBy=multi-user.target
|
接下来,使用以下命令启用新创建的服务:
1
|
sudo systemctl enable StartDNSMASQ.service
|
现在,重新启动你的植入物。
鼓声….
一旦你的植入物重新启动,几分钟后你的主机计算机应该注册一个新的以太网设备,在我的情况下是Ethernet 4,并被指定为Remote NDIS Compatible Device。如果一切按预期工作,它应该获得IP地址192.168.255.3。
注意:你可能会收到如下警告。我没有花时间弄清楚如何避免这个,所以,是的。抱歉。在这一点上是预期的。
哇,如果你做到了这一步,我很高兴地告诉你困难的部分已经结束!恭喜。
在本博客系列的第四部分,我们将从这里开始,完成集成LoRa带外通信,以创建最终的物理植入物。
敬请关注。
阅读:
第一部分
第二部分
你可以直接从Tim本人那里了解更多信息,参加他的Antisyphon培训课程:
空间系统网络安全导论(ICSS)
空间系统网络安全导论(ICSS):硬件版