+-------------------------------------------------------+ |BIND 8.2 - 8.2.2 *Remote root Exploit How-To* by E-Mind| +-------------------------------------------------------+ (A) ¿Qué es un DNS? 1. ¿Cómo consulto un DNS? 2. ¿Cómo encuentro un DNS vulnerable? (B) ¿Cómo edito las entradas de un DNS? 1. ¿Cómo encuentro el fichero de zona? 2. ¿Cómo edito el fichero de zona? (C) Cómo explotar un sistema vulnerable 1. ¿Qué necesito tener antes de usar el exploit? 2. ¿Cuál es la teoría detrás del exploit? 3. ¿Dónde puedo conseguir el exploit? 4. ¿Porqué debo parchear el exploit? 5. ¿Cómo parcheo el exploit? 6. ¿Cómo compilo el exploit? 7. ¿Cómo ejecuto el exploit? 8. ¿Cómo hago para que el servidor vulnerable haga una consulta a mi IP? 9. ¿Qué debo hacer antes de abandonar la shell? (D) Who should be credited for this HowTo? (Original, por deseo del autor) 1. Who is the person that motivated me into writing this? 2. Who am I? 3. Can I distribute/change this HowTo? 4. Final Credits and Greets :) Sección A - ¿Qué es un DNS? --------------------------- Un DNS - Servidor de Nombres de Dominio, se usa para convertir nombres de máquinas a direcciones IP y direcciones IP a nombres de máquinas. por ejemplo: www.infoseek.com = 204.162.96.173 1. ¿Cómo consulto un DNS? Primero, probablemente conocerá que cuando configura su TCP/IP y desea utilizar nombres de máquinas en su navegador para acceder a un sitio web, en vez de introducir la dirección IP de ese sitio, necesita configurar un servidor DNS. Recibirá la dirección IP de su servidor DNS desde su ISP. Para consultar al servidor DNS, los sistemas Unix (y NT) tienen una herramienta llamada "nslookup", la sintaxis de la cual es: $nslookup o $nslookup Un servidor DNS configurado correctamente contiene dos "listas" para un dominio llamadas ficheros de zona. Un fichero de zona se usa para la resolución de nombre a IP y la otra se usa para las consultas inversas o resolución de IP a nombre. "nslookup" puede ser utilizado de forma interactiva, esta es la forma en la que trabajaremos, porque es más potente. Simplemente escriba nslookup en la línea de comandos y pulse entrar. Recibirá un carácter ">" como respuesta, desde el cual usted podrá empezar a introducir direcciones IP y nombres de máquinas. Hay algunos comandos de nslookup que trataremos más tarde en este texto que le permitirá obtener más información 2. ¿Cómo encuentro un DNS vulnerable? Recuerde, explotaremos los Servidores de Nombres. Primero necesitamos encontrar la versión del servicio DNS que se está ejecutando en una máquina remota. También necesitaremos conocer el Sistema Operativo, pero hay bastantes HowTo sobre esto. Utilizaremos una herramienta llamada "dig", la cual está disponible en muchos sistemas Unix. La sintaxis es la siguiente: $dig @ version.bind chaos txt | grep \"8 Mire la salida. Si puede ver: 8.2 o 8.2.1 o 8.2.2 entonces es vulnerable. Si puede ver 8.2.2P2 - P5, no lo es. Si no recibe salida y sólo ve que su terminal ha quedado colgado, significa que el administrador del DNS probablemente ha modificado el código fuente para que el servidor no le proporcione esta información. PUEDE QUE SEA VULNERABLE. Sección B - ¿Cómo edito las entradas de un DNS? ----------------------------------------------- Lo primero que debe saber es que DNS són sólo ficheros de texto, y las entradas són añadidas o cambiadas editando esos ficheros de texto y reanudando el servicio. El fichero principal que controla el servicio DNS es /etc/named.conf o /etc/named.boot. Si /etc/named.conf existe, este es el fichero con el que debe trabajar. 1. ¿Cómo encuentro el fichero de zona? Como dije antes, un DNS configurado correctamente tiene dos "listas" o ficheros de zona para cada dominio servido. Necesitará editar este fichero de zona para cambiar o añadir entradas a ese dominio. Un dominio es por ejemplo, infoseek.com, y el nómbre de la máquina es www, la FQDN es www.infoseek.com. FQDN viene de Nombre de Dominio Totalmente Cualificado (Fully Qualified Domain Name). Para encontrar el fichero de zona que resuelve de FQDN a IP para infoseek.com, primero consultaremos nuestro propio servidor DNS para que nos diga cuál es el DNS primario para infoseek.com. Así es como se hace: $nslookup Default Server: xxxxxx.xxxxxxx.xx.xx Address: xxx.xx.xx.xx >set q=ns >infoseek.com >infoseek.com nameserver = NS-UU.infoseek.com >NS-UU.infoseek.com internet address = 198.5.208.3 Como puede ver, ahora tenemos la dirección IP del servidor de nombres de infoseek.com. Supongamos que somos root allí. Accedemos por SSH a su DNS, localizamos el fichero /etc/named.conf, visualizamos el fichero y vemos al principio una sección de opciones. Hay una línea que dice: directory "/var/named" Esto significa que los ficheros de zona deberán estar en /var/named. Más abajo en el fichero veremos algunas secciones de zona. Si vemos la zona correspondiente a infoseek.com debe ser algo como: zone "infoseek.com"{ type master; file "infoseek.com.zone"; }; Como podemos apreciar, el fichero de zona es: /var/named/infoseek.com.zone, y este es el fichero que debemos editar. 2. ¿Cómo edito el fichero de zona? Primero, echemos un vistazo a este fichero de zona. Veremos arriba de todo un registro SOA, que probablemente le parezca un bloque de basura. Después podremos ver algo como esto: @ IN NS NS-UU.infoseek.com. www IN A 204.192.96.173 ftp IN CNAME corp-bbn corp-bbn IN A 204.192.96.2 . . . Como podemos ver, hay diversos tipos de registros, para que nuestro exploit funcione, sólo necesitamos centrarnos en un registro, el cuál es NS. Un registro A es el típico registro para la resolución de nombre a IP. CNAME es un nombre canónico, es una alias de un registro A. Un registro PTR es un registro puntero, lo contrario que un registro A, apunta de la dirección IP a un FQDN. Los PTR se usan en el "otro" fichero de zona. No hablaremos sobre él aquí pero es recomendable que lea sobre DNS, hay muchos libros buenos sobre DNS, lea uno. Un registro NS es un registro del Servidor de Nombres que dice cuál es el Servidor de Nombres para un dominio o sub-dominio específico. Como habrá podido apreciar, el registro NS-UU.infoseek.com finaliza con un ".". Esto es porque especificamos el FQDN y no el nombre de la máquina. Cuando el punto se omite, el nombre de dominio se añade después del nombre de la máquina y si lo hubiéramos omitido el último punto, hubiera sido como decir: NS-UU.infoseek.com.infoseek.com. Así que en vez de: www IN A 204.192.96.173 podremos escribir: www.infoseek.com. IN A 204.192.96.173 Lo que resulta ser lo mismo. Para que nuestro exploit funcione, necesitaremos añadir un sub-dominio a un servidor de nombres en la red. Así que supongamos otra vez que somos root en NS-UU.infoseek.com. ¿Cómo añadimos un sub-dominio? Sólo necesitamos añadir otro registro NS. subdominio IN NS hacker.box.com. esto significa que el servidor de nombres del dominio subdominio.infoseek.com debe ser ahcker.box.com. hacker.box.com debe ser resuelto hacia vuestra dirección IP, así que reemplace este nombre (hacker.box.com) por su propio FQDN. Ahora deberemos recargar el servidor de nombres para que los cambios tengan efecto. Ejecute el siguiente comando: #/usr/sbin/ndc restart new pid es 24654 # Sección C - Cómo explotar un sistema vulnerable ----------------------------------------------- 1. ¿Qué necesito tener antes de usar el exploit? Antes que nada, 3 neuronas. ;P Necesitará privilegios de root en un Servidor de Nombres PRIMARIO en Internet que sea Autoritativo para un Dominio de la red. Además, necesitará una máquina desde la que lanzar el exploit. Y para los requisistos del DNS, podría buscar a alguien con privilegios de root en dicho DNS para que edite los ficheros de zona por usted. 2. ¿Cuál es la teoría detrás del exploit? El exploit usa un Desbordamiento de Buffer en las versiones 8.2 - 8.2.2 de BIND para conseguir de forma remota una shell de root. El exploit escucha en el puerto 53 de la máquina atacante, y actúa como un servidor DNS. Cuando alguien lo consulta, envía un registro NXT muy grande que contiene el código que explotará remotamente el servidor BIND, suponiendo que sea un servidor vulnerable. Para obtener más información sobre cómo trabajan los Desbordamientos de Buffer, *POR FAVOR* lea el excelente artículo de Aleph1: Phrack 49 Article 14 - Smashing The Stack For Fun And Profit. URL: http://www.phrack.com/search.phtml?view&article=p49-14 3. ¿Dónde puedo conseguir el exploit? http://www.hack.co.za/daem0n/named/t666.c 4. ¿Porqué debo parchear el exploit? Debe haber oído que alguien necesitó parchear el exploit para hacerlo funcionar. Esto es porque ADM pensó que sólo la élite debería utilizar su exploit y por eso, introdujo un pequeño "error" en el código. Lo que hizo, fué cambiar el código de la shell de forma que en vez de ejecutar /bin/sh ejecuta /adm/sh. 5. ¿Cómo parcheo el exploit? Como puede ver, sólo se necesita un pequeño cambio para corregir el código. / = 2F(HEX) ===> / = 2F(HEX) a = 61(HEX) ===> b = 62(HEX) d = 64(HEX) ===> i = 69(HEX) m = 6D(HEX) ===> n = 6E(HEX) / = 2F(HEX) ===> / = 2F(HEX) Así que todo lo que necesitamos es buscar en el código fuente por 0x2f,0x61,0x64,0x6d,0x2f y reemplazarlo por 0x2f,0x62,0x69,0x6e,0x2f Hecho. 6. ¿Cómo compilo el exploit? Como siempre: $gcc t666.c -o t666 $ 7. ¿Cómo ejecuto el exploit? $su Password: #./t666 1 Ahora el exploit está escuchando en el puerto 53 (si ejecuta un servidor DNS en su máquina y quiere lanzar el exploit, primero tendrá que terminar el servidor de nombres, ejecute: #killall -9 named) El exploit está espereando consultas, en el momento que alguien lo consulte usted recibirá una salida de la forma: Received request from xxx.xx.xx.xx:1025 for xxx.xxxxxxxxx.xx.xx type=1 Si era un servidor DNS, entrará en un bucle, y si es vulnerable, ejecutámdose en un Linux RedHat 6.x - named 8.2/8.2.1 (desde rpm) (es por esto que elegimos la arquitectura 1, ejecute ./t666 sin argumentos para obtener una lisat de arquitecturas en las que el exploit funciona. Sólo lo he probado en Linux RedHat, así que no me pregunte porqué no funciona en Solaris, no tengo un Solaris para probarloni tiempo para poner más esfuerzos en este exploit). Obtendrá una shell de root. 8. ¿Cómo hago para que el servidor vulnerable haga una consulta a mi IP? Esto es bastante sencillo, una vez que ha añadido el subdominio en el servidor de nombres de la red y se ha hecho usted su DNS, la única cosa que le falta es consultar el servidor vulnerable por una máquina dentro del subdominio añadido. $nslookup >server >www.subdominio.infoseek.com Lo que ocurrirá es que el servidor preguntará, en este caso a NS-UU.infoseek.com, por la IP de www.subdominio.infoseek.com. NS-UU.infoseek.com empezará a buscar y dará con un subdominio, porque subdominio tiene su PROPIO registro NS, entonces le dirá a que hacker.box.com (tu máquina) es el Servidor de Nombres Autoritativo para sobdominio.infoseek.com. Ahora, lo que pasa es que consultará a hacker.box.com para obtener la IP de www.subdomain.infoseek.com. BOOM! :) 9. ¿Qué debo hacer antes de abandonar la shell? Cuando explote BIND, el programa named (demonio del servidor de nombres) dejará de funcionar correctamente, así que necesitará añadir algún tipo de puerta trasera para volver y restaurarlo. *NO INTENTE RESTAURARLO DESDE LA SHELL* Hay gran cantidad de troyanos y rootkits que puede instalar en el servidor, esto se lo dejo a su elección. Section D - Who should be credited for this HowTo? -------------------------------------------------- 1. who is the person that motivated me into writing this? That person is no other the gov-boi, he operates the great site www.hack.co.za. Without him, this How-To would have never been writen! Thanks Gov-Boi :) 2. whoami? I am E-Mind, you can find me on IRC (EFNet) I am not giving away my E-Mail, and will not answer stupied questions. I think I have provided everything you need to RUN the exploit in this How-To. If not, and if you find errors, PLEASE /msg me on IRC. 3. can I distribute/change this HowTo? I take no responsibility for your actions. You are free to do whatever you want with this file *AS LONG AS "SECTION D" REMAINS UNTOUCHED* 4. Final Credits and Greets :) Credits: Gov-Boi - Keep up the good work man! ;p Aleph One - no other article out there explains buffer overflows better then yours! ADM - for writing this cool exploit. Greetz: #myth!, #!glich, #972, #darknet, #feed-the-goats - `sup guyz? ;] EOF