Lobbydesires botnet
Recentment Oxydian va rebre una alerta sobre el mal funcionament de diversos llocs WordPress. Després d’examinar aquests llocs, es va descobrir que el lloc estava infectat per una petita botnet desconeguda i molt recent. Aquest tipus d’intrusió en un lloc web forma part dels punts que es verifiquen en una auditoria intrusiva. A continuació se’n presenta l’anàlisi:
EDIT 14/07/20: aquí hi ha els scripts que permeten detectar i netejar aquest malware:
https://github.com/Guiomuh
/WP_Redirect_Botnet_Cleaner
Anàlisi general
Tot va començar amb el descobriment de la següent payload JavaScript sospitosa en un lloc WordPress:
Ràpidament es veu que el lloc https://lobbydesires[.]com és un servidor C&C (Command and Control) que allotja el codi maliciós d’aquest malware. Això permet a l’atacant canviar a voluntat les funcionalitats de la botnet.
Comencem per l’anàlisi general d’aquest malware. En primer lloc, un simple WHOIS sobre el nom de domini utilitzat revela que el lloc està allotjat als Països Baixos i que es va registrar el 29 de juny de 2020, és a dir, fa 4 dies. I en tan pocs dies, nombrosos llocs ja han estat infectats!
De fet, es pot utilitzar la cerca de Google següent per llistar la part dels llocs infectats que han estat indexats des de la seva infecció:
intext:lobbydesires[.]com/location.js
Actualment apareixen 260 llocs, però el nombre real deu ser molt superior, tenint en compte el temps que triguen els bots de Google a reindexar un lloc web.
Anàlisi tècnica: location.js
Aquest és el codi del fitxer location.js, que es recupera del lloc lobbydesires.com i s’executa a cada visita d’una pàgina infectada.
Cal recordar que aquí es parla de codi JavaScript: per tant, el codi s’executa al navegador de la persona que visita el lloc i no al lloc mateix
Es constata que el codi ha estat ofuscat; caldrà una mica de feina per fer-lo comprensible.
Després d’una mica de neteja, en aquest fitxer s’hi troben 3 funcions JS:
check_adm()
make_theme()
reqListener()
reqListener()
L’última funció reqListener() és buida, cosa que fa pensar que la botnet no està acabada, però aquest punt es tracta més endavant.
check_admin()
Aquesta és la funció principal del malware, la que s’executa després de la definició de les funcions. S’encarrega de comprovar, amb l’ajuda de les galetes, si l’usuari que visita la pàgina infectada és l’administrador del lloc WordPress. Si no ho és, l’usuari és redirigit a la pàgina d’inici de sessió. Si es tracta de l’administrador, aleshores es crida la funció make_theme() .
Aquest efecte té com a principi bloquejar la pàgina fins que l’administrador la visiti, un mecanisme força astut.
make_theme()
Aquesta funció comença fent una petició GET a l’adreça següent:
http://[victime.com]/wp-admin/theme-editor.php?file=header.php
Aquesta és la pàgina de WordPress que permet a l’administrador modificar el tema actual. Aquí, més concretament, el fitxer header.php del tema.
El malware recupera aleshores algunes informacions de la pàgina amb l’ajuda d’expressions regulars. Aquestes informacions li caldran per interactuar amb la pàgina més endavant.
i = /name=”newcontent”.*?[>]([\/\s\/\S]*?)<\/textarea/g.exec(n),
d = /
- i[1] conté el contingut de header.php abans de la modificació
- d[1] conté el nom del tema utilitzat
- p[2] conté el valor del nonce que s’utilitzarà en les peticions següents
A continuació la funció comprova si el tema ja està infectat cercant la presència de la cadena “sdfsd23” (present a la 2a payload (PHP), presentada més avall). Si el tema encara no està infectat, s’hi afegeixen 2 payloads al començament. Una en JavaScript, similar a l’anterior:
I una altra que conté codi PHP: (simplificada aquí per facilitar-ne la comprensió)
Aquest codi PHP s’executa, doncs, al servidor a cada càrrega de pàgina. Però què fa?
Anàlisi tècnica: persistència en el tema WP
La payload PHP anterior s’encarrega de descarregar i executar el fitxer https://lobbydesires[.]com/n.txt
Aquest fitxer és un script PHP codificat en base64
Cal recordar que aquí es parla de codi PHP: per tant, el codi s’executa al servidor infectat
El nucli d’aquest fitxer conté diverses funcions, però, per simplificar, cerca fitxers concrets des de l’arrel del servidor per infectar-los.
Això implica que els altres llocs allotjats al mateix servidor també poden quedar infectats!
Aquesta cerca es pot dividir en 4 parts:
- La cerca del fitxer wp-config.php
- La cerca de fitxers amb un nom que contingui “.ph” o “.htm”
- La cerca de fitxers amb un nom que contingui “index.” i (“.ph” o “.htm”)
- La cerca de fitxers amb un nom que contingui “.js”
Tot i que la manera de cercar no és òptima, es veu clarament que el malware apunta als fitxers JS, PHP i HTML. En cada cas s’afegeix al fitxer trobat una payload JavaScript similar a les anteriors, excepte en el cas de wp-config.php
En efecte, un cop trobat, aquest fitxer es recorre a la recerca de les credencials de la base de dades SQL de WordPress. Aquestes s’utilitzen després per afegir la payload JavaScript a tots els articles de WordPress.
Una botnet nadó?
Com ja s’ha indicat abans, aquesta botnet no sembla acabada. A més de no disposar encara de càrregues útils que permetin llançar atacs, algunes funcionalitats estan incompletes.
Per citar només un exemple, es pot parlar del fitxer rebut.log :
Aquest fitxer, creat durant l’execució del codi PHP maliciós, conté la data de la seva darrera execució. S’utilitza al començament de l’execució per comprovar si la darrera execució és de fa més o menys de 6400 segons. Segurament per evitar que el malware es torni a executar a cada càrrega de pàgina, cosa que pot alentir greument el lloc. Tanmateix, en els 2 casos s’executa el mateix, la qual cosa és incoherent.
El nom d’aquest fitxer, rebut.log, sembla un indici que l’atacant és francòfon.
També es pot observar que les payloads JavaScript tenen un paràmetre no utilitzat que indica des d’on han estat cridades; en resum:
location.js?i=1 -> from index.php
location.js?s=1 -> from .php .htm or JS
location.js?qs=1 -> from SQL DB article
location.js?v=1 -> from Infected Theme (header.php)
A més, s’observa una important redundància de codi, cosa que pot ser un indici de la inexperiència del seu creador.
Finalment, cal destacar l’absència de redundància del servidor de control. Normalment, en malwares d’aquest tipus s’utilitzen diversos servidors infectats en redundància per emmagatzemar els fitxers de codi, perquè l’atacant pugui mantenir el control de la seva botnet encara que el servidor sigui denunciat.
En aquest cas, només s’utilitza un servidor i Oxydian l’ha denunciat; per tant, és qüestió de temps que aquesta botnet quedi inutilitzable.
EDIT (05/07/2020): el servidor ja no està disponible a dia d’avui
Conclusió
Tot i que actualment és inofensiu, aquest virus és molt persistent i s’actualitza a cada visita d’una pàgina infectada. Això, doncs, pot canviar aviat i aquesta botnet podria revelar ràpidament la seva veritable funció. Per tant, és essencial netejar qualsevol lloc que hagi estat infectat. Amb aquest objectiu, Oxydian ha publicat un script que permet fer una neteja completa d’aquest malware. En efecte, aquest malware és molt persistent i n’hi hauria prou d’oblidar una sola pàgina per provocar una reinfecció completa dels llocs allotjats al servidor.
Mentrestant, una correcció ràpida seria bloquejar el domini lobbydesires[.]com al tallafocs o, si no és possible, afegir-lo al fitxer hosts. Aquesta correcció, però, no és completa: només evita la descàrrega i, per tant, l’actualització de la payload PHP inserida al tema.
També cal preguntar-se com es va produir la primera infecció. Una hipòtesi seria la presència d’una vulnerabilitat XSS Stored en un WordPress o un plugin no actualitzat. En efecte, aquestes vulnerabilitats són habituals i permetrien injectar la payload JS inicial, que infectaria així la primera pàgina, la qual infectaria després tot el lloc si l’administrador la visités. La mateixa família de vulnerabilitats d’aplicació es busca a l’anàlisi de mitm6, una presa de control de la xarxa interna via IPv6.
Consells: per protegir-se d’aquest tipus d’atac és imprescindible mantenir actualitzats el lloc WordPress i els seus plugins.