Ocean-ng/C2-Backdoor-in-Drone-Fleet-An-End-to-End-Malware-Analysis-and-Risk-Based-Defense-Framework.md

GitHub: Ocean-ng/C2-Backdoor-in-Drone-Fleet-An-End-to-End-Malware-Analysis-and-Risk-Based-Defense-Framework.md

面向无人机/IoT 舰队的恶意软件分析框架,通过隔离沙盒环境复现 C2 后门攻击链路并提供基于 Snort 的风险防御方案。

Stars: 0 | Forks: 0

# 基础设施与实验环境搭建指南 ## 1. 虚拟网络配置(沙盒环境) 在创建虚拟机之前,我们必须创建一个私有网络区域,以便这两台机器可以相互通信,而不会泄露到外部网络。 * **网络类型:** LAN Segment(在 VMware Workstation 中)。 * **创建步骤(在 VMware Workstation 中):** 1. 进入 **VM** 标签页 > **Settings** > **Network Adapter**。 2. 点击 **LAN Segments...** 按钮 > 点击 **Add** 并将其命名为 `nhom4`。 3. 点击 **OK**。现在,在 Network Connection 部分,选择 **LAN segment** 选项并为两台虚拟机都选择 `nhom4`。 4. 创建一个额外的网络适配器,以便在需要进一步安装时,能更灵活地在 LAN Segment 和 NAT 之间切换。 -> 点击 **Add** -> **Network Adapter** -> 将 **Network Adapter 1** 设置为 NAT -> 将 **Network Adapter 2** 设置为 LAN segment (`nhom4`)。 **静态 IP:** 由于 LAN Segment 没有自动的 DHCP IP 分配器,我们将建立一个静态子网:`192.168.100.0/24`。通过像这样设置静态 IP,即使机器关机然后再开机,IP 也不会改变。 image image ## 2. KALI LINUX(红队) 这台机器用于构建 Mirai,执行场景 1 的静态和动态分析,并运行 Wireshark 来分析 Mirai 的 Hex 代码,以及在场景 2 中使用 tcpreplay 将数据包注入网络。 * **CPU:** 2 核。 * **内存 (RAM):** 4 GB。 * **硬盘:** 30 GB。 * **网络适配器设置:** 放入 LAN segment:`nhom4`。 * **静态 IP 配置:** (请记住在配置之前仔细检查机器的网卡) * 将 IP 设置为 `192.168.100.10`。 **在 Kali 上配置静态 IP:** 传统的 Kali Linux 使用 `interfaces` 文件进行网络配置,而不是 netplan。 在 Kali 上打开终端并输入以下命令以检查网卡名称: ``` ip a ``` 你会看到 2 个物理网卡:`eth0`(目前从 NAT 获取动态 IP)和 `eth1`(尚无 IP,预留给 LAN Segment)。 image 使用以下命令打开网络配置文件: ``` sudo nano /etc/network/interfaces ``` 滚动到最底部并添加以下配置块,以强制为 `eth1` 网卡分配静态 IP `192.168.100.10`: ``` auto eth1 iface eth1 inet static address 192.168.100.10 netmask 255.255.255.0 ``` *(按 Ctrl+O -> Enter -> Ctrl+X)* image 重启网络服务以应用配置: ``` sudo systemctl restart networking ``` image 查看 VMware 窗口右下角的底部,找到当前为 NAT 的网卡图标,右键点击它并选择 **Disconnect**。 image image 此时,Kali 已完全断开与 Internet 的连接,但命令与控制 软件仍会在 IP `192.168.100.10` 上正常监听。来自 Ubuntu 机器(也将断开 NAT 连接)的 bot 将通过 LAN Segment 平滑且安全地连接到 Kali。 ## 3. UBUNTU SERVER 最新版本(蓝队) 这台机器充当受感染的 Drone(接收流量的目标),并同时充当运行 Snort IDS 的监控网关。 * **CPU:** 2 核。 * **内存 (RAM):** 4 GB。 * **硬盘:** 25 GB。 * **网络适配器设置:** 放入 LAN segment:`nhom4`。 * **静态 IP 配置:** (先检查网卡) * 将 IP 设置为 `192.168.100.20`。因为 Ubuntu Server 使用 CLI,所以它将通过 Netplan 进行配置。 **第 1 步:查找网卡名称。** 打开终端并输入以下命令: ``` ip a ``` image 此时,将出现 2 个物理网卡(名为 `ens33 up` 和 `ens37 up`;这些名称在你的机器上可能有所不同,因此请仔细检查)。 对于需要输入长命令的步骤,你应该使用 SSH 以提高速度。如果有人遇到 SSH 错误并且无法像这样进行 SSH: ``` C:\Users\admin>ssh phat@192.168.18.136 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ ``` 你可以按如下方法修复它,因为这是主机密钥验证冲突: ``` ssh-keygen -R 192.168.18.136 ssh phat@192.168.18.136 ``` **第 2 步:打开网络配置文件** ``` ls /etc/netplan/ ``` 该文件将被命名为 `00-installer-config.yaml`。 image 使用 nano 命令编辑该文件: ``` sudo nano /etc/netplan/00-installer-config.yaml ``` **第 3 步:编辑 IP(注意空格)。** 注意:YAML 文件对空格极其敏感。绝对不要使用 Tab 键;只能使用 Space(空格)键进行缩进: ``` network: ethernets: ens33: dhcp4: true ens37: addresses: - 192.168.100.20/24 version: 2 ``` (在此配置中,`ens33` 将自动从 NAT 接收 Internet,而 `ens37` 为 LAN Segment 网络持有固定 IP `192.168.100.20`)。 image *(按 Ctrl+O -> Enter -> Ctrl+X)* **第 4 步:应用配置并输入命令让系统获取 IP:** ``` sudo netplan apply ``` **当需要 Internet 时(下载 Snort 包、更新系统等):** 我们不需要做任何事情。默认情况下,Adapter 1 (NAT) 已连接,虚拟机将有 Internet 连接。 **运行 Mirai 恶意软件时:** 在 VMware 窗口边框的右下角。 你会看到 2 个小电脑图标(对应 2 个网卡)。 将鼠标悬停在每一个图标上以查看哪一个是 NAT。 右键点击那个 NAT 图标 -> 选择 **Disconnect**。 这种方法就像从物理上拔掉 Ubuntu 服务器的互联网网线一样。其中的恶意软件将被完全困在通过 `ens37` 网卡的 LAN Segment 内。同时,由于你没有删除操作系统内的网络配置,因此当你关闭机器时,网络服务不会报错或挂起。 ## 4. Ping 测试 在为两台机器设置固定 IP 后,相互进行 ping 测试以检查这 2 台机器是否可以在同一子网内相互连接。 * **Kali:** `ping 192.168.100.20 -c 4` * **Ubuntu:** `ping 192.168.100.10 -c 4` image image # 项目实施 ## 1. 防御者机器设置(Ubuntu Server - 蓝队) 这台机器充当 Drone 的“网关”,并在其上安装了入侵检测系统。 **1.1. 更新并安装 Snort。** 在 Ubuntu 上打开终端并输入这些命令: ``` sudo apt update && sudo apt upgrade -y # 安装 Snort(安装过程会询问子网;请输入你的 Host-Only 子网,例如 192.168.100.0/24) sudo apt install snort -y ``` **1.2. 检查网卡名称。** 输入命令 `ip a` 查看你的网卡名称(例如,`ens33` 或 `eth0`)。 **1.3. 备份并建立 Snort 配置** ``` # 备份原始配置文件 sudo cp /etc/snort/snort.conf /etc/snort/snort.conf.bak # 打开配置文件进行编辑 sudo nano /etc/snort/snort.conf ``` 在这个文件中,找到 `ipvar HOME_NET any` 这一行并将其更改为 `ipvar HOME_NET 192.168.100.0/24`(替换为你的虚拟网络 IP 子网)。 ## 2. 在 Kali Linux 上准备数据和工具(红队) 这台机器将用于 PCAP 分析(协议 RE)以及将流量推入网络以测试 Snort。 **2.1. 安装重放与分析工具集** ``` sudo apt update sudo apt install tcpreplay tshark -y ``` **2.2. 有 2 种有趣的方法来分析 Mirai:** * 构建 Mirai 源代码并对其进行分析(在构建和分析期间,你需要切换到 LAN segment)。 一旦你获得了源代码,分析此恶意软件的步骤如下: 从 Src Code 编译成 Malware 一旦你获得了 Malware --> 进行分析。 image image ### 配置 Bot * 在 Kali 机器上构建 在 `./mirai/bot/table.h` 中,你可以找到有关配置选项的大部分说明。 在 `./mirai/bot/table.c` 中,有几个选项需要更改才能使其正常工作。 * `TABLE_CNC_DOMAIN` - 要连接的 CNC 的域名 * `TABLE_CNC_PORT` - 要连接的端口,已设置为 23 * `TABLE_SCAN_CB_DOMAIN` - 当找到暴力破解结果时,将向此域名报告 * `TABLE_SCAN_CB_PORT` - 为暴力破解结果连接的端口,已设置为 48101。 (*) 将默认的 cnc 域名保留为 `cnc.changeme.com : 23`,并将报告目的地保留为 `report.changeme.com : 48101`。这样在构建完成后,我们就可以直接将其 DNS 重定向到我们想要的服务器。 在 Mirai botnet 系统中,网络通常分为 2 个主要数据流:命令流 (C2) 和感染结果报告流 (Scan Receiver)。 * **`TABLE_CNC_DOMAIN` & `TABLE_CNC_PORT` (端口 23):** * **含义:** 这是大脑服务器 (C2 Server) 的地址和端口。 * **运行方式:** 当一个 IoT 设备(如 Drone)被恶意软件感染时,它所做的第一件事就是静默连接到此地址(报告它存活的状态),并等待来自黑客的 DDoS 攻击命令。 * **为什么是端口 23?** 端口 23 通常用于合法的 Telnet 服务。Mirai 的作者有意设计 C2 通过端口 23 进行通信,以隐藏流量(将恶意软件流量混入正常的 Telnet 流量中),从而绕过配置松散的防火墙。 * **`TABLE_SCAN_CB_DOMAIN` & `TABLE_SCAN_CB_PORT` (端口 48101):** * **含义:** CB 代表 Callback。这是专门用于接收“报告”的服务器地址。 * **运行方式:** 当空闲(不进行 DDoS 攻击)时,bot 将不断扫描周围网络,以查找其他密码薄弱的 IoT 设备。如果它成功暴力破解了一台设备(例如,找到了账号 root / 密码 12345),它会立即打包该 IP 和密码,并通过端口 48101 将其发送回此地址。大脑接收到此信息后,随后将使用 Loader 文件去感染该新设备。 **1. 在 Kali Linux 上安装交叉编译器:** ``` sudo apt update # 安装适用于 ARM 芯片的编译器(在 Drone/Camera 线路上非常常见) sudo apt install gcc-arm-linux-gnueabi gcc-arm-linux-gnueabihf -y # 安装适用于 MIPS 芯片的编译器(常见于 Routers/Gateways)(你不需要安装这个) sudo apt install gcc-mips-linux-gnu gcc-mipsel-linux-gnu -y # 安装适用于 PowerPC 和 SuperH (SH4) 芯片的编译器 sudo apt install gcc-powerpc-linux-gnu gcc-sh4-linux-gnu -y ``` image image **2. 更正 `build.sh` 中的编译器命令名称** 2016 年的 Mirai 原始源代码使用旧名称调用编译器命令。但在现代的 Kali Linux 发行版中,这些命令已被重命名为新的标准。 你需要打开 `build.sh` 文件并将命令名称更改为你刚刚安装的包相匹配的名称: ``` # 为 x86 编译(Lab Virtual Machine) gcc -fcommon -std=c99 bot/*.c -DDEBUG $FLAGS -static -g -o debug/mirai.dbg # 为 MIPS 编译(从 mips-gcc 更改为 mips-linux-gnu-gcc) mips-linux-gnu-gcc -std=c99 -DDEBUG bot/*.c "$FLAGS" -static -g -o debug/mirai.mips # 为 ARMv4 编译(从 armv4l-gcc 更改为 arm-linux-gnueabi-gcc) arm-linux-gnueabi-gcc -std=c99 -DDEBUG bot/*.c "$FLAGS" -static -g -o debug/mirai.arm # 为 ARMv6/v7 编译(从 armv6l-gcc 更改为 arm-linux-gnueabihf-gcc) arm-linux-gnueabihf-gcc -std=c99 -DDEBUG bot/*.c "$FLAGS" -static -g -o debug/mirai.arm7 # 为 SH4 编译(从 sh4-gcc 更改为 sh4-linux-gnu-gcc) sh4-linux-gnu-gcc -std=c99 -DDEBUG bot/*.c "$FLAGS" -static -g -o debug/mirai.sh4 ``` image 因为有一些超出了研究论文范围的不相关内容,我将删除它们。具体来说,是上述 5 次编译中的最后 4 行编译代码。它们都是用于构建对应不同设备上芯片的不同 Mirai 变种。我们只在虚拟化环境中进行测试,因此只要第 1 行能工作就可以了。(此外,这个 src 代码已经有十年的历史了,我怀疑现在是否还有任何 IoT 机器在使用那些芯片系列) => 简而言之,正如 Khang 所说,只需保留第一行,并使用井号注释掉其余部分。 image **创建“debug”目录** ``` mkdir debug ``` image **安装 Go 语言** ``` sudo apt update && sudo apt install golang -y ``` (*) 因为 src 使用了非常、非常古老的 Go 版本,所以必须采取一些额外的步骤才能成功地完全编译它。 **为项目初始化 Go Module** 现代的 Go 编译器需要一个项目标识配置文件 (`go.mod`) 才能允许下载外部库。 ``` go mod init mirai-c2 ``` image **手动下载缺失的 Go 库** ``` go get github.com/go-sql-driver/mysql go get github.com/mattn/go-shellwords ``` image **在 Kali 上安装数据库管理系统** ``` sudo apt update sudo apt install mariadb-server -y sudo systemctl start mariadb ``` **重新运行总体编译命令** ``` chmod +x build.sh ./build.sh debug telnet ``` 如果在这一步,任何人遇到类似于 Phat 的这样的错误: ``` ┌──(phat㉿nhom4)-[~/Mirai-Source-Code/mirai] └─$ ./build.sh debug telnet /usr/bin/x86_64-linux-gnu-ld.bfd: cannot open output file debug/mirai.dbg: No such file or directory collect2: error: ld returned 1 exit status /usr/bin/x86_64-linux-gnu-ld.bfd: cannot open output file debug/enc: No such file or directory collect2: error: ld returned 1 exit status /usr/bin/x86_64-linux-gnu-ld.bfd: cannot open output file debug/nogdb: No such file or directory collect2: error: ld returned 1 exit status /usr/bin/x86_64-linux-gnu-ld.bfd: cannot open output file debug/badbot: No such file or directory collect2: error: ld returned 1 exit status ``` 那么请按照以下步骤操作: ``` ──(phat㉿nhom4)-[~/Mirai-Source-Code/mirai] └─$ cat build.sh | grep -i "debug" echo "Usage: $0 " echo "Usage: $0 " elif [ "$1" == "debug" ]; then gcc -fcommon -std=c99 bot/*.c -DDEBUG "$FLAGS" -static -g -o debug/mirai.dbg # mips-gcc -std=c99 -DDEBUG bot/*.c "$FLAGS" -static -g -o debug/mirai.mips # armv4l-gcc -std=c99 -DDEBUG bot/*.c "$FLAGS" -static -g -o debug/mirai.arm # armv6l-gcc -std=c99 -DDEBUG bot/*.c "$FLAGS" -static -g -o debug/mirai.arm7 # sh4-gcc -std=c99 -DDEBUG bot/*.c "$FLAGS" -static -g -o debug/mirai.sh4 gcc -std=c99 tools/enc.c -g -o debug/enc gcc -std=c99 tools/nogdb.c -g -o debug/nogdb gcc -std=c99 tools/badbot.c -g -o debug/badbot go build -o debug/cnc cnc/*.go go build -o debug/scanListen tools/scanListen.go echo "Unknown parameter $1: $0 " ┌──(phat㉿nhom4)-[~/Mirai-Source-Code/mirai] └─$ ``` ``` rm -rf debug mkdir debug chmod 777 debug ./build.sh debug telnet ``` image 完成后,我们会得到这一堆东西: 分别为: * **`mirai.dbg`**:是刚刚构建的恶意软件。它会扫描 Telnet 端口,暴力破解弱密码,维持与 C2 的连接,并接收执行 DDoS 攻击的命令。我们小组将拿这个进行分析。 * **`enc`**:是加密工具,用于将 IP 和域名加密为 XOR 过的 Hex 字符串。它在黑客的机器上运行(以隐藏其身份)。 * **`nogdb`**:是一个反调试工具。为了防止恶意软件被邪恶的取证分析师解剖和分析。 * **`scanListen`**:位于服务器端,接收来自 bot 群的扫描信号,并将该信息写入数据库。 * **`cnc`**:反派的大脑,这里是存储数据库以及发布命令以指挥“后宫”发起全面攻击的地方。 * **`badbot`**:为黑客模拟可能的场景,以进行测试和修复 Bug。
标签:DAST, IP 地址批量处理, Mirai 僵尸网络, 安全实验环境, 恶意软件分析, 虚拟化网络配置