CREA UN FUZZER CASERO

Posted on 12/11/2011

0



Un Fuzzer es un programa de testeo que envía datos no validos aun software en especifico hasta crear un error como se muestra en la imagen anterior. En internet existen infinidades de Fuzzers. Sin embargo en esta entrada creare un Fuzzer simple para entender como funciona y para que nos servirá mas adelante.

En esta demostración hare un Fuzzer para servidores FTP.

El primer paso es saber que comandos permite este servidor FTP, para eso me conecto a uno y digito HELP. El resultado es el siguiente.

!		debug		mdir		qc		send
$		dir		mget		sendport	site
account		disconnect	mkdir		put		size
append		exit		mls		pwd		status
ascii		form		mode		quit		struct
bell		get		modtime		quote		system
binary		glob		mput		recv		sunique
bye		hash		newer		reget		tenex
case		help		nmap		rstatus		tick
cd		idle		nlist		rhelp		trace
cdup		image		ntrans		rename		type
chmod		lcd		open		reset		user
close		ls		prompt		restart		umask
cr		macdef		passive		rmdir		verbose
delete		mdelete		proxy		runique		?

Ahora esa lista de comandos lo pasare a un array en Python, con la ayuda de oppen office hoja de calculo, copiare la lista anterior y lo pegare en formato separado por comas y con comillas.

'!','debug','mdir','qc',
'send','$','dir','mget','sendport',
'site','account','disconnect','mkdir',
'put','size','append','exit','mls',
'pwd','status','ascii','form','mode',
'quit','struct','bell','get','modtime',
'quote','system','binary','glob',
'mput','recv','sunique','bye','hash',
'newer','reget','tenex','case','help',
'nmap','rstatus','tick','cd','idle',
'nlist','rhelp','trace','cdup',
'image','ntrans','rename','type',
'chmod','lcd','open','reset','user',
'close','ls','prompt','restart',
'umask','cr','macdef','passive',
'rmdir','verbose','delete','mdelete',
'proxy','runique','?'

El propósito del Fuzzer es ejecutar comando por comando seguido de data “basura” hasta que el servidor FTP se congele y muestre el mensaje de la imagen anterior.
Con la ayuda de Python haremos toda esa lógica en el siguiente script.

#!/usr/bin/python
from socket import *
import sys

try:
        # parametros de entrada
	ip = sys.argv[1] # la ip del servidor remoto ftp
	port = int(sys.argv[2]) # el puerto por el cual esta corriendo el servidor
	number = int(sys.argv[3]) # la cantidad de caracteres basura a enviar

        # la lista de comandos
	commands = ['!','debug','mdir','qc',
	'send','$','dir','mget','sendport',
	'site','account','disconnect','mkdir',
	'put','size','append','exit','mls',
	'pwd','status','ascii','form','mode',
	'quit','struct','bell','get','modtime',
	'quote','system','binary','glob',
	'mput','recv','sunique','bye','hash',
	'newer','reget','tenex','case','help',
	'nmap','rstatus','tick','cd','idle',
	'nlist','rhelp','trace','cdup',
	'image','ntrans','rename','type',
	'chmod','lcd','open','reset','user',
	'close','ls','prompt','restart',
	'umask','cr','macdef','passive',
	'rmdir','verbose','delete','mdelete',
	'proxy','runique','?']

        # se abre la conexion al servidor
	sock = socket(AF_INET,SOCK_STREAM)
	sock.connect((ip,port))
	print sock.recv(1024)

        # envio el usuario
	sock.send("USER test\r\n")
	print sock.recv(1024)

        # envio la contraseña
	sock.send("PASS test\r\n")
	print sock.recv(1024)

        # genero un bucle para que pruebe con todos los camando
	print  "------------------------------"
	for command in commands:
		try:
                        # envio el comando
			buffer = command + " "
                        # tantas veces 'A' tal como indico
		        buffer += "A"*number
                        buffer += "\r\n"
			sock.send(buffer)
			message = sock.recv(1024)
			message = message.replace("A"*number,"")
			message = message.replace(": command not understood","")
			message = message.replace("500","")
			message = message.replace("'","")
			message = "[-] Enviando => " + message + sys.argv[3] + " veces 'A'"
			print message
			print "------------------------------"
		except:
                        # en caso que se genere una sobre carga se termina el testeo y idica cual es 
                        # el comando vulnerable y con cuantos caracteres basura crasheo
			print "\n[!] buffer overflow!!! para el ultimo comando enviado...\n"
			break

	sock.close()
except:
	print "\n[x] Error!! Uso: <objetivo_ip> <puerto> <numero_caracteres_enviados>\n"
	sys.exit(0)

Tal como se creo un Fuzzer para testear un servidor FTP, también se puede hacer lo mismo para otros servidores tales como un servidor de correo, etc.
Para saber que comandos esta utilizando el servidor “vulnerable”, conectarse mediante telnet

telnet
open [ip] [puerto]
HELP
Y veran la lista de comando
Anuncios
Etiquetado: , , ,
Posted in: fuzzer, linux, python, ubuntu