martes 28 de febrero de 2012

[Hack] Los peligros del phpinfo y como tirar un servidor

¿Cuantos hemos creado un fichero phpinfo? Y quizás es una de las cosas que primero se hacen al terminar de instalar php.

Para los que no saben, "phpinfo" es una pagina de información con datos de configuración de un servidor. Por lo general, cuando se está configurando un servidor, una forma de saber si funciona "php" es creando este archivo. Sencillamente, no es mas que generar un archivo con el contenido
<?php phpinfo(); ?>
y guardarlo como info.php (puede ser cualquier nombre con extensión *.php). De esta forma, basta con entrar a http://(tu pagina o ip)/phpinfo.php Y así ver la información, variables y configuración actual del servidor.

Y ¿Porque esto es peligroso?
Ya sea por olvido, para un posterior uso, o creyendo que nadie se va a dar cuenta de la existencia de este archivo (al no estar linkeado en la pagina). Los administradores, simplemente lo dejan, le cambian el nombre y listo. Tal vez un usuario común jamas se entere de la existencia del mismo, pero puede que un atacante lo descubra y utilice la información para posteriores ataques.
Cuando se va a iniciar un ataque, el primer paso es el Footprinting (Así se denomina a las diferentes técnicas para recabar información) tratando de obtener IPs, dns, información personal, puertos, servicios corriendo, versiones de programas, etc.

El phpinfo le otorga a un extraño por ejemplo:
-Saber algunos programas que están corriendo, mediante la variable PATH.
-Ver la versión del sistema operativo, sin la necesidad de hacer fingerpriting o utilizar un programa (que además deja huellas).
-Saber las versiones de los programas y módulos de apache. A partir de ello ver si existe algún bug, para después explotarlo.
-Ver permisos de algunos archivos.
-Ver la directiva safe_mode.
-En caso de ser vulnerable a LFI (Local File Inclusion donde se puede visualizar archivos del servidor o inyecta código en un fichero para luego ejecutarlo) podría ayudar a la explotación, debido a que la ejecución de un script se almacena de forma temporal. Al archivo con el script mediante un método gets o post, se visualizaría el nombre del archivo temporal generado en el phpinfo y ejecutar el fichero con el LFI.
-Encontrar una vulnerabilidad RFI (Remote File Inclusion donde se puede ejecutar una shell remota y entrar directamente al servidor) si allow_url_fopen está habilitado.
-Explotar un xss, mediante la variable de vector '?a[]=' agregandola a la url.
Entre otras cosas...

Analizando la salida del phpinfo.
Este es un ejemplo real de un phpinfo en un servidor.


-Cuando entramos a la pagina del phpinfo, nos encontramos con algo similar a esto. Fíjense que al comienzo ya nos dice la versión de php. De esta forma se puede saber que vulnerabilidades pueden llegar a explotarse. Y abajo el Sistema en que corre.


-En la parte de "apache2handler", tenemos la versión de apache. Al igual que antes con esto podemos saber que vulnerabilidades se puede explotar. En el apartado "Loaded Modules" los módulos que se están ejecutando. Esto es importante porque Si existe un bug en esa versión que lo genere un modulo este debe estar cargado.


-Esta es la parte que andaba buscando. Se puede ver que cabeceras del protocolo http se utilizan. La parte que me interesa es "HTTP_ACCEPT_ENCODING", fíjense que acepta "gzip, deflate", quiere decir que permite comprimir la respuesta antes de enviarla.

Verán, cuando nuestro explorador (IExplorer, Mozilla, Opera, Chrome etc..) envían una consulta http a un servidor al abrir una pagina, internamente se envía algo similar a esto (puede variar):
 GET /index.html HTTP/1.1
Host: www.pagina.com
User-Agent: nombre-cliente
Y el servidor internamente devuelve algo asi:
HTTP/1.1 200 OK
Date: Fri, 2 Mar 2012 18:39:05 GMT
Content-Type: text/html
Content-Length: 1221

<Cuerpo de la pagina>
...
Como el protocolo http utiliza múltiples cabeceras, uno puede enviar una cabecera modificada
para obtener una respuesta diferente. Un caso particular es el de los servidores de descarga, que utilizan "range", rango de bytes que se necesita para continuar la descarga.
Aprovechando esto, si enviamos múltiples consultas con diferentes rangos y a todas ellas, le decimos que los comprima con gzip, el servidor intentará atender todas estas consultas y finalmente colapsará.
-----------------------------
Para el exploit utilice lenguaje C++ y es bastante sencillo. En primer lugar se pide la url de la pagina, a partir de ella se obtiene la ip. Para cada consulta se crea un "hilo" y utilizando "socket" se envía la cabecera modificada.





Así que ya saben, acuerdense de deshabilitar el phpinfo. Actualizar los programas.
Aclaración: Esto no es un tutorial. Gonzac Studios no se hace responsable por el mal uso de este material.

sábado 17 de diciembre de 2011

GPS Garmin nüvi 1390t & Como instalar mapas

Hace tiempo que me tocó probar distintos dispositivos gps. Y hablo de gps reales, no el mapa de google que traen los celulares. Algunos con mas opciones que otros, pero tratándose de mostrar tu locación y la ruta realizada, todos completamentes competentes.
Creo que, lo que hizo tan populares a los GPS fue la ayuda que otorga a los conductores y viajeros.
Hoy tuve la posibilidad de tener uno nuevo en mis manos, el nüvi 1390t. Y para serles franco no existe mucha diferencia entre los modelos anteriores. La interfaz es la misma, el tamaño practicamente no varía y el diseño es similar. Pero veamoslo mas detalladamente:


En la caja junto al gps viene el cargador para auto, una base para el soporte, el soporte con sopapa para el parabrisas, un cable usb y un adaptador de memoria SD, con una memoria microSD de 2Gb.
Algo que me llamó la atención es que no traía CD con lo programas y controladores, ni un manual. Garmin hace ya un tiempo dejó de dar soporte de sus programas en CD y resulta realmente molesto que averiguar que programas se necesitan y tener que descargarlos de su pagina.


Ranura para memoria microSD

Algunas características destacables son
-Pantalla de 4 pulgadas
-Tamaño de 12,2 x 7,5 x 1,6 cm
-Duración de bateria de Aprox. 4 hs
-Mapas preinstalados (Segun el pais donde se compre).
-Memoria externa de hasta 2gb y adaptador (Aveces no incluida).
-Indicación por Voz, con voces personalizables.
-Bluetooth para utilizar el celular con manos libres. (No le veo gran utilidad, no permite control por voz).
-Y los servicios conocidos, ubicación actual, búsqueda de ruta mas económica, indicación de ruta, visión de cruces, indicación de carril, puntos de interés, control de velocidad, bloqueo antirrobo y Reloj mundial, conversor de moneda, medidas y calculadora.

Desventajas:
-No trae manual ni programas.
-No tiene reconocimiento de voz.
-No calcula rutas a partir del trafico.
-No incluye información meteorologica.
-No incluye la función para encontrar el automovil.
-No tiene reloj Alarma.
-No reproduce mp3.
-No tiene salida externa de audio.
-No presenta mapas con relieves ni edificios en 3D.

A pesar de las desventajas, con todas las características que incluye hace falta destacar su precio en comparacion con otros modelos que pueden llegar a costar hasta el cuádruple.
---------------------
Instalación de mapas:

Como el dispositivo no fue comprado en el país, era necesario instalar los mapas.
Según me contaban el vendedor había dicho algo como "Para poder usarlo van a tener comprar los mapas e instalarlos". No se como será en otros países, pero acá en argentina tenemos el proyecto MAPEAR que es la comunidad mas importante a lo que se refiere en Cartografía. E indican que la instalación de mapas debe ser gratuita.

En primer lugar hay que descargar el producto Training Cente de Garmin. Una vez instalado aparecerá la siguiente ventana.

Esto es solo para que funcione de forma correcta el otro programa.
Cerramos la ventana, y descargamos e instalamos MapSource.
Aclaración: Este no se podrá instalar si no tenemos una versión anterior. Por lo que hay que extraer los ficheros en una carpeta con Winrar y ejecutar el archivo "MSmain.msi".

Ahora solo nos queda por descargar los mapas. Para ello entramos en la pagina de Mapear y descargamos la versión que queramos, náutica, terrenos etc. En este caso la de rutas y ciudades.

Una vez instalada abrimos el MapSource, vamos a la pestaña "ver", la opción "pasar a producto" y seleccionamos el producto.

Una vez realizado esto, nos aparecerán los mapas. Los seleccionamos con la herramienta polígono al sector que queramos. Y con el GPS conectado al PC, hacemos click en el icono de cargar a dispositivo.

--------------------------
Y eso es todo. Como los link de descargas siempre se actualizan y para que no tengan que registrarse, descomprimir el MapSource y andar buscando los programas. Subo un rar con todos lo necesario. Incluye una POIS de radares y un generador de claves para desbloquear mapas.
Link de la descarga. El archivo ocupa unos 225.3 MB, así que tengan paciencia.

Saludos

martes 6 de diciembre de 2011

Facebook virus y estafas

Ya son mas que conocidas la diferentes estafas que se aprovechan las redes sociales para transmitirse de forma masiva. Anteriormente se utilizaban las mismas paginas de aplicaciones, y aun muchos estafadores siguen usándolas para engañar a cualquier usuario indefenso y así poder propagarse.
¿Que beneficio sacan de ello, si no es hacer daño?
Si nos ponemos a revisar cada uno de ellos nos daremos cuenta que existen diferentes modalidades. -La mas utilizada es para pishing, poder robar cuentas bancarias deja muchos dinero y para poder obtener datos de alguna cuenta hay que buscar entre muchos usuarios.
-La otra similar se trata de una estafa directa, haciendo que el usuario mande dinero.
-Y por ultima la mas benigna es la llevar a usuarios a paginas con publicidades y AdSense, donde ellos están registrados y les pagan por cada usuario que entre.
---------------------------
La revancha del creador faceplus
Tiempo atrás uno de los temas mas spamedao hablado, era el supuesto "faceplus". Una aplicación que supuestamente permitía costumizar o personalizar tu perfil de facebook. Se instalaba la aplicación e inmeditamente, esta mandaba una publicacion a todos tus contactos para que la descarguen. Obviamente la cantidad de spam que generaba era enorme.

Hace un tiempo empecé a eliminar "paginas de facebook" por la cantidad de publicaciones de videos, y que generaba una especie de spam indirecto ya que la idea de facebook es mostrarte la actualizacion de tus contactos. Pero después empecé a notar publicaciones de "videos" de persona, algunos con mensajes en un español medio centroamericano y se me ocurrió investigar.


Yendo a la pagina en cuestión, que casualidad me faltaba un plugin novedoso de youtube, aunque todos usamos youtube normalmente.


Veamos un poco el código:


1-En primer lugar tenemos que lo que se muestra es un iframe de una pagina llamada "fanvisitas" así que el código del plugin esta ahí.
2-En segundo lugar tenemos un script de adsense google. Está bien, el quiere ganar algo de dinero, después de todo se la pasa compilando vídeos ¿no?

En la pagina del enlace:




¿Porque los plugins de youtube estarían alojados en fanvista? ¿No deberían descargarse directamente desde el servidor de youtube? Algo raro ¿No?. Entonces entremos a la pagina de fanvisitas y veamos que podemos encontrar.

Ajá!, el autor de la pagina anterior es el mismo de FacePlus. Bueno al menos el tubo la consideración de advertírtelo:

---------------------------
Otra cosa, si hacemos un whois al dominio nos saldrá algo así
Domain Name: FANVISITAS.COM
Registrar: DIRECTI INTERNET SOLUTIONS PVT. LTD. D/B/A PUBLICDOMAINREGISTRY.COM
Whois Server: whois.PublicDomainRegistry.com
Referral URL: http://www.PublicDomainRegistry.com
Name Server: NS5.SAAPY.COM
Name Server: NS6.SAAPY.COM
Status: clientTransferProhibited
Updated Date: 05-dec-2011
Creation Date: 07-nov-2011
Expiration Date: 07-nov-2012
Ahora si averiguamos dentro del servidor sobre datos de titular de esta pagina

Name: Domain Admin
Company: PrivacyProtect.org
Address: ID#10760, PO Box 16
Note - All Postal Mails Rejected, visit Privacyprotect.org

Eso quiere decir que está protegida. No vaya a ser que alguien quiera tomar represalias. ;)
---------------------------------
Actualizacion (11/12):
De la misma forma aunque un poco mas evidente

El código de fuente no lo dejo porque es bastante similar al anterior. Utiliza un fondo falso de facebook, nada mas complejo que eso. El falso plugin se descarga de un servidor vevideo.com.es.
Si queremos entrar a la pagina principal esta nos redirecciona a otra que te pide tu usuario y contraseña de hotmail, es genial! no solo busca transmitir malware y estafar. Sino que también te quiere robar el correo electrónico.

Para ponerle un poco de humor, quieres saber quien es el encargado de esto:
http://www.whois.net/whois/servervideotube.com

Actualizacion (19/12): Veo que siguen apareciendo mas paginas, esta es otra http://vk3.me/es/?3090. Con un aspecto similar a youtube No son mas que imágenes de fondo. En este caso, tanto la pagina como los plugins están alojados en el mismo servidor.

Saludos y tengan cuidado con lo que instalan.

viernes 25 de noviembre de 2011

Baterias de notebook - Upgrade Msi

Recuerdo en el colegio una vez haber escuchado que "Una batería es un conjunto de pilas". Y no estaban tan errados, si bien algunas se constituyen de celdas electroquímicas otras son literalmente un grupo de pilas.
Actualmente se utilizan las baterías de Iones de litio, y con ella se caen todos mitos del mantenimiento de las baterías.

El efecto memoria: Había que descargarlas por completo. No hay nada mas raro y falso. La primera vez que lo escuché no le encontraba explicación pero me lo habían explicado en la técnica. Esto sucedía cuando se formaban unos cristales en el interior, en este caso estábamos hablando de las baterías de níquel cadmio (Ni-Cd). Tiempo después fueron reemplazadas por baterías menos contaminantes y sin este efecto, por las de níquel e hidruro metálico (Ni-Hm).
-Las baterías de litio no presentan efecto memoria, pero si algo que denominaron pasivacion. Debido a su química interna se forma cloruro de litio, que se soluciona descargando y cargando completamente la batería mas o menos una vez al mes. Esto se puede obserbar en las notebook cuando no carga al 100% y queda algo así como 98% ya que se descalibra.
La carga inicial: Si bien varios fabricantes lo recomiendan, no es mas que otro mito heredado de las antiguas baterías. Las baterías de Ni-Cd y Ni-Hm que constituían aparatos electrónicos no eran tan "inteligentes" como hoy en día. Hoy en día los dispositivos son capaces de detectar la carga y cortar el paso de corriente (tal vez alguno de nosotros tenga un cargador de pilas que se apaga automaticamente y/o un led que avisa).
Tener enchufado el cargador con la batería es perjudicial: Como comenté anteriormente esto sucedía con las baterías de viejas. Las baterías de litio comienzan a fallar por distintos factores como el recalentamiento, la humedad etc. Aunque algún fallo en el cargador o sobrecarga puede afectar a la batería.

La baterías de la notebook son baterías inteligentes, dentro de las mismas se encontrar pilas a las que se denomina celdas junto a un circuito electrónico que comprueba su estado y otras variables.

¿Puedo reemplazar las pilas?
Las baterías tienen un ciclo de vida (de carga y descarga), y los fabricantes son muy consiente de ello. El circuito entre otras cosas posee:
-Un integrado, (en mi caso bq29330) un protector y medidor de carga mediante una interfaz serie SMBus. Controlando los ciclos de carga y descarga. Y se debe resetear por software.
-Dos transistores mosfet TPC3026, para cortar los ciclos de cargar.
-Un thermistor y un fusible térmico para el exceso de temperatura.



Cuando el circuito integrado decide que ya se cumplió la cantidad promedio de ciclos, manda una señal al Pc y este indica que hay que reemplazar la batería por una nueva. El contador interno evita que se siga utilizando la batería para evitar fallas (por mas que las pilas aun estén bien), y solo puede ser reseteado con una memoria especializada la cual obviamente los fabricantes no lo proporcionan al publico.
Otro tema es la temperatura, si existe un exceso de temperatura en las pilas el fusible se corta evitando posibles daños. Casos de incendio existen muchos, inclusive muchas veces las compañías fabricantes de notebook tienen que retirar del mercado miles de equipos que vienen con defecto de fabrica. Si no me creen escriban "batería notebook incendio" en el buscador y encontraran las noticias.

La batería en su tiempo de vida tiene 4 estados.
-El estado óptimo, donde funciona correctamente o con una pérdida casi imperceptible.
-El estado intermedio de uso, donde no dura la misma cantidad de tiempo que cuando era nueva, pero sirve momentaneamente. Se detecta fácil debido que se apaga antes de lo indicado.
Se puede arreglar temporalmente colocándola en el freezer un día y luego aplicarle un ciclo de carga y descarga completa. Esto se debe a los efectos expansión y contracción dentro de la celda mejorando el movimiento de los iones.
-El estado critico, donde la autonomía es mínima. El equipo avisa mediante una señal (led, sonido, o mensaje en la barra de inicio) que la batería se debe reemplazar.
-El estado no funcional, la batería no puede mantener la computadora prendida o no es reconocida por el sistema operativo.

Se que existen lugares para comprar las pilas y que reemplazan las celdas. Inclusive en Internet muestran como hacerlo uno mismo. Pero si nos fijamos en lo anterior, esto no es mas que una solución temporal y una perdida de dinero. A estas se las conoce como "38650" y son muy utilizadas en linternas y láser de alto alcance. Tres pilas de solo 2800mAh ronda los 120$, mientras que una batería extendida de 6 celdas (4400mAh) cuesta el doble (tomando como referencia el precio de 6 pilas). Y una de 9 celdas solo un poco mas. Es decir con un poco mas de dinero podemos lograr una mayor autonomía.

-Batería msi original de 3 celdas:
autonomía: 2200mAh
peso: 185g
tiempo: (uso normal, Internet, 50% de brillo)
2.20 hs o 2.30 hs aproximadamente
-Batería msi 6 celdas:
autonomía: 4400mAh
peso: 322g
tiempo: (uso normal, Internet, 50% de brillo)
5.00 hs o 5.15 hs aproximadamente
-Batería msi 9 celdas:
autonomía: 7800mAh
peso: 505g
tiempo: (uso normal, Internet, 50% de brillo)
7.30 hs o 7.45 hs aproximadamente

Como ven, se puede sacar mucho provecho de las mismas. Los resultados varían según lo que se esté corriendo. Una aplicación excelente para medir la autonomía y gratuito es Baterry Eater, que nos permite hacer benchmark y sacar resultados reales.
Si queremos cuidar nuestra batería, una herramienta avanzada excelente (aunque de paga), es Battery Optimizer. No solo monitorear la carga, si no también controlar el estado de la misma y con la capacidad poder optimizar su rendimiento. Si no deseamos pagar podemos optar por una similar llamada Battery Care aunque no tan potente.

El cargardor!
Existe la creencia de que el cargador debe ser estrictamente el que vino de fábrica, como también aquellas personas que piensan que el cargar solo varía la ficha. La realidad es que existes así como un grupo de voltajes mas utilizados, por ejemplo los mas comunes son de 15, 16, 18, 19, 20, 22 y 24v pero las vaio utilizan su propia medida 19,5v. O las fichas, cada fabricante utiliza una en particular. Por lo que un cargador original siempre va a salir mas costoso que uno universal. Y muchas veces un cargador universal puede sacarte de apuros.
Una muy buena idea también es conseguir un cargador universal que se conecte al auto. Para realizar wardriving (búsqueda y mapéo de redes inalámbricas), para realizar auditorías, en caso de viajar o de necesitar utilizarla de forma urgente etc.


Una recomendación con respeto a los cargadores, traten de cuidar los cables: mantener estiradas donde están las uniones, no doblarlos demasiado superando su ángulo critico, y estirarlos sin que se tuerza a la hora de usarlos. No solo por que se puedan llegar a cortar, si no que pequeños cortocircuitos pueden dañar el transformador.
-------------------

Espero que les haya gustado. Con esto continuo con las entradas [Preparando un ataque real], la anterior de esta serie de post fue
[Modding] Agregar una antena al portatil, Msi U100.
Saludos

jueves 24 de noviembre de 2011

[Hack] Las paginas juegan con nuestros datos -Obtener Contraseñas-

Hace un tiempo hablé de como obtener datos de elementos html a la hora de diseñar una web, y luego sobre lo cuidadoso que hay que ser al usar las variables como $_server[] en php.
Hoy un poco mas allá le voy a mostrar ejemplos reales, donde las paginas administran nuestra contraseña de forma insegura.
---
Verán, existen 5 casos prácticos de como autentifican nuestra contraseñas.

1)"Envían la contraseña en texto limpio y la comparan con el texto almacenado": Este es el peor de los casos, nuestra contraseña se envía en texto sin codificarse y en la base de datos existe nuestra contraseña de la misma forma. Es decir que nuestra contraseña viaja por la red y cualquiera (que sepa como) o cualquiera que pueda acceder a la base de datos, puede ver las contraseñas y el usuario.
2)"Envían la contraseña en texto limpio y la almacenan codificada": De esta forma, la contraseña al menos, quien tenga acceso a la base de datos no podrá saber nuestra contraseña.
3)"Envían la contraseña cifrada y se decifra en el servidor": La contraseña viaja cifrada y al interceptar los datos no es legible a simple vista, pero quien tenga acceso a la base de datos sabe nuestra contraseña.
4)"Envían la contraseña cifrada y la almacenan cifrada": Si bien nadie tiene acceso a la contraseña real, un atacante podría modificar la cabecera para enviar el dato codificado y lograr acceder a nuestra cuenta.
5)"Utilizar un certificado de autenticación": Este es el ejemplo claro de hotmail.

Ahora que entendieron los diferentes casos, hay que aclarar que existen diferentes algoritmos de encriptacion.
-Algoritmos débiles: Por lo general se cifran y decifran con el mismo algoritmo. Son conocidos. Ejemplo base64 .
-Algoritmos fuertes: De hash, permiten cifrar un texto dando como resultado una cadena de caracteres de una longitud determinada y no son capaces de decifrarce. Al tener una longitud determinada para "infinitas combinaciones de texto" presentan colisiones de de hash es decir alguna combinación se repite (como MD5 vulnerable a la paradoja de cumpleaños) pero que se soluciona al añadirle una cadena llamada SALT.
Ejemplos MD5, SHA-1, BLOWFISH, AES etc.

---
Los Sniffers:
Antiguamente cuando no existían las redes wirelles como hoy en dia, y la velocidad de conexion era lenta. Los dispositivos mas conocidos para conectar varias maquinas eran los Hubs, los expertos sabían que los paquetes de una maquina se enviaban a todos los dispositivos conectados al hub (inundación de paquetes). Por lo tanto, aquel que modificaba la tarjeta ethernet para trabajar en modo promiscuo y capas de reconocer los paquetes, podía ver todo el tráfico y con ello las contraseñas. Con la llegada de los switch y los routers esto cambió. Capaces de distinguir los equipos, el protocolo ARP de resolución de direcciones en realidad solo lo dificultó un poco.
¿Estamos realmente seguros?
La realidad que un atacante puede modificar la tabla ARP (envenenamiento arp).
Cuando una ip no se encuentra en la tabla, se envía la ip a todas las maquinas y el equipo responde con su direccion mac. De esta forma, se engaña al equipo haciendo que el trafico pueda pasar previamente por el equipo atacante (man of middle) y luego reenviar los datos sin que el usuario se lo sospeche.
Para que esto se puede realizar, las tarjetas de red deben soportar captura de paquetes, la librería winpcap realiza la conexión a bajo nivel con la tarjeta de red.
Si te gusta la programación como a mí, puedes programar en C# tu propia utilidad para capturar paquetes y filtrarlos. En cambio si eres un Script kiddie seguro quieres un programa, en ese caso debes bajarte un sniffer. Lamentablemente como borre la aplicación que estaba programando voy a utilizar "cain y abel" como ejemplo.

Como esto no es un tutorial del cain y abel, simplemente vamos a analizar las salidas.

  • En esta imagen se puede ver como los datos son pasados en texto limpio.



  • En la primera imagen la pagina vulnerable, luego la contraseña enviada en el conocido base64, y desencriptada al final.




  • En estas, se observa que está codificado en md5. Con un poco de suerte, alguna servicio de descifrado encontrará el password. O con un Pc lo suficientemente potente y una base de datos de tablas rainbow el password saldría en unos segundos o minutos.

  • Ejemplo de windows live en la maquina víctima. Estos certificados también son vulnerables pero ya es otro tema.

Por ultimo me queda decir no confíen sus datos a una red publica, asegúren su red. Y a todos los diseñadores y webmaster utilicen encriptacion y comprobación, tanto del lado del login como del lado del servidor. Después de todo, los usuarios son los que hacen a las paginas.

martes 8 de noviembre de 2011

[Hack] ejecucion de codigo en URI

Como una variación a lo visto en [hack web parte2] filtros & pagina owned , hoy les voy a hablar de cross site scripting en URI. Tal vez les sea mas conocido el termino URL, como la dirección a un sitio determinado, en realidad la URL es un tipo de URI. La diferencia fundamental es que la URI puede incluir una subdirección de un elemento. De cualquier forma estamos hablamos de la dirección de un recurso web.

La diferencia con esta vulnerabilidad y la vista anteriormente es que en la anterior, los datos se enviaban desde un campo de texto a través de un método get o post. En esta, un error en el tratamiento de las variables en una pagina php, nos permite incluir código en la dirección web. (No confundir con método get donde las variables se pasan como parámetro por la dirección).

Cuando se crea una pagina php tenemos métodos que nos facilitan información a la hora de programar. Uno de tantos es $_SERVER que contienen información de las rutas y cabeceras. Este es un array al cual, se le pasan diversos elementos de la siguiente forma $_SERVER['elemento'].
El problema surge cuando este método se lo incluye directamente en un formulario intentando optimizarlo.
Formulario común:
<form method="POST" action="Dirección_donde_se_envían_los_datos">...
Formulario común en php:
echo "<form method="POST" action="Dirección_donde_se_envían_los_datos">"; ...
Formulario en php optimizado:
echo "<form method="POST" action=\"".$_SERVER['elemento']."\">"; ...

Se usa el método $_SERVER['elemento'] para añadir una dirección al campo action del formulario. El 'elemento' determina que elemento del arreglo se necesita. De esta forma
$_SERVER['PHP_SELF'] :
Devuelve como resultado el documento que se está ejecutando.
$_SERVER['REQUEST_URI'] :
Devuelve la dirección de donde se ingresó.
$_SERVER['SCRIPT_FILE'] :
Devuelve el documento de donde se ejecuta el script php.
$_SERVER['SCRIPT_FILENAME'] :
Devuelve la dirección donde se ejecuta el script php.

¿Que tiene de vulnerable?
Todavía no se dieron cuenta?, de esta forma esta permitiendo introducir código directamente en el la pagina a través de la barra de direcciones.
Un atacante podría cerrar la etiqueta introduciendo />"> al final de la dirección y luego inyectar el exploit, pudiendo robar cuentas, transmitir malware y todo ello.





Aclaración: Esto no es un tutorial, Gonzac Studios no se hace responsable por el mal uso de este material.

Saludos.

lunes 31 de octubre de 2011

Acceder a elementos de una etiqueta html

Si bien esto suena sencillo, en Internet se confunde mucho. Tanto los documentos html como los xml funcionan a partir de "etiquetas", estas indican no solo el tipo de contenido sino también, permiten estructurar el documento en forma de árbol (La diferencia entre estos dos lenguajes y su utilizacion se escapan al contenido manual). Una etiqueta se estructura de la siguiente forma:

<nombre_tipo atributo="valor" evento="valor"> Contenido <\nombre_tipo>

Así en html las etiquetas representan un tipo definido de elemento con sus diferentes atributos o propiedades (estilo, nombre, identificador etc) y funciones o evento. En xml los tipos de etiquetas los define el diseñador, y se lo puede ver como una representacion de un objeto real y sus diferentes propiedades. Y los atributos son mas bien especificación (por ejemplo Una persona tiene nombre,apellido y teléfono. Este puede ser de tipo móvil o de casa). En caso de que se desee representar un "objeto html" se debe especificar dentro de etiquetas description el namespace, pero ese es otro tema.

Identificar un elemento.

Existen muchos tipos de etiquetas y cada una tiene un tipo definido de atributos, aquellas que no expresan el formato de texto, también pueden no incluir atributos. El problema surge cuando se quiere utilizar el contenido de ese elemento o sus propiedades. Por ello siempre es recomendable colocarle a las etiquetas html un atributo id="nombre_identificador". Y acá algo importante., los elementos del html se definen por un "name" y un "id", a esto hay que prestarle mucha atención ya que, Internet explorer confunde estos dos y en el caso de tener 2 etiquetas una con atributo "name" igual al "id" de otra etiqueta esto me daría un error. Por lo que recomiendo, directamente no utilizar name o que id y name tengan el mismo valor.


Llamar a un elemento
Cuando queremos "llamar" a un elemento a partir de un evento o un script en javascript, existen varios casos:

-Llamar un elemento dentro de si mismo: Para esto se utiliza el operado THIS, que indica que se va a referenciar atributos de si mismo, ejemplo
<div style="padding:valor" onclick="this.style.padding='valor_nuevo'"valor"> Contenido <\nombre_tipo>
En este ejemplo se crea una seccion y al hacer click se cambia su tamaño.

-Llamar a un elemento de mi documento: En caso de estar de utilizar JavaScript, simplemente se referencia utilizando document y para poder reconocerlo tenemos 3 formas.
document.getElementById('valor_id')
document.getElementByName('nombre')
document.getElementByTagName('nombre_tag')
Así obtendremos nuestro elemento html y podremos acceder a sus atributos.
El ejemplo anterior document.getElementById('pos').style.padding="nuevo_valor";

Algo a tener en cuenta: cuando queremos obtener el valor de por ejemplo un campo de texto debemos saber que dato se necesita realmente.
-Si inicializamos el campo con un contenido en particular ejemplo <imput type="text" id="campo" value="texto_inicial" > lo obtenemos..
var texto = document.getElementById('campo').getAttribute;
-Mientras que si queremos obtener los datos que se ingresan en el campo de texto sería..
var texto = document.getElementById('campo').value;

-Llamar a un elemento dentro de un form: Cuendo se tienen etiquetas dentro de un formulario, se puede referenciar el formulario para poder acceder al elemento. Por ejemplo teniendo:
<form name=nombre_formulario methodo=...> <imput name=nombre_campo type=text...>
Desde el javascript se llamaría:
var texto = document.nombre_formulario.nombre_campo.value;
Aclaracion: si se intenta obtener al comienzo de cargar la pagina va a dar error.

-Llamar a un elemento de otro frame: Supongamos que tenemos una pagina principal que tiene 2 frames (pueden ser mas), uno es <frame name="izquierda" src="izq.htm"> y el otro es <frame name="derecha" src="der.htm"> y queremos desde der.htm acceder a un elemento de izq.htm, simplemente lo referenciamos desde javascript de la siguiente forma:
top.nombre_frame.document.getElementById('valor_id')
ejemplo var texto= top.izquierda.document.getElementById('campo').value;

-Acceder a elementos en forma de arbol: Este tipo de métodos se creó básicamente para facilitar el recorrido de documentos xml, pero por su formato también es compatible con html.
Para esto se utiliza DOM (modelo de objeto de documento) implementado por varios lenguajes de programacion, permite obtener el documento como un conjunto de objetos. Para ello se obtiene el primer elemento, "nodo raíz"(en html como siempre se empieza por la etiqueta <html>) y se busca por nodo hijo. Un ejemplo sencillo..
<html>
<head>
<title>Titulo<\title>
<\head>
<body>
<\body>
<\html>

Si queremos ver los nodos hijo en JavaScript:
<script language="javascript">
//cargamos la raiz
var raiz = document.documentElement;
//obtenemos la cantidad de hijos
var cant = raiz.childNodes.length;
for(var i=0;i<=cant; i++){
//Escribir el nombre del nodo, en la posición "i"
//del conjunto de hijos de "raíz"
document.write(raiz.childNodes.item(i).nodeName+"<br>");
}
</script>


Esto devolvería "HEAD" y "BODY". Así, solo queda buscar el nodo que queremos y utilizar las propiedades anteriores como "getAttribute" etc.