Linux Capabilities
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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)