Ich bin Root. Grundlegendes zur Privilegieneskalation des Linux-Betriebssystems

Ich habe das erste Quartal 2020 damit verbracht, mich auf die OSCP-Prüfung vorzubereiten. Die Suche nach Informationen bei Google und viele „blinde“ Versuche nahmen meine gesamte Freizeit in Anspruch. Besonders schwierig war es, die Mechanismen zur Erhöhung der Privilegien zu verstehen. Der PWK-Studiengang widmet diesem Thema große Aufmerksamkeit, aber die Lehrmaterialien reichen nie aus. Es gibt viele Handbücher im Internet mit nützlichen Befehlen, aber ich bin kein Fan davon, Empfehlungen blind zu befolgen, ohne zu verstehen, wozu sie führen.

Ich möchte mit Ihnen teilen, was ich während der Vorbereitung und dem erfolgreichen Bestehen der Prüfung gelernt habe (einschließlich regelmäßiger Streifzüge durch Hack The Box). Ich war sehr dankbar für jede Information, die mir geholfen hat, den „Try Harder“-Weg bewusster zu gehen. Jetzt ist es an der Zeit, der Community etwas zurückzugeben.

Ich möchte Ihnen ein Handbuch zur Eskalation von Berechtigungen in OS Linux geben, das eine Analyse der häufigsten Vektoren und verwandter Funktionen enthält, die für Sie auf jeden Fall nützlich sein werden. Oftmals sind die Mechanismen zur Erhöhung der Privilegien selbst recht einfach; bei der Strukturierung und Analyse von Informationen treten Schwierigkeiten auf. Deshalb habe ich beschlossen, mit einer „Sightseeing-Tour“ zu beginnen und dann jeden Vektor in einem separaten Artikel zu betrachten. Ich hoffe, ich erspare Ihnen etwas Zeit bei der Recherche zu diesem Thema.

Ich bin Root. Grundlegendes zur Privilegieneskalation des Linux-Betriebssystems

Warum ist eine Privilegieneskalation im Jahr 2020 überhaupt möglich, wenn die Methoden doch schon sehr lange bekannt sind? Wenn der Benutzer das System richtig verwaltet, ist es tatsächlich nicht möglich, die darin enthaltenen Berechtigungen zu erhöhen. Das wichtigste globale Problem, das solche Möglichkeiten eröffnet, ist unsichere Konfiguration. Auch das Vorhandensein veralteter Softwareversionen mit Schwachstellen im System ist ein Sonderfall einer unsicheren Konfiguration.

Rechteausweitung durch unsichere Konfiguration

Befassen wir uns zunächst mit der unsicheren Konfiguration. Beginnen wir mit IT-Experten nutzen häufig Handbücher und Ressourcen wie Stackoverflow, von denen viele unsichere Befehle und Konfigurationen enthalten. Ein markantes Beispiel - Nachrichten dass der am häufigsten von Stackoverflow kopierte Code einen Fehler enthielt. Ein erfahrener Administrator wird den Pfosten sehen, aber das ist eine ideale Welt. Sogar kompetente Spezialisten erhöhte Arbeitsbelastung fähig, Fehler zu machen. Stellen Sie sich vor, ein Administrator bereitet die Dokumentation für die nächste Ausschreibung vor und koordiniert sie, beschäftigt sich gleichzeitig mit der neuen Technologie, die im nächsten Quartal implementiert werden soll, und löst regelmäßig Probleme mit der Benutzerunterstützung. Und dann bekommt er die Aufgabe, schnell ein paar virtuelle Maschinen einzurichten und darauf Dienste auszurollen. Wie groß ist Ihrer Meinung nach die Wahrscheinlichkeit, dass der Administrator den Pfosten einfach nicht bemerkt? Dann wechseln die Fachkräfte, die Krücken bleiben aber, während Unternehmen stets danach streben, die Kosten auch für das IT-Personal zu minimieren.

Pseudo-Shell und Jailbreak

Die während der Ausnutzungsphase erhaltene System-Shell ist häufig begrenzt, insbesondere wenn Sie sie durch Hacken eines Benutzers des Webservers erhalten haben. Beispielsweise können Shell-Einschränkungen Sie daran hindern, den Befehl sudo auszuführen, was zu einem Fehler führt:

sudo: no tty present and no askpass program specified

Sobald Sie eine Shell haben, empfehle ich die Erstellung eines vollwertigen Terminals, beispielsweise mit Python.

python -c 'import pty;pty.spawn("/bin/bash")'

Sie fragen sich vielleicht: „Warum brauche ich tausend Befehle, wenn ich einen beispielsweise zum Übertragen von Dateien verwenden kann?“ Tatsache ist, dass Systeme unterschiedlich konfiguriert sind; auf einem bestimmten Host ist möglicherweise kein Python installiert, dafür aber Perl. Die Fähigkeit besteht darin, vertraute Dinge im System ohne vertraute Werkzeuge erledigen zu können. Eine vollständige Liste der Funktionen finden Sie hier hier.

Eine Shell mit niedrigen Privilegien kann mit abgerufen werden Mannschaften 1 и Mannschaften 2 (überraschenderweise sogar GIMP).

Befehlsverlauf anzeigen

Linux sammelt einen Verlauf aller ausgeführten Befehle in einer Datei ~ / .bash_history. Wenn der Server aktiv genutzt wird und sein Verlauf nicht gelöscht wird, besteht eine hohe Wahrscheinlichkeit, dass in dieser Datei Anmeldeinformationen gefunden werden. Das Löschen des Verlaufs ist einfach umständlich. Wenn der Administrator gezwungen ist, zehnstöckige Befehle auszuwählen, ist es für ihn natürlich bequemer, diesen Befehl aus dem Verlauf aufzurufen, als ihn erneut einzugeben. Außerdem wissen viele Menschen nichts von diesem „Hack“. Wenn es alternative Shells wie Zsh oder Fish im System gibt, haben diese ihre eigene Geschichte. Um den Befehlsverlauf in einer beliebigen Shell anzuzeigen, geben Sie einfach den Befehlsverlauf ein.

cat ~/.bash_history
cat ~/.mysql_history
cat ~/.nano_history
cat ~/.php_history
cat ~/.atftp_history

Es gibt Shared Hosting, bei dem der Server zum Hosten mehrerer Websites genutzt wird. Normalerweise verfügt bei dieser Konfiguration jede Ressource über einen eigenen Benutzer mit einem separaten Home-Verzeichnis und einem virtuellen Host. Bei falscher Konfiguration finden Sie die Datei .bash_history im Stammverzeichnis der Webressource.

Suche nach Passwörtern im Dateisystem und Angriffe auf angrenzende Systeme

Konfigurationsdateien für verschiedene Dienste sind möglicherweise für Ihren aktuellen Benutzer lesbar. Darin finden Sie Zugangsdaten im Klartext – Passwörter für den Zugriff auf eine Datenbank oder verwandte Dienste. Das gleiche Passwort kann sowohl für den Zugriff auf die Datenbank als auch für die Autorisierung des Root-Benutzers (Credential Staffing) verwendet werden.
Es kommt vor, dass die gefundenen Anmeldeinformationen zu Diensten auf anderen Hosts gehören. Die Entwicklung eines Angriffs auf die Infrastruktur über einen kompromittierten Host ist nicht schlimmer als die Ausnutzung anderer Hosts. Angrenzende Systeme können auch durch die Suche nach IP-Adressen im Dateisystem gefunden werden.

grep -lRi "password" /home /var/www /var/log 2>/dev/null | sort | uniq #Find string password (no cs) in those directories
grep -a -R -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' /var/log/ 2>/dev/null | sort -u | uniq #IPs inside logs

Wenn der kompromittierte Host über eine Webanwendung verfügt, auf die über das Internet zugegriffen werden kann, ist es besser, seine Protokolle von der Suche nach IP-Adressen auszuschließen. Adressen von Ressourcenbenutzern aus dem Internet sind für uns wahrscheinlich nicht von Nutzen, wohl aber die Adressen des internen Netzwerks (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) und wohin sie gehen, den Protokollen nach zu urteilen , könnte von Interesse sein.

Sudo

Der Befehl sudo gibt dem Benutzer die Möglichkeit, einen Befehl im Root-Kontext mit seinem eigenen Passwort oder ohne die Verwendung eines Passworts auszuführen. Viele Vorgänge unter Linux erfordern Root-Rechte, die Ausführung als Root gilt jedoch als sehr schlechte Praxis. Stattdessen ist es besser, selektive Berechtigungen zum Ausführen von Befehlen im Root-Kontext zu erteilen. Viele Linux-Tools, einschließlich Standardtools wie vi, können jedoch verwendet werden, um Berechtigungen auf legitime Weise zu erweitern. Um eine geeignete Methode zu finden, empfehle ich die Suche hier.

Wenn Sie Zugriff auf das System erhalten, müssen Sie als Erstes den Befehl sudo -l ausführen. Es wird die Berechtigung zur Verwendung des sudo-Befehls angezeigt. Wenn ein Benutzer ohne Passwort abgerufen wird (z. B. Apache oder www-data), ist der Privilegieneskalationsvektor über sudo unwahrscheinlich. Bei Verwendung von sudo fragt das System nach einem Passwort. Mit dem Befehl passwd können Sie auch kein Passwort festlegen; er fragt nach dem aktuellen Passwort des Benutzers. Wenn Sudo jedoch noch verfügbar ist, müssen Sie im Wesentlichen nach Folgendem suchen:

  • alle Interpreter, jeder kann eine Shell erzeugen (PHP, Python, Perl);
  • beliebige Texteditoren (vim, vi, nano);
  • irgendwelche Zuschauer (weniger, mehr);
  • jede Fähigkeit, mit dem Dateisystem (cp, mv) zu arbeiten;
  • Tools, die eine Ausgabe in Bash, interaktiv oder als ausführbaren Befehl (awk, find, nmap, tcpdump, man, vi, vim, ansible) haben.

Suid/Sgid

Es gibt viele Handbücher im Internet, die das Sammeln aller suid/sgid-Befehle empfehlen, aber ein seltener Artikel enthält Einzelheiten dazu, was mit diesen Programmen zu tun ist. Es gibt Möglichkeiten zur Privilegieneskalation, die den Einsatz von Exploits nicht berücksichtigen hier. Außerdem weisen eine Reihe ausführbarer Dateien spezifische Schwachstellen für die Betriebssystemversion auf. beispielsweise.

Im Idealfall würden Sie alle installierten Pakete zumindest über searchsploit ausführen. In der Praxis sollte dies mit den gängigsten Programmen wie sudo erfolgen. Es besteht auch immer die Möglichkeit, automatisierte Tools zu verwenden und deren Entwicklung zu unterstützen, die aus Sicht der Rechteausweitung interessante ausführbare Dateien mit gesetzten suid/sgid-Bits hervorheben. Eine Liste solcher Tools werde ich im entsprechenden Abschnitt des Artikels bereitstellen.

Beschreibbare Skripte, die von Cron oder Init im Kontext von Root ausgeführt werden

Cron-Jobs können unter verschiedenen Benutzerkontexten ausgeführt werden, einschließlich Root. Wenn ein Cron-Task mit einem Link zu einer ausführbaren Datei eingerichtet ist und für Sie zum Schreiben verfügbar ist, kann er leicht durch einen böswilligen Task und eine Rechteausweitung ersetzt werden. Standardmäßig sind Dateien mit Cron-Tasks jedoch für jeden Benutzer lesbar.

ls -la /etc/cron.d  # show cron jobs 

Ähnlich verhält es sich mit init. Der Unterschied besteht darin, dass Aufgaben in Cron regelmäßig ausgeführt werden und in Init – beim Systemstart. Der Betrieb erfordert einen Systemneustart und einige Dienste werden möglicherweise nicht gestartet (sofern sie beim Start nicht registriert wurden).

ls -la /etc/init.d/  # show init scripts 

Sie können auch nach Dateien suchen, die von jedem Benutzer beschreibbar sind.

find / -perm -2 -type f 2>/dev/null # find world writable files

Die Methode ist recht bekannt, erfahrene Systemadministratoren gehen vorsichtig mit dem Befehl chmod um. Allerdings beschreiben die allermeisten Handbücher im Internet die Festlegung maximaler Rechte. Der „Just Make it Work“-Ansatz unerfahrener Systemadministratoren schafft grundsätzlich Möglichkeiten zur Eskalation von Privilegien. Wenn möglich, ist es besser, im Befehlsverlauf nach einer unsicheren Verwendung von chmod zu suchen.

chmod +w /path 
chmod 777 /path

Shell-Zugriff für andere Benutzer erhalten

Wir schauen uns die Liste der Benutzer in /etc/passwd an. Wir achten auf diejenigen, die eine Hülle haben. Sie können diese Benutzer brutisieren – es ist möglich, dass durch den resultierenden Benutzer letztendlich die Möglichkeit besteht, die Berechtigungen zu erhöhen.

Um die Sicherheit zu verbessern, empfehle ich Ihnen, stets das Prinzip der geringsten Privilegien einzuhalten. Es ist auch sinnvoll, sich die Zeit zu nehmen, unsichere Konfigurationen zu überprüfen, die nach der Fehlerbehebung verbleiben könnten – dies ist die „technische Pflicht“ des Systemadministrators.

Selbstgeschriebener Code

Es lohnt sich, einen genauen Blick auf die ausführbaren Dateien im Home-Verzeichnis des Benutzers und des Webservers (/var/www/, sofern nicht anders angegeben) zu werfen. Diese Dateien könnten sich als völlig unsichere Lösung erweisen und unglaubliche Krücken enthalten. Wenn Sie ein Framework im Webserver-Verzeichnis haben, macht es natürlich keinen Sinn, im Rahmen eines Pentests nach Zero-Day darin zu suchen, aber es wird empfohlen, benutzerdefinierte Modifikationen, Plugins und Komponenten zu finden und zu studieren.

Um die Sicherheit zu erhöhen, ist es besser, wenn möglich, die Verwendung von Anmeldeinformationen in selbst geschriebenen Skripten sowie potenziell gefährliche Funktionen wie das Lesen von /etc/shadow oder das Manipulieren von id_rsa zu vermeiden.

Erhöhung von Privilegien durch Ausnutzung von Schwachstellen

Bevor man versucht, Privilegien durch Ausbeutung auszuweiten, ist es wichtig zu verstehen Übertragen von Dateien auf den Zielhost. Zusätzlich zu den üblichen Tools wie ssh, ftp, http (wget, curl) gibt es ein ganzes „Zoo“ der Möglichkeiten.

Um die Systemsicherheit zu verbessern, aktualisieren Sie es regelmäßig auf den neuesten Stand stabil Versionen und versuchen Sie auch, Distributionen zu verwenden, die für Unternehmen entwickelt wurden. Ansonsten kommt es selten vor, aber es gibt Situationen, in denen ein apt-Upgrade das System funktionsunfähig macht.

Ausnutzen von Diensten, die im Root-Benutzerkontext ausgeführt werden

Einige Linux-Dienste laufen als Root. Sie können mit dem Befehl ps aux | gefunden werden grep-Wurzel. In diesem Fall darf der Dienst nicht im Internet beworben werden und lokal verfügbar sein. Wenn öffentliche Exploits vorhanden sind, können diese sicher verwendet werden: Ein Dienstabsturz im Fehlerfall ist weitaus weniger kritisch als ein Absturz des Betriebssystems.

ps -aux | grep root # Linux

Als erfolgreichster Fall kann der Betrieb eines gehackten Dienstes im Kontext des Root-Benutzers angesehen werden. Durch den Betrieb des SMB-Dienstes erhalten Sie privilegierten SYSTEM-Zugriff auf Windows-Systemen (z. B. über ms17-010). Dies ist jedoch auf Linux-Systemen nicht üblich, sodass Sie viel Zeit damit verbringen können, Berechtigungen zu erweitern.

Ausnutzung von Linux-Kernel-Schwachstellen

Dies ist der Weg, den Sie zuletzt gehen sollten. Ein erfolgloser Vorgang kann zu einem Systemabsturz führen und im Falle eines Neustarts werden einige Dienste (einschließlich derjenigen, über die die ursprüngliche Shell bezogen wurde) möglicherweise nicht gestartet. Es kommt vor, dass der Administrator einfach vergessen hat, den Befehl systemctl enable zu verwenden. Außerdem führt es zu großer Unzufriedenheit mit Ihrer Arbeit, wenn die Operation nicht vereinbart wurde.
Wenn Sie sich für die Verwendung der Quellcodes von Exploitdb entscheiden, lesen Sie unbedingt die Kommentare am Anfang des Skripts. Darin steht unter anderem meist, wie man einen bestimmten Exploit richtig kompiliert. Wenn Sie zu faul sind oder es aufgrund von Fristen „gestern“ tun mussten, können Sie nach Repositories mit bereits kompilierten Exploits suchen. beispielsweise. Sie sollten sich jedoch darüber im Klaren sein, dass Sie in diesem Fall die Katze im Sack haben. Wenn andererseits ein Programmierer bis aufs Byte genau verstehen würde, wie ein Computer funktioniert und welche Software er verwendet, würde er in seinem ganzen Leben keine einzige Codezeile schreiben.

cat /proc/version
uname -a
searchsploit "Linux Kernel" 

Metasploit

Um die Verbindung abzufangen und zu verarbeiten, ist es immer besser, das Exploit/multi/handler-Modul zu verwenden. Die Hauptsache ist, die richtige Nutzlast festzulegen, zum Beispiel generic/shell/reverse_tcp oder generic/shell/bind_tcp. Die von Metasploit erstellte Shell kann mithilfe des Moduls post/multi/manage/shell_to_meterpreter auf Meterpreter aktualisiert werden. Mit Meterpreter können Sie den Post-Exploitation-Prozess automatisieren. Beispielsweise überprüft das Modul post/multi/recon/local_exploit_suggester die Plattform, Architektur und Entitäten, die für die Ausnutzung erforderlich sind, und schlägt Metasploit-Module vor, um die Berechtigungen auf dem Zielsystem zu erweitern. Dank Meterpreter läuft die Eskalation von Berechtigungen manchmal darauf hinaus, das erforderliche Modul zu starten, aber Hacken, ohne zu verstehen, was unter der Haube passiert, ist nicht „wahr“ (Sie müssen trotzdem einen Bericht schreiben).

Tools

Tools zur Automatisierung der lokalen Informationserfassung ersparen Ihnen viel Aufwand und Zeit, sind jedoch allein nicht in der Lage, den Weg zur Eskalation von Berechtigungen vollständig zu identifizieren, insbesondere im Fall der Ausnutzung von Kernel-Schwachstellen. Automatisierungstools führen alle notwendigen Befehle aus, damit Sie Informationen über das System sammeln können. Es ist jedoch auch wichtig, dass Sie dazu in der Lage sind zu analysieren empfangene Daten. Ich hoffe, dass mein Artikel Ihnen in dieser Hinsicht nützlich sein wird. Natürlich gibt es noch viel mehr Tools, als ich im Folgenden aufzähle, aber alle machen ungefähr das Gleiche – das ist eher Geschmackssache.

Linpeas

Ein ziemlich neues Tula, der erste Commit stammt aus dem Januar 2019. Mein Lieblingstool im Moment. Der Punkt ist, dass es die interessantesten Vektoren der Privilegieneskalation hervorhebt. Stimmen Sie zu, es ist bequemer, auf dieser Ebene eine Expertenbewertung einzuholen, als monolithische Rohdaten zu analysieren.

LinEnum

Mein zweitliebstes Tool, es sammelt und organisiert auch Daten, die durch lokale Aufzählung gewonnen werden.

Linux-Exploit-Suggester (1,2)

Dieser Exploit analysiert das System auf geeignete Exploit-Bedingungen. Tatsächlich erledigt es die gleiche Aufgabe wie das Metasploit-Modul local_exploit_suggester, bietet jedoch Links zu Exploit-DB-Quellcodes anstelle von Metasploit-Modulen.

Linuxprivchecker

Dieses Skript sammelt und organisiert eine große Menge an Informationen in Abschnitten, die für die Bildung eines Vektors zur Erhöhung der Berechtigungen nützlich sein können.

Ein andermal werde ich näher darauf eingehen Erhöhung der Berechtigungen im Linux-Betriebssystem über suid/sgid.

Source: habr.com

Kommentar hinzufügen