‹ cd4cwj / writeups
root@cd4cwj:~$ cat writeups/binary-trail.md

Binary Trail

forensedfirlinux

Binary Trail

Máquina de tipo respuesta a incidentes (IR) / análisis forense, no de explotación clásica: el propio enunciado entrega acceso root directo para simular a un analista que ya está dentro del servidor comprometido y debe reconstruir qué hizo un binario sospechoso.

Máquina: The Hackers Labs — Binary Trail SO: Ubuntu 24.04.1 LTS, kernel 6.8.0-51-generic Vector de entrada: Ninguno que explotar — acceso root/toor entregado por el enunciado (simulación de un equipo de respuesta a incidentes ya con acceso) Escalada de privilegios: No aplica (se entra directo como root) Objetivo real: Análisis forense de un binario (auth_proxy) hallado en un directorio no estándar (/opt), usando solo comandos básicos de Linux (sin herramientas avanzadas), tal como pide el propio enunciado Herramientas principales: nmap (descubrimiento de puertos), ssh/sshpass (acceso remoto), stat (permisos/metadatos de fichero), strings (extraer texto legible de un binario compilado), grep (búsqueda de rastros en logs)

Resumen de acceso y hallazgos

Ítem Valor
Acceso root por SSH, credenciales dadas por el enunciado (root:toor)
Binario sospechoso ████████████
Fichero oculto creado por el binario ████████████
Rastro en logs ████████████

Cuestionario final — resultado

# Pregunta Respuesta Evidencia
1 Nombre del binario sospechoso ████████████ /opt/auth_proxy, 16008 bytes, ejecutable ELF
2 Fichero que oculta el binario en el sistema ████████████ código fuente /opt/lab/auth_proxy.c
3 Comando que dejó rastros en los logs ████████████ /var/log/auth.log.1:137
4 Archivo de logs con los rastros (ruta) ████████████ grep -na 'auth_proxy' /var/log/auth.log.1
5 Permisos de /etc/.shadow_auth (numérico) ████████████ stat /etc/.shadow_auth → Access: (0600/-rw-------)

Glosario rápido

Herramientas necesarias

Fase 0 — Preparación del laboratorio

Se descargó el .zip oficial de TheHackersLabs y se extrajo:

unzip "TheHackersLabs - Binary Trail.zip"
# → TheHackersLabs - Binary Trail.ova  (2.2 GB, disco de 25 GB)
# → TheHackersLabs - Binary Trail.pdf (enunciado)

El PDF del enunciado es la pieza clave que cambia el enfoque de esta máquina respecto a las anteriores del laboratorio: en vez de pedir explotarla desde fuera, plantea un escenario ya post-compromiso y entrega las credenciales directamente:

“Un servidor Linux crítico […] se ha identificado la presencia de un binario desconocido ubicado en un directorio no estándar […] Evita confiar en herramientas avanzadas; utiliza únicamente las capacidades básicas disponibles en un entorno estándar de Linux […] Login: root / toor”

Import y arranque, igual que el resto del laboratorio (Bridged por defecto → se fuerza a host-only):

VBoxManage import "TheHackersLabs - Binary Trail.ova" --dry-run   # vista previa: Ubuntu_64, 2 CPUs, 2048 MB
VBoxManage import "TheHackersLabs - Binary Trail.ova"
VBoxManage modifyvm "TheHackersLabs - Binary Trail" --nic1 hostonly --hostonlyadapter1 vboxnet0
VBoxManage startvm "TheHackersLabs - Binary Trail" --type headless

Para reproducir desde cero, con la VM apagada:

VBoxManage controlvm "TheHackersLabs - Binary Trail" poweroff
VBoxManage startvm "TheHackersLabs - Binary Trail" --type headless

Fase 1 — Reconocimiento de red

Se descubre la IP asignada por DHCP en la red host-only comparando la MAC de la VM con lo que responde arp-scan:

arp-scan --interface=vboxnet0 --localnet
# 192.168.56.106  08:00:27:be:db:de   ← coincide con la MAC de la NIC de Binary Trail

Escaneo completo de puertos TCP:

nmap -sC -sV -p- --min-rate 2000 -oN loot/nmap-tcp-full.txt 192.168.56.106

Resultado: un único puerto abierto.

22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.5

Lectura: no hay web, ni FTP, ni ningún otro servicio que dé pie a un vector de entrada externo. Esto, sumado a que el propio PDF ya entrega credenciales, confirma que el reto no es “cómo entrar” sino “qué encuentras una vez dentro”.

Fase 2 — Acceso inicial

Se usa directamente la credencial del enunciado:

sshpass -p 'toor' ssh [email protected] "id; hostname; uname -a"
uid=0(root) gid=0(root) groups=0(root)
oscar
Linux oscar 6.8.0-51-generic #52-Ubuntu SMP PREEMPT_DYNAMIC Thu Dec 5 13:09:44 UTC 2024 x86_64

El hostname es oscar — el mismo nombre del creador que ya aparecía en la máquina El Topo DNS ([+] Creador: Oscar en su pantalla de login), confirmando que es del mismo autor dentro del laboratorio.

Nota honesta: antes de asumir que el enunciado era la única vía, se comprobó explícitamente que no hubiera una cadena de explotación alternativa (una descripción previa mencionaba esteganografía + cracking de hash + un fichero Office + fuerza bruta SSH). Se buscó evidencia de cada paso directamente en el sistema:

find / -xdev \( -iname '*.jpg' -o -iname '*.png' -o -iname '*.bmp' \) 2>/dev/null   # solo iconos estándar de Ubuntu
find / -xdev \( -iname '*.docx' -o -iname '*.zip' -o -iname '*.odt' \) 2>/dev/null  # nada del escenario
grep -vE '/nologin|/false' /etc/passwd                                              # solo root y sync — nunca hubo "3 usuarios"
grep -na 'Failed password' /var/log/auth.log.1                                      # cero resultados, no hubo fuerza bruta
grep -na 'Accepted password' /var/log/auth.log.1                                    # solo accesos de "root", sin otro usuario

Ningún rastro de esa cadena existe en esta build de la máquina (descargada dic-2024). Se documenta esta comprobación en vez de omitirla: esa descripción de 5 pasos corresponde a otro escenario o a otra versión, no a la VM real que se analizó aquí.

Fase 3 — Análisis forense del binario sospechoso

3.1 — Localizar el binario y su directorio “no estándar”

El enunciado dice que el binario está en “un directorio no estándar”. En Linux, /opt es precisamente el directorio pensado para software de terceros instalado manualmente (no gestionado por el paquete del sistema como sí lo son /usr/bin o /usr/sbin) — un lugar habitual para que algo fuera de lugar pase desapercibido:

ls -la /opt/
-rwxr-xr-x 1 root root 16008 dic 21  2024 /opt/auth_proxy
drwxr-xr-x 2 root root  4096 dic 21  2024 /opt/lab/

Pregunta 1 → nombre del binario sospechoso: auth_proxy.

3.2 — Función principal del binario

Junto al binario hay un directorio /opt/lab/ con su código fuente en C — un lujo que no se tiene en un incidente real (normalmente solo queda el binario compilado), pero que aquí sirve para verificar con certeza lo que hace, en vez de solo inferirlo:

cat /opt/lab/auth_proxy.c
#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("Running auth_proxy...\n");
    system("touch /etc/.shadow_auth");
    return 0;
}

Se confirma que el binario compilado coincide con ese código usando strings (lista las cadenas de texto legible embebidas en el ejecutable, sin necesidad de ejecutarlo ni desensamblarlo):

strings /opt/auth_proxy | grep -E "Running|touch"
Running auth_proxy...
touch /etc/.shadow_auth

Función principal: el binario no hace nada relacionado con autenticación real pese a su nombre (“proxy de autenticación”) — es un nombre señuelo. Su única acción es imprimir un mensaje y, mediante system(), lanzar el comando de shell touch /etc/.shadow_auth, que crea (o actualiza la fecha de) un fichero vacío oculto en /etc.

3.3 — Fichero oculto y sus permisos

stat /etc/.shadow_auth
cat /etc/.shadow_auth
  File: /etc/.shadow_auth
  Access: (0600/-rw-------)  Uid: (0/root)  Gid: (0/root)
  Birth: 2024-12-21 09:16:29
Archivo creado por auth_proxy para pruebas internas.

El nombre .shadow_auth es otro señuelo: imita al fichero real /etc/shadow (donde Linux guarda las contraseñas hasheadas) para que, a simple vista en un listado largo de /etc, un analista distraído lo confunda con algo del propio sistema operativo y no lo investigue. Los permisos 0600 (lectura/escritura solo para el propietario, aquí root) coinciden con los que normalmente tendría un fichero sensible legítimo — otro motivo por el que pasa desapercibido.

3.4 — Rastros en los logs del sistema

El código fuente no llama a ninguna función de log (syslog, openlog) — solo a printf y system(). Sin embargo, al buscar el nombre del binario en los logs del sistema aparece igualmente:

grep -rl 'auth_proxy' /var/log
/var/log/auth.log.1
grep -na 'auth_proxy\|shadow_auth' /var/log/auth.log.1
137:Dec 21 10:32:45 server auth_proxy: touch /etc/.shadow_auth
138:Dec 21 10:32:45 server auth_proxy: Probando creación de archivos ocultos
171:Dec 21 10:32:45 server auth_proxy: touch /etc/.shadow_auth
172:Dec 21 10:32:45 server auth_proxy: Probando creación de archivos ocultos
197:Dec 21 10:32:45 server auth_proxy: touch /etc/.shadow_auth
198:Dec 21 10:32:45 server auth_proxy: Probando creación de archivos ocultos

Detalle importante para el análisis (no cambia la respuesta, pero sí la interpretación): como el binario en sí no tiene código de logging, estas líneas no las escribió el programa al ejecutarse — las generó alguien (el atacante, o quien preparó la prueba) a mano con la utilidad logger, que permite mandar un mensaje a syslog con cualquier etiqueta de origen que se quiera (logger -t auth_proxy "touch /etc/.shadow_auth"). Es decir, el propio rastro en los logs pudo ser fabricado para simular que el binario reporta su actividad — una lección de análisis forense real: un log puede mentir sobre su origen si el atacante tiene permisos para escribir en syslog.

3.5 — Cómo llegó al servidor

Se revisó el resto de auth.log.1 en busca de vectores de entrada:

grep -na 'Accepted password\|Invalid user\|Failed password' /var/log/auth.log.1
96:  Accepted password for root from 192.168.1.112 port 46082 ssh2
168: Accepted password for root from 192.168.1.112 port 35360 ssh2
194: Accepted password for root from 192.168.1.112 port 52522 ssh2

No hay ningún Failed password ni usuario distinto de root — solo tres sesiones SSH exitosas ya como root, desde la misma IP (192.168.1.112, la máquina de quien preparó/probó el laboratorio). No hay evidencia de que el binario haya llegado por un exploit remoto; todo indica que fue colocado manualmente por quien tenía ya acceso root (coherente con /opt/lab/auth_proxy.c estando ahí mismo, como si fuera el entorno donde se compiló in situ) para simular un artefacto sospechoso a analizar, no un ataque real en curso.

Diagrama resumen

             /opt/lab/auth_proxy.c  --gcc-->  /opt/auth_proxy (ELF, 16008 B)
                                                      |
                                          system("touch /etc/.shadow_auth")
                                                      |
                                                      v
                                    /etc/.shadow_auth (0600, root:root)
                                    "Archivo creado por auth_proxy para pruebas internas."

  alguien con acceso ya root ejecuta 3 veces auth_proxy
                                                      |
                                                      v
                     logger -t auth_proxy "touch /etc/.shadow_auth"          } rastro fabricado,
                     logger -t auth_proxy "Probando creación de..."          } no generado por el binario
                                                      |
                                                      v
                                        /var/log/auth.log.1 (líneas 137-198)

Causas raíz y mitigación

Hallazgo Causa raíz Mitigación
Binario no autorizado en /opt Sin control de integridad ni inventario de software instalado manualmente Monitorización de integridad de ficheros (AIDE/Tripwire), listas blancas de ejecución (AppArmor/SELinux, fapolicyd)
Fichero oculto con nombre señuelo (/etc/.shadow_auth) /etc no se audita por creación de nuevos ficheros, solo se asume “de confianza” FIM (File Integrity Monitoring) con alertas sobre creación/modificación en directorios críticos del sistema
Rastro en logs potencialmente fabricado vía logger syslog confía en la etiqueta que declara el propio proceso que escribe, sin verificar el PID/binario real de origen Correlacionar logs con auditd (que sí registra el binario y PID reales que ejecutan cada execve), no depender solo de mensajes autodeclarados
root con login SSH por contraseña habilitado Configuración por defecto sin endurecer (PermitRootLogin yes, autenticación por password) PermitRootLogin no, autenticación solo por clave pública, MFA para accesos privilegiados

«El hombre es una criatura que se acostumbra a todo, y creo que esa es la mejor definición que se puede dar de él.»
— Fiódor Dostoyevski, Memorias de la casa muerta