-
Transformar Debian en un Zombie de nmap
Si estamos buscando usar un ordenador/pc/servidor/máquina con Debian como proxy/zombie para realizar escaneos de tipo «idle» con nmap, tenemos que saber ciertas cosas:
En las distros GNU/Linux con kernel modernos ya no existe un simple ajuste por sysctl o parámetro de configuración que permita volver a la generación de identificadores IP (IP ID) puramente incremental de forma nativa. El comportamiento actual (que introduce aleatoriedad en el IP ID o usa secuencias “semi-aleatorias”) es un mecanismo de seguridad para dificultar ataques de ciertas clase, como los propios idle-scans o el rastreo de conexiones. Por tanto, no basta con tocar un fichero en /proc/sys/net/ipv4/ o hacer un cambio sencillo para forzar la secuencia incremental, ya que el código que gestiona el IP ID en Linux está en el propio kernel y no se controla mediante un sysctl. Entonces, a grandes rasgos, para transformar un Debian en un zombie hay dos posibles caminos:
- Parchear y recompilar el kernel, para que la función que asigna el IP ID se comporte de la manera que queramos. Por ejemplo, que incremente un contador en lugar de usar randomización.
- Reescribir el campo IP ID “en vivo” usando netfilter u otro mecanismo con algún módulo especial de iptables/nftables que reescriba el campo IP ID al vuelo.
Este segundo camino es más teórico que práctico. Podríamos interceptar el tráfico en espacio de usuario o con un módulo especial de iptables/nftables que reescriba el campo IP ID al vuelo. Sin embargo, en el árbol principal del código fuente de netfilter, no existe un módulo oficial que reescriba directamente el campo IP ID para todos los paquetes salientes. Podríamos aproximar algo customizado usando nfqueue, llevando paquetes a espacio de usuario, modificando la cabecera IP y reinyectándolos. Pero el rendimiento sería muy, muy malo. Tampoco hay un target nativo de iptables/iptables-legacy/nftables que manipule directamente el IP ID (como sí existen para el TTL, DSCP, etc). Todo esto hace que, en la práctica, sea mucho más sencillo (técnicamente hablando) parchear el kernel.
Ahora bien, en el código fuente del kernel, la parte encargada de generar el ID de los paquetes IPv4 (la cabecera IP) suele estar en el fichero:
net/ipv4/ip_output.c
Particularmente en la función:
ip_select_ident_segs(…)
…o, dependiendo de la versión:
ip_select_ident()
El kernel por defecto usa (simplificando) algo parecido a prandom_u32() o un algoritmo hash para inicializar y “pseudoaleatorizar” el campo id. Podríamos modificar ese código para que en lugar de generarlo aleatoriamente, simplemente lo vaya incrementando. Un ejemplo simplificado de parche (no literal, porque puede variar según la versión exacta del kernel) podría ser:
--- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -XYZ,7 +XYZ,7 @@ static u16 ip_select_ident_segs(const struct sk_buff *skb, ... { ... - u32 ident = prandom_u32(); /* Generación aleatoria típica */ + static u16 counter = 0; /* O algo similar, con protección si hace wrap */ + u32 ident = counter++; ... return htons((u16)ident); }
Se necesitarán los paquetes de desarrollo (kernel headers, toolchain, etc.) para recompilar el kernel con esos cambios. Y la tarea será bastante tediosa, porque habrá que compilar y probar cada cambio. Lógicamente esto conlleva implicaciones de seguridad considerables para toda máquina que bootee ese kernel (por ejemplo, facilitar ciertos tipos de fingerprinting y escaneos), por lo que esa máquina resultante tendría, como única función, ser un zombie de nmap.
La otra opción, y tal vez la más práctica, es instalar un Debian que useun kernel 2.2 o anterior. Por ejemplo Debian 2.2 «Potato». Debian 3.0 “Woody” (lanzada en 2002) también usaba el kernel 2.2, pero también ofrecía 2.4 como opción. Por lo que, si lo que se quiere es instalar Debian 3, habría que ver de instalar la versión que venía con el kernel 2.2.
A partir de la serie 2.4 del kernel (años 2001 a 2004), empezaron a aparecer parches que permitían elegir la aleatorización de IP ID. Eran opcionales, pero permitían elegirlos. En la práctica, desde algún momento de la rama 2.6 (por ejemplo, alrededor de 2.6.12–2.6.20 dependiendo de la distro), ya era raro ver un comportamiento puramente incremental en un kernel “de fábrica”. Hoy día (kernels 4.x, 5.x, 6.x, etc.) ya no hay opción por sysctl para volver atrás, y el código fuente implementa la randomización como comportamiento estándar.Esta inverstigación está en desarrollo. Si quieres contribuir, ponte en contacto conmigo.
Search
Archives
- febrero 2025
- diciembre 2024
- noviembre 2024
- octubre 2024
- septiembre 2024
- junio 2024
- mayo 2024
- abril 2024
- marzo 2024
- octubre 2023
- agosto 2023
- junio 2023
- mayo 2023
- abril 2023
- marzo 2023
- febrero 2023
- enero 2023
- diciembre 2022
- noviembre 2022
- octubre 2022
- septiembre 2022
- agosto 2022
- julio 2022
- junio 2022
- mayo 2022
- abril 2022
- febrero 2022
- enero 2022
- diciembre 2021
- noviembre 2021
- octubre 2021
- septiembre 2021
- julio 2021
- junio 2021
- mayo 2021
- abril 2021
- marzo 2021
- febrero 2021
- enero 2021
- diciembre 2020
- noviembre 2020
- octubre 2020
- septiembre 2020
- junio 2020
- mayo 2020
- abril 2020
- marzo 2020
- noviembre 2019
- septiembre 2019
- agosto 2019
- julio 2019
- junio 2019
- mayo 2019
- enero 2019
- noviembre 2018
- septiembre 2018
- agosto 2018
- junio 2018
- mayo 2018
- marzo 2018
- febrero 2018
- diciembre 2017
- octubre 2017
- septiembre 2017
- agosto 2017
- julio 2017
- junio 2017
- mayo 2017
- abril 2017
- marzo 2017
- febrero 2017
- diciembre 2016
- noviembre 2016
- octubre 2016
- septiembre 2016
- agosto 2016
- julio 2016
- mayo 2016
- abril 2016
- marzo 2016
- febrero 2016
- noviembre 2015
- octubre 2015
- agosto 2015
- julio 2015
- junio 2015
- mayo 2015
- abril 2015
- marzo 2015
- febrero 2015
- enero 2015
- diciembre 2014
- noviembre 2014
- octubre 2014
- septiembre 2014
- agosto 2014
- julio 2014
- junio 2014
- mayo 2014
- abril 2014
- marzo 2014
- febrero 2014
- enero 2014
- diciembre 2013
- noviembre 2013
- septiembre 2013
- julio 2013
- mayo 2013
- marzo 2013
- febrero 2013
- enero 2013
- diciembre 2012
- noviembre 2012
- agosto 2012
- julio 2012
- junio 2012
- mayo 2012
- abril 2012
- marzo 2012
- enero 2012
- noviembre 2011
- julio 2011
- junio 2011
- mayo 2011
- abril 2011
- marzo 2011
- enero 2011
- diciembre 2010
- septiembre 2010
- agosto 2010
- julio 2010
- febrero 2010
- enero 2010