Linux Capabilities
RootedCON ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.\
Linux Capabilities
Linux-Fähigkeiten teilen Root-Rechte in kleinere, distincte Einheiten auf, sodass Prozesse eine Teilmenge von Rechten haben können. Dies minimiert die Risiken, indem nicht unnötig vollständige Root-Rechte gewährt werden.
Das Problem:
Normale Benutzer haben eingeschränkte Berechtigungen, was Aufgaben wie das Öffnen eines Netzwerk-Sockets betrifft, die Root-Zugriff erfordern.
Fähigkeitssets:
Inherited (CapInh):
Zweck: Bestimmt die Fähigkeiten, die vom übergeordneten Prozess weitergegeben werden.
Funktionalität: Wenn ein neuer Prozess erstellt wird, erbt er die Fähigkeiten aus diesem Set von seinem übergeordneten Prozess. Nützlich, um bestimmte Berechtigungen über Prozessstarts hinweg aufrechtzuerhalten.
Einschränkungen: Ein Prozess kann keine Fähigkeiten erlangen, die sein übergeordneter Prozess nicht besaß.
Effective (CapEff):
Zweck: Stellt die tatsächlichen Fähigkeiten dar, die ein Prozess zu jedem Zeitpunkt nutzt.
Funktionalität: Es ist das Set von Fähigkeiten, das vom Kernel überprüft wird, um Berechtigungen für verschiedene Operationen zu gewähren. Für Dateien kann dieses Set ein Flag sein, das angibt, ob die erlaubten Fähigkeiten der Datei als effektiv betrachtet werden sollen.
Bedeutung: Das effektive Set ist entscheidend für sofortige Berechtigungsprüfungen und fungiert als aktives Set von Fähigkeiten, die ein Prozess nutzen kann.
Permitted (CapPrm):
Zweck: Definiert das maximale Set von Fähigkeiten, das ein Prozess besitzen kann.
Funktionalität: Ein Prozess kann eine Fähigkeit aus dem erlaubten Set in sein effektives Set erhöhen, wodurch er die Fähigkeit nutzen kann. Er kann auch Fähigkeiten aus seinem erlaubten Set ablegen.
Grenze: Es fungiert als obere Grenze für die Fähigkeiten, die ein Prozess haben kann, und stellt sicher, dass ein Prozess seinen vordefinierten Berechtigungsrahmen nicht überschreitet.
Bounding (CapBnd):
Zweck: Setzt eine Obergrenze für die Fähigkeiten, die ein Prozess während seines Lebenszyklus jemals erwerben kann.
Funktionalität: Selbst wenn ein Prozess eine bestimmte Fähigkeit in seinem erwerbbaren oder erlaubten Set hat, kann er diese Fähigkeit nicht erwerben, es sei denn, sie ist auch im Bounding-Set enthalten.
Anwendungsfall: Dieses Set ist besonders nützlich, um das Potenzial eines Prozesses zur Eskalation von Berechtigungen einzuschränken und eine zusätzliche Sicherheitsebene hinzuzufügen.
Ambient (CapAmb):
Zweck: Ermöglicht es, bestimmte Fähigkeiten über einen
execve
-Systemaufruf hinweg beizubehalten, was normalerweise zu einem vollständigen Zurücksetzen der Fähigkeiten des Prozesses führen würde.Funktionalität: Stellt sicher, dass nicht-SUID-Programme, die keine zugehörigen Datei-Fähigkeiten haben, bestimmte Berechtigungen beibehalten können.
Einschränkungen: Fähigkeiten in diesem Set unterliegen den Einschränkungen der erwerbbaren und erlaubten Sets, um sicherzustellen, dass sie die erlaubten Berechtigungen des Prozesses nicht überschreiten.
Für weitere Informationen siehe:
Prozesse & Binärdateien Fähigkeiten
Prozesse Fähigkeiten
Um die Fähigkeiten für einen bestimmten Prozess zu sehen, verwenden Sie die status-Datei im /proc-Verzeichnis. Da sie mehr Details bietet, lassen Sie uns auf die Informationen beschränken, die sich auf Linux-Fähigkeiten beziehen. Beachten Sie, dass für alle laufenden Prozesse die Fähigkeitsinformationen pro Thread verwaltet werden, für Binärdateien im Dateisystem werden sie in erweiterten Attributen gespeichert.
Sie können die Fähigkeiten in /usr/include/linux/capability.h finden.
Sie können die Fähigkeiten des aktuellen Prozesses mit cat /proc/self/status
oder durch Ausführen von capsh --print
und die anderer Benutzer in /proc/<pid>/status
finden.
Dieser Befehl sollte auf den meisten Systemen 5 Zeilen zurückgeben.
CapInh = Vererbte Fähigkeiten
CapPrm = Erlaubte Fähigkeiten
CapEff = Effektive Fähigkeiten
CapBnd = Begrenzte Menge
CapAmb = Ambientfähigkeiten Menge
Diese hexadezimalen Zahlen ergeben keinen Sinn. Mit dem capsh-Dienstprogramm können wir sie in die Namen der Fähigkeiten decodieren.
Lass uns jetzt die Capabilities überprüfen, die von ping
verwendet werden:
Obwohl das funktioniert, gibt es einen anderen und einfacheren Weg. Um die Fähigkeiten eines laufenden Prozesses zu sehen, verwenden Sie einfach das getpcaps-Tool, gefolgt von seiner Prozess-ID (PID). Sie können auch eine Liste von Prozess-IDs angeben.
Lass uns hier die Fähigkeiten von tcpdump
überprüfen, nachdem wir der Binärdatei genügend Fähigkeiten (cap_net_admin
und cap_net_raw
) gegeben haben, um das Netzwerk zu sniffen (tcpdump läuft im Prozess 9562):
Wie Sie sehen können, entsprechen die angegebenen Fähigkeiten den Ergebnissen der 2 Methoden, um die Fähigkeiten einer Binärdatei zu erhalten. Das getpcaps Tool verwendet den capget() Systemaufruf, um die verfügbaren Fähigkeiten für einen bestimmten Thread abzufragen. Dieser Systemaufruf muss nur die PID bereitstellen, um weitere Informationen zu erhalten.
Binaries Capabilities
Binärdateien können Fähigkeiten haben, die während der Ausführung verwendet werden können. Zum Beispiel ist es sehr häufig, die ping
Binärdatei mit der cap_net_raw
Fähigkeit zu finden:
Du kannst Binaries mit Fähigkeiten suchen mit:
Dropping capabilities with capsh
Wenn wir die CAP_NET_RAW-Fähigkeiten für ping entfernen, sollte das Ping-Tool nicht mehr funktionieren.
Neben der Ausgabe von capsh selbst sollte auch der Befehl tcpdump einen Fehler ausgeben.
/bin/bash: /usr/sbin/tcpdump: Operation not permitted
Der Fehler zeigt deutlich, dass der Ping-Befehl nicht berechtigt ist, einen ICMP-Socket zu öffnen. Jetzt wissen wir mit Sicherheit, dass dies wie erwartet funktioniert.
Fähigkeiten entfernen
Sie können die Fähigkeiten einer Binärdatei mit
Benutzerfähigkeiten
Offensichtlich ist es möglich, auch Benutzern Fähigkeiten zuzuweisen. Das bedeutet wahrscheinlich, dass jeder Prozess, der vom Benutzer ausgeführt wird, die Fähigkeiten des Benutzers nutzen kann.
Basierend auf diesem, diesem und diesem müssen einige Dateien konfiguriert werden, um einem Benutzer bestimmte Fähigkeiten zu geben, aber die Datei, die die Fähigkeiten jedem Benutzer zuweist, ist /etc/security/capability.conf
.
Beispiel für eine Datei:
Umgebungsfähigkeiten
Durch das Kompilieren des folgenden Programms ist es möglich, eine Bash-Shell in einer Umgebung zu starten, die Fähigkeiten bereitstellt.
Innerhalb der bash, die von der kompilierten Umgebungs-Binärdatei ausgeführt wird, ist es möglich, die neuen Fähigkeiten zu beobachten (ein regulärer Benutzer wird keine Fähigkeit im "aktuellen" Abschnitt haben).
Sie können nur Fähigkeiten hinzufügen, die sowohl im erlaubten als auch im vererbbaren Set vorhanden sind.
Fähigkeit-bewusste/Fähigkeit-dumme Binaries
Die fähigkeit-bewussten Binaries verwenden nicht die neuen Fähigkeiten, die von der Umgebung bereitgestellt werden, jedoch werden die fähigkeit-dummen Binaries sie verwenden, da sie sie nicht ablehnen. Dies macht Fähigkeit-dumme Binaries anfällig in einer speziellen Umgebung, die Binaries Fähigkeiten gewährt.
Dienstfähigkeiten
Standardmäßig hat ein Dienst, der als Root ausgeführt wird, alle Fähigkeiten zugewiesen, und in einigen Fällen kann dies gefährlich sein. Daher ermöglicht eine Dienstkonfigurationsdatei, die Fähigkeiten anzugeben, die Sie ihm geben möchten, und den Benutzer, der den Dienst ausführen soll, um zu vermeiden, dass ein Dienst mit unnötigen Rechten ausgeführt wird:
Capabilities in Docker-Containern
Standardmäßig weist Docker den Containern einige Fähigkeiten zu. Es ist sehr einfach zu überprüfen, welche Fähigkeiten dies sind, indem man Folgendes ausführt:
RootedCON ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
Privesc/Container Escape
Capabilities sind nützlich, wenn Sie Ihre eigenen Prozesse nach der Durchführung privilegierter Operationen einschränken möchten (z. B. nach dem Einrichten von chroot und dem Binden an einen Socket). Sie können jedoch ausgenutzt werden, indem ihnen bösartige Befehle oder Argumente übergeben werden, die dann als root ausgeführt werden.
Sie können Capabilities auf Programme mit setcap
erzwingen und diese mit getcap
abfragen:
Die +ep
bedeutet, dass Sie die Fähigkeit hinzufügen (“-” würde sie entfernen) als Effektiv und Erlaubt.
Um Programme in einem System oder Ordner mit Fähigkeiten zu identifizieren:
Ausnutzungsbeispiel
Im folgenden Beispiel wird die Binärdatei /usr/bin/python2.6
als anfällig für privesc gefunden:
Fähigkeiten, die von tcpdump
benötigt werden, um jedem Benutzer das Abfangen von Paketen zu ermöglichen:
Der Sonderfall von "leeren" Fähigkeiten
Aus den Dokumenten: Beachten Sie, dass man leere Fähigkeitensets einer Programmdatei zuweisen kann, und es somit möglich ist, ein Set-User-ID-Root-Programm zu erstellen, das die effektive und gespeicherte Set-User-ID des Prozesses, der das Programm ausführt, auf 0 ändert, aber diesem Prozess keine Fähigkeiten verleiht. Oder einfacher gesagt, wenn Sie eine Binärdatei haben, die:
nicht im Besitz von root ist
keine
SUID
/SGID
-Bits gesetzt hatleere Fähigkeiten gesetzt hat (z.B.:
getcap myelf
gibtmyelf =ep
zurück)
dann wird diese Binärdatei als root ausgeführt.
CAP_SYS_ADMIN
CAP_SYS_ADMIN
ist eine äußerst mächtige Linux-Fähigkeit, die oft mit einem nahezu Root-Level gleichgesetzt wird, aufgrund ihrer umfangreichen administrativen Berechtigungen, wie das Einbinden von Geräten oder das Manipulieren von Kernel-Funktionen. Während sie für Container, die ganze Systeme simulieren, unverzichtbar ist, stellt CAP_SYS_ADMIN
erhebliche Sicherheitsherausforderungen dar, insbesondere in containerisierten Umgebungen, aufgrund ihres Potenzials für Privilegieneskalation und Systemkompromittierung. Daher erfordert ihre Nutzung strenge Sicherheitsbewertungen und vorsichtige Verwaltung, mit einer starken Präferenz für das Entfernen dieser Fähigkeit in anwendungsspezifischen Containern, um dem Prinzip der geringsten Privilegien zu entsprechen und die Angriffsfläche zu minimieren.
Beispiel mit Binärdatei
Mit Python können Sie eine modifizierte passwd-Datei über der echten passwd-Datei einhängen:
Und schließlich mount die modifizierte passwd
-Datei auf /etc/passwd
:
Und Sie werden in der Lage sein, su
als root mit dem Passwort "password" zu verwenden.
Beispiel mit Umgebung (Docker-Ausbruch)
Sie können die aktivierten Fähigkeiten innerhalb des Docker-Containers überprüfen mit:
Innerhalb der vorherigen Ausgabe können Sie sehen, dass die SYS_ADMIN-Fähigkeit aktiviert ist.
Mount
Dies ermöglicht dem Docker-Container, die Host-Disk zu mounten und frei darauf zuzugreifen:
Vollzugriff
In der vorherigen Methode konnten wir auf die Festplatte des Docker-Hosts zugreifen. Falls Sie feststellen, dass der Host einen ssh-Server ausführt, könnten Sie einen Benutzer auf der Festplatte des Docker-Hosts erstellen und über SSH darauf zugreifen:
CAP_SYS_PTRACE
Das bedeutet, dass Sie den Container verlassen können, indem Sie einen Shellcode in einen Prozess injizieren, der im Host läuft. Um auf Prozesse zuzugreifen, die im Host laufen, muss der Container mindestens mit --pid=host
ausgeführt werden.
CAP_SYS_PTRACE
gewährt die Fähigkeit, Debugging- und Systemaufruf-Trace-Funktionen zu nutzen, die von ptrace(2)
bereitgestellt werden, sowie Cross-Memory-Attach-Aufrufe wie process_vm_readv(2)
und process_vm_writev(2)
. Obwohl es für Diagnose- und Überwachungszwecke leistungsfähig ist, kann CAP_SYS_PTRACE
, wenn es ohne einschränkende Maßnahmen wie einen Seccomp-Filter auf ptrace(2)
aktiviert wird, die Systemsicherheit erheblich gefährden. Insbesondere kann es ausgenutzt werden, um andere Sicherheitsbeschränkungen zu umgehen, insbesondere die von Seccomp auferlegten, wie durch Proofs of Concept (PoC) wie dieses demonstriert.
Beispiel mit Binärdatei (Python)
Beispiel mit Binärdatei (gdb)
gdb
mit ptrace
-Berechtigung:
Erstellen Sie einen Shellcode mit msfvenom, um ihn über gdb in den Speicher zu injizieren.
Debuggen Sie einen Root-Prozess mit gdb und kopieren Sie die zuvor generierten gdb-Zeilen:
Beispiel mit Umgebung (Docker-Ausbruch) - Ein weiteres GDB-Missbrauch
Wenn GDB installiert ist (oder Sie es mit apk add gdb
oder apt install gdb
installieren können, zum Beispiel), können Sie einen Prozess vom Host aus debuggen und ihn die system
-Funktion aufrufen lassen. (Diese Technik erfordert ebenfalls die Fähigkeit SYS_ADMIN
).
Du wirst die Ausgabe des ausgeführten Befehls nicht sehen können, aber er wird von diesem Prozess ausgeführt (also erhalte eine rev shell).
Wenn du den Fehler "No symbol "system" in current context." erhältst, überprüfe das vorherige Beispiel, in dem ein Shellcode in ein Programm über gdb geladen wird.
Beispiel mit Umgebung (Docker-Ausbruch) - Shellcode-Injektion
Du kannst die aktivierten Fähigkeiten innerhalb des Docker-Containers mit folgendem Befehl überprüfen:
List Prozesse die im Host laufen ps -eaf
Holen Sie sich die Architektur
uname -m
Finden Sie einen Shellcode für die Architektur (https://www.exploit-db.com/exploits/41128)
Finden Sie ein Programm, um den Shellcode in den Speicher eines Prozesses zu injizieren (https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)
Modifizieren Sie den Shellcode im Programm und kompilieren Sie es
gcc inject.c -o inject
Injizieren Sie es und holen Sie sich Ihre Shell:
./inject 299; nc 172.17.0.1 5600
CAP_SYS_MODULE
CAP_SYS_MODULE
ermächtigt einen Prozess, Kernel-Module zu laden und zu entladen (init_module(2)
, finit_module(2)
und delete_module(2)
Systemaufrufe), was direkten Zugriff auf die Kernoperationen des Kernels bietet. Diese Fähigkeit birgt erhebliche Sicherheitsrisiken, da sie eine Privilegieneskalation und eine vollständige Kompromittierung des Systems ermöglicht, indem sie Änderungen am Kernel erlaubt und somit alle Linux-Sicherheitsmechanismen, einschließlich Linux Security Modules und Container-Isolierung, umgeht.
Das bedeutet, dass Sie Kernel-Module in den Kernel der Host-Maschine einfügen/entfernen können.
Beispiel mit Binärdatei
Im folgenden Beispiel hat die Binärdatei python
diese Fähigkeit.
Standardmäßig überprüft der modprobe
-Befehl die Abhängigkeitsliste und die Map-Dateien im Verzeichnis /lib/modules/$(uname -r)
.
Um dies auszunutzen, erstellen wir einen gefälschten lib/modules-Ordner:
Dann kompiliere das Kernel-Modul, das du unten in 2 Beispielen findest, und kopiere es in diesen Ordner:
Schließlich führen Sie den benötigten Python-Code aus, um dieses Kernel-Modul zu laden:
Beispiel 2 mit Binärdatei
Im folgenden Beispiel hat die Binärdatei kmod
diese Fähigkeit.
Was bedeutet, dass es möglich ist, den Befehl insmod
zu verwenden, um ein Kernel-Modul einzufügen. Befolgen Sie das folgende Beispiel, um eine reverse shell auszunutzen, die dieses Privileg missbraucht.
Beispiel mit Umgebung (Docker-Ausbruch)
Sie können die aktivierten Fähigkeiten innerhalb des Docker-Containers mit folgendem Befehl überprüfen:
Innerhalb der vorherigen Ausgabe können Sie sehen, dass die SYS_MODULE-Berechtigung aktiviert ist.
Erstellen Sie das Kernel-Modul, das eine Reverse-Shell ausführen wird, und die Makefile, um es zu kompilieren:
Das Leerzeichen vor jedem make-Wort in der Makefile muss ein Tabulator, keine Leerzeichen sein!
Führen Sie make
aus, um es zu kompilieren.
Schließlich starten Sie nc
in einer Shell und laden das Modul von einer anderen und Sie werden die Shell im nc-Prozess erfassen:
Der Code dieser Technik wurde aus dem Labor von "Abusing SYS_MODULE Capability" kopiert von https://www.pentesteracademy.com/
Ein weiteres Beispiel für diese Technik findet sich unter https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host
CAP_DAC_READ_SEARCH
CAP_DAC_READ_SEARCH ermöglicht es einem Prozess, Berechtigungsprüfungen für das Lesen von Dateien und für das Lesen und Ausführen von Verzeichnissen zu umgehen. Seine Hauptnutzung besteht darin, Dateien zu suchen oder zu lesen. Es ermöglicht jedoch auch einem Prozess, die Funktion open_by_handle_at(2)
zu verwenden, die auf jede Datei zugreifen kann, einschließlich solcher außerhalb des Mount-Namensraums des Prozesses. Der Handle, der in open_by_handle_at(2)
verwendet wird, soll ein nicht transparenter Identifikator sein, der durch name_to_handle_at(2)
erhalten wird, kann jedoch sensible Informationen wie Inode-Nummern enthalten, die anfällig für Manipulationen sind. Das Potenzial zur Ausnutzung dieser Fähigkeit, insbesondere im Kontext von Docker-Containern, wurde von Sebastian Krahmer mit dem Shocker-Exploit demonstriert, wie hier analysiert.
Das bedeutet, dass Sie Berechtigungsprüfungen für das Lesen von Dateien und für das Lesen/Ausführen von Verzeichnissen umgehen können.
Beispiel mit Binärdatei
Die Binärdatei wird in der Lage sein, jede Datei zu lesen. Wenn eine Datei wie tar diese Fähigkeit hat, kann sie die Schatten-Datei lesen:
Beispiel mit binary2
In diesem Fall nehmen wir an, dass die python
-Binärdatei diese Fähigkeit hat. Um Root-Dateien aufzulisten, könnten Sie Folgendes tun:
Und um eine Datei zu lesen, könntest du Folgendes tun:
Beispiel in der Umgebung (Docker-Ausbruch)
Sie können die aktivierten Fähigkeiten innerhalb des Docker-Containers mit folgendem Befehl überprüfen:
Innerhalb der vorherigen Ausgabe können Sie sehen, dass die DAC_READ_SEARCH-Berechtigung aktiviert ist. Infolgedessen kann der Container Prozesse debuggen.
Sie können lernen, wie das folgende Exploit funktioniert in https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3, aber zusammenfassend lässt sich sagen, dass CAP_DAC_READ_SEARCH uns nicht nur erlaubt, das Dateisystem ohne Berechtigungsprüfungen zu durchlaufen, sondern auch ausdrücklich alle Prüfungen für open_by_handle_at(2) entfernt und unserem Prozess den Zugriff auf sensible Dateien, die von anderen Prozessen geöffnet wurden, ermöglichen könnte.
Das ursprüngliche Exploit, das diese Berechtigungen missbraucht, um Dateien vom Host zu lesen, finden Sie hier: http://stealth.openwall.net/xSports/shocker.c, das Folgende ist eine modifizierte Version, die es Ihnen ermöglicht, die Datei, die Sie lesen möchten, als erstes Argument anzugeben und sie in eine Datei zu dumpen.
Der Exploit muss einen Zeiger auf etwas finden, das auf dem Host gemountet ist. Der ursprüngliche Exploit verwendete die Datei /.dockerinit und diese modifizierte Version verwendet /etc/hostname. Wenn der Exploit nicht funktioniert, müssen Sie möglicherweise eine andere Datei festlegen. Um eine Datei zu finden, die im Host gemountet ist, führen Sie einfach den Befehl mount aus:
Der Code dieser Technik wurde aus dem Labor von "Abusing DAC_READ_SEARCH Capability" kopiert von https://www.pentesteracademy.com/
RootedCON ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
CAP_DAC_OVERRIDE
Das bedeutet, dass Sie die Schreibberechtigungsprüfungen für jede Datei umgehen können, sodass Sie jede Datei schreiben können.
Es gibt viele Dateien, die Sie überschreiben können, um Privilegien zu eskalieren, Sie können sich hier Ideen holen.
Beispiel mit Binärdatei
In diesem Beispiel hat vim diese Fähigkeit, sodass Sie jede Datei wie passwd, sudoers oder shadow ändern können:
Beispiel mit Binärdatei 2
In diesem Beispiel wird die python
-Binärdatei diese Fähigkeit haben. Sie könnten Python verwenden, um jede Datei zu überschreiben:
Beispiel mit Umgebung + CAP_DAC_READ_SEARCH (Docker-Ausbruch)
Sie können die aktivierten Berechtigungen innerhalb des Docker-Containers mit folgendem Befehl überprüfen:
Zuerst lesen Sie den vorherigen Abschnitt, der DAC_READ_SEARCH-Fähigkeit missbraucht, um beliebige Dateien zu lesen des Hosts und kompilieren Sie den Exploit. Dann kompilieren Sie die folgende Version des Shocker-Exploits, die es Ihnen ermöglicht, beliebige Dateien im Dateisystem des Hosts zu schreiben:
Um den Docker-Container zu verlassen, könnten Sie die Dateien /etc/shadow
und /etc/passwd
vom Host herunterladen, einen neuen Benutzer hinzufügen und shocker_write
verwenden, um sie zu überschreiben. Dann Zugriff über ssh.
Der Code dieser Technik wurde aus dem Labor "Abusing DAC_OVERRIDE Capability" kopiert von https://www.pentesteracademy.com
CAP_CHOWN
Das bedeutet, dass es möglich ist, den Eigentümer jeder Datei zu ändern.
Beispiel mit Binärdatei
Angenommen, die python
-Binärdatei hat diese Fähigkeit, Sie können den Eigentümer der shadow-Datei ändern, das Root-Passwort ändern und Privilegien eskalieren:
Oder mit der ruby
-Binärdatei, die diese Fähigkeit hat:
CAP_FOWNER
Das bedeutet, dass es möglich ist, die Berechtigungen jeder Datei zu ändern.
Beispiel mit Binärdatei
Wenn Python diese Fähigkeit hat, können Sie die Berechtigungen der Schatten-Datei ändern, das Root-Passwort ändern und Privilegien eskalieren:
CAP_SETUID
Das bedeutet, dass es möglich ist, die effektive Benutzer-ID des erstellten Prozesses festzulegen.
Beispiel mit Binärdatei
Wenn Python diese Fähigkeit hat, können Sie sie sehr leicht missbrauchen, um die Berechtigungen auf root zu eskalieren:
Eine andere Möglichkeit:
CAP_SETGID
Das bedeutet, dass es möglich ist, die effektive Gruppen-ID des erstellten Prozesses festzulegen.
Es gibt viele Dateien, die Sie überschreiben können, um Privilegien zu eskalieren, Sie können hier Ideen bekommen.
Beispiel mit Binärdatei
In diesem Fall sollten Sie nach interessanten Dateien suchen, die eine Gruppe lesen kann, da Sie sich als jede Gruppe ausgeben können:
Sobald Sie eine Datei gefunden haben, die Sie missbrauchen können (durch Lesen oder Schreiben), um die Berechtigungen zu erhöhen, können Sie eine Shell erhalten, die die interessante Gruppe imitiert mit:
In diesem Fall wurde die Gruppe shadow imitiert, sodass Sie die Datei /etc/shadow
lesen können:
Wenn docker installiert ist, könnten Sie die docker-Gruppe nachahmen und sie missbrauchen, um mit dem docker socket zu kommunizieren und Privilegien zu eskalieren.
CAP_SETFCAP
Das bedeutet, dass es möglich ist, Fähigkeiten auf Dateien und Prozessen festzulegen.
Beispiel mit Binärdatei
Wenn Python diese Fähigkeit hat, können Sie sie sehr leicht missbrauchen, um Privilegien auf root zu eskalieren:
Beachten Sie, dass Sie diese Fähigkeit verlieren, wenn Sie eine neue Fähigkeit mit CAP_SETFCAP auf die Binärdatei setzen.
Sobald Sie die SETUID-Fähigkeit haben, können Sie zu diesem Abschnitt gehen, um zu sehen, wie Sie die Privilegien erhöhen können.
Beispiel mit Umgebung (Docker-Ausbruch)
Standardmäßig wird die Fähigkeit CAP_SETFCAP dem Prozess innerhalb des Containers in Docker zugewiesen. Sie können dies überprüfen, indem Sie etwas wie Folgendes tun:
Diese Fähigkeit erlaubt es, anderen Binärdateien beliebige andere Fähigkeiten zu geben, sodass wir darüber nachdenken könnten, aus dem Container zu entkommen, indem wir eine der anderen Fähigkeitsexploits auf dieser Seite ausnutzen. Wenn Sie jedoch versuchen, beispielsweise die Fähigkeiten CAP_SYS_ADMIN und CAP_SYS_PTRACE an die gdb-Binärdatei zu vergeben, werden Sie feststellen, dass Sie sie vergeben können, aber die Binärdatei nach diesem Vorgang nicht mehr ausgeführt werden kann:
From the docs: Erlaubt: Dies ist ein einschränkendes Superset für die effektiven Fähigkeiten, die der Thread annehmen kann. Es ist auch ein einschränkendes Superset für die Fähigkeiten, die von einem Thread, der nicht die CAP_SETPCAP-Berechtigung in seinem effektiven Set hat, zum vererbbaren Set hinzugefügt werden können. Es scheint, dass die erlaubten Fähigkeiten diejenigen einschränken, die verwendet werden können. Allerdings gewährt Docker standardmäßig auch die CAP_SETPCAP, sodass Sie möglicherweise neue Fähigkeiten innerhalb der vererbbaren hinzufügen können. In der Dokumentation dieser Berechtigung heißt es: CAP_SETPCAP : […] fügt jede Berechtigung aus dem begrenzenden Set des aufrufenden Threads zu seinem vererbbaren Set hinzu. Es scheint, dass wir nur Fähigkeiten aus dem begrenzenden Set zum vererbbaren Set hinzufügen können. Das bedeutet, dass wir keine neuen Fähigkeiten wie CAP_SYS_ADMIN oder CAP_SYS_PTRACE in das Erbset setzen können, um Privilegien zu eskalieren.
CAP_SYS_RAWIO
CAP_SYS_RAWIO bietet eine Reihe sensibler Operationen, einschließlich Zugriff auf /dev/mem
, /dev/kmem
oder /proc/kcore
, Modifikation von mmap_min_addr
, Zugriff auf die Systemaufrufe ioperm(2)
und iopl(2)
sowie verschiedene Festplattenbefehle. Der FIBMAP ioctl(2)
wird ebenfalls über diese Berechtigung aktiviert, was in der Vergangenheit zu Problemen geführt hat. Laut der Man-Seite ermöglicht dies dem Inhaber auch, beschreibend eine Reihe von gerätespezifischen Operationen auf anderen Geräten durchzuführen
.
Dies kann nützlich sein für Privilegieneskalation und Docker-Ausbrüche.
CAP_KILL
Das bedeutet, dass es möglich ist, jeden Prozess zu beenden.
Beispiel mit Binärdatei
Angenommen, die python
-Binärdatei hat diese Berechtigung. Wenn Sie auch einige Dienst- oder Socket-Konfigurationen (oder eine beliebige Konfigurationsdatei, die mit einem Dienst zusammenhängt) ändern könnten, könnten Sie es hintertüren und dann den Prozess, der mit diesem Dienst verbunden ist, beenden und auf die Ausführung der neuen Konfigurationsdatei mit Ihrer Hintertür warten.
Privesc mit kill
Wenn Sie kill-Fähigkeiten haben und ein Node-Programm als Root (oder als ein anderer Benutzer) läuft, könnten Sie wahrscheinlich es mit dem Signal SIGUSR1 senden und es den Node-Debugger öffnen lassen, zu dem Sie sich verbinden können.
RootedCON ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
CAP_NET_BIND_SERVICE
Das bedeutet, dass es möglich ist, an jedem Port (auch an privilegierten) zu lauschen. Sie können die Privilegien nicht direkt mit dieser Fähigkeit eskalieren.
Beispiel mit Binärdatei
Wenn python
diese Fähigkeit hat, kann es an jedem Port lauschen und sogar von dort aus eine Verbindung zu einem anderen Port herstellen (einige Dienste erfordern Verbindungen von bestimmten privilegierten Ports).
CAP_NET_RAW
CAP_NET_RAW Berechtigung erlaubt Prozessen, RAW- und PACKET-Sockets zu erstellen, wodurch sie in der Lage sind, beliebige Netzwerkpakete zu generieren und zu senden. Dies kann zu Sicherheitsrisiken in containerisierten Umgebungen führen, wie z.B. Paket-Spoofing, Traffic-Injection und Umgehung von Netzwerkzugangskontrollen. Böswillige Akteure könnten dies ausnutzen, um die Container-Routing zu stören oder die Netzwerksicherheit des Hosts zu gefährden, insbesondere ohne angemessene Firewall-Schutzmaßnahmen. Darüber hinaus ist CAP_NET_RAW entscheidend für privilegierte Container, um Operationen wie Ping über RAW-ICMP-Anfragen zu unterstützen.
Das bedeutet, dass es möglich ist, den Verkehr abzuhören. Sie können die Berechtigungen mit dieser Fähigkeit nicht direkt eskalieren.
Beispiel mit Binärdatei
Wenn die Binärdatei tcpdump
diese Berechtigung hat, können Sie sie verwenden, um Netzwerkdaten zu erfassen.
Beachten Sie, dass, wenn die Umgebung diese Fähigkeit gewährt, Sie auch tcpdump
verwenden könnten, um den Verkehr abzuhören.
Beispiel mit Binärdatei 2
Das folgende Beispiel ist python2
-Code, der nützlich sein kann, um den Verkehr der "lo" (localhost) Schnittstelle abzufangen. Der Code stammt aus dem Labor "Die Grundlagen: CAP-NET_BIND + NET_RAW" von https://attackdefense.pentesteracademy.com/
CAP_NET_ADMIN + CAP_NET_RAW
CAP_NET_ADMIN Fähigkeit gewährt dem Inhaber die Möglichkeit, Netzwerkkonfigurationen zu ändern, einschließlich Firewall-Einstellungen, Routing-Tabellen, Socket-Berechtigungen und Netzwerkschnittstelleneinstellungen innerhalb der exponierten Netzwerk-Namensräume. Es ermöglicht auch das Aktivieren des Promiscuous Mode auf Netzwerkschnittstellen, was das Sniffen von Paketen über Namensräume hinweg erlaubt.
Beispiel mit Binärdatei
Angenommen, die Python-Binärdatei hat diese Fähigkeiten.
CAP_LINUX_IMMUTABLE
Das bedeutet, dass es möglich ist, Inode-Attribute zu ändern. Sie können die Berechtigungen mit dieser Fähigkeit nicht direkt erhöhen.
Beispiel mit Binärdatei
Wenn Sie feststellen, dass eine Datei unveränderlich ist und Python diese Fähigkeit hat, können Sie das unveränderliche Attribut entfernen und die Datei änderbar machen:
Beachten Sie, dass dieses unveränderliche Attribut normalerweise mit folgendem Befehl gesetzt und entfernt wird:
CAP_SYS_CHROOT
CAP_SYS_CHROOT ermöglicht die Ausführung des chroot(2)
Systemaufrufs, der potenziell das Entkommen aus chroot(2)
Umgebungen durch bekannte Schwachstellen erlauben kann:
CAP_SYS_BOOT
CAP_SYS_BOOT erlaubt nicht nur die Ausführung des reboot(2)
Systemaufrufs für Systemneustarts, einschließlich spezifischer Befehle wie LINUX_REBOOT_CMD_RESTART2
, die für bestimmte Hardwareplattformen maßgeschneidert sind, sondern ermöglicht auch die Verwendung von kexec_load(2)
und, seit Linux 3.17, kexec_file_load(2)
zum Laden neuer oder signierter Crash-Kernel.
CAP_SYSLOG
CAP_SYSLOG wurde in Linux 2.6.37 von der breiteren CAP_SYS_ADMIN getrennt und gewährt speziell die Fähigkeit, den syslog(2)
Aufruf zu verwenden. Diese Fähigkeit ermöglicht das Anzeigen von Kerneladressen über /proc
und ähnliche Schnittstellen, wenn die Einstellung kptr_restrict
auf 1 gesetzt ist, die die Offenlegung von Kerneladressen steuert. Seit Linux 2.6.39 ist der Standard für kptr_restrict
0, was bedeutet, dass Kerneladressen offengelegt werden, obwohl viele Distributionen dies aus Sicherheitsgründen auf 1 (Adressen außer von uid 0 verbergen) oder 2 (immer Adressen verbergen) setzen.
Zusätzlich erlaubt CAP_SYSLOG den Zugriff auf die dmesg
Ausgabe, wenn dmesg_restrict
auf 1 gesetzt ist. Trotz dieser Änderungen behält CAP_SYS_ADMIN die Fähigkeit, syslog
Operationen aufgrund historischer Präzedenzfälle durchzuführen.
CAP_MKNOD
CAP_MKNOD erweitert die Funktionalität des mknod
Systemaufrufs über die Erstellung regulärer Dateien, FIFOs (benannte Pipes) oder UNIX-Domänensockets hinaus. Es erlaubt speziell die Erstellung von speziellen Dateien, die Folgendes umfassen:
S_IFCHR: Zeichen-Sonderdateien, die Geräte wie Terminals sind.
S_IFBLK: Block-Sonderdateien, die Geräte wie Festplatten sind.
Diese Fähigkeit ist entscheidend für Prozesse, die die Fähigkeit benötigen, Gerätedateien zu erstellen, um direkte Hardwareinteraktionen über Zeichen- oder Blockgeräte zu ermöglichen.
Es ist eine Standard-Docker-Fähigkeit (https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19).
Diese Fähigkeit erlaubt Privilegieneskalationen (durch vollständiges Lesen der Festplatte) auf dem Host, unter diesen Bedingungen:
Zunächst Zugriff auf den Host haben (unprivilegiert).
Zunächst Zugriff auf den Container haben (privilegiert (EUID 0) und effektives
CAP_MKNOD
).Host und Container sollten denselben Benutzernamespace teilen.
Schritte zum Erstellen und Zugreifen auf ein Blockgerät in einem Container:
Auf dem Host als Standardbenutzer:
Bestimmen Sie Ihre aktuelle Benutzer-ID mit
id
, z.B.uid=1000(standarduser)
.Identifizieren Sie das Zielgerät, zum Beispiel
/dev/sdb
.
Innerhalb des Containers als
root
:
Zurück auf dem Host:
Dieser Ansatz ermöglicht es dem Standardbenutzer, über den Container auf /dev/sdb
zuzugreifen und möglicherweise Daten zu lesen, indem er gemeinsame Benutzernamensräume und Berechtigungen nutzt, die auf dem Gerät festgelegt sind.
CAP_SETPCAP
CAP_SETPCAP ermöglicht es einem Prozess, die Fähigkeitssätze eines anderen Prozesses zu ändern, was die Hinzufügung oder Entfernung von Fähigkeiten aus den effektiven, vererbbaren und erlaubten Sätzen ermöglicht. Ein Prozess kann jedoch nur Fähigkeiten ändern, die er in seinem eigenen erlaubten Satz besitzt, was sicherstellt, dass er die Privilegien eines anderen Prozesses nicht über sein eigenes Niveau hinaus erhöhen kann. Neuere Kernel-Updates haben diese Regeln verschärft und CAP_SETPCAP
nur erlaubt, die Fähigkeiten innerhalb seines eigenen oder der erlaubten Sätze seiner Nachkommen zu verringern, um Sicherheitsrisiken zu mindern. Die Nutzung erfordert, dass CAP_SETPCAP
im effektiven Satz und die Zielfähigkeiten im erlaubten Satz vorhanden sind, wobei capset()
für Änderungen verwendet wird. Dies fasst die Kernfunktion und die Einschränkungen von CAP_SETPCAP
zusammen und hebt seine Rolle im Privilegienmanagement und der Sicherheitsverbesserung hervor.
CAP_SETPCAP
ist eine Linux-Fähigkeit, die es einem Prozess ermöglicht, die Fähigkeitssätze eines anderen Prozesses zu ändern. Es gewährt die Möglichkeit, Fähigkeiten aus den effektiven, vererbbaren und erlaubten Fähigkeitssätzen anderer Prozesse hinzuzufügen oder zu entfernen. Es gibt jedoch bestimmte Einschränkungen, wie diese Fähigkeit verwendet werden kann.
Ein Prozess mit CAP_SETPCAP
kann nur Fähigkeiten gewähren oder entfernen, die in seinem eigenen erlaubten Fähigkeitssatz enthalten sind. Mit anderen Worten, ein Prozess kann einem anderen Prozess keine Fähigkeit gewähren, wenn er diese Fähigkeit selbst nicht hat. Diese Einschränkung verhindert, dass ein Prozess die Privilegien eines anderen Prozesses über sein eigenes Privilegienniveau hinaus erhöht.
Darüber hinaus wurde die Fähigkeit CAP_SETPCAP
in neueren Kernel-Versionen weiter eingeschränkt. Sie erlaubt es einem Prozess nicht mehr, die Fähigkeitssätze anderer Prozesse willkürlich zu ändern. Stattdessen erlaubt sie es einem Prozess nur, die Fähigkeiten in seinem eigenen erlaubten Fähigkeitssatz oder dem erlaubten Fähigkeitssatz seiner Nachkommen zu verringern. Diese Änderung wurde eingeführt, um potenzielle Sicherheitsrisiken im Zusammenhang mit der Fähigkeit zu reduzieren.
Um CAP_SETPCAP
effektiv zu nutzen, müssen Sie die Fähigkeit in Ihrem effektiven Fähigkeitssatz und die Zielfähigkeiten in Ihrem erlaubten Fähigkeitssatz haben. Sie können dann den Systemaufruf capset()
verwenden, um die Fähigkeitssätze anderer Prozesse zu ändern.
Zusammenfassend lässt sich sagen, dass CAP_SETPCAP
es einem Prozess ermöglicht, die Fähigkeitssätze anderer Prozesse zu ändern, aber keine Fähigkeiten gewähren kann, die er selbst nicht hat. Darüber hinaus wurde aufgrund von Sicherheitsbedenken die Funktionalität in neueren Kernel-Versionen eingeschränkt, um nur das Verringern von Fähigkeiten in seinem eigenen erlaubten Fähigkeitssatz oder den erlaubten Fähigkeitssätzen seiner Nachkommen zuzulassen.
Referenzen
Die meisten dieser Beispiele stammen aus einigen Laboren von https://attackdefense.pentesteracademy.com/, also wenn Sie diese Privesc-Techniken üben möchten, empfehle ich diese Labore.
Weitere Referenzen:
RootedCON ist die relevanteste Cybersecurity-Veranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersecurity-Profis in jeder Disziplin.
Last updated