BlogHacking Web Apps

Cómo: descubrir parámetros HTTP ocultos para encontrar puntos débiles en aplicaciones web

Hackear aplicaciones web a veces puede ser un desafío debido a la gran cantidad de partes móviles que poseen. En el núcleo de estas aplicaciones se encuentran las solicitudes y los parámetros HTTP, pero estas cosas a menudo se ocultan al usuario por motivos de seguridad, conveniencia o ambos. Sin embargo, se puede utilizar una herramienta llamada Arjun para descubrir parámetros HTTP ocultos en aplicaciones web.

Los parámetros HTTP, a veces llamados cadenas de consulta, son la parte de una URL que toma la entrada del usuario y la transmite a la aplicación web. Un ejemplo típico se verá así:

http://example.com/name?id=1

Cuando el servidor recibe la solicitud, procesará la consulta y devolverá un nombre con el ID de 1. A veces, como en los formularios web, se enviarán varios campos como la cadena de consulta. Por lo general, se verá algo como:

http://example.com/form?field1=v1&field2=v2

En ciertos casos, algunos de estos parámetros pueden estar ocultos a la vista. Por ejemplo, si un parámetro oculto de administración estaba configurado para Cierto, puede haber una funcionalidad diferente a la de un usuario normal.

Arjun es una herramienta de línea de comandos que busca parámetros HTTP ocultos mediante una lista de palabras de nombres de parámetros. Cuenta con múltiples subprocesos, manejo de límites de velocidad y permite agregar encabezados personalizados a las solicitudes. También es compatible con los métodos GET, POST y JSON, lo que lo convierte en un recurso valioso para probar aplicaciones web.

Descarga y configuración

Usaremos Metasploitable 2 como el objetivo y Kali Linux como nuestra máquina local, pero puede usar lo que le resulte cómodo cuando lo siga.

Lo primero que debemos hacer es descargar Arjun de GitHub. Podemos clonar fácilmente una copia del repositorio usando el clon de git mando:

~# git clone https://github.com/s0md3v/Arjun

Cloning into 'Arjun'...
remote: Enumerating objects: 226, done.
remote: Total 226 (delta 0), reused 0 (delta 0), pack-reused 226
Receiving objects: 100% (226/226), 159.03 KiB | 1024.00 KiB/s, done.
Resolving deltas: 100% (104/104), done.

Ahora simplemente cambie al nuevo directorio usando CD:

~# cd Arjun/

Y podemos enumerar el contenido con el ls mando:

~/Arjun# ls

arjun.py  CHANGELOG.md  core  db  LICENSE  README.md

Arjun necesita Python versión 3.4 o superior para funcionar correctamente, y podemos ver si está instalado en nuestro sistema usando el cual mando:

~/Arjun# which python3

/usr/bin/python3

Y podemos comprobar el número de versión con el -V cambiar:

~/Arjun# python3 -V

Python 3.7.5rc1

Si Python 3.4 o superior no está en nuestro sistema, podemos instalarlo a través del administrador de paquetes:

~/Arjun# apt-get install python3

Eso debería ser todo lo que necesitamos para empezar.

Arjun en acción

Siempre es una buena idea consultar el menú de ayuda cuando se enfrenta a una nueva herramienta. Utilizar el -h bandera para ver la ayuda de Arjun y los argumentos opcionales:

~/Arjun# python3 arjun.py -h
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

usage: arjun.py [-h] [-u URL] [-o OUTPUT_FILE] [-d DELAY] [-t THREADS]
                [-f WORDLIST] [--urls URL_FILE] [--get] [--post]
                [--headers [HEADERS]] [--json] [--stable] [--include INCLUDE]

optional arguments:
  -h, --help           show this help message and exit
  -u URL               target url
  -o OUTPUT_FILE       path for the output file
  -d DELAY             request delay
  -t THREADS           number of threads
  -f WORDLIST          wordlist path
  --urls URL_FILE      file containing target urls
  --get                use get method
  --post               use post method
  --headers [HEADERS]  add headers
  --json               treat post data as json
  --stable             prefer stability over speed
  --include INCLUDE    include this data in every request

La forma más básica de ejecutar la herramienta es proporcionando una URL válida: utilice el -u bandera para hacerlo:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters
[+] Heuristic found a potential post parameter: phpMyAdmin
[!] Prioritizing it
[+] Heuristic found a potential post parameter: db
[!] Prioritizing it
[+] Heuristic found a potential post parameter: table
[!] Prioritizing it
[+] Heuristic found a potential post parameter: lang
[!] Prioritizing it
[+] Heuristic found a potential post parameter: convcharset
[!] Prioritizing it
[+] Heuristic found a potential post parameter: token
[!] Prioritizing it
[+] Heuristic found a potential post parameter: pma_username
[!] Prioritizing it
[+] Heuristic found a potential post parameter: pma_password
[!] Prioritizing it
[+] Heuristic found a potential post parameter: server
[!] Prioritizing it
[~] Performing heuristic level checks
[!] Scan Completed
[+] Valid parameter found: db
[+] Valid parameter found: phpMyAdmin
[+] Valid parameter found: table
[+] Valid parameter found: target
[+] Valid parameter found: GLOBALS
[+] Valid parameter found: pma_username

Podemos ver que comienza a analizar la página, buscando posibles parámetros HTTP que puedan estar ocultos. Encuentra algunos válidos y nos da los resultados en la parte inferior.

También podemos especificar qué tipo de datos de solicitud utilizar. Por ejemplo, para buscar parámetros GET, simplemente agregue el –obtener opción:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/ --get
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters

...

Para buscar parámetros POST, utilice el –correo opción:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/ --post
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters

...

Y para buscar parámetros JSON, use el –json opción:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/ --json
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters

...

También podemos proporcionar a Arjun una lista de varias URL para usar en lugar de una sola. Utilizar el –urls bandera seguida del nombre del archivo que contiene la lista de URL:

~/Arjun# python3 arjun.py --urls urls.txt
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Scanning: http://10.10.0.50/phpMyAdmin/
[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters

...

En la misma línea, podemos usar nuestra propia lista de palabras que contiene nombres de parámetros personalizados en lugar del predeterminado que usa Arjun. Utilizar el -F bandera seguida del nombre de la lista de palabras personalizada:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/ -f parameters.txt
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters

...

Arjun también nos permite establecer el número de subprocesos a usar, siendo dos el valor predeterminado. Utilizar el -t interruptor seguido del número de hilos deseados:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/ -t 16
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters

...

También podemos establecer el retraso entre solicitudes con el -D bandera:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/ -d 5
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters

...

Para objetivos particularmente complicados, podemos usar el –estable opción, que establecerá el número de subprocesos en 1 y el retraso en un número aleatorio de segundos entre 6 y 12:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/ --stable
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters

...

Arjun hace que sea fácil guardar los resultados en formato JSON; solo use el -o cambiar seguido del nombre del archivo de salida:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/ -o results.json
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters
[+] Heuristic found a potential post parameter: phpMyAdmin
[!] Prioritizing it
[+] Heuristic found a potential post parameter: db
[!] Prioritizing it
[+] Heuristic found a potential post parameter: table
[!] Prioritizing it
[+] Heuristic found a potential post parameter: lang
[!] Prioritizing it
[+] Heuristic found a potential post parameter: convcharset
[!] Prioritizing it
[+] Heuristic found a potential post parameter: token
[!] Prioritizing it
[+] Heuristic found a potential post parameter: pma_username
[!] Prioritizing it
[+] Heuristic found a potential post parameter: pma_password
[!] Prioritizing it
[+] Heuristic found a potential post parameter: server
[!] Prioritizing it
[~] Performing heuristic level checks
[!] Scan Completed
[+] Valid parameter found: GLOBALS
[+] Valid parameter found: db
[+] Valid parameter found: phpMyAdmin
[+] Valid parameter found: table
[+] Valid parameter found: target
[+] Valid parameter found: pma_username
[!] Saving output to JSON file in results.json

Otra característica útil es la capacidad de incluir datos específicos que se enviarán con cada solicitud. Utilizar el –incluir opción con la cadena de datos que se enviará entre comillas:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/ --include 'data=test'
    _
   /_| _ '
  (  |/ /(//) v1.6
      _/

[~] Analysing the content of the webpage
[~] Analysing behaviour for a non-existent parameter
[!] Reflections: 0
[!] Response Code: 200
[!] Content Length: 4145
[!] Plain-text Length: 474
[~] Parsing webpage for potential parameters

...

También podemos utilizar el –cabeceras opción, que nos permitirá enviar información de encabezado con la solicitud:

~/Arjun# python3 arjun.py -u http://10.10.0.50/phpMyAdmin/ --headers

Eso abrirá un editor de texto (nano por defecto), lo que nos permitirá pegar cualquier encabezado directamente en:

GNU nano 4.5                                                                                      /tmp/tmptvwpv4kd
Host: EXAMPLE
Accept: TEST
Referer: https://www.google.com

El editor predeterminado se puede cambiar en /core/prompt.py a un editor de su elección.

Terminando

Hoy, aprendimos un poco sobre los parámetros HTTP y cómo a veces se pueden ocultar a la vista. Arjun es una herramienta que se puede utilizar para exponer estos parámetros ocultos, lo que aumenta la visibilidad de la superficie de ataque de una aplicación web. Exploramos la herramienta y algunas de sus opciones, incluida la capacidad de usar diferentes métodos de solicitud, subprocesos personalizados y demoras, datos de solicitud persistentes y más. Arjun es una pequeña y agradable herramienta de la que puede beneficiarse cualquier persona que se tome en serio el ataque de aplicaciones web.

Imagen de portada de drd_ / Null Byte

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar