红队植入攻击:打造强大IoT硬件植入设备(第三部分)

本文详细介绍了如何配置Raspberry Pi Zero W作为USB以太网设备,通过dnsmasq分配IP地址,实现与目标主机的TCP/IP通信,为红队操作提供强大的物理植入能力。

红队植入攻击:打造强大IoT硬件植入设备(第三部分)

| 作者:Tim Fowler

这是《红队植入攻击:打造强大IoT硬件植入设备》博客系列的第三部分。我们将从上一篇文章结束的地方继续构建,上一篇文章可以在这里找到:第二部分

如果你还没有阅读之前的博客文章,我建议你先阅读,然后再回到这里。

在上一篇文章中,我们介绍了如何使用Raspberry Pi Pico作为USB橡胶鸭子,并通过附加的LoRa调制解调器扩展其功能,以实现DuckyScript文件的空中执行。

在这篇文章中,我们将更进一步,利用我们迄今为止学到的所有知识,并将其提升到11级。

如果你还记得,在本系列的第一篇博客中,我展示了一个示例,即Raspberry Pi Zero W带有连接到头针的RM95 LoRa模块。

好吧,我们将使用该设置作为本文剩余部分的硬件,以及上一篇博客文章中的自定义Pico/LoRa PCB之一,但这可以轻松替换为Adafruit Feather RP2040 with LoRa或类似设备。

以下是将要使用的硬件:

植入硬件

  • Raspberry Pi Zero W
  • Pi Zero的USB Dongle板
  • breakout板上的RFM95 LoRa模块
  • 915MHz u.fl天线

操作员硬件

关于Pi Zero的USB Dongle板的一个说明 – 有多种选择,但到目前为止,我首选的版本是Geek Pi USB Dongle Expansion Board,可以在Amazon上以约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作为物理植入物设置中最困难但最关键的部分。与相当有限的Raspberry Pi Pico不同,拥有完整的Linux计算机作为你的植入物是一个非常强大的工具,并且能够使主机与植入物通信对于最大化平台的潜力至关重要。

深入配置

一旦你的硬件准备就绪,你需要在MicroSD卡上安装操作系统。我建议使用Raspbian以及Raspberry Pi Imager软件将操作系统安装到卡上。在执行此操作时,建议你启用SSH并配置Wi-Fi,因为这将使只需将Pi Zero W插入主机并开始使用变得更加容易。

SD卡准备好后,插入插槽并将USB Dongle插入计算机。一段时间后,它应该启动,你应该能够使用在安装过程中设置的凭据和.local(其中hostname是在安装过程中设置的)SSH进入它。

一旦连接到Pi Zero,确保在更改配置之前安装所有更新。首先,你需要修改位于/boot/config.txt的config.txt文件,并在末尾添加以下行:

1
dtoverlay=dwc2

此配置选项启用了将很快利用的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培训课程中了解更多: Introduction to Cybersecurity in Space Systems (ICSS) Introduction to Cybersecurity in Space Systems (ICSS): Hardware Edition

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计