Abusando de los Runners de GitLab CI como un Marco de Comando y Control
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
El artículo describe un concepto de prueba llamado GitRunner C2 que convierte binarios legítimos y firmados digitalmente del runner de GitLab CI en un marco de comando y control. Al instalar los runners como servicios de Windows, un atacante puede ejecutar comandos arbitrarios de PowerShell y exfiltrar datos a través de la infraestructura incorporada de GitLab. Dado que el tráfico utiliza HTTPS saliente a gitlab.com, la actividad puede mezclarse con las comunicaciones normales de los desarrolladores.
Investigación
El investigador demostró la cadena completa de ataque, comenzando con la inscripción a través de un comando único de PowerShell elevado y terminando con la ejecución de comandos interactivos. La investigación se basó en los registros operativos de Sysmon y PowerShell para registrar la creación de procesos, cambios en el registro y comandos ejecutados a través del registro de bloque de scripts. El estudio mostró que el comportamiento legítimo del runner puede ayudar a evadir la detección tradicional de EDR y basada en red.
Mitigación
Los defensores deben vigilar los servicios de Windows recién instalados con nombres inusuales o servicios iniciados desde rutas de archivos no estándar. Habilitar el registro de bloque de scripts de PowerShell es esencial para la visibilidad de los comandos ejecutados a través del runner. Las organizaciones también deben limitar quién puede instalar servicios y monitorear el tráfico HTTPS saliente sospechoso hacia GitLab desde puntos finales que no se utilizan para el trabajo de desarrollo.
Respuesta
Si se detecta esta actividad, aísle el punto final afectado inmediatamente para detener la comunicación de comando y control. Revoque cualquier Token de Acceso Personal de GitLab y tokens de registro de runner vinculados al entorno comprometido. Los investigadores deben revisar luego los registros de PowerShell y los registros de eventos de Windows para determinar el alcance de los comandos ejecutados y de cualquier exfiltración de datos resultante.
"flowchart TD step_ingress["T1105 u2013 Transferencia de herramienta de ingreso: Descarga de gitlab-runner-windows-amd64.exe legítimo a través de PowerShell desde S3"] step_persistence["T1543.003 u2013 Crear o modificar proceso del sistema: Servicio de Windows: Instalación del runner de GitLab como un servicio nativo de Windows para persistencia"] rules_for_persistence("<b>Nombre de la regla</b>: Ruta binaria de servicio sospechosa (vía sistema)<br/><b>ID de la regla</b>: 780e6396-d9f4-42b2-8d73-89918e2dab16") step_trust_subversion["T1553.002 u2013 Subvertir controles de confianza: Firma de código: Uso del binario firmado digitalmente de GitLab para evadir la detección"] step_execution["T1059.003 u2013 Interprete de comando y scripts: Shell de comando de Windows: Ejecución de cargas de comando a través de variables CI usando ejecutor de shell"] step_c2["T1071 u2013 Protocolo de capa de aplicación: Uso de HTTPS (puerto 443) a la infraestructura de GitLab como un relé de C2"] step_exfiltration["T1567.001 u2013 Exfiltración a través de servicio web: Exfiltración a repositorio de código: Movimiento de archivos a través de Artefactos de GitLab y Registro de Paquetes Genéricos"] step_ingress –>|leads_to| step_persistence step_persistence –>|enables| step_trust_subversion step_persistence -.->|detected_by| rules_for_persistence step_trust_subversion –>|then| step_execution step_execution –>|uses| step_c2 step_c2 –>|leads_to| step_exfiltration "
Flujo de Ataque
Detecciones
La Posibilidad de Ejecución a través de Líneas de Comando de PowerShell Ocultas (vía cmdline)
Ver
Posible Ejecución de GitRunner C2 (vía powershell)
Ver
Posible Creación de Tarea Programada (vía powershell)
Ver
Posible Creación de Tarea Programada Usando PowerShell (vía powershell)
Ver
Operaciones de Imagen de Servicio por Proceso Raro (vía evento_registro)
Ver
Ruta Binaria de Servicio Sospechosa (vía sistema)
Ver
Registro de Bloque de Scripts de PowerShell Indica Potencial Abuso del Runner de GitLab [Windows Powershell]
Ver
Evasión del Servicio GitLab Runner de PowerShell [Windows Sysmon]
Ver
Ejecución de Simulación
Prerrequisito: La Verificación Previa de Telemetría y Línea de Base debe haber pasado.
Razonamiento: Esta sección detalla la ejecución precisa de la técnica del adversario (TTP) diseñada para activar la regla de detección. Los comandos y la narrativa DEBEN reflejar directamente los TTPs identificados y tienen como objetivo generar la telemetría exacta esperada por la lógica de detección. Ejemplos abstractos o no relacionados conducirán a un diagnóstico erróneo.
-
Narrativa de Ataque y Comandos: Un adversario ha obtenido acceso inicial e intenta establecer un canal de Comando y Control (C2) persistente. En lugar de usar malware conocido, descargan el legítimo
gitlab-runner-windows-amd64.exepara mezclarse con la actividad de DevOps. Usan PowerShell para soltar el archivo en un directorio temporal y luego lo registran como un Servicio de Windows nombrado «gitlab-runner». Este método busca explotar la naturaleza confiable de las herramientas CI/CD para eludir el escrutinio de seguridad tradicional. -
Script de Prueba de Regresión:
# Simulación de Instalación de GitLab Runner para Validación de Detecciones $ErrorActionPreference = "Stop" # 1. Definir rutas y nombres para coincidir exactamente con la lógica de detección $TargetDir = "C:WindowsTemp" $BinaryName = "gitlab-runner-windows-amd64.exe" $BinaryPath = Join-Path $TargetDir $BinaryName $ServiceName = "gitlab-runner" Write-Host "[+] Iniciando Simulación: Instalando $BinaryName" # 2. Simular Creación de Archivo (Evento ID 11 de Sysmon) # En un ataque real, esto sería una descarga web. Aquí creamos un archivo de prueba con el nombre específico. New-Item -Path $BinaryPath -ItemType File -Force | Out-Null Write-Host "[+] Archivo creado: $BinaryPath (Dispara Evento ID 11)" # 3. Simular Instalación de Servicio en Registro (Evento ID 13 de Sysmon) # Creando la ruta del servicio en el registro para activar la detección de ImagePath. $RegPath = "HKLM:SYSTEMCurrentControlSetServices$ServiceName" New-Item -Path $RegPath -Force | Out-Null Set-ItemProperty -Path $RegPath -Name "ImagePath" -Value $BinaryPath Write-Host "[+] Llave de registro creada y ImagePath: $RegPath (Dispara Evento ID 13)" Write-Host "[+] Simulación completa. Verifique SIEM para alertas." -
Comandos de Limpieza:
# Limpiar artefactos de simulación $TargetDir = "C:WindowsTemp" $BinaryName = "gitlab-runner-windows-amd64.exe" $BinaryPath = Join-Path $TargetDir $BinaryName $ServiceName = "gitlab-runner" Remove-Item -Path $BinaryPath -Force -ErrorAction SilentlyContinue Remove-Item -Path "HKLM:SYSTEMCurrentControlSetServices$ServiceName" -Recurse -Force -ErrorAction SilentlyContinue Write-Host "[+] Limpieza completa."