红队植入物之攻击性物联网(第三部分):构建USB以太网设备与DHCP配置

本文详细介绍了如何配置树莓派Zero W作为USB以太网设备,实现与目标主机的TCP/IP通信。内容包括硬件选择、系统配置、脚本编写及DHCP服务设置,为红队植入物提供强大的网络通信能力。

红队植入物之攻击性物联网(第三部分)

这是《红队植入物之攻击性物联网》博客系列的第三部分。我们将基于上一篇文章的内容继续构建,上一篇文章可在此处找到:第二部分。如果您尚未阅读之前的博客文章,建议您先阅读后再返回此处。

在上一篇文章中,我们介绍了如何使用树莓派Pico作为USB橡皮鸭,并通过附加的LoRa调制解调器扩展其功能,以实现DuckyScript文件的无线执行。在本文中,我们将更进一步,利用迄今为止学到的所有知识,并将其提升到11级。

如果您还记得,在本系列的第一篇博客中,我展示了一个示例,即树莓派Zero W带有连接到引脚头的RM95 LoRa模块。我们将使用该设置作为本文剩余部分的硬件,以及上一篇博客中的自定义Pico/LoRa PCB之一,但这可以轻松替换为Adafruit Feather RP2040 with LoRa或类似设备。

以下是使用的硬件:

植入物硬件

  • 树莓派Zero W
  • Pi Zero的USB扩展板
  • breakout板上的RFM95 LoRa模块
  • 915MHz u.fl天线

操作员硬件

关于Pi Zero的USB扩展板的一个说明 – 有多种选择,但我的首选是Geek Pi USB扩展板,可以在亚马逊上以约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扩展板插入计算机。一段时间后,它应该启动,并且您应该能够使用安装期间设置的凭据和<hostname>.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培训课程: 太空系统网络安全导论(ICSS) 太空系统网络安全导论(ICSS):硬件版

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