elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
27 Mayo 2012, 15:32  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking Avanzado (Moderadores: ANELKAOS, TRICKY)
| | |-+  Doing Fingerprinting to CMS Programs. Use case, Joomla!.
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Doing Fingerprinting to CMS Programs. Use case, Joomla!.  (Leído 1,097 veces)
Preth00nker

Desconectado Desconectado

Mensajes: 43


Mov MyHeart, 4C6F7665h!!!


Ver Perfil
Doing Fingerprinting to CMS Programs. Use case, Joomla!.
« en: 13 Septiembre 2010, 18:49 »

Código:
###################################################################
#
#       Doing Fingerprinting to CMS Programs. Use case, Joomla!.
#                (dude.. What we got?)
#            Writen by  :  Preth00nker
#         Mail me at: Preth00nker@gmail.com
#
####################################################################


   [Abstract]

El siguiente documento pretende mostrar una técnica ocupada durante el transcurso de un pentesting común para delimitar con una precisión decente la versión (o posible rango de versiones) instalada del lado del servidor.
Probablemente esté de más comentar el objetivo o uso de poder descubrir dicho factor, sin embargo, haremos hincapié en que la mayoría de veces, el hecho de tener presente la versión del software instalado es uno de los primeros pasos que un atacante requiere, esto debido a que se puede obtener un mejor panorama del sistema en cuestión al cual se pretenda comprometer.
Continuando, podemos mencionar que esta técnica se extiende sobre muchas aplicaciones, tanto de código abierto como cerrado, sin embargo, para tener algo plausible utilizaremos el software de código abierto mencionado en el título, JOOMLA, en varias de sus versiones.
Por último mencionar que durante el desarrollo de la siguiente lectura, se exhorta al administrador/programador a ocupar un método intuitivo para no caer en este tipo de ataques.


   [Introducción]

Muchos proyectos en desarrollo requieren que, entre versión y versión, los archivos inherentemente cambien algunas partes, entendiendo el pasado enunciado como el cambio tanto al contenido, como en el nombre, fecha de modificación, fecha de creación, etc.. sin embargo, muchos de los archivos requeridos para el funcionamiento de la aplicación DEBEN poseer el mismo nombre, esto debido a la estandarización del proyecto, dicho evento será 'fundamental' para la técnica que enseguida se explica, ya que lo que se pretende será estandarizar un archivo entre versiones y comparar su contenido de una forma rápida y eficiente.


   [Explicación]

La técnica en cuestión es simple, lo que se pretende es hacer una diferenciación entre archivos públicos a los cuales cualquier usuario tiene acceso, debido a que son necesarios para que el navegador interprete tanto llamadas a funciones definidas por la aplicación del lado del cliente ( javascript/ .js ), o atributos especiales para la estilización de la aplicación ( Cascading Style Sheet / .css ), debido a esto, sería muy difícil llevar a cabo dicha diferenciación de forma manual, por tanto, para optimizar el proceso haremos un checksum (Suma de verificación del contenido) de dichos archivos, lo que nos dará como resultado la firma de la versión con la cual se está tratando en el lado del servidor.


   [Práctica]

Lo primero que se hizo durante el actual experimento fue descargar 5 versiones diferentes del CMS Joomla!, comenzando por las ver. 1.0.14, continuando con la 1.5, 1.5.10, 1.5.20 y finalmente 1.6.0, por cierto, para una lista extendida de las versiones del CMS Joomla! usted puede referirse al siguiente enlace (http://es.wikipedia.org/wiki/Joomla!#Versiones_2) donde se puede observar claramente la evolución entre las versiones.

Una vez descargados y extraídos dichos archivos (en un directorio limpio) se desea encontrar una asociación entre archivos con nombres y rutas comunes entre la evolución de las versiones, por tanto, contando con una instancia de terminal nos dirigimos al directorio de la versión 1.0.14 y corremos el siguiente comando

Código:
            r00t@Ph:~/clean/Joomla_1.0.14-Full_Package$ find ./ |grep .js$ > ../1.0.14.txt

lo que nos deja el archivo 1.0.14.txt en el directorio /clean/, así que enseguida ejecutamos (de nuevo desde nuestra terminal):

Código:
            r00t@Ph:~/clean/$ nano 1.0.14.txt
./includes/js/overlib_hideform_mini.js
./includes/js/joomla.javascript.js
./includes/js/calendar/lang/calendar-en.js
./includes/js/calendar/calendar_mini.js
./includes/js/calendar/calendar.js
./includes/js/ThemeOffice/theme.js
./includes/js/JSCookMenu_mini.js
./includes/js/jscalendar-1.0/lang/calendar-en.js
./includes/js/jscalendar-1.0/lang/cn_utf8.js
./includes/js/jscalendar-1.0/calendar_stripped.js
./includes/js/jscalendar-1.0/calendar-setup_stripped.js
./includes/js/tabs/tabpane.js
./includes/js/tabs/tabpane_mini.js
./includes/js/JSCookMenu.js
./includes/js/dtree/dtree.js
./includes/js/overlib_mini.js
./includes/js/wz_tooltip.js
./includes/js/mambojavascript.js
./mambots/editors/tinymce/jscripts/tiny_mce/langs/en.js

                           [ ... ]

Para nuestra sorpresa entre las 3 primeras lineas aparece lo que probablemente sea el archivo principal de las funciones donde se carga el código javascript desde el navegador del usuario, "./includes/js/joomla.javascript.js", ahora viendo el contenido observamos algo como lo siguiente

Código:
// <?php !! This fools phpdocumentor into parsing this file
/**
* @version $Id: joomla.javascript.js 5691 2006-11-09 00:55:42Z Saka $
* @package Joomla
* @copyright Copyright (C) 2005 Open Source Matters. All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* Joomla! is Free Software
*/

// general utility for browsing a named array or object
function xshow(o) {
s = '';
for(e in o) {s += e+'='+o[e]+'\n';}
alert( s );
}

/**
* Writes a dynamically generated list
* @param string The parameters to insert into the <select> tag
* @param array A javascript array of list options in the form [key,value,text]
* @param string The key to display for the initial state of the list
* @param string The original key that was selected
* @param string The original item value that was selected
*/

                           [ ... ]

así que bien, resta comprobar que en los directorios restantes el contenido exista y sea diferente, por tanto, corremos la siguiente linea:

Código:
            r00t@Ph:~/clean/$ find ./|grep joomla.javascript.js
                ./Joomla1.5_Stable_rev9961/includes/js/joomla.javascript.js
                ./Joomla_1.5.20-Spanish-pack_completo/includes/js/joomla.javascript.js
                ./Joomla_1.5.10-Spanish-pack_completo/includes/js/joomla.javascript.js
                ./Joomla_1.0.14-RC1-Full_Package/includes/js/joomla.javascript.js

resultando en algo bastante particular.. todas las versiones citadas al inicio parecen coincidir con el archivo joomla.javascript.js, con excepción de la más reciente. Ahora, no todo está perdido, tomando en cuenta que ninguna de las versiones anteriores dejó de contener dicho archivo, y en última instancia de tener en la mira un CMS que cumpla con una instalación de Joomla que NO CONSERVE dicho archivo en la URL http://servidor.com/includes/js/joomla.javacript.js, qué significaría?... exacto, estamos tratando con una versión 1.6.0, ahora que, no hace falta alarmarse tanto con las próximas versiones, sólo es caso de encontrar el archivo público principal del desarrollo e iterar con la técnica citada.
Continuando con nuestro análisis, la mayor parte de nuestra investigación está hecha, así que ocupando un poco de kung-foo-bash obtendremos las firmas digitales de los archivos en las versiones a nuestro alcance de la siguiente forma:

Código:
            r00t@Ph:~/clean/$ find ./|grep joomla.javascript.js|xargs md5sum
                b891f61dc9b85a9193592c9d13e9c97a  ./Joomla1.5_Stable_rev9961/includes/js/joomla.javascript.js
                cfdcbe9e7cba6dee3b2df7fba2e41dac  ./Joomla_1.5.20-Spanish-pack_completo/includes/js/joomla.javascript.js
                326412fc179cb787500adffada69c4e7  ./Joomla_1.5.10-Spanish-pack_completo/includes/js/joomla.javascript.js
                9570ccaab7cdac45e6727740515ce69a  ./Joomla_1.0.14-RC1-Full_Package/includes/js/joomla.javascript.js

finalmente comprobamos la teoría expuesta mediante un ejemplo real perteneciente a algún servidor público...

Código:
            r00t@Ph:~/clean/$ wget http://www.cudec.edu.mx/includes/js/joomla.javascript.js
                --2010-09-11 22:07:35--  http://www.cudec.edu.mx/includes/js/joomla.javascript.js
                Resolviendo www.cudec.edu.mx... 74.55.0.162
                Conectando a www.cudec.edu.mx|74.55.0.162|:80... conectado.
                Petición HTTP enviada, esperando respuesta... 200 OK
                Longitud: 15405 (15K) [application/x-javascript]
                Guardando a: «joomla.javascript.js»
                100%[=====================================>] 15,405      28.4K/s   en 0.5s   
                2010-09-11 22:07:36 (28.4 KB/s) - «joomla.javascript.js» guardado [15405/15405]


            r00t@Ph:~/clean/$ md5sum joomla.javascript.js
                cfdcbe9e7cba6dee3b2df7fba2e41dac  joomla.javascript.js

la cual corresponde según nuestra investigación a una versión Joomla! 1.5.20, así que el objetivo se ha concretado.


   [Notas finales]

Comentar que algo simple y rápido como la siguiente linea podría despistar a un atacante a la hora de detectar la versión de nuestro CMS, lo explicado a continuación no nos exenta (de ninguna manera) de ser atacados, sin embargo, es un buen comienzo.
Situándonos en el directorio raíz de nuestra instalación pública y corriendo el comando mostrado enseguida obtenemos algo parecido a lo siguiente..

Código:
            r00t@Ph:~/var/www/joomla1.x$ md5sum /etc/passwd;echo "\n";md5sum /etc/passwd|awk {'print "//"$1'} >> ./includes/js/joomla.javascript.js ;tail ./includes/js/joomla.javascript.js
                6847fe92eb2c0aa8e929132cbaff4522  /etc/passwd
                                for (i=0, n=f.elements.length; i < n; i++) {
                                     if (f.elements[i].name == name) {
                                       return f.elements[i];
                                     }
                                }
                        }
                return null;
                }
                //6847fe92eb2c0aa8e929132cbaff4522

Donde en la primera linea observamos el md5sum de nuestro archivo de permisos en el sistema (/etc/passwd), enseguida veremos la última parte del código y en la última linea veremos el mismo md5sum incluido como comentario al final del fichero, esto con el objetivo de modificar el la suma de verificación / firma digital del archivo, comentar que el factor de tomar el archivo /etc/passwd fue sólo para tener una cadena pseudoaleatoria incluida en el archivo Joomla.javascript.js.


   [ Despedida ]

Bien espero hayan llegado hasta esta parte de la lectura y pues para finalizar pedir una disculpa al administrador de http://www.cudec.edu.mx, esperando  que entienda que el material expuesto aquí fui con fines puramente ilustrativos y de aprendizaje.
Un saludo saludo y pues cualquier comentario por favor hagan lo llegar a través del correo citado en el encabezado de este archivo.

Greets: r3vz, itachi, dark-avenger, hkm, shaka, etal, and the complete team.
En línea

mov [MyBrain], IA
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines