Mostrando entradas con la etiqueta ssh. Mostrar todas las entradas
Mostrando entradas con la etiqueta ssh. Mostrar todas las entradas

lunes, 10 de agosto de 2015

Una instancia a la deriva VI: destripando DDoS Perl IrcBot v1.0

Hoy tuve oportunidad de volver a sentarme un rato a analizar el bot IRC escrito en PERL del que les comenté en el post anterior. Lo mejor del caso es que está documentado con comentarios!!

Características principales:

  • Está compuesto por unas 1100 líneas de PERL puro y duro.
  • El código está divido en 5 partes:
    • Un gran comentario inicial a modo de "man" donde el autor explica cómo funciona, las opciones disponibles, etc. El inglés no parece ser la especialidad del autor... Buena parte del script parece estar escrito en portugues por palabras como: meunick, porta, pacote, etc.
    • Configuration: donde se definen variables como el nombre del servidor IRC al que se conecta, el nombre del proceso con el que se oculta el script en ejecución (apache2, sshd, httpd, cron, etc), nombre de usuario a utilizar en el canal IRC, etc.
    • Help module: permite consultar las opciones disponibles en el bot, a través del canal IRC.
Opciones: system, version, flood
    • Functions: en este segmento se agrupan todas las funcionalidades del script, como: 
      • die: mata al bot y termina su actividad.
      • join: une al bot a un canal de IRC, donde puede recibir nuevas ordenes.
      • portscan: lanza un scaneo de puertos contra un host.
      • download: descarga un archivo a partir de la orden recibida por IRC.
      • dns: el bot resuelve un dominio recibido como parámetro
      • port: intenta una conexión TCP a un puerto particular, y reporta si fue posible o no.
      • udp1: UDP flooding para DDOS, los paquetes son de tamaño variable y terminan con la cadena "Tr0x". El target, el puerto destino y la duración del ataque llegan como parámetros.
      • udp2: esta opción va un poco mas allá, hace uso de una función auxiliar llamada udpflooder. No solo hace flooding UDP, sino también TCP, IGMP e ICMP. Además envía paquetes al resto de los protocolos recorriendo los valores de 3 a 255 (excepto 6, TCP lista de valores/protocolos) en el campo protocol del header IP.
Función udpflooder
      • udp3: UDP flooding para DDOS, los paquetes son de tamaño fijo (0 bytes). El target, el puerto destino y la duración del ataque llegan como parámetros.
      • tcp: TCP flooding inicia conexiones con el fin de consumir los recursos del objetivo, no hay transferencia de información.
      • http: inicia conexiones TCP contra un servidor web y envía una petición GET.
      • cback: inicia una conexión a un host remoto y enlaza esa conexión con una shell local. Lo que comúnmente se conoce como reverse shell.
Funcíon cback para reverse shell
      • mail: esta función permite ordenar al bot el envío de correo electrónico.
Función para envío de correo (SPAM?)
    • Funciones auxiliares utilizadas para tareas particulares como escribir los sockets y demás.
  • El script sólo hace uso de unos pocos módulos de perl (Socket, IO::Socket, IO::Select) lo que lo hace extremadamente portable. Se  jactan de esto diciendo: "Teste on every system with PERL instlled"
  • De stealth el bot no tiene demasiado, solo el cambio del nombre del proceso antes de hacer el fork
Lista de nombres y elección
    • A continuación se puede ver como desactivan algunas señales y luego previo al fork asignan $process a $0.
Asignación del nombre a $0
    • El proceso gira eternamente en un loop while(1) a la espera de nuevas ordenes desde el canal. Este funcionamiento genera un consumo de CPU altísimo que no debería pasar desapercibido.
ubuntu@ip-172-31-54-250:~$ ps aux --sort=-pcpu|head
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
ubuntu    8982 99.5  0.4  32836  4904 ?        R    18:39 190:14 /sbin/klogd -c 1 -x -x
root         1  0.0  0.2  33508  2876 ?        Ss   00:38   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    00:38   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    00:38   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   00:38   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    00:38   0:00 [kworker/u30:0]
root         7  0.0  0.0      0     0 ?        S    00:38   0:02 [rcu_sched]
root         8  0.0  0.0      0     0 ?        R    00:38   0:01 [rcuos/0]
root         9  0.0  0.0      0     0 ?        S    00:38   0:00 [rcuos/1]
ubuntu@ip-172-31-54-250:~$ 

  • En todo momento el bot reporta por IRC las respuestas a las órdenes recibidas, así como también la finalización de las mismas. Por ejemplo, en la primer imagen se ven cuando el bot recibe la orden de atacar al host 217.79.XXX.XXX mediante la función udp3 por 300 segundos al puerto UDP 65000; en la segunda imagen se ve cuando el host reporta el fin del ataque habiendo mandado 383790 Kbytes (374Mbytes en 300 segundos), bastante lejos de los 7Gbyte generados por los otros dos bots. Es decir que con solo estos 3 bots (había varios mas participando) se generaron mas o menos 14.6Gbytes de tráfico en 300 segundos, lo que da una tasa de casi 50Mbytes (~500Mbits) por segundo, not too bad, not too bad.
Azul (servidor), Rojo (bot)
Azul (bot), Rojo (servidor)

Estado actual:

Dado que pasaron unos días desde que se tomaron las capturas de red pensé que posiblemente el servidor de IRC ya habría sido desactivo y lo habrían movido a otro lugar, sin embargo:

juan@moon:~/Escritorio/$ host fuoriditesta.noip.me
fuoriditesta.noip.me has address 37.187.127.139
juan@moon:~/Escritorio/$


Sigue firme en el mismo host, en algún lugar de Francia, a pesar de haber sido reportado hace un par de días...:
test@moon:~/Escritorio/$ nc fuoriditesta.noip.me 6667
NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Couldn't look up your hostname

NICK latina
NOTICE AUTH :*** No ident response
PING :1209436948

USER mrbeauty 192.168.0.2 fuoriditesta.noip.me :poesj
PONG :1209436948

:Benvenuti.anonymous.x.it 001 latina :Welcome to the Internet Relay Network latina
:Benvenuti.anonymous.x.it 002 latina :Your host is Benvenuti.anonymous.x.it, running version beware1.5.7
:Benvenuti.anonymous.x.it 003 latina :This server was created Tue Jul 13 2004 at 20:36:17 GMT
:Benvenuti.anonymous.x.it 004 latina Benvenuti.anonymous.x.it beware1.5.7 dgikoswx biklmnoprstv
:Benvenuti.anonymous.x.it 005 latina MAP SILENCE=15 WHOX WALLCHOPS WALLVOICES USERIP CPRIVMSG CNOTICE MODES=6 MAXCHANNELS=10 MAXBANS=45 :are supported by this server
:Benvenuti.anonymous.x.it 005 latina NICKLEN=9 TOPICLEN=160 AWAYLEN=160 KICKLEN=160 CHANTYPES=#& PREFIX=(ov)@+ CHANMODES=b,k,l,rimnpst CASEMAPPING=rfc1459 :are supported by this server
:Benvenuti.anonymous.x.it 251 latina :There are 148 users and 2 invisible on 1 servers
:Benvenuti.anonymous.x.it 253 latina 1 :unknown connection(s)
:Benvenuti.anonymous.x.it 252 latina 3 :operator(s) online
:Benvenuti.anonymous.x.it 254 latina 3 :channels formed
:Benvenuti.anonymous.x.it 255 latina :I have 150 clients and 0 servers
:Benvenuti.anonymous.x.it NOTICE latina :Highest connection count: 185 (185 clients)
:Benvenuti.anonymous.x.it 375 latina :- Benvenuti.anonymous.x.it Message of the day
:Benvenuti.anonymous.x.it 372 latina :- 2015-4-8 23:48
:Benvenuti.anonymous.x.it 372 latina :- (IT)
:Benvenuti.anonymous.x.it 372 latina :- « Chiunque voglia può essere Anonymous e lavorare per una serie di obiettivi... Abbiamo un programma su cui tutti concordiamo, ci coordiniamo e agiamo, ma per la sua realizzazione tutti agiscono indipendentemente, senza volere alcun riconoscimento. Vogliamo solo raggiungere qualcosa che crediamo sia importante... »
:Benvenuti.anonymous.x.it 372 latina :- . /$$                 /$$            /$$$$$$
:Benvenuti.anonymous.x.it 372 latina :- .| $$                | $$           /$$__  $$
:Benvenuti.anonymous.x.it 372 latina :- .| $$       /$$   /$$| $$ /$$$$$$$$| $$  \__/  /$$$$$$   /$$$$$$$
:Benvenuti.anonymous.x.it 372 latina :- .| $$      | $$  | $$| $$|____ /$$/|  $$$$$$  /$$__  $$ /$$_____/
:Benvenuti.anonymous.x.it 372 latina :- .| $$      | $$  | $$| $$   /$$$$/  \____  $$| $$$$$$$$| $$
:Benvenuti.anonymous.x.it 372 latina :- .| $$      | $$  | $$| $$  /$$__/   /$$  \ $$| $$_____/| $$
:Benvenuti.anonymous.x.it 372 latina :- .| $$$$$$$$|  $$$$$$/| $$ /$$$$$$$$|  $$$$$$/|  $$$$$$$|  $$$$$$.$
:Benvenuti.anonymous.x.it 372 latina :- .|________/ \______/ |__/|________/ \______/  \_______/ \_______/
:Benvenuti.anonymous.x.it 372 latina :-                          
...
:Benvenuti.anonymous.x.it 372 latina :-            by AnonPlus
:Benvenuti.anonymous.x.it 376 latina :End of /MOTD command.
:Benvenuti.anonymous.x.it NOTICE latina :on 1 ca 1(4) ft 10(10)

^[[H^C
test@moon:~/Escritorio/SH/Segunda_parte$


De hecho hasta parece tener mas usuarios que antes, si no me equivoco en las capturas analizadas se llegaron a ver 57 usuarios, en esta prueba había 148 (al día de hoy hay mas de 500).

Hay una nueva versión disponible del bot (descargable desde un nuevo lugar), el nuevo nombre es ntpd.pdf, y trae algunos cambios simples en el código, por ejemplo:
  • Nuevos admins
Top.pdf:my @admins = ("x","TopGun","anonplus");
ntpd.pdf:my @admins = ("Anonplus","AnonPIus","topgun");
  • Nuevo mensaje de bienvenida al unirse al canal:
Top.pdf:        sendraw("PRIVMSG $canal : 4,1 [DDoS Perl Bot] 9,1Hello, I`m Ready To Serve ... ");
ntpd.pdf:        sendraw("PRIVMSG $canal :  0,1 by nethackteam ... ");

entre otros menos importantes. El cambio de @admins no es menor, dado que es parte del mecanismo de validación utilizado para ejecutar comandos remotamente, por lo tanto los bots corriendo la versión vieja del código no aceptarían las órdenes de los nuevos admins. De todas maneras el script es capaz de actualizarse a partir de una orden enviada por el canal, donde básicamente se descarga la nueva versión del link pasado como parámetro y se ejecuta.


En fin... hay mucho mas para decir, pero por ahora corto acá.

    lunes, 3 de agosto de 2015

    Una instancia a la deriva IV: WTF!!! LulzSeC y DDoS Perl IrcBot v1.0

    Decidí darle una segunda oportunidad a "Una instancia a la deriva" porque la verdad que me interesó y me quedaron algunas cosas en el tintero. Así que hice unos ajustes para no caer en los mismos problemas que la vez anterior y volví a dejar la instancia corriendo con el password débil en el usuario ubuntu.

    Ajustes nuevos:

    • Desactivé la rotación de logs en auditd, para no volver a perder logs.
    • Limité el flujo de conexiones SSH desde la instancia hacia el exterior con iptables. Solo se permiten 10 conexiones por minuto.
    • Detuve el envío por correo de los logs de auditd, porque no sirvió de nada.

    Unas horas mas tarde

    Mientras estaba en el trabajo, me llegaron 3 notificaciones que indicaban accesos exitosos al sistema:
    • 219.229.222.4 a las 01:20:58 del 2 Agosto, al 2do intento. De todas maneras siguió probando otros usuarios.
    • 85.127.193.17 a las 10:05:54 del 2 Agosto, 1 solo intento.
    • 91.81.221.168 a las 10:14:46 del 2 Agosto, 1 solo intento.
    Al volver a casa la verdad que me moría de ganas de ver qué había pasado esta vez. A pesar de que no parecía haber nada raro, algo tenía que andar mal. Nadie anda por la vida probando contraseñas por SSH solo por la diversión. Así fue que me encontré con 3 procesos que se estaban literalmente deborando el CPU, se los presento:

    root@ip-172-31-54-250:~# ps aux|grep ubuntu
    ubuntu   16562 32.9  0.4  32948  4976 ?        R    10:15 146:11 /usr/sbin/sshd -i
    ubuntu   16564 32.9  0.4  32948  4980 ?        R    10:15 146:11 /usr/sbin/sshd
    ubuntu   16566 32.9  0.4  32944  4976 ?        R    10:15 146:11 /sbin/syslogd
    root     20189  0.0  0.0  10436   928 pts/2    S+   17:39   0:00 grep --color=auto ubuntu
    root@ip-172-31-54-250:~#

    Tan sospechosos como es posible: PIDs similares, consumo de CPU altísimo, casi la misma cantidad de memoria, lanzados a la misma hora, sin embargo los nombres no coinciden...

    Un mecanismo MUY básico de persistencia y ocultamiento es dar a los procesos nombres de otros procesos importantes/críticos de forma tal que nadie se atreva a matarlos.

    Sin embargo, Ubuntu por defecto viene con rsyslog en lugar de syslogd, así que un administrador despierto debería intuir que algo raro pasa en su servidor ¿rsyslogd y syslogd corriendo conjuntos?:

    root@ip-172-31-54-250:~# ps aux|grep sysl
    syslog     809  0.0  0.8 260072  8560 ?        Ssl  Aug01   0:03 rsyslogd
    ubuntu   16566 32.9  0.4  32944  4976 ?        R    10:15 147:16 /sbin/syslogd
    root     20235  0.0  0.0  10436   924 pts/2    S+   17:42   0:00 grep --color=auto sysl
    root@ip-172-31-54-250:~#

    Así que me interesa ver ese binario o lo que fuera, por lo que fui a buscarlo y:

    root@ip-172-31-54-250:~# ls /sbin/|grep syslog
    root@ip-172-31-54-250:~#

    nada, no existe tal archivo, esto ya se ponía interesante. Hice lo mismo para /usr/sbin/sshd y di con que este si existe pero parece ser el original que viene con la distribución y parece no haber sido modificado

    root@ip-172-31-54-250:~# ll /usr/sbin/sshd
    -rwxr-xr-x 1 root root 766784 May 12  2014 /usr/sbin/sshd*
    root@ip-172-31-54-250:~#
     
    Viendo las conexiones de red me llamaron la atención 3 conexiones establecidas, todas a la misma dirección y al mismo puerto:

    root@ip-172-31-54-250:~# netstat -ntp
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 172.31.54.250:60881     37.187.127.139:6667     ESTABLISHED 16562/sshd -i  
    tcp        0      0 172.31.54.250:60882     37.187.127.139:6667     ESTABLISHED 16564/sshd     
    tcp        0      0 172.31.54.250:60883     37.187.127.139:6667     ESTABLISHED 16566/syslogd  
    root@ip-172-31-54-250:~#

    claro que si, las conexiones parecían estar establecidas contra un servidor IRC (por el puerto 6667)!!! El IRC es muy utilizado para la administración de BOTNETs, básicamente los hosts corren un cliente IRC que se registra en uno o mas canales y a través de los cuales recibe ordenes de los admins y las ejecuta.

    Dado que IRC por defecto se comunica sin ningún tipo de cifrado me fui de cabeza a ver las capturas de red. Luego de recorrer un par de ellas y solo ver cientos de conexiones SSH me encontré con una HTTP que captó mi atención. Parece haber sido desencadenada por el usuario conectado desde 91.81.221.168, uno de los usuarios autenticados correctamente con 1 intento:


     Se puede ver bien claro como descargan un supuesto archivo PDF de un sitio comprometido, pero que en realidad no se trata mas que de un script en perl (para otro post el análisis del script, tiene casi mil líneas). Particularmente se trata de un BOT irc para DDOS. Un poco mas abajo podemos ver en la variable $server el servidor de IRC donde el bot se reporta, que de momento resuelve en la IP que se pudo ver con netstat

    También vemos por ejemplo la lista nicknames de donde se elegirá para unirse al canal.

    Tan pronto como se terminó de descargar el archivo, el script fue ejecutado y 3 conexiones se establecieron contra el servidor IRC:


    Diferentes usuarios y nicknames fueron utilizados pero todos se conectaron al mismo servidor y se metieron al mismo canal #Top. Una vez que el host ya se registró en el canal envía un mensaje muy simpático:

    ..4,1 [DDoS Perl Bot]. .9,1Hello, I`m Ready To Serve ... ..

    La línea que envía este mensaje es la 372 del script, copiada a continuación:

    sendraw("PRIVMSG $canal :^B^C4,1 [DDoS Perl Bot]^B ^C9,1Hello, I`m Ready To Serve ... ^C^B");

    Debo admitir que la próxima imagen me dio cierto, como llamarlo... aah si,  cagaso:


    Pareciera que dicho servidor IRC está controlado por los amigos de LulzSec. Sumado a este mensaje bastante gráfico, un poco mas arriba se encuentra la siguiente frase en claro Italino:

    Chiunque voglia pu.. essere Anonymous e lavorare per una serie di obiettivi... Abbiamo un programma su cui tutti concordiamo, ci coordiniamo e agiamo, ma per la sua realizzazione tutti agiscono indipendentemente, senza volere alcun riconoscimento. Vogliamo solo raggiungere qualcosa che crediamo sia importante... ..

    que según google translate significa:

    Cualquier persona que lo desee puede ser anónimo .. y trabajar para una serie de objetivos ... Tenemos un programa todos estamos de acuerdo, coordinamos y actuar, pero para su realización todos actúan de forma independiente, sin querer ningún reconocimiento. Sólo queremos conseguir algo que creemos que es importante ... ..

    Esta frase es el slogan de Anonymous Italia... La verdad que en este punto donde la ficción y la realidad se unen de una manera un tanto imprevista decidí terminar los procesos que mantenían las conexiones establecidas con el servidor de IRC. Los motivos?
    • mis conocimientos de IRC son muy básicos como para mantener esas conexiones corriendo.
    • aún no sabía qué estaba haciendo precisamente el sistema.
    • se qué es LulZSec y Anonymous.
    • y eso se parece a un arma xD.
    Con los procesos detenidos y todas las conexiones cortadas seguí analizando las capturas de tráfico. Un poco mas adelante en la misma conexión se puede ver por ejemplo la cadena de donde se puede bajar el script que ejecuta el bot irc, básicamente parece describir los pasos para instalar el irc bot en un host (descargar, ejecutar y eliminar). Se aprovechan del hecho que PERL se encuentra instalado prácticamente en todos los hosts Linux del universo.



    Durante un tiempo entran y salen nuevos bots del canal, hasta que comienza el show...


    El usuario TopGun (usuario admin según la línea 144 del script) desencadena el ataque DDOS sobre el host 217.79.190.XXX mediante paquetes UDP con destino al puerto 65000 durante 300 segundos. Uno a uno los bots anuncian estar atacando el host y una cantidad exorbitante de paquetes UDP comienzan a salir de mi sistema. Al pasar los 300 segundos y terminar el ataque los bots esperan por un nuevo objetivo y nuevamente se produce el bombardeo de paquetes UDP, a veces a diferentes puertos (puerto 22 UDP) y a veces por mas tiempo (he viste ataques por 400 segundos).


    Se pone mas y mas interesante. En este punto apagué el servidor y me fui a dormir porque me quedaban muchas cosas dando vuelta en la cabeza. Para la próxima un análisis un poco mas a fondo de las capturas que no llegaron por mail y los logs de auditd, para identificar todos los ataques lanzados y los bots. También me gustaría ver cómo desmantelar ese server IRC y comunicar a los infectados que lo están. Aunque no se hasta qué punto quiero involucrarme...

    miércoles, 29 de julio de 2015

    Una instancia a la deriva III: El porque de las cosas

    Después de un fin de semana de paseo hoy toca encarar la tercera parte de la saga "Una instancia a la deriva" e intentar descubrir qué pasó a partir de las 2:32 del 23 de Julio y por qué se apagó la instancia 2 horas después.

    Para tener un poco mas de contexto si todavía no los leíste, deberías pasar por los posts Una instancia a la deriva I y Una instancia a la deriva II. Acá va un resumen:

    • A las 3:33 (02:33 UTC) de la mañana del 23 de Julio recibí 2 emails que indicaban autenticaciones exitosas en la instancia.
    • A partir de ese momento, en los gráficos de consumo de recursos provistos por AWS, se puede ver claramente que el comportamiento de la instancia cambió drásticamente. Consumo de CPU, red y acceso a disco se incrementaron.
    • A partir del análisis de algunas de las capturas de tcpdump se puede ver un número importante de conexiones SSH iniciadas por la instancia contra direcciones IP de terceros. Esto daría a entender que la instancia fue infectada y ahora se encontraba atacando otras direcciones para propagar el problema.
    • Cerca de las 04:40 (UTC) la instancia inicio la secuencia de shutdown. A este punto no está claro qué lo desencadenó si audtitd por espacio insuficiente o el cronjob que controlaba la ejecución de tcpdump.

    Analizando el disco y los archivos de la instancia


    Dado que la instancia se encuentra apagada le quité el volumen raíz, y lo asocié a otra instancia recién lanzada. A continuación se puede ver el disco /dev/xvdf de 10GB

    root@ip-172-31-56-203:/home/ubuntu# lsblk
    NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0   8G  0 disk
    `-xvda1 202:1    0   8G  0 part /
    xvdf    202:80   0  10G  0 disk
    `-xvdf1 202:81   0  10G  0 part
    root@ip-172-31-56-203:/home/ubuntu#


    Monté el disco en modo solo lectura para evitar modificar o eliminar archivos por error.

    root@ip-172-31-56-203:/home/ubuntu# mount -o ro /dev/xvdf1 /mnt/
    root@ip-172-31-56-203:/home/ubuntu# mount
    /dev/xvda1 on / type ext4 (rw,discard)
    ...
    /dev/xvdf1 on /mnt type ext4 (ro)
    root@ip-172-31-56-203:/home/ubuntu#


    y lo primero que observé es el espacio de almacenamiento disponible...

    root@ip-172-31-56-203:/home/ubuntu# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/xvda1      7.8G  782M  6.6G  11% /
    none            4.0K     0  4.0K   0% /sys/fs/cgroup
    udev            492M   12K  492M   1% /dev
    tmpfs           100M  336K   99M   1% /run
    none            5.0M     0  5.0M   0% /run/lock
    none            497M     0  497M   0% /run/shm
    none            100M     0  100M   0% /run/user
    /dev/xvdf1      9.8G  9.2G   62M 100% /mnt
    root@ip-172-31-56-203:/home/ubuntu#


    exacto! 100% utilizado (a penas 62 MB libres) esto parecería tirar por el suelo mi idea de que habían detenido el proceso tcpdump y refuerza a su vez la teoría de auditd deteniendo la instancia por imposibilidad de escribir logs.

    No hay archivos creados en el directorio home del usuario comprometido, esto me llamó un poco la atención, esperaba al menos encontrar algo ahí

    root@ip-172-31-56-203:~/restored# ls -lah /mnt/home/ubuntu/
    total 32K
    drwxr-xr-x 4 ubuntu ubuntu 4.0K Jul 19 20:49 .
    drwxr-xr-x 3 root   root   4.0K Jul  6 20:42 ..
    -rw------- 1 ubuntu ubuntu    9 Jul 19 20:49 .bash_history
    -rw-r--r-- 1 ubuntu ubuntu  220 Apr  9  2014 .bash_logout
    -rw-r--r-- 1 ubuntu ubuntu 3.6K Apr  9  2014 .bashrc
    drwx------ 2 ubuntu ubuntu 4.0K Jul  6 20:43 .cache
    -rw-rw-r-- 1 ubuntu ubuntu    0 Jul  6 20:43 .cloud-locale-test.skip
    -rw-r--r-- 1 ubuntu ubuntu  675 Apr  9  2014 .profile
    drwx------ 2 ubuntu ubuntu 4.0K Jul 21 07:19 .ssh
    root@ip-172-31-56-203:~/restored#

    En el directorio home de root, donde se guardaban las capturas, podemos ver que las mismas ocuparon del orden de 5GB

    root@ip-172-31-56-203:~/restored# du -sch /mnt/root/
    5.0G    /mnt/root/
    5.0G    total
    root@ip-172-31-56-203:~/restored#


    y que tenemos 1062 capturas

    root@ip-172-31-56-203:~/restored# ls /mnt/root/sample*|wc -l
    1062
    root@ip-172-31-56-203:~/restored#


    para bien o para mal, parece no faltar ninguna.

    En cuanto a los archivos de logs parecen estar intactos y en su lugar. Lo mas llamativo es la cantidad de logs generados por auditd:

    root@ip-172-31-56-203:~/restored# ls /mnt/var/log/audit/
    audit.log     audit.log.16  audit.log.23  audit.log.30  audit.log.38  audit.log.45  audit.log.52  audit.log.6   audit.log.67  audit.log.74
    audit.log.1   audit.log.17  audit.log.24  audit.log.31  audit.log.39  audit.log.46  audit.log.53  audit.log.60  audit.log.68  audit.log.75
    audit.log.10  audit.log.18  audit.log.25  audit.log.32  audit.log.4   audit.log.47  audit.log.54  audit.log.61  audit.log.69  audit.log.76
    audit.log.11  audit.log.19  audit.log.26  audit.log.33  audit.log.40  audit.log.48  audit.log.55  audit.log.62  audit.log.7   audit.log.77
    audit.log.12  audit.log.2   audit.log.27  audit.log.34  audit.log.41  audit.log.49  audit.log.56  audit.log.63  audit.log.70  audit.log.78
    audit.log.13  audit.log.20  audit.log.28  audit.log.35  audit.log.42  audit.log.5   audit.log.57  audit.log.64  audit.log.71  audit.log.79
    audit.log.14  audit.log.21  audit.log.29  audit.log.36  audit.log.43  audit.log.50  audit.log.58  audit.log.65  audit.log.72  audit.log.8
    audit.log.15  audit.log.22  audit.log.3   audit.log.37  audit.log.44  audit.log.51  audit.log.59  audit.log.66  audit.log.73  audit.log.9
    root@ip-172-31-56-203:~/restored#


    esto es un gran problema. El número de rotaciones de logs de audit es de 80, lo que significa que es MUY probable que los primeros logs hayan sido desechados... Una miradita rápida al log mas viejo nos confirma esto

    root@ip-172-31-56-203:~/restored# aureport -t -if /mnt/var/log/audit/audit.log.79

    Log Time Range Report
    =====================
    /mnt/var/log/audit/audit.log.79: 07/23/15 03:15:20.105 - 07/23/15 03:17:17.037
    root@ip-172-31-56-203:~/restored#


    El log mas viejo contempla los registros entre las 03:15 y las 03:17 del 23 de Julio. Lo cuál significa que NO vamos a tener información de los primero minutos posteriores a las 02:33 ya que por el número de eventos y la cantidad de rotaciones esos logs fueron perdidos.

    Analizando un poco los logs:


    El primer paso fue incluir los últimos logs de autenticaciones (/var/log/auth.log) en la BD para poder contabilizarlos de manera mas sencilla. De este paso obtuve la siguiente información:
    • 54.196.232.229 realizó 38 intentos fallidos de autenticación entre las 02:32:08 y las 02:33:28.
    • 59.188.237.12 no realizó intentos fallidos.
    Viendo mas de cerca los logs podemos ver que:

    Jul 23 02:33:28 ip-172-31-54-250 sshd[32683]: Accepted password for ubuntu from 54.196.232.229 port 37470 ssh2
    Jul 23 02:33:28 ip-172-31-54-250 sshd[32683]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
    Jul 23 02:33:29 ip-172-31-54-250 sshd[32683]: pam_unix(sshd:session): session closed for user ubuntu
    Jul 23 02:33:30 ip-172-31-54-250 sshd[316]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
    Jul 23 02:33:32 ip-172-31-54-250 sshd[316]: Accepted password for ubuntu from 59.188.237.12 port 2693 ssh2
    Jul 23 02:33:32 ip-172-31-54-250 sshd[316]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
    Jul 23 02:33:33 ip-172-31-54-250 sshd[370]: Received disconnect from 59.188.237.12: 11: Shutdown.
    Jul 23 02:33:33 ip-172-31-54-250 sshd[316]: pam_unix(sshd:session): session closed for user ubuntu
    Jul 23 02:33:35 ip-172-31-54-250 sshd[380]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
    Jul 23 02:33:35 ip-172-31-54-250 sshd[381]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
    Jul 23 02:33:37 ip-172-31-54-250 sshd[380]: Accepted password for ubuntu from 59.188.237.12 port 2697 ssh2
    Jul 23 02:33:37 ip-172-31-54-250 sshd[380]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
    Jul 23 02:33:37 ip-172-31-54-250 sshd[381]: Accepted password for ubuntu from 59.188.237.12 port 2696 ssh2
    Jul 23 02:33:37 ip-172-31-54-250 sshd[381]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
    Jul 23 02:33:41 ip-172-31-54-250 chpasswd[504]: pam_unix(chpasswd:chauthtok): user "butter" does not exist in /etc/passwd
    Jul 23 02:33:41 ip-172-31-54-250 sshd[489]: Received disconnect from 59.188.237.12: 11: Shutdown.
    Jul 23 02:33:41 ip-172-31-54-250 sshd[381]: pam_unix(sshd:session): session closed for user ubuntu
    Jul 23 02:34:44 ip-172-31-54-250 sshd[488]: Received disconnect from 59.188.237.12: 11: Shutdown.
    Jul 23 02:34:44 ip-172-31-54-250 sshd[380]: pam_unix(sshd:session): session closed for user ubuntu


    • A las 02:33:28 el host 54.196.232.229 dio con el password correcto para el usuario ubuntu.
    • 4 segundos después a las 02:33:32 el host 59.188.237.12 inicia una sesión con el usuario y password correcto. Posiblemente para corroborar que sean válidos, dado que la sesión es terminada al segundo.
    • A las 02:33:37 se inician dos sesiones desde la IP 59.188.237.12, esta vez duran unos segundos mas. Una de ellas es terminada a las 02:33:41 (4 segundos después de iniciar), mientras que la otra termina a las 02:34:44 (1 minuto y 7 segundos después de iniciar).
    • A las 02:33:41 se ejecutó el comando chpasswd, básicamente es utilizado para cambiar passwords en batch. No entiendo para qué harían esto. De hecho el error saltó porque el usuario butter no existe en el sistema. 

    Los logs de auditd


    De los logs de auditd, lamentablemente no hay mucho para decir ya que la parte más importante (los minutos correspondientes a las sesiones SSH) se perdió por la rotación. A pesar de esto, acá va lo que pude encontrar a partir de los logs que quedaron:
    • Analizando el archivo mas viejo
    El reporte general a priori no dice demasiado, salvo por el hecho de haber registrado 11314 eventos en casi 2 minutos:

    root@ip-172-31-56-203:/home/ubuntu# aureport -i -if /mnt/var/log/audit/audit.log.79

    Summary Report
    ======================
    Range of time in logs: 07/23/15 03:15:20.105 - 07/23/15 03:17:17.037
    Selected time for report: 07/23/15 03:15:20 - 07/23/15 03:17:17.037
    Number of changes in configuration: 0
    Number of changes to accounts, groups, or roles: 0
    Number of logins: 0
    Number of failed logins: 0
    Number of authentications: 0
    Number of failed authentications: 0
    Number of users: 3
    Number of terminals: 2
    Number of host names: 1
    Number of executables: 5
    Number of files: 26
    Number of AVC's: 0
    Number of MAC events: 0
    Number of failed syscalls: 0
    Number of anomaly events: 0
    Number of responses to anomaly events: 0
    Number of crypto events: 0
    Number of keys: 1
    Number of process IDs: 226
    Number of events: 11314

    root@ip-172-31-56-203:/home/ubuntu#


    Podemos identificar esos 5 ejecutables que se mencionan en el reporte general con el flag -x de la siguiente manera:

    root@ip-172-31-56-203:/home/ubuntu# aureport -x --summary -if /mnt/var/log/audit/audit.log.79

    Executable Summary Report
    =================================
    total  file
    =================================
    11264  /tmp/squid64 (deleted)
    15  /usr/sbin/cron
    12  /bin/rm
    11  /usr/sbin/tcpdump (deleted)
    11  /bin/tar
    root@ip-172-31-56-203:/home/ubuntu#


    De los 5 ejecutables solo uno me resulta sospechoso y claramente es /tmp/squid64. Lamentablemente el archivo ya no se encuentra en /tmp, debe haber sido eliminado después de lanzarse el proceso probablemente, y no logré recuperarlo. Los otros ejecutables son parte de los procesos de control y monitoreo explicados en el primer post.

    Podemos ver también cuáles fueron los archivos mas utilizados en estos eventos:

    root@ip-172-31-56-203:/home/ubuntu# aureport -f --summary -if /mnt/var/log/audit/audit.log.79

    File Summary Report
    ===========================
    total  file
    ===========================
    11264  /etc/passwd
    23  /root/
    11  /root
    2  /root/sample295.jpg
    2  /root/sample296.jpg
    2  /root/sample297.jpg
    2  /root/sample298.jpg
    2  /root/sample299.jpg
    2  /root/sample300.jpg
    2  /root/sample301.jpg
    2  /root/sample302.jpg
    2  /root/sample303.jpg
    2  /root/sample304.jpg
    2  /root/sample305.jpg
    1  /root/sample294.jpg
    1  sample296
    1  sample297
    1  sample298
    1  sample299
    1  sample300
    1  sample301
    1  sample302
    1  sample303
    1  sample304
    1  sample305
    1  sample306
    root@ip-172-31-56-203:/home/ubuntu#


    Parece mucha coincidencia que el proceso /tmp/squid64 y el archivo /etc/passwd se hayan registrado en la misma cantidad de eventos.

    De hecho si filtramos el reporte por eventos vemos:

    root@ip-172-31-56-203:/home/ubuntu# aureport -e -i --summary -if /mnt/var/log/audit/audit.log.79

    Event Summary Report
    ======================
    total  type
    ======================
    11298  SYSCALL
    3  USER_END
    3  USER_START
    3  CRED_DISP
    3  CRED_ACQ
    3  USER_ACCT
    1  CWD
    root@ip-172-31-56-203:/home/ubuntu#


    El evento SYSCALL (tipo 1300) se registró 11298 veces. A partir del reporte de las syscalls utilizadas vemos que la mas registrada fue open (syscall 2):

    root@ip-172-31-56-203:/home/ubuntu# aureport -s -i --summary -if /mnt/var/log/audit/audit.log.79

    Syscall Summary Report
    ==========================
    total  syscall
    ==========================
    11275  open
    12  unlinkat
    11  creat
    root@ip-172-31-56-203:/home/ubuntu#



    De las 11275 llamadas a open, 11264 fueron para el archivo /etc/passwd, y llamada por el binario /tmp/squid64.

    Por último miramos el registro de eventos por usuario y vemos claramente que la mayoría de los eventos fueron generados por el usuario comprometido (ubuntu):

    root@ip-172-31-56-203:/home/ubuntu# aureport -u --summary -i -if /mnt/var/log/audit/audit.log.79

    User Summary Report
    ===========================
    total  auid
    ===========================
    11264  ubuntu
    34  root
    15  unset
    root@ip-172-31-56-203:/home/ubuntu#

    • Analizando un evento particular
    A modo de ejemplo tomé uno de los 11264 eventos que implicaron el archivo /etc/passwd y el binario /tmp/squid64, se puede ver a continuación:

    root@ip-172-31-56-203:/home/ubuntu# ausearch -a "513448" -i -if /mnt/var/log/audit/audit.log.79
    ----
    type=PATH msg=audit(07/23/15 03:15:20.113:513448) : item=0 name=/etc/passwd inode=397875 dev=ca:01 mode=file,644 ouid=root ogid=root rdev=00:00 nametype=NORMAL
    type=CWD msg=audit(07/23/15 03:15:20.113:513448) :  cwd=/home/ubuntu
    type=SYSCALL msg=audit(07/23/15 03:15:20.113:513448) : arch=x86_64 syscall=open success=yes exit=26 a0=0x7f0beb4fd35c a1=O_RDONLY|O_CLOEXEC a2=0x1b6 a3=0x7f0bd0000078 items=1 ppid=1 pid=1588 auid=ubuntu uid=ubuntu gid=ubuntu euid=ubuntu suid=ubuntu fsuid=ubuntu egid=ubuntu sgid=ubuntu fsgid=ubuntu tty=(none) ses=30 comm=squid64 exe=/tmp/squid64 (deleted) key=(null)
    root@ip-172-31-56-203:/home/ubuntu#


    En esencia, el proceso PID 1588 ejecutado del binario /tmp/squid64 abre el archivo /etc/passwd en modo lectura (no entiendo con qué objetivo hace eso...). El hecho de que el PPID del proceso sea 1 (init) significa que el proceso padre fue terminado e init pasó a ser el padre del mismo. Muy probablemente el proceso padre original fue la shell abierta por SSH.
    • El verdadero porque del shutdown
    Aquí se devela de manera concreta el shutdown!!! A las 04:40:21 el demonio de audit decidió apagar el distema por la falta de espacio libre para poder escribir los eventos, esto quedó registrado en la ĺtima linea del log mas reciente de audit

    root@ip-172-31-56-203:/mnt# ausearch -a "1708" -i -if /mnt/var/log/audit/audit.log
    ----
    type=DAEMON_END msg=audit(07/23/15 04:40:21.000:1708) : auditd normal halt, sending auid=root pid=13214 subj=l=3.13.0-48-generic auid=root pid=18333 subj=unconfined  res=success res=success
    root@ip-172-31-56-203:/mnt#


    También se puede ver el reflejo de esto en /var/log/syslog, a las 04:39:56 se registró el primer mensaje indicando poco espacio disponible en el disco:

    root@ip-172-31-56-203:/mnt# grep auditd var/log/syslog
    Jul 23 04:39:04 ip-172-31-54-250 auditd[18333]: message repeated 108 times: [ Audit daemon rotating log files]
    Jul 23 04:39:56 ip-172-31-54-250 auditd[18333]: Audit daemon is low on disk space for logging
    Jul 23 04:40:01 ip-172-31-54-250 auditd[18333]: Audit daemon is low on disk space for logging
    Jul 23 04:40:03 ip-172-31-54-250 auditd[18333]: Audit daemon rotating log files
    Jul 23 04:40:05 ip-172-31-54-250 auditd[18333]: Audit daemon is low on disk space for logging
    Jul 23 04:40:19 ip-172-31-54-250 auditd[18333]: The audit daemon is now halting the system
    root@ip-172-31-56-203:/mnt#

     

    Analizando un poco las capturas de red


    Como mencioné antes, las capturas de red se encuentran totalmente disponibles y aparentemente intactas dentro del directorio home del usuario root. En el post anterior, me había quedado mucha intriga con respecto a la captura número 105, ya que no había sido enviada por email y era la que debería haber capturado toda la actividad de los dos hosts mencionados. Utilizando wireshark y su análisis de conversaciones podemos ver lo siguiente

    Las muchas intervenciones hechas por la dirección 54.196.232.229:


    • Se puede apreciar la similitud de todas las conversaciones TCP siempre con la misma cantidad de paquetes y bytes transferidos, estas conexiones son los intentos fallidos de login. La excepción es la última conexión que intercambió 6 paquetes mas y unos bytes mas también.
    • La última conexión es la última actividad registrada para esta IP y muy probablemente se trate de la conexión con que se adivinó el password del usuario.

    Las 3 intervenciones hechas por la dirección 59.188.237.12:


    • En la primer conexión apenas se intercambiaron unos 7758 bytes, esta es la conexión que podría haber sido para comprobar la tupla ip, usuario, password
    • La segunda conexión ya tuvo bastante mas tráfico 2.3MB aproximadamente, de los cuales 2.24 MB se movieron desde 59.188.237.12 a la instancia. Esto indica la subida de uno o mas archivos.
    • No hay mucho para suponer de la 3er conexión, es significativamente mas chica que la segunda, pero el doble de la primera. Posiblemente para recolectar alguna información del host infectado.

    Técnicamente las conexiones 2 y 3 se inician con una diferencia de milisegundos entre ellas.

    Un dato muy interesante es que no todo en las capturas resulta ser tráfico SSH encriptado!!! Escripteando un poco con tcpdump, encontré tráfico HTTP entre la instancia y el host 59.188.237.12. Y adivinen qué se envía por este medio? sin cifrado y con un simple HTTP POST!!!!


    Si... nada mas y nada menos que las tuplas ip, usuario, passowrd encontradas y de hecho con mi instancia encontraron varias xD. Se puede ver claramente como mediante una petición POST desde la intancia se cargan los valores en cuestión. Esto refuerza mas aún la hipótesis de que el host 59.188.237.12 se encarga de recolectar e infectar constantemente.

    Intenté encontrar llamadas a curl o wget que se pudieran estar usando para este paso, pero no logré encontrar nada en los logs de audit, así que al parecer esta operación debe estar manejado por el mismo binario squid64.

    Y /tmp/squid64 dónde está?


    Después de tanto revuelo, wireshark, tcpdump y demás hierbas no pude encontrar el archivo que subieron y ejecutaron en la instancia, el famoso squid64. Así que con buena parte del misterio resuelto me puso a invertir unas horas mas en intentar saber algo mas sobre el archivo.

    Haciendo uso de autopsy pude obtener una lista de Orphan files del volumen y uno de ellos me resultó muy interesante:

    Inode: 13931   Type: regular    Mode:  0755   Flags: 0x80000
    Generation: 3210820034    Version: 0x00000000:00000001
    User:  1000   Group:  1000   Size: 0
    File ACL: 0    Directory ACL: 0
    Links: 0   Blockcount: 0
    Fragment:  Address: 0    Number: 0    Size: 0
     ctime: 0x55b07036:ba627a40 -- Thu Jul 23 04:40:22 2015
     atime: 0x55b052ba:5086de40 -- Thu Jul 23 02:34:34 2015
     mtime: 0x55b07036:ba627a40 -- Thu Jul 23 04:40:22 2015
    crtime: 0x55b05286:a843ce40 -- Thu Jul 23 02:33:42 2015
    dtime: 0x55b07036 -- Thu Jul 23 04:40:22 2015
    Size of extra inode fields: 28
    EXTENTS:
    (END)

    A pesar de que los bloques ya no se encuentran asoaciados al inodo 13931, podemos ver los metadatos
    • Usuario 1000 (ubuntu)
    • Fecha de creación: 02:33:42 del 23 de Juli
    • Fecha de última modificación 04:40:22 del 23 de Julio
    y todo indica que se trata de un archivo creado por el mismo usuario comprometido justo después de haberse iniciado una sessión SSH desde el host 59.188.237.12 y que casualmente fue eliminado a la misma hora en que fue apagado el sistema. Es mucha casualidad! Potencialmente el inodo 13931 perteneció al archivo squid64.

    Yendo un poco mas profundo y buscando cadenas (strings) dentro de los bloques de disco no asignados encontré algunas cosas interesantes:

    [-] ERROR: could not create SSH session
    SUXX
    /dev/urandom
    /dev/random
    socket error:
    POST %s  HTTP/1.1
    Host: %s
    Host: %s:%d
    Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5
    .3
    User-Agent: %s
    Content-Length: %d
    zhangyan7tian
    data=%s %s %s
    /stat.asp
    59.188.237.12
    ask_userauth
    entering function %s line %d in /root/sshcrack/libssh-0.5.3/src/auth.c
    ssh-userauth
    leaving function %s line %d in /root/sshcrack/libssh-0.5.3/src/auth.c

    ...
    Receiving banner: too large banner
    ssh_send_banner
    SSH-1.5-libssh-0.5.2
    SSH-2.0-libssh-0.5.2
    Received SSH_KEXDH_REPLY


    Entre tantas cadenas podemos ver
    • El banner SSH-2.0-libssh-0.5.2 con que se identifica el cliente SSH que realiza las conexiones de manera masiva.
    • Un path de archivos fuente /root/sshcrack/libssh-0.5.3/src/auth.c parece tratarse del path the compilación de la aplicación sshcrack. Lo raro es que utiliza libssh-0.5.3 en lugar del 0.5.2.
    • Vemos el encabezado HTTP con la llamada POST completa e incluso pareciera estar hardcodeada la IP de recolección e infección (59.188.237.12).
    y un poco mas adelante lo que parece ser un diccionario de usuarios/passwords, si prestan atención se darán cuenta que los usuarios probados son los que mencioné cerca del final del primer post:

    zhangyan
    zhangyan7tian
    3rddf
    root
    12345
    root
    admin
    root
    password
    root
    123muie123
    root
    root
    root
    1234
    root
    root123
    root
    123456
    root
    ...

    qwerty123
    root
    qwerty
    root
    pa55w0rd
    root
    1qaz2wsx
    root
    root
    toor
    ...

    root
    ^%$#@!
    root
    ^&*()
    root
    5mmQ


    En fin, no pude obtener el archivo, pero quedaron muchos rastros que podrían formar parte del mismo. Desafortunadamente no contemplé en ningún momento la posibilidad de perder logs de auditd, incluso sabiendo de la rotación, creí que 80 era un número mas que suficiente.

    Resumen


    Hasta aquí llegó mi amor! A modo de resumen para cerrar la saga es dejo los siguientes puntos:
    • Está claro que hay al menos 2 tipos de nodos en este proceso. Los nodos (tipo A) como 54.196.232.229 que buscan usuarios con passwords triviales y nodos como 59.188.237.12 (tipo B) que se encargan de infectar y recolectar las tuplas obtenidas por los nodos tipo A.
    • Cuando un nodo tipo A consigue un usuario y password lo reporta instantaneamente al nodo tipo B, mediante un mensaje POST HTTP.
    • El nodo tipo B se conecta al host y realiza una serie de operaciones que no pudieron ser determinadas con precisión, pero que convierten al host en un nodo tipo A.
    En los próximos días iniciaré la instancia por primera vez luego de la infección para corroborar si hay algún mecanismo que haga persistir la infección.

    viernes, 24 de julio de 2015

    Una instancia a la deriva II: Crónica de una muerte anunciada

    Aquí va la segunda parte, si estás leyendo esto, te recomiendo que primero pases por Una instancia a la deriva I .

    Primer contacto del mas allá

    No pasó mucho tiempo hasta que alguien del país de la gran muralla diera con el password de mi usuario ubuntu. Para ser mas preciso luego de 56 intentos a las 06:40 del 21 de Julio don 106.2.197.34 dió con el password correcto.


    Al parecer esta IP está hosteando un sitio web que por las imágenes (porque no entiendo nada) me da a pensar que se trata de un sitio de cambio de monedas.


    Luego de haber encontrado el password la IP dejó de insistir y no pasó a mayores. Esto último me da a pensar que podría ser un sistema infectado a los efectos de encontrar y recolectar usuarios/passwords de otros sistemas, probablemente parte de una botnet. En particular esta nueva IP siguió el mismo diccionario que las IPs (108.51.89.92, 180.250.223.10 y 77.222.137.46) mencionadas en Una instancia a la deriva I.

    Pasó un día y no hubo novedades, al punto que supuse que había hecho algo mal.

    Guess who's back!


    Ayer por la mañana mientras desayunaba y leía los mails me encontré con esto


    Lo primero que pensé fue "Que! casualidad dos IPs diferentes adivinaron el password del usuario ubuntu al mismo tiempo!" No tenía ganas de husmear demasiado en ese momento para que no se me hiciera tarde, pero no me resistí a logearme en la instancia para ver qué habían hecho y...

    juan@moon:~/Escritorio/SH$ ssh root@52.6.74.XXX
    ssh: connect to host 52.6.74.XXX port 22: Connection timed out
    juan@moon:~/Escritorio/SH$


    booom! La instancia estaba inaccesible! A este punto ya era irresistible y abrí la consola de AWS, para encontrarme con la siguiente imagen


    La instancia se apagó por si sola. Esto era lo que debía pasar en caso de que se detuviera el proceso que capturaba el tráfico de red que entraba y salía de la instancia o por ejemplo en caso de que se diera una condición desfavorable para audit (como disco lleno...).

    Desde la misma consola controlé el uso de recursos para ver si encontraba algo interesante


    se puede ver claramente como poco antes de las 02:30 algo se desencadenó dentro de la instancia que incrementó el trafico de red en ambos sentidos. Si vemos el mismo período, pero en este caso las estadísticas del volumen se puede apreciar un incremento en todas las operaciones


    Un comportamiento análogo se puede ver también en la utilización de CPU


    Sea lo que sea que pasó, comenzó poco antes de las 02:30 y terminó tempestivamente poco después de las 04:30. Por último pegué una mirada a los console logs para ver si había algo interesante y...


    A las 04:40 del 23 de Julio se inició un shutdown. Esto me dio a entender que posiblemente pudieron matar el proceso tcpdump que corría como root (oO) y cuando el cronjob detectó que tcpdump ya no corría mandó a apagar el sistema a las 04:40.

    En este punto terminé el desayuno y partí a mis obligaciones xD.

    Antes de abrir la caja de pandora


    Antes de ir directamente a analizar el volumen raíz de la instancia o siquiera volver a prenderla vamos a mirar qué información se pudo obtener desde las capturas de tráfico y los logs.

    Desde los logs de audit que se enviaban por mail


    El último archivo de logs de auditd fue enviado por mail a las 02:00 del 23 de Julio, una hora y media antes del acceso (en principio absolutamente inútil). Sumado a eso por algún motivo el archivo contiene el siguiente time frame de logs

    root@moon:/home/juan/Escritorio/SH/logs/audit# aureport -t -if audit.log.1

    Log Time Range Report
    =====================
    audit.log.1: 19/07/15 20:13:01.249 - 21/07/15 07:35:55.417
    root@moon:/home/juan/Escritorio/SH/logs/audit#


    más inútil todavía. Al parecer cometí un error leyendo la documentación y estuve mandando por correo el mismo archivo cada 2hs, en lugar de mandar el archivo con los últimos logs... shit happens.

    Desde las capturas de tráfico con tcpdump


    La salvación debería estar en las capturas!! Viendo los mails, a las 02:32 del 23 de Julio se subió la captura número 104 (la captura previa, la 103, se había subido a las 17:05 del día anterior, 22 de Julio) y a partir de allí comenzaron a generarse capturas de manera increíble hasta que a las 04:36 se subí la última, la número 1099!!! Es decir que en 2 horas se generaron al menos 995 capturas de 5 MB (~5GB), esto me hace pensar que es poco probable que se haya llenado el disco de la instancia ya que si no me equivoco quedaba mas espacio libre.

    Lamentablemente por el número de capturas generadas, y consecuentemente la cantidad de mails enviados, muchas de ellas fueron rebotadas por los mecanismos de google anti spam.

    A pesar de que muchas no llegaron a ser enviadas a la cuenta, es probable que aún se encuentren en el volumen de la instancia.

     En la cuenta de correo se puede esto por el orden en que llegaron los correos:

    File sample104 Thu Jul 23 02:32:31 UTC 2015
    File sample106 Thu Jul 23 02:35:29 UTC 2015
    File sample129 Thu Jul 23 02:43:26 UTC 2015
    File sample111 Thu Jul 23 02:37:39 UTC 2015
    File sample108 Thu Jul 23 02:36:26 UTC 2015
    File sample157 Thu Jul 23 02:50:11 UTC 2015

    el 105 que posiblemente sería el mas interesante nunca llegó. La captura 108 llegó después que la 129 que llegó antes que la 111 xD, en fin...

    Un análisis simple de las capturas 103, 104, 106 y 108 muestra que la IP 54.196.232.229 actuó entre las 17:05 del 22 de Julio (fin captura 103) y antes de las 02:35 del 23 de Julio (fin captura 106). Esto comprende las capturas 104 y 105, no hay rastros de dicha IP en la captura 106 ni en la 108.

    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -r sample103 host 54.196.232.229 | wc -l
    reading from file sample103, link-type EN10MB (Ethernet)
    0
    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -r sample104 host 54.196.232.229 | wc -l
    reading from file sample104, link-type EN10MB (Ethernet)
    339
    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -r sample106 host 54.196.232.229 | wc -l
    reading from file sample106, link-type EN10MB (Ethernet)
    0
    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -r sample108 host 54.196.232.229 | wc -l
    reading from file sample108, link-type EN10MB (Ethernet)
    0
    juan@moon:~/Escritorio/SH/traffic captures/root$


    Dado que los logs de ese día no fueron enviados por correo, tampoco fueron cargados en la BD así que aún no puedo saber cuantos intentos fallidos se realizaron. 

    Misteriosamente no hay rastos de la IP 59.188.237.12 en ninguna de las capturas anteriores...

    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -r sample103 host 59.188.237.12 | wc -l
    reading from file sample103, link-type EN10MB (Ethernet)
    0
    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -r sample104 host 59.188.237.12 | wc -l
    reading from file sample104, link-type EN10MB (Ethernet)
    0
    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -r sample106 host 59.188.237.12 | wc -l
    reading from file sample106, link-type EN10MB (Ethernet)
    0
    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -r sample108 host 59.188.237.12 | wc -l
    reading from file sample108, link-type EN10MB (Ethernet)
    0
    juan@moon:~/Escritorio/SH/traffic captures/root$


    esto podría indicar que dicha IP tuvo intervención durante la captura 105 (entre las 02:32:31 y las 02:35:29) y fue lo suficientemente breve como para no aparecer en la 106.

    Viendo las capturas con wireshark con un poco de paciencia noté que en la captura 106 parecía haber conexiones SSH iniciadas desde la instancia hacia un número razonable de IPs. Aca va un ejemplo:


    Ahora era mi instancia la que se encontraba disparando al mundo conexiones SSH utilizando el cliente libssh-0.5.2 !!! Para que se den una idea, miren esto

    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -n -r sample103 src host 172.31.54.250 and "tcp[13] & 2 != 0" and "tcp[13] & 16 == 0"| wc -l
    reading from file sample103, link-type EN10MB (Ethernet)
    0
    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -n -r sample104 src host 172.31.54.250 and "tcp[13] & 2 != 0" and "tcp[13] & 16 == 0"| wc -l
    reading from file sample104, link-type EN10MB (Ethernet)
    0
    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -n -r sample106 src host 172.31.54.250 and "tcp[13] & 2 != 0" and "tcp[13] & 16 == 0"| wc -l
    reading from file sample106, link-type EN10MB (Ethernet)
    28457
    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -n -r sample108 src host 172.31.54.250 and "tcp[13] & 2 != 0" and "tcp[13] & 16 == 0"| wc -l
    reading from file sample108, link-type EN10MB (Ethernet)
    22196
    juan@moon:~/Escritorio/SH/traffic captures/root$ tcpdump -n -r sample111 src host 172.31.54.250 and "tcp[13] & 2 != 0" and "tcp[13] & 16 == 0"| wc -l
    reading from file sample111, link-type EN10MB (Ethernet)
    19930
    juan@moon:~/Escritorio/SH/traffic captures/root$ 


    Las capturas 103 y 104 no registraron conexiones SSH iniciadas desde la instancia, sin embargo las capturas 106, 108 y 111 registraron y MUCHAS.

    En este punto parece que el acceso se produjo entre las capturas 104 y 105 y que la infección y ejecución del software malicioso se podría haber producido durante la captura 105, dado que en la 106 ya se registra el comportamiento anómalo.

    La primer hipótesis es que la IP 54.196.232.229 (USA) dio con la clave en el lapso de las capturas 104 y 105, para que luego la IP 59.188.237.12 (HNK) se encargue de la infección durante lo que fue la captura 105. Una vez infectado el sistema no se registraron mas contactos de ninguna de estas dos direcciones.

    Pensamientos en el aire...
    •  54.196.232.229 parece ser un sistema infectado comportándose como se comportó mi instancia. De hecho, sin hacer demasiado escándalo, es otra instancia en EC2.
    • 59.188.237.12 podría ser el nodo recolector de las tuplas usuario,password,ip para proceder a infectar.
    Para la próxima, abriré la caja de pandora para ver qué quedó en el disco de la instancia y ver con más precisión qué fue lo que pasó.