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...