Intro
Dieser Artikel behandelt die manuelle Ausnutzung einer SQLi-Schwachstelle ohne SQLMap, das Knacken von Hash-Passwörtern von Benutzern, die Verwendung von SSH-Tunneln, um einen versteckten Dienst aufzudecken, und die Erlangung von Root-Rechten ohne Metasploit. Hier ist ein Link zur Tryhackme-Box.
Aufzählung
Nmap-Scan
Ich mag es, eine Umgebungsvariable für die IP-Adresse des Ziels zu definieren, so dass ich sie mir nicht merken oder immer wieder vollständig eingeben muss.
PORT ZUSTAND SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; Protokoll 2.0) | ssh-hostkey: | 2048 61:ea:89:f1:d4:a7:dc:a5:50:f7:6d:89:c3:af:0b:03 (RSA) | 256 b3:7d:72:46:1e:d3:41:b6:6a:91:15:16:c9:4a:a5:fa (ECDSA) |_ 256 53:67:09:dc:ff:fb:3a:3e:fb:fe:cf:d8:6d:41:27:ab (ED25519) 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) | http-cookie-flags: | /: | PHPSESSID: |httponly-Flag nicht gesetzt | http-methods: |_ Unterstützte Methoden: GET HEAD POST OPTIONS |_http-server-header: Apache/2.4.18 (Ubuntu) |_http-title: Spielzone Service-Informationen: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Nur zwei offene TCP-Ports, ohne Anmeldeinformationen kann man mit SSH nicht viel machen, außer Bruteforcing. Werfen wir einen Blick auf die Website, die auf Port 80 läuft.
Da dieser Rechner auf einer SQLi-Schwachstelle basiert, sollten wir mit den Grundlagen der SQL-Injektion beginnen.
SQL-Einschleusung
Eine SQL-Injektion liegt vor, wenn benutzergesteuerte Eingaben an SQL-Abfragen übergeben werden; auf diese Weise können wir das Ergebnis solcher Abfragen manipulieren.
Eine Abfrage sieht so aus: SELECT ? FROM ? WHERE ? LIKE ?
was bedeutet SELECT something FROM some table WHERE some column LIKE '% %'
wird der Befehl standardmäßig in einfache Anführungszeichen gesetzt ' '
mit % %
enthalten, die Platzhalter sind. Wenn wir suchen würden nach ook
und wird somit '%ook%'
wo wir book
in unserer Datenbank, können wir sie aufgrund dieser Platzhalter finden. Wir haben nur die Kontrolle über die book
Wort, können wir den Rest der Abfrage nicht ändern, weil er im PHP-Code des Backends fest einkodiert ist.
Als Erstes müssen Sie herausfinden, welches Datenbankmanagementsystem auf dem Server läuft. Die auf der Website angezeigte Fehlermeldung verrät uns, welche Software für die Verwaltung der Datenbank verwendet wird.
Geben Sie diese Abfrage in das Anmeldeformular ein:
john' or 0=0 #
die das Folgende tut:
SELECT * FROM users WHERE username='john' or 0=0;#' and password='john';
alle Spalten der Tabelle users anzeigen/auswählen, wobei die Spalte username john ist or
(führt die Abfrage aus, wenn mindestens eine Bedingung erfüllt ist) 0=0
was immer true ergibt, und die Abfrage wird ausgeführt. Das Rautensymbol #
kommentiert alles danach, wobei der folgende Teil ignoriert wird ' and password='john'
. Wenn die App anfällig ist, können Sie alle Spalten und ihre Werte anzeigen. Aber in unserem Fall können wir den Anmeldebildschirm umgehen.
Jetzt finden wir ein weiteres SQL-injizierbares Formular als Suchfeld:
Wenn wir nun ein einfaches Anführungszeichen
'
als Abfrage eingeben, wird eine Fehlermeldung ausgegeben (der Inhalt kann auch verschwinden), die uns mehr über das Datenbankmanagementsystem, hier MySQL, verrät:
“Sie haben einen Fehler in Ihrer SQL-Syntax. Schauen Sie im Handbuch zu Ihrer MySQL-Server-Version nach, um die richtige Syntax in der Nähe von ‘%” in Zeile 1 zu finden.
Verwenden wir unsere erste Abfrage, um zu sehen, ob wir in der Lage sind, alle Spalten und ihre Werte anzuzeigen:
In der Ausgabe werden nur zwei Spalten angezeigt, nämlich Titel und Bewertung. Zeit für die Aufzählung der Anzahl der Spalten in der Tabelle, die standardmäßig abgefragt wird. Dazu wenden wir einen einfachen Trick an: 'order by 1-- -
.
Sie müssen diese Zahl um 1 erhöhen, bis Sie eine Fehlermeldung erhalten, die besagt, dass sie nicht existiert. Bis dahin werden Sie keine Ausgabe sehen, wenn der Befehl erfolgreich ausgeführt wurde.
Ich konnte bis zu 3 hochzählen, bis ich eine Fehlermeldung erhielt. Unser Ziel hat 3 Spalten.
Wir können nun versuchen, die Informationen mit dem
union
Befehl:
Schauen wir uns die Datenbanken in MySQL an, indem wir die Tabelle
INFORMATION_SCHEMA
verwenden, die Informationen über alle Tabellen liefert, im Grunde die Datenbank-Metadaten oder den Systemkatalog:
... information_schema INNODB_CMPMEM information_schema INNODB_BUFFER_POOL_STATS information_schema INNODB_SYS_COLUMNS information_schema INNODB_SYS_FOREIGN information_schema INNODB_SYS_TABLESTATS db post db benutzer mysql spalten_priv mysql db mysql motor_cost mysql-ereignis ...
gibt alle Tabellen und ihre Werte aus. Die Tabellen “post” und “users” sehen für uns in der Datenbank “db” recht interessant aus.
Lassen Sie uns jetzt noch alles abrufen, da ich gerne mehr Informationen zum Nachschlagen habe:
... NNODB_SYS_TABLESTATS MODIFIED_COUNTER INNODB_SYS_TABLESTATS AUTOINC INNODB_SYS_TABLESTATS REF_COUNT post id post name post description users username users pwd spalten_priv Host spalten_priv Db spalten_priv Benutzer spalten_priv Tabellen_name ...
Die obige Abfrage liefert uns alle Tabellen- und Spaltennamen. Wir stellen nichts in die erste Reihe, weil sie aus irgendeinem Grund, den ich nicht kenne, versteckt ist. Wenn Sie es aber wissen, können Sie es mir unten mitteilen.
Wir können genauer sein und die Spalten username und pwd aus der Tabelle users auswählen.
agent47 ab5db915fc9ce[redacted]6500c57f2b52901ca6c0c6218f04122c3efd14
Knacken der Raute
Jetzt, da wir die Anmeldedaten haben, ist es an der Zeit, den Hash zu knacken. Ich benutze die folgende
Website
um den Hash-Typ zu identifizieren und werde ihn mit John knacken.
Um die korrekte Schreibweise aller Hash-Typen anzuzeigen, verwenden Sie die folgende Option:
john --list=formats
Ausbeutung
SSH
Wenn Sie sich erinnern, hatten wir auch einen offenen ssh-Port, also verbinden wir uns mit den Anmeldeinformationen, die wir erhalten haben, und listen alle unsere Box-Verbindungen auf.
Netid Status Recv-Q Send-Q Lokale Adresse:Port Peer-Adresse:Port udp UNCONN 0 0 *:10000 *:* udp UNCONN 0 0 *:68 *:* tcp LISTEN 0 80 127.0.0.1:3306 *:* tcp LISTEN 0 128 *:10000 *:* tcp LISTEN 0 128 *:22 *:* tcp LISTEN 0 128 :::80 :::* tcp LISTEN 0 128 :::22 :::*
Port 10000 ist bei unserem Nmap-Scan nicht aufgetaucht, und die übrigen Ports sind ziemlich unproblematisch, also nicht besonders interessant. Eine Firewall-Regel muss den Port 10000 blockieren. Versuchen wir, dies zu überprüfen:
cat: /etc/iptables/rules.v4: Erlaubnis verweigert
Obwohl wir die iptables nicht sehen können, können wir mit einem SSH-Tunnel den Port für uns (lokal) freigeben!
SSH-Tunnel
Von unserem lokalen Rechner aus führen wir:
ssh -L 10000:localhost:10000 agent47@$IP
um den Port zu unserem localhost zu tunneln, so dass wir lokal auf ihn zugreifen können.
Geben Sie anschließend in Ihrem Browser ein: localhost:10000
und Sie werden in der Lage sein, auf den neu freigelegten Webserver zuzugreifen. Sie können die zuvor gefundenen Anmeldedaten verwenden.
Wir stellen fest, dass die ausgestellte CMS-Version 1.580 ist. Dies veranlasst uns zu einer schnellen Suche nach potenziellen Schwachstellen:
--------------------------------------------- -------------------------------------------- Exploit-Titel | URL --------------------------------------------- -------------------------------------------- Webmin 1.580 - '/file/show.cgi' Entferntes Komma | https://www.exploit-db.com/exploits/21851 Webmin <1.920 - 'rpc.cgi' Remote Code Execu | https://www.exploit-db.com/exploits/47330 --------------------------------------------- -------------------------------------------- Shellcodes: Keine Ergebnisse
Damit erhalten wir zwei Metasploit-Module und keinen eigenständigen Exploit. Nachdem wir den Code des ersten Metasploit-Moduls durchgelesen haben, stellen wir fest, dass das Hinzufügen von
/file/show.cgi
an die URL anhängen, können wir die Verzeichnisse als root durchlaufen.
Einige weitere Aufzählungen
Um Ihnen etwas Zeit zu sparen, habe ich versucht, Folgendes abzurufen
etc/passwd
&
etc/shadow
& sie anschließend mit John zu knacken, aber das Knacken hat nicht funktioniert.
Ich habe die etc/sudoers
Datei, aber nichts Interessantes. Das gilt auch für die etc/crontab
Datei.
Die Flagge lässt sich leicht abrufen, indem man in den üblichen Root-Pfad wechselt, aber ich wollte erst einmal Root-Rechte bekommen.
Lassen Sie uns nach den SUID-Bit-aktivierten Binärdateien suchen:
/usr/bin/newgrp /usr/bin/passwd /usr/bin/chsh /usr/bin/newuidmap /usr/bin/chfn /usr/bin/gpasswd /usr/bin/newgidmap /usr/bin/pkexec /usr/bin/at /usr/bin/sudo /usr/lib/dbus-1.0/dbus-daemon-launch-helper /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic /usr/lib/snapd/snap-confine /usr/lib/openssh/ssh-keysign /usr/lib/eject/dmcrypt-get-device /usr/lib/policykit-1/polkit-agent-helper-1 /bin/ntfs-3g /bin/umount /bin/fusermount /bin/mount /bin/ping /bin/su /bin/ping6
Ich habe auch ein paar Skripte hochgeladen, um nach Schwachstellen zu suchen, aber alle waren negativ.
Privilegieneskalation
Ich habe einige Zeit damit verbracht, Reverse-Shell-Skripte hochzuladen und sie in die /tmp
aber es hat nicht funktioniert. Schließlich fand ich die folgende PHP-Einzeiler-Web-Shell, die funktionierte, indem ich sie ein wenig anders ausführte:
0 Comments