Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
En esta práctica veremos como hacer fingerprinting de archivos usando FOCA.
En esta oportunidad vamos a hacer un scan con la herramienta llamada FOCA (Fingerprinting Organizations with Collected Archives).
Para esta práctica voy a usar www.globant.com
como objetivo inicial para conocer un poco sobre FOCA
y su uso. Luego usaremos algún otro objetivo para ver casos donde haya metadata
expuesta.
Como primer paso configuramos el proyecto y el dominio
objetivo:
Una vez listo, seleccionamos las extensiones de archivo
que queremos que sean tomadas en cuenta por FOCA
al realizar el scan:
Una vez listo, hacemos click
en Search All
para iniciar el scan
. Una vez que FOCA
comienza a detectar archivos los vemos listados debajo de la selección de extensiones de archivos:
Una vez tenemos resultados disponibles, podemos hacer click derecho
sobre cualquiera de los archivos listados y darle click
en Download
para descargarlo y ver que información podemos obtener del mismo:
Una vez descargado el documento aparece listado en el tree view
y podemos observar algunos detalles del mismo.
Para ver los detalles de la metadata
del archivo necesitamos volver a la lista de archivos y luego darle click derecho
al archivo deseado y click
en Extract All metadata
y luego Analyze all metadata
.
En este caso no obtenemos información importante dado que estos documentos ya fueron sanitizados antes de ser publicados. Pero en caso de obtener algún detalle importante de la metadata
de los mismos, FOCA
listara los diferentes tipos de información en el tree view
para que podamos revisarlos:
Si vemos un ejemplo de un archivo que si expone ciertos datos en su metadata
veremos como esta información es presentada en FOCA
:
Vemos que entre los resultados obtenemos:
La dirección IP del servidor
El Software usado para crear el Archivo
El User usado al crear el archivo
Cada archivo escaneado puede exponer distintas piezas de información que nos dejan obtener una imagen más completa del objetivo durante la etapa de reconocimiento.
En este otro ejemplo vemos que un PDF del campus de la UTN revela diferentes detalles al analizarlo:
En este caso obtenemos algunas carpetas
(Folders), algunos emails
y la versión del software
usado en la creación del documento.
Algunos documentos revelan mucha más información:
En este caso podemos ver que la metadata
extraída de ciertos documentos, exponen cuentas de usuarios, correos, impresoras, carpetas, incluso otros servidores. Claramente sanitizar los documentos antes de compartirlos es clave para prevenir que agentes externos puedan obtener detalles potencialmente sensibles con herramientas como FOCA
.
En esta práctica veremos como usar Maltego para realizar un footprinting.
En esta práctica usaremos Maltego
en su versión gratuita (Community Edition
) para entender como podemos, utilizando esta herramienta, llevar a cabo un footprinting
de una web objetivo.
En Maltego los "Módulos" se llaman Transforms
cada uno de ellos aporta funcionalidades y diversos tipos de scans
que podemos utilizar.
Para instalar transforms
, Maltego dispone de una sección llamada transform hub
:
El hub
es una suerte de store o market
donde podemos encontrartransforms
pagos, gratuitos y algunos que ofrecen free trials (pruebas gratuitas). Disponemos de filtros
para refinar nuestra búsqueda. En este caso en particular usaremos todos transforms gratuitos
para hacer nuestra práctica de reconocimiento web.
En mi caso voy a utilizar los siguientes transforms gratuitos:
La instalación de los transforms
es sencilla, basta con clickear
cada una y elegir la opción install
. Luego una ventana se abrirá para comenzar la instalación.
Algunos transforms
como el de Shodan
, requieren una API Key
para funcionar y pedirán la misma durante la instalación:
El objetivo de esta práctica es generar un reconocimiento web usando Maltego y los transforms
que instalamos previamente.
Para iniciar generamos un nuevo graph
desde el menú de Maltego:
Una vez creado vemos que disponemos de una suerte de canvas
vacío donde vamos a poder organizar los elementos de nuestro scan. Estos elementes en Maltego se llaman Entities
. Podemos ver una lista de cada una en el panel a la izquierda
de nuestro canvas
, diferenciados por categorías.
Las Entities
nos permiten ubicar en el canvas
los distintos tipos de dispositivos
, eventos
, infraestructuras
, locations
, Personal
, etc.
Para comenzar nuestro scan, buscamos en la lista de entidades la entidad llamada Domain
:
Para agregar nuestra entidad al canvas
, basta con arrastrarla y soltarla sobre el mismo. Por default esta entidad apunta a paterva.com
. Necesitamos ajustar ese valor y apuntarlo a nuestro objetivo. Para ello disponemos de 2 formas:
Opción 1: Hacer doble click
en el texto
de la entidad
y cambiar el valor
al dominio objetivo
:
Opción 2: Editar el dominio
usando el panel de propiedades de la entidad
(este panel es genérico a cualquier entidad
que tengamos seleccionada):
En mi caso utilizaré como objetivo
una web de noticias online:
https://semanarionuestragente.com/
En Maltego cada entity
nos ofrece diversos tipos de scan (en realidad también son llamados transforms
). Los mismos son habilitados por los transforms
que tengamos instalados. Cada entidad puede contener distintos tipos de scans
disponibles según su tipo. Para ver los scans
disponibles, podemos hacer click derecho
sobre la entidad:
Vemos que el menú contextual que se despliega es llamado Run Transforms
. El mismo nos presenta cada transform
instalado, podemos hacer click
sobre alguno en particular o bien hacer click
en All Transforms
para ver la lista completa de opciones disponibles:
Comenzaremos por hacer un scan del tipo whois
. Podemos usar la barra de búsqueda del menú contextual para refinar la lista y por ejemplo ver los scans
de tipo whois
que están disponibles:
En este caso probaremos el transform
(scan) llamado to DNS - NS (Name Server)
. Al hacerle click
el scan/transform
seleccionado es ejecutado. Vemos que luego de un momento 2
nuevas entidades aparecen en nuestro canvas
. También podemos ver que cada transform/scan
genera un log
al ejecutarse que se muestra en la ventada de output
debajo del canvas
:
De esta manera vemos que obtenemos ambos Name Servers
que están vinculados a nuestro objetivo. Estas nuevas entidades nos permiten correr scans
adicionales. Veamos cuales están disponibles para ns69.domaincontrol.com
:
Probemos correr el transform
llamado To Domains [Sharing this NS]
y al correr vemos que nos actualiza el canvas
con todos los dominios que también utilizan ese mismo Name Server
:
Ya nos podemos ir dando una idea del potencial de Maltego para hacer reconocimiento de nuestros objetivos.
Tomemos para nuestro próximo scan a jamibgoode.com
y corramos el transform
llamado To Email Address [from whois info]
:
Vemos que de esta manera logramos listar el correo que esta especificado en los registros de whois
para ese dominio. De esta forma podemos comenzar a obtener información sobre nuestro objetivo, pero Maltego también nos ofrece otra forma automatizada de realizar escaneos de footprinting
usando lo que se llama machines
.
Maltego pone a nuestra disposición diferentes machines
que son una suerte de scans pre-seteados
que podemos ejecutar automáticamente para el dominio objetivo que hemos definido. Veamos como podemos usar machines
para hacer footprinting
, esta vez para el dominio kimballoon.com
:
Primero ubicamos la machine
que deseamos ejecutar, para esta práctica usaremos la llamada Footprint L1
. Basta con hacer click
en la machine deseada para ejecutarla:
En la versión community
de Maltego
esta limitada la funcionalidad y potencia de estas machines.
Luego de ejecutar la machine
, en la parte superior derecha de la pantalla de Maltego vemos el resultado de los scans/transforms
ejecutados por dicha machine
. Y al ver el canvas
vemos que tenemos múltiples nuevas entidades
, cada una de las cuales nos sigue proveyendo de información adicional para nuestro esfuerzo de footprinting
:
Vemos que en este caso el footprinting
realizado nos genera en nuestro canvas
una considerable cantidad de nuevas entidades
de variados tipos. Cada una de las cuales nos permite seguir utilizando transforms
adicionales para intentar conseguir información y detalles adicionales que luego podemos recopilar para tener un panorama lo más completo posible de nuestro objetivo.
Como podemos observar el poder de Maltego es considerable y la facilidad de uso que nos ofrece la convierte en una herramienta formidable para nuestros esfuerzos de footprinting
y
reconocimiento.
Durante esta simple práctica vimos algunas de las funcionalidades que Maltego ofrece, ciertamente hay muchas más por descubrir, aprender y utilizar. Espero que este texto sea útil y sirva para comenzar a explorar esta poderosa herramienta.
En esta práctica veremos como están formados los archivos passwd y shadow en Linux y SAM en Windows y como se maneja la autenticación en estos SO.
passwd
y shadow
Objetivo de la Practica del curso de CEH de la UTN:
Dentro de los entornos de los distintos SO, encontraremos archivos que tienen una gran importancia respecto a la autenticación, son el archivo passwd
y el shadow
, de las distribuciones de LINUX o el archivo SAM
de Windows. El ejercicio de aquí es analizar y detallar esos archivos y describirlos lo mejor posible.
Anteriormente en Linux las credenciales de usuario solían ser almacenadas directamente en el archivopasswd
. No obstante por limitaciones y cuestiones de seguridad actualmente solo almacena información de las cuentas de usuarios, mientras que los hashes de los passwords se almacenan en el archivo shadow
.
El archivo se encuentra comúnmente en la siguiente ubicación /etc/passwd
y su contenido es de texto plano. Generalmente el acceso de solo lectura es permitido dado que muchas utilidades utilizan su contenido para relacionar IDs
a las correspondientes cuentas de usuario. Dentro del mismo podemos encontrar una lista de system accounts
. De cada cuenta se exponen las siguientes piezas de información: Username
, Password
, UID
, GID
, UserID Info
, Home Dir
, Command/Shell
. Veamos que significa cada uno y como es la estructura general de este archivo y sus datos.
/etc/passwd
Ya mencionamos que el archivo passwd
almacena información en texto plano. Dicha información es almacenada de a una entrada por línea. Cada línea delimita sus campos usando los dos puntos :
.
Veamos un diagrama de la estructura de cada línea.
Veamos una descripción sobre que función cumple cada una de las partes:
Username: Comúnmente usado para el proceso de login, de longitud entre 1 y 32 caracteres.
Password: Un carácter x
que indica que el password hash esta almacenado en el archivo /etc/shadow
.
UID (User ID): A cada user se le asigna un ID
, siendo 0
reservado para el root
, los de 1 a 99
reservados para cuentas predefinidas, los de 100 a 999
reservados para cuentas administrativas y de sistema. Finalmente los IDs superiores a 1000
son asignados para los usuarios.
GID (Group ID): El grupo primario al que pertenece el user, almacenado en /etc/groups
.
UserID Info: Permite almacenar información adicional del usuario, como ser el nombre del servicio
(service accounts) o detalles del tipo Nombre completo del user
.
User Home Directory: La ruta absoluta la carpeta home del user en cuestión.
Comando o Shell: Indica el shell
o comando
. Comúnmente es un shell
pero no es siempre el caso.
Permisos: Este archivo suele ser de solo lectura
para los usuarios y propiedad de root
.
/etc/passwd
Veamos que contenido obtenemos al ejecutar el comando en alguna de nuestras máquinas virtuales.
cat /etc/passwd
vemos que los resultados incluyen una larga lista de cuentas de administración, servicios y finalmente usuarios.
/etc/shadow
Ya mencionamos que actualmente las credenciales en Linux residen en gran parte en el archivo /etc/passwd
pero también mencionamos que el password hash
de cada usuario se almacena en el archivo llamado /etc/shadow
. Veamos en detalle como es la estructura de este otro archivo.
De igual forma que en el archivo /etc/passwd
la data dentro de /etc/shadow
se almacena también línea por línea. Incluso cada una de las líneas de este archivo se corresponde 1 a 1 con las del archivo password
.
Incluso existen herramientas como unshadow
(parte de JohnTheRipper) que nos permite recombinar los archivospasswd
y shadow Para luego crackearlos rápidamente con
John.
Username: El Nombre del usuario.
Password Encriptado: El password encriptado, usualmente sigue un patrón de este estilo $tipo$Sal$Hash
.
Donde el tipo
es el algoritmo de hash que fue usado para encriptar el password.
$6$: Indica el uso de SHA-512.
$5$: Indica el uso de SHA-256.
$2a$: Indica el uso de Blowfish.
$1$: Indica el uso de MD5 Hash.
$2y$: Indica el uso de Eksblowfish.
La Sal
(salt
en ingles): es un valor que se utiliza para garantizar la aleatoriedad del hashing, de manera que el hash resultante siempre sea distinto.
Finalmente el Hash value
: El resultado de hash generado para el encriptado de nuestro password.
Ultimo cambio de password: Representa una fecha en días, contando desde el primero de enero de 1970 hasta el día de hoy.
Edad mínima del password: Normalmente se setea en cero indicando que el no hay un mínimo establecido para la caducidad del password. Si contiene otro valor, el mismo representa la cantidad de días que deben transcurrir para cambiar el password.
Edad máxima del password: Número de días antes de que el password expire.
Período de Advertencia: La cantidad de días antes de que el password expire. Por ejemplo un valor de 6 le recordará al usuario cambiar el password 6 días antes de que el password caduque.
Período de Inactividad: El número de días luego de que el password haya vencido donde la cuenta de usuario quedará desactivada. Normalmente esta en cero.
Fecha de expiración: La fecha donde la cuenta de usuario fue efectivamente deshabilitada.
Sin Uso (Reservados para futuro uso): Actualmente es ignorado, se guarda para futuros posibles usos.
Hasta acá vimos como esta compuestos los archivos /etc/passwd
y /etc/shadow
y como se organiza y encripta la información dentro de ellos.
En Windows las contraseñas son almacenadas en el archivo SAM. Este archivo es en realidad una base de datos, donde Windows almacena las contraseñas en formato de hashes. Para generar estos hashes Windows ha utilizado distintos mecanismos a lo largo de las versiones. En particular nos centraremos en las siguientes: LM, NT-Hash(NTLM, NTLMv1 y NTLMv2)
.
LM Hash es la forma antigua en la que Windows almacenaba las contraseñas y se remonta a los años '80. Las principal desventaja de este hash es que trabajaba con un set de caracteres limitados (14 caracteres), lo cual lo convertía en uno muy fácil de crackear. Internamente los hashes se generan mediante un mecanismo muy débil en general y la longitud del set de caracteres no es su única desventaja.
Veamos rápidamente como opera el algoritmo LM:
Conversión: Se convierten todas las letras minúsculas de la contraseña a letras mayúsculas.
Modificación: Se agregan al password caracteres nulos (NULL) hasta completar los 14 caracteres.
División: Se separa el password en dos bloques, cada uno de 7 caracteres.
Generación de KEYs: Se generan 2 claves DES para cada bloque.
Cifrado: Se cifra cada bloque con DES y un texto fijo con el valor KGS!@#$%
.
Hash Generado: El hash se genera en base a la concatenación de ambos bloques encriptados con DES.
Considerando la facilidad con la que se puede crackear, LM Hash fue desactivado por defecto con la salida de Windows Vista y Windows Server 2008. No obstante aún se mantiene una retro compatibilidad para sistemas legacy y puede ser activado manualmente mediante una Group Policy (GPO).
Como podemos observar los Hashes generados para cada contraseña en formato LM resultan iguales luego de la conversión, esto se debe al primer paso que lleva adelante el algoritmo, la conversión de minúsculas a mayúsculas. Si observamos los hashes resultantes en formato NTLM, vemos que son diferentes para cada contraseña.
Veamos que tan sencillo es crackear ese hash usando una herramienta como hashcat
.
hashcat -m 3000 -a 3 hash
Dentro de la VM demoró 10min aproximadamente en crackear el password:
Como vemos es relativamente simple y rápido el proceso de crackeo de los hashes LM.
Actualmente en Windows se utiliza un mecanismo de hash conocido como NT Hash o NTLM Hash. Existen varias versiones de este hash que han ido mejorando la seguridad del mismo. Veamos rápidamente las características principales de cada versión.
El protocolo NTLM es un sistema del tipo Challenge-Response
el cual utiliza el intercambio de 3 mensajes para autenticar al cliente y un cuarto mensaje opcional para la integridad del intercambio. El hash tiene una longitud de 128 bits y funciona tanto para cuentas locales como para cuentas de dominio de Active Directory.
El algoritmo para este protocolo es bastante simple para la generación del hash, y hace uso de ambos tipos de hash: LM Hash y NT Hash
. Esta versión 1 de NTLM ya esta deprecada siendo actualmente mantenida para retro compatibilidad con sistemas viejos.
El algoritmo para esta versión de NTLM es bastante simple de comprender a alto nivel:
Conversión: Se convierte la contraseña a Unicode (UTF-16-LE).
Modificación: Para cada carácter agrega un 0 (Zero byte)
Hashing: Finalmente aplica el algoritmo MD4 al resultado del proceso anterior.
El algoritmo en concreto se puede consultar en Wikipedia, pero para referencia se ve así:
Veamos como podemos crackear este nuevo hash usando hashcat
y un hash de ejemplo.
u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c
hashcat -m 5500 -a 3 ntlm_v1_hash
Esta vez le tomó a hashcat unos 5 minutos aproximadamente para crackear el hash.
Como podemos notar el proceso de crackeo de la versión NTLMv1 es también relativamente simple y rápido.
La versión 2 de NTLM continúa usando el protocolo NTLM de formato challenge-response
que vimos antes, pero incorpora mejoras de seguridad y criptografía para hacerlo más seguro y reemplazar a NTLMv1. También se incorpora el uso de HMAC-MD5 como algoritmo de Hashing y se incorpora el nombre de dominio como variable para el proceso de autenticación.
Negociación: Se genera el challenge de 8 bytes
y es emitido por el server.
Respuesta: Se generan 2 bloques de 16 bytes con hashes HMAC-MD5
a modo de respuesta al challenge
. Estos bloques de respuesta incluyen también un challenge
generado en el lado del cliente, el password hash (HVAC-MD5) y puede incluirse otra información de identificación.
Respuesta Corta (shorter-response): En este bloque de respuesta se incluyen los 8 bytes del challenge
del lado de cliente y los 16 bytes de del bloque
. Esto genera un bloque de respuesta de 24 bytes
consistente con el formato usado en NTLMv1
.
Segunda Respuesta: El segundo bloque de respuesta usa un challenge
de longitud variable, que incluye entre otras cosas: el horario actual en formato NT Time
, un valor aleatorio de 8 bytes
, el nombre de dominio
e información estándar adicional. Considerando que esta respuesta debe incluir el challenge
del lado del cliente, su longitud variara en cada caso.
El hash resultante se puede apreciar en el siguiente ejemplo obtenido en la página de hashes de hashcat:
admin::N46iSNekpT:08ca45b7d7ea58ee:88dcbe4446168966a153a0064958dac6:5c7830315c7830310000000000000b45c67103d07d7b95acd12ffa11230e0000000052920b85f78d013c31cdb3b92f5d765c783030
El algoritmo se puede ver en detalle en el artículo de Wikipedia, el cual proporciona información adicional.
Hasta aquí vimos los diferentes tipos de manejos de passwords en Windows. Para no terminar la práctica sin aprender alguna herramienta que nos permita interactuar con estos hashes almacenados en SAM, veamos como podemos extraer estos hashes de un host Windows
usando mimikatz
y posteriormente crackearlos usando hashcat
. No obstante no ahondaremos en detalle en como utilizar mimikatz en sí, sino que lo utilizaremos rápidamente para hacer un dump de los hashes. Quizás cubra el uso de mimikatz en otro escrito a futuro, dado que es una herramienta sumamente interesante.
Deberás desactivar Windows Defender, dado que mimikatz es detectado como archivo malicioso.
El primer paso es obtener una copia del archivo SAM, para lo cual usaremos la terminal de Powershell (como Admin) y copiaremos los archivos SAM
y SYSTEM
a nuestra carpeta de trabajo.
Deberíamos tener algo similar a esto luego de realizar ese proceso:
Ahora necesitamos abrir una consola, idealmente como administrador, y navegar hasta la carpeta donde tenemos nuestro export y mimikatz
.
Lo siguiente es ejecutar mimikatz desde la terminal de Windows (PowerShell):
Ahora debemos indicarle a mimikatz que queremos extraer los hashes de archivo SAM y para ello debemos hacer uso del siguiente comando:
Como vemos mimikatz extrae los hashes presentes en la base de datos de SAM:
Por último usaremos nuevamente a nuestro amigo fiel hashcat
para tratar de crackear el password de la cuenta administrador
. Como podemos ver el hash esta en formato NTLM.
hashcat -m 1000 -a 3 hash
Hashcat demora nuevamente unos minutos en crackear el hash.
Hasta aquí hemos visto como funciona el manejo de passwords tanto en Linux como en Windows y como podemos crackear distintos tipos de hashes usando mimikatz
y hashcat
. Cabe mencionar que también existe otro protocolo de autenticación que no hemos visto en esta práctica llamado Kerberos
que es comúnmente usado para autenticación contra dominios como Active Directory
.
Kerberos no forma parte del alcance de esta práctica y lo veremos en detalle más adelante.
Ha sido una práctica extensa y que me ha permitido estudiar bastante sobre los temas cubiertos, principalmente sobre el funcionamiento de autenticación en Windows que no lo tenía muy presente.
En esta práctica veremos el uso básico de Wireshark para el análisis de paquetes de red.
Wireshark es un analizador de protocolos de red más utilizado del mundo. Permite ver lo que está sucediendo en la red en detalle y es el estándar en muchas empresas comerciales y sin fines de lucro, agencias gubernamentales e instituciones educativas. Wireshark es la continuación de un proyecto iniciado por Gerald Combs en 1998 llamado Ethereal.
Al abrir Wireshark nos aparecerá una pantalla similar a la siguiente, veremos a continuación los controles más importantes que usaremos de aquí en adelante.
Filtros:
Una de los controles que más usaremos en Wireshark es la barra de filtros. Mediante el uso de filtros podemos identificar los paquetes que cumplan uno o más criterios de filtrado. Veremos lo básico de filtros más adelante.
Archivos Recientes
: Esta sección (Vacía por default al instalar Wireshark de cero) recopila los últimos archivos PCAP que hayamos abierto. También nos permite abrir archivos directamente haciendo click en el texto Open
.
Interfaces para Captura:
En esta sección podemos ver el listado de las interfaces presentes en el equipo donde se ejecuta Wireshark. Esta sección varía de equipo a equipo. Se puede seleccionar una interfaz en particular y comenzar a escuchar su trafico de red haciendo doble click sobre el nombre de la interfaz. El gráfico representa la actividad de red en cada interfaz.
En Wireshark los paquetes se clasifican por color según el tipo de protocolo usado y errores encontrados en estos. Para poder ver las reglas de colores para los paquetes de red, vamos a: View -> Coloring Rules
.
Como podemos observar Wireshark nos presenta todas las reglas de coloreado que están actualmente configuradas.
Es importante tener presente esta configuración de colores y comenzar a familiarizarnos con ella, dado que es una forma visualmente sencilla de identificar paquetes y protocolos de forma rápida.
Existe una gran cantidad de filtros disponibles en Wireshark que nos permitirán refinar nuestras búsquedas hasta encontrar el tráfico de red específico a una dirección IP, MAC Address, Tipo de Protocolo, etc. No cubriremos todos los posibles filtros en esta sección, nos limitaremos a los necesarios para entender el funcionamiento general de los mismos y los usaremos a lo largo de esta práctica.
Los filtros en Wireshark utilizan operadores lógicos
y operadores de comparación
como en los lenguajes de programación. Haciendo uso de estos operadores podemos combinar nuestros filtros para realizar filtrados refinados para encontrar exactamente el tráfico de red que queremos capturar y ver.
Los operadores de comparación nos permiten comparar valores en nuestras expresiones de filtrado. Estos operadores son los siguientes:
Los operadores Lógicos
nos permiten comparar expresiones de filtrado. Estos operadores son los siguientes:
Cabe destacar que en Wireshark los filtros se clasifican en dos grandes grupos, Capture Filters
(Filtros de Captura) y Display Filters
(Filtros de visualización). Veamos a continuación un breve detalle de cada uno.
Los filtros de captura son aplicados antes de iniciar la captura de paquetes y no pueden ser alterados durante la captura. Si prestamos atención en la pantalla inicial de Wireshark, este control también se presenta como una barra de búsqueda en la sección Capture
:
Este tipo de filtros nos permite por ejemplo capturar el tráfico de un rango de IP en particular, el tráfico de un tipo de protocolo en particular, el tráfico únicamente del protocolo IPV4, etc.
Cabe mencionar que estos filtros también son accesibles desde el menu de Wireshark: Capture -> Options (CTRL + K)
.
En esta ventana también podemos activar/desactivar el modo promiscuo de Wireshark.
Promiscuous mode: En modo activo Wireshark tratará de detallar todo paquete de red que vea en la interfaz, este o no dirigido a nuestro equipo. Non-Promiscuous Mode: En este modo Wireshark únicamente interceptará el tráfico de red de la interfaz seleccionada si su origen o destino es dirigido a nuestro equipo.
Veamos ahora como podemos capturar las credenciales de logueo a un servicio de FTP analizando el trafico de red de una interfaz. Cabe destacar que este mismo proceso de análisis puede llevar a cabo de igual manera luego de abrir archivo PCAP/PCAPNG
.
Para esta práctica voy a utilizar lo siguiente:
Interfaz: eth0
Puerto: 21
Para comenzar en la pantalla principal de Wireshark aplicaremos un filtro de captura, seleccionando únicamente la interfaz eth0. Para lo cual podemos directamente hacer doble click sobre el nombre de la interfaz:
Luego de esto Wireshark comenzará a capturar el tráfico de red de esa interfaz automáticamente. Dejamos la captura activa y nos dirigimos a la terminal para conectarnos por FTP
a nuestra VM
e intentamos loguearnos. Luego de esto volvemos a Wireshark
y hacemos click en el botón rojo de stop para detener la captura.
Comenzamos conectándonos al servidor FTP, en este caso usé un usuario recientemente configurado para el acceso a FTP.
Una vez detenido el proceso de captura, debemos ver algo similar a esto en Wireshark:
Ahora hagamos usos de distintos filtros que nos permitan ubicar específicamente el tráfico FTP. Por ejemplo podemos filtrar por el trafico en el puerto 21:
Y como podemos ver Wireshark aplica el Display Filter correspondiente sobre los resultados:
Alternativamente podemos directamente filtrar por el protocolo FTP simplemente escribiendo:
También nos puede interesar ver el tráfico del puerto 20 (FTP-DATA)
junto con el del puerto 21 (FTP)
:
Filtremos directamente por ftp y hagamos click derecho en el paquete número 58 y elegimos la opción Follow -> TCP Stream.
De esta manera podemos seguir el paso a paso del trafico de red generado por nuestro intento de login al la maquina virtual Windows Server.
Combinación de teclas para TCP Stream: CTRL + ALT + SHIFT + T
Al abrirse el TCP Stream, veremos la secuencia de interacción entre el usuario y el servicio FTP. Vemos que el usuario listó los archivos del directorio y descargo el mismo.
Como podemos ver las credenciales de login fueron ftpuser:Test123
y el usuario descargó el archivo Executive_Secrets.txt
desde el servidor FTP a su equipo. Veamos como podemos ubicar esta acción en el tráfico de red y extraer los contenidos de ese archivo.
Primero filtremos por ftp-data
:
Luego seleccionamos el paquete 386
donde se hace la transferencia del archivo (RETR)
, y seguimos el TCP Stream
como vimos antes.
Finalmente podemos ver el contenido del archivo descargado por el usuario durante la sesión FTP. Y podemos guardarlo en nuestro equipo haciendo uso de las opciones que nos provee Wireshark.
Wireshark nos permite cambiar el formato en el que se muestra la data, lo que es útil si en lugar de una archivo de texto plano estuviéramos tratando de recuperar un ejecutable por ejemplo. En ese caso podemos ver el contenido en modo raw
y guardarlo como .exe
.
Hasta acá vimos como usar lo básico de Wireshark
y repasamos algunos de los filtros que nos serán de utilidad a la hora de analizar tráfico de red. Wireshark dispone de muchísimas más opciones y no está en el alcance de esta práctica cubrir esta herramienta a fondo.
⛔ Todo el contenido demostrado en este compendio de escritos, es exclusivamente para el estudio de hacking ético.
Bienvenido a mis notas de estudio del curso de CEH de la UTN y de hacking ético en general, espero que te resulten de utilidad para tus estudios y prácticas. Cada uno de estos escritos nace en principio como una práctica a un modulo de la cursada, pero no solo queda en la mera práctica. Trato de de cada escrito tenga el suficiente detalle e ilustre el uso básico de cada herramienta o proceso y no solo sea un mini documento donde se resuelve lo pedido y ya.
La idea de estos escritos es realmente generar documentación que sirva a futuro como referencia o guía rápida para cuando necesite consultarlos nuevamente. Y que puedan ser compartidos libremente con la comunidad de estudiantes que necesiten acceso a información de consulta para sus estudios.
Beware of the dog, you have been warned. 😎
Non-Profit | Open Source | Freely and Publicly Available content
Todo el contenido esta ofrecido gratuitamente y sin fines de lucro, libre de uso para cualquier estudiante interesado. En este espacio creemos en compartir el conocimiento y hacerlo accesible a todo estudiante, especialmente a aquellos estudiantes de países en desarrollo donde el costo de vida y las restricciones económicas hacen muy difícil el acceso a documentación y recursos pagos para el estudio. 💚
Saludos,
Wikipedia: Data Encryption Standard (DES) es un algoritmo de cifrado, es decir, un método para información. DES fue sometido a un intenso análisis académico y motivó el concepto moderno del y su . Hoy en día, DES se considera inseguro para muchas aplicaciones. Esto se debe principalmente a que el tamaño de clave de 56 bits es corto; las claves de DES se han roto en menos de 24 horas. . Se cree que el algoritmo es seguro en la práctica en su variante de , aunque existan ataques teóricos. Desde hace algunos años, el algoritmo ha sido sustituido por el nuevo (Advanced Encryption Standard).
Podemos ver este hash en acción usando una herramienta como la que se encuentra online en .
Wikipedia: El algoritmo en concreto se ve de la siguiente forma.
Hash de ejemplo (De la página de hashes de hashcat):
NTLMv2 Hash:
Wikipedia: El algoritmo en concreto se ve de la siguiente forma.
Descarga mimikatz desde su repositorio:
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en .
Más sobre Capture filters
en la documentación oficial de Wireshark.
Click en el siguiente .
Los Display Filters
, nos permiten realizar filtrado de datos directamente sobre la lista de resultados y son los que usaremos regularmente para ubicar el tráfico de red que nos interese inspeccionar. Wireshark utiliza este tipo de filtros para las que vimos antes y es una de sus principales funcionalidades. Cabe destacar que la cantidad de filtros que se pueden utilizar es enorme y esta fuera del alcance de esta práctica verlos en detalle. Mencionaremos sin embargo, los que usaremos en esta práctica.
Según la misma , actualmente más de 261000 campos de 3000 protocolos son soportados para su uso con filtros.
Más sobre Display Filters
en la documentación de Wireshark.
Click en el siguiente .
Si quieres realizar esta práctica locamente, al menos la parte del análisis. Puedes descargar el archivo PCAPNG
desde el link debajo
Para esta práctica también usare el Server de mi Lab local de Active Directory. Mas detalle en el siguiente .
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en .
Estos escritos detallan mis apuntes y notas personales creadas para comprender y practicar los contenidos de la cursada y algunos adicionales. Los mismos estarán en constante revisión y actualización. Todos están creados por mi para estudio y futura consulta y pueden contener errores propios de quien esta en constante aprendizaje. Si ves algo que se pueda mejorar no dudes en mencionarlo, puedes comunicarte conmigo en Twitter en cualquier momento.
También están disponibles guías técnicas sobre resolución de laboratorios en (solo en Ingles por el momento).
Si estos escritos te sirven para tus estudios, eres bienvenido a copiarlos para tu futura referencia. Agradezco en ese caso si me dejan un comentario en haciéndome saber que te fueron útiles (lo cual me motiva a seguir creando contenido) o bien dejar la mención a este compilado de apuntes donde quiera que uses mis textos.
Esta obra está bajo una .
Operador
Uso
eq
o ==
Igual a x valor.
ne
o !=
No igual (not equal) a x valor.
gt
o >
Mayor que x valor.
lt
o <
Menos que x valor.
ge
o >=
Mayor o igual que x valor.
le
o <=
Menor o igual que x valor.
contains
Contiene x valor.
matches
o ~
Cumple una expresión regular (Perl-Compatible).
bitwise_and
o &
Bitwise AND is non-zero.
Operador
Uso
and
o &&
Nos permite enlazar condiciones, todas deben cumplirse.
or
o ||
Nos permite enlazar condiciones, al menos una debe cumplirse.
xor
o ^^
Únicamente una de las condiciones debe cumplirse.
not
o !
Negación, la condición no debe cumplirse.
[…]
Permite seleccionar una sub-secuencia.
in
Nos permite ver si el valor es parte de un set. Por ej. tcp.port in {80, 8080}
Uso
Capture Filter
Capturar tráfico IPV4, ignorando otros protocolos como ARP,etc.
ip
Capturar tráfico por puerto, por ejemplo port 53
capturará el tráfico de DNS.
port #
Capturar el tráfico desde/ hacia el IP especificado.
host <IP>
Captura el tráfico por rango de puertos, por ejemplo tcp portrange 1200-2112
.
tcp portrange
Uso
Display Filter
Filtrar por IP (Destino)
ip.dest == 192.168.1.1
Filtrar por IP (Origen)
ip.src == 192.168.1.2
Filtrar por IP
ip.addr == 192.168.1.3
Filtrar por Subnet
ip.addr = 192.168.1.1/24
Filtrar por puerto(TCP)
tcp.port == 21
Filtrar por URL
http.host == "tzero86bits.tk"
Filtrar por MAC Address
eth.addr == 00:65:C7:16:25:F2
Filtrar por TimeStamp
frame.time >= "Mayo16, 1986 11:16:00"
En esta práctica veremos como hacer SYN Flooding usando HPING3 y como analizar ese tráfico con Wireshark.
La idea detrás del ataque de inundación SYN es saturar a nuestro objetivo con el envío de paquetes que tengan solo la flag SYN habilitada, sin importarnos la respuesta del servidor. Conociendo el mecanismo de negociación de 3 fases del protocolo TCP sabemos que normalmente una solicitud SYN
, es respondida por el servidor con SYN-ACK
para luego el cliente finalmente responder con ACK
y establecer la conexión.
En el caso del ataque SYN, dejamos al servidor a la espera de la respuesta ACK por ende la conexión permanece abierta esperando esa respuesta de una IP de origen que al estar spoofeada no enviará respuesta alguna.
Esto produce, luego de incontables paquetes SYN recibidos, una saturación en el servidor lo cual lo imposibilita de recibir tráfico legitimo para acceder a alguno de los servicios que ofrezca. Como por ejemplo una pagina o aplicación web
siendo servida en el puerto 80
, dejará de responder cuando el servidor se vea saturado. En algunos casos la totalidad del servidor puede verse afectada al consumir todos los recursos disponibles y puede causar la caída del servidor o su reinicio.
Para esta práctica voy a utilizar las siguientes VMs en VMWare WorkStation:
VM de Ataque:
Kali 2020.4 con HPING y Wireshark instalados.
VM Objetivo:
Windows 10 VM (Parte del lab de AD local).
Para comenzar necesitaremos tener instalado HPING3, en distribuciones como KALI y Parrot OS ya viene instalado (en caso contrario basta con usar el comando sudo apt-get install hping
). Una vez tenemos HPING instalado podemos comenzar a ver como realizar este ataque. Para lo cual usaremos el siguiente comando con HPING:
Veamos que significa cada switch que le suministramos a HPING:
Switch
Función
-S
Setea la flag SYN en el paquete enviado.
-a
Para hacer IP Spoofing, es decir simular que los paquetes se envían desde otra IP y no la de nuestra maquina de ataque. Debemos especificar la IP que deseamos usar.
-flood
Le indica a HPING que envíe los paquetes lo más rápido posible sin esperar ningún tipo de respuesta del objetivo.
Alternativamente podemos indicarle a HPING que utilice direcciones de IP aleatorias para el ataque, de esta manera cada paquete será enviado desde una IP distinta a la anterior. Para esto hacemos uso del switch --rand-source
. A diferencia del switch -a
, no hace falta indicar las IPs en este caso.
En un escenario real, este tráfico constante sería detectado por un Firewall o IDS (Intrusion Detection System) lo cual normalmente resulta en nuestra IP de origen siendo bloqueada luego de unos pocos intentos de conexión. En estos casos el uso del switch --rand-source nos permitirá evadir estas protecciones dado que cada paquete contendrá una IP de origen spoofeada y diferente a la anterior.
Veamos como se ve nuestro comando de ataque desde la terminal:
Como vemos el comando no muestra mayor información y como esperábamos tampoco procesa ninguna respuesta del objetivo ni nos avisa si los paquetes enviados en efecto arribaron al objetivo. Si vemos como reacciona la maquina objetivo podemos ver que tenemos el uso de red bastante a tope:
Cabe destacar que este ataque es "genérico", pero HPING
nos da la posibilidad de especificar cuales puertos queremos atacar haciendo uso del switch -p num_puerto
. Esto es especialmente útil por ejemplo si estamos atacando un puerto que sirve una aplicación web por ejemplo. En ese caso este ataque causaría que la aplicación web deje de responder normalmente dado el constante ataque con paquetes SYN que estamos realizando. Lo que en efecto sería un ataque de Denegación de Servicio (DoS).
Veamos ahora como podemos observar este ataque y su tráfico de red usando Wireshark
.
Si abrimos Wireshark en nuestra maquina de ataque, iniciamos la captura del trafico en el adaptador eth0
y usamos el siguiente display filter ip.addr == 192.168.1.40 && tcp
podemos ver los paquetes de red con la flag SYN
siendo enviados al objetivo:
NOTA: Si dejamos que Wireshark capture este tráfico de red sin detener la captura luego de unos minutos, muy probablemente veremos que Wireshark dejará de responder. Algunas veces incluso toda la VM dejará de responder.
Si analizamos el contenido de cualquiera de esos paquetes, vemos que la flag SYN
que indicamos desde HPING se esta enviando correctamente:
Si detenemos el ataque en HPING podemos observar la cantidad enorme de paquetes enviados a nuestro objetivo:
De esta manera vemos que sencillo resulta realizar un simple ataque de DoS
usando HPING
con paquetes SYN
y la funcionalidad de flooding de HPING
y como podemos observar y analizar este tráfico de red usando Wireshark
.
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en el siguiente link.
En esta práctica veremos como hacer scanning the vulnerabilidades usando Nessus Vulnerability Scanner.
Wikipedia: Link.
Nessus es un programa de escaneo de vulnerabilidades en diversos sistemas operativos. Consiste en un demonio o diablo(daemon
), nessusd
, que realiza el escaneo en el sistema objetivo, y nessus
, el cliente (basado en consola o gráfico
) que muestra el avance e informa sobre el estado de los escaneos.
Para poder instalar Nessus
debemos crearnos una cuenta sin costo que nos dará acceso a Nessus Essentials,
una versión limitada pero aún muy poderosa de Nessus
que incluye suficientes escaneos para poder realizar esta práctica.
Una vez estamos registrados y tenemos nuestra cuenta de Nessus Essentials
recibiremos por mail nuestra clave de activación
para poder descargar e instalar Nessus
.
Nessus es un software que consume su buena cuota de recursos, de ser posible es recomendable tener una VM dedicada para su uso. De esta manera podemos dejar el scanning corriendo en la VM de Nessus y continuar cualquier otra tarea en nuestra VM regular de trabajo sin que afecte su fluidez y sin correr el riesgo de que otras tareas afecten los procesos de scanning de Nessus.
La página de descarga de Nessus ofrece diversas versiones según nuestro sistema operativo. Para esta práctica usaremos una VM con Kali Linux 2020.4
.
En este caso descargaré la versión indicada para distribuciones basadas en Debian 64 bits
.
La web nos pide aceptar la Licencia y comienza la descarga. Veamos como instalamos el paquete .deb
descargado usando el comando dpkg -i {NombreDelArchivo.deb}
.
En nuestra terminal nos dirigimos a la carpeta de descargas (o el directorio donde hayas descargado Nessus) y ejecutamos el comando:
Una vez instalado necesitamos inicializar el servicio que ejecutará el daemon
llamado nessusd
. Para iniciar el servicio usamos el comando /bin/systemctl start nessusd.service
.
Es necesario ejecutar el comando con privilegios usando sudo
.
Con esto ya tenemos Nessus listo para ser iniciado, no obstante el primer inicio involucra configuraciones adicionales antes de poder usar Nessus.
Para Iniciar Nessus, abrimos la siguiente URL https://kali:8834/
como menciona el mensaje que recibimos luego de instalar Nessus.
Al hacerlo, recibiremos una advertencia sobre el certificado inválido. Hacemos click
en el botón advanced
y en el link
del final Procced to kali (unsafe)
. Deberíamos ahora ver esta pantalla:
Con la opción Nessus Essentials seleccionada hacemos click
en Continue
. En el siguiente paso nos pedirá registrarnos, dado que ya tenemos nuestra cuenta y clave de activación, hacemos click
en skip
. En el siguiente paso ingresaremos nuestro código de activación y daremos click
en continue
.
Nessus nos pedirá crear una cuenta de administrador
para usar la herramienta, ingresamos el user y password
que deseemos y hacemos click
en Submit
.
A continuación Nessus comenzara a descargar e inicializar sus plugins.
Si todo ha salido bien, veremos la siguiente pantalla donde nos pedirá que ingresemos el usuario y contraseña que especificamos antes para la cuenta administrador.
Una vez iniciada la sesión en nessus
, veremos la siguiente pantalla y tendremos todo listo para comenzar nuestra práctica.
Discovery & Vulnerability Scans
)Ahora que tenemos Nessus instalado y listo, veremos a continuación como podemos realizar un scan de vulnerabilidades
, que información obtenemos
del mismo y como nessus
presenta los resultados.
Para está práctica voy usar como objetivo las VMs
de mi Laboratorio local para prácticas de Active Directory
y veremos las vulnerabilidades que logra detectar Nessus
.
Objetivos a escanear:
Equipo
IP
DC: Controlador de Dominio
192.168.31.131
Client1: Windows 10 Enterprise
192.168.31.132
Client2: Windows 10 Pro
192.168.31.133
Ingresamos las direcciones IP
en el campo targets
de la ventana de bienvenida a Nessus y hacemos click
en el botón submit
.
Al darle submit
Nessus comenzara a realizar un proceso de host discovery
para ubicar hosts adicionales que puedan existir dentro de los targets especificados. Al completarse, seleccionamos los que en efecto vayamos a escanear.
Tengamos presente que Nessus Essentials
nos limita en la cantidad de hosts
que podemos escanear. Actualmente ese limite es de 16 hosts.
En este punto basta con dar click
en Run Scan
y Nessus
automáticamente realizará un escaneo básico de cada objetivo para comenzar a conocer un poco más sobre ellos.
Para ver nuestro scan
en marcha podemos ir a la tab
llamada History
:
Luego de un momento veremos que las tabs
llamadas Hosts
y Vulnerabilities
comenzarán a registrar resultados:
Dejaremos correr el scan hasta que se complete del todo, sin embargo es bueno saber que podemos ir revisando en tiempo real las detecciones registradas en las correspondientes tabs
de la pantalla My Basic Network Scan
.
Luego de unos minutos obtenemos el resultado del scan básico
:
Como podemos ver Nessus clasifica las vulnerabilidades encontradas en base a distintos niveles de severidad y su puntaje CVSS (Common Vulnerability Scoring System)
especificado por la National Vunlerability Database en su versión CVSSv2
(anteriormente estaba más alineado a CVSSv1
).
CVSS Score
Severidad en Nessus
Entre 1.0 y 3.9
Low/Info
Entre 4.0 y 6.0
Medium
Entre 7.0 a 9.9
High
10.0
Critical
Veamos en este caso en detalle la vulnerabilidad de severidad Medium
detectada: SBM Signing not required
.
Para ver el detalle de cualquier resultado, basta con hacerle click
y Nessus nos mostrará la siguiente pantalla con todo el detalle disponible:
De cada vulnerabilidad obtendremos un detalle similar, en este caso la siguiente información es provista:
Detalle de la Vulnerabilidad:
Severidad de la vulnerabilidad: MEDIUM
.
Descripción: Obtenemos una descripción del posible impacto de la vulnerabilidad. En este caso nos indica que la firma de comunicaciones con el servidor SMB, no es requerida. Lo cual puede permitir a un eventual atacante llevar a cabo ataques del tipo MIM (Man in the Middle)
.
Solución: Parte del detalle ofrecido por Nessus para cada vulnerabilidad incluye posibles soluciones para mitigar el riesgo de cada vulnerabilidad detectada. En este caso la solución es activar el requisito de que toda comunicación deba estar firmada (Digitally Sign Communications)
.
Artículos relacionados: Como parte del informe de detalle Nessus también suele incluir links a diversos artículos donde se explica la tecnología afectada (por ejemplo SMB) y recursos adicionales que puede incluir otros artículos donde se vea en detalle la vulnerabilidad.
Listado de Puertos y Hosts Afectados: Incluye el detalle de los puertos afectados y la lista de hosts donde se detectó la misma vulnerabilidad (esta cantidad se corresponde al valor indicado en la columna Count
en la lista de vulnerabilidades de la pantalla anterior). En este caso vemos que solo dos de los tres equipos del lab están afectados por esta vulnerabilidad.
Detalles del plugin (Plugin Details): Información básica y de referencia sobre cual plugin fue utilizado para realizar la detección.
Información de Riesgo (Risk Information): Detalle del los factores de riesgo y los diferentes puntajes CVSS que aplican para esta vulnerabilidad.
Información de la Vulnerabilidad: Esta sección nos muestra un detalle adicional sobre la vulnerabilidad y la fecha en que fue publicada originalmente.
No es parte de esta práctica el proceso de como solucionar la vulnerabilidad, nos centraremos únicamente en el escaneo de las mismas y como son reportadas por Nessus.
Hasta acá vimos como podemos realizar un scan básico en una instalación limpia de Nessus y como ver el detalle de las vulnerabilidades detectadas. No obstante no es la única forma de hacer escaneos dado que normalmente luego del primer scan realizado, Nessus no vuelve a mostrar la pantalla de Bienvenida para iniciar un scan automático rápido como vimos en este ejemplo. Por este motivo en la siguiente sección veremos como podemos iniciar un scan a demanda en Nessus Essentials y los pasos necesarios para hacerlo.
Scans On Demand
con Nessus (Zerologon Vuln Detection
)Una vez tenemos al menos un escaneo realizado en Nessus, al abrir el programa veremos que ya no aparece la pantalla de bienvenida para dejarnos ingresar los targets
y realizar un scan básico
automático. Para iniciar un nuevo escaneo debemos hacer click
en el botón New Scan
.
Luego de hacer click
en New Scan
Nessus nos muestra la siguiente pantalla donde aparecen listados los tipos de escaneos disponibles, incluyendo algunos a los cuales no vamos a tener acceso con Nessus Essentials.
Los primeros dos escaneos que aparecen listados (Host Discovery
y Basic Network Scan
) son los que fueron ejecutados por Nessus cuando cargamos nuestros objetivos en la pantalla de bienvenida. Entre los escaneos disponibles se encuentra uno para detectar si nuestro objetivo es vulnerable a Zerologon
, una vulnerabilidad que sigue impactado a equipos que no cuentan con los parches necesarios. Veamos si alguna de nuestras VMs
del lab es vulnerable, incluso en caso de no ser vulnerables veremos como es el proceso para iniciar un escaneo manualmente en Nessus (proceso que aplica a cualquier scan con mayor o menor configuraciones requeridas según el tipo de escaneo).
Para Iniciar un scan primero debemos configurarlo, comenzamos por hacer click
en el scan llamado Zerologon Remote Scan
y veremos la siguiente pantalla.
En esta pantalla debemos indicar un Nombre para el scan, Objetivos a escanear. Nessus es una herramienta ENORME y no es posible cubrir en esta práctica todas las posibles configuraciones para este o cualquier otro scan. Pero es importante saber que nos ofrece opciones para configurar el scan a nuestro gusto y necesidad. Entre estas opciones adicionales se encuentran ajustes como configuraciones de Ping y tipos de Ping a realizar, rango de puertos, enumeradores de puertos a usar e incluso opciones avanzadas como detener las operaciones si el host deja de responder durante el scan.
Una parte importante que debemos comprender sobre Nessus, es que todas sus funcionalidades son provistas por plugins y familias de plugins. Estos plugins son usados en los diferentes escaneos y aportan pruebas específicas que Nessus llevará a cabo. Podemos ver la lista de plugins que se usarán durante un scan en la tab
llamada Plugins
. En Este caso podemos ver que el scan actual solamente hace uso de un plugin para testear Zerologon
.
Si hacemos click
sobre el nombre del plugin (columna Plugin Name
) podemos ver un detalle o resumen sobre el plugin y la vulnerabilidad que testea.
El detalle es similar al que vimos durante el primer scan e incluye todo el detalle disponible sobre la vulnerabilidad. Una vez que estemos listos con los ajustes para nuestro scan, Indicamos el nombre para el mismo y los IP objetivos:
En este punto podemos guardar nuestro scan para ejecutarlo en otro momento o bien haciendo click
en el botón de la flecha abajo que tiene el botón llamado Save
, podemos elegir ejecutarlo ahora mismo haciendo click
en Launch
:
Los scans
guardados aparecerán listados en debajo de My Scans
junto con los otros escaneos que hayamos realizado o guardado anteriormente.
Si no guardaste el scan podes ejecutarlo haciendo click
en el botón de play
que se muestra para este scan en la lista de escaneos (My Scans
) como se muestra en la siguiente imagen.
De acá en adelante ocurre lo mismo que vimos durante el primer escaneo básico, Nessus realizara los testeos necesarios usando el Plugin
configurado para el scan
y nos devolverá los resultados de las vulnerabilidades encontradas en caso de estar presentes en los objetivos escaneados. Veamos que resultados nos ofrece:
Como podemos observar el Nessus determinó en 5 minutos
que el Controlador de Dominio (DC)
de nuestro lab es vulnerable al ataque Zerologon
. Si hacemos click
en la vulnerabilidad podemos darnos una idea de la potencia de Nessus
.
Con tan solo 23
intentos pudo comprometer la seguridad del DC
y verificar que en efecto es vulnerable al exploit Zerologon
. Incluso vemos el detalle de la request
y response
enviadas por Nessus
.
Hasta acá llegamos con esta práctica de scanning de vulnerabilidades con Nessus. Vimos como Instalar Nessus y realizar su configuración inicial, hasta su uso básico para realizar un scan inicial automático (Discovery
y Network Basic Scan
). Finalmente realizamos un scan manual a demanda para comprobar si nuestro laboratorio era vulnerable al exploit Zerologon
que afecta a los Controladores de Dominio
. Con dicho scan comprobamos que en efecto nuestro DC
es vulnerable.
Adjunto a está práctica el reporte generado por Nessus para el scan de ZeroLogon.
Nessus cuenta con muchas opciones que no podemos llegar a cubrir en esta práctica, no obstante es bueno conocer que dispone de herramientas para crear nuestras propios templates
de Policies
para determinar las acciones que se llevan a cabo en cada tipo de scan
. También incluye funcionalidades para generación de reportes, y reglas(rules
) customizadas para el funcionamiento de los plugins
. Todo esto sin tener en cuenta las demás funcionalidades y scans
que se habilitan con la versión paga.
Ciertamente es una herramienta muy interesante y que me interesa comprender en mayor profundidad. Quizás dedique un escrito en particular profundizando en su uso en algún momento. Por ahora quizá realice alguna que otra actualización a esta misma práctica.
Si durante el proceso de instalación y primer inicio recibís un error de descarga o algún otro error que impide que Nessus termine de configurarse, podes probar las siguientes soluciones que pueden puede serte útiles para remediar el problema.
En mi caso, fue necesaria la solución numero dos para solucionarlo, los problemas que tuve al instalar Nessus.
Si durante la configuración inicial de Nessus recibís el error Download Failed (Descarga Fallida)
Intenta con la siguiente solución.
NOTA: Encaso de recibir un error de que la descarga a fallado. Podemos ejecutar el siguiente comando para solucionarlo sudo /opt/nessus/sbin/nessuscli update
.
Una vez que ejecutamos ese comando, veremos el siguiente resultado en consola.
En algunos casos con esto ya podremos retomar la configuración de Nessus.
En caso de que el error persista luego de intentar la solución 1 o recibamos algún error diferente que igualmente impide la correcta inicialización de Nessus. Podemos probar los siguientes comandos que resetearan por completo Nessus:
# service nessusd stop
# /opt/nessus/sbin/nessuscli fix --reset
# /opt/nessus/sbin/nessuscli fetch --register ACTIVATIONCODE
# /opt/nessus/sbin/nessusd -R
# service nessusd start
Espero que te sea de ayuda.
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en el siguiente link.
Distintos ejemplos de como correr variados tipos de scans usando Nmap.
En esta práctica veremos como usar nmap para realizar distintos tipos de escaneos mediante los cuales obtendremos distintos detalles de nuestro objetivo. Para esta práctica voy a usar un laboratorio local que tengo creado para practicas de Active Directory como objetivo. Este lab corre en VMware localmente y consta de los siguientes equipos:
Tipo
IP
DC: Controlador de Dominio
192.168.31.131
Client1: Win 10 Enterprise
192.168.31.132
Client2: Windows 10 Pro
192.168.31.133
Este lab esta destinado a practicar ciertas vulnerabilidades de varios tipos, algunos de ellos detallados a continuación:
LLMNR and NBT-NS Poisoning
SMB Relay Attacks
Kerberoasting
BloodHound and other enumeration tools
Golden Ticket
Token Impersonation
IPv6 DNS Takeover Attacks
Credentials Dumping with Mimikatz
Esta práctica no cubre las vulnerabilidades mencionadas ni la creación del lab, únicamente lo usaremos como objetivo para aprender los distintos tipos de escaneos.
Teniendo esto en cuenta debería servirnos para obtener información mediante los distintos tipos de scan usando Nmap que veremos en esta práctica.
En esta primer parte del práctico veremos los escaneos más simples que podemos realizar con nmap.
Lo primero que podemos probar es como hacer ping a nuestro objetivo. Por el momento comencemos por un solo IP objetivo, el del controlador de dominio.
Para hacer un simple scan de un host con nmap podemos hacer uso del siguiente switch -sn
, el mismo nos devuelve varios detalles del objetivo aparte de informarnos si el host esta activo, como ser la latencia y la dirección MAC del host.
-sn: Ping Scan - disable port scan
El comando completo queda de la siguiente manera:
nmap -sn 192.168.31.131
El uso de sudo
no es necesario para este scan.
Con este simple scan obtuvimos la siguiente información de nuestro objetivo:
Info Obtenida
Valor
Estado del Host (Activo/Inactivo)
Host is up
MAC Address
00:0C:29:1C:F8:3D (VMware)
Latencia
0.00039s
Para detectar el sistema operativo del objetivo podemos usar el siguiente switch de nmap: -O
. Lo que nos devuelve el siguiente output en la consola:
El comando completo nos queda de esta forma:
sudo nmap -O 192.168.31.131
Este switch requiere ser ejecutado con privilegios.
Como vemos este scan no solo intenta detectar el SO (OS fingerprinting), sino que también ejecuta algunos análisis adicionales como ser detección de puertos comunes y detección de servicios corriendo en cada puerto.
En este caso vemos que no fue posible detectar el SO correctamente, posiblemente por alguno de los ajustes que tengo realizados en el laboratorio local. Es importante saber que disponemos de un switch alternativo para intentar detectar el SO más agresivamente: --osscan-guess
.
Veamos como es el output cuando logra detectarlo correctamente:
También vemos que incluye los datos que vimos en el scan anterior.
Info Obtenida
Valor
Listado de puertos abiertos y sus servicios
PORT STATE SERVICE
53/tcp open domain
88/tcp open kerberos-sec
135/tcp open msrpc
139/tcp open netbios-ssn
389/tcp open ldap
445/tcp open microsoft-ds
464/tcp open kpasswd5
593/tcp open http-rpc-epmap
636/tcp open ldapssl
3268/tcp open globalcatLDAP
3269/tcp open globalcatLDAPssl
Distancia de red hasta el host
1 hop
Posible Versión del Sistema Operativo (Host de ejemplo)
Windows XP SP3 o Windows Server 2012
Para escanear determinados puertos podemos hacer uso del switch -p
el cual nos permite especificar una serie de puertos específicos, sobre los cuales realizar un scan.
El comando queda de esta manera:
nmap -p 53,88,389,445 192.168.31.134
De esta manera podemos escanear los puertos deseados.
Si queremos escanear por un rango de puertos en particular podemos hacerlo de la siguiente forma:
nmap -p 54-445 192.168.31.131
Si en cambio queremos escanear todos los puertos podemos hacerlo de la siguiente manera, usando el switch -p-
.
El comando queda de esta forma:
nmap -p- 192.168.31.131
Para este host en particular use el switch -Pn
que nos permite indicarle a nmap que no realice pings. Necesario para objetivos que no responden a ping (ICMP) echo requests.
Para realizar un escaneo que nos ayude a identificar las versiones de los servicios que están corriendo en el objetivo podemos hacer uso del siguiente switch -sV
.
El comando queda de esta forma:
nmap -sV 192.168.31.131
Si queremos realizar un escaneo completamente abierto, podemos hacer uso del switch -sT
. En este tipo de escaneo generalmente nos asegura una respuesta dado que la sesión se inicia en su totalidad (SYN, SYN+ACK, ACK, RST).
Importante: Este escaneo es fácilmente detectado por firewalls y otras medidas de seguridad.
Para realizar este scan el comando queda de la siguiente manera:
nmap -sT 192.168.31.131
En muchos casos necesitamos realizar escaneos sin alertar o disparar detecciones del lado del objetivo. Para estos casos nmap cuenta con el switch -sS
. En este tipo de scan la sesión no se completa correctamente, y únicamente los paquetes SYC, SYNC+ACK y RST
son utilizados. Cuando el objetivo responde, el cliente en vez de responder con ACK
responde directamente con RST
.
Este comando requiere de privilegios para correr (sudo).
Para ejecutar este tipo de scan el comando queda de la siguiente forma:
nmap -sS 192.168.31.131
Como explique antes el switch adicional -Pn
es necesario para hosts que no responden a ping requests (ICMP Echo Requests) como es el caso de este objetivo que estoy usando.
Si queremos obtener un panorama general de los equipos que están activos en la red que estamos escaneando podemos hacer uso del switch -sP
. El mismo puede llevar un tiempo terminar dependiendo que tan extensa sea nuestra red. En Este caso el lab objetivo es bastante pequeño.
Podemos usar el comando de esta manera:
nmap -sP 192.168.31.*
Notemos que en este caso estamos pasando parte del IP, e indicamos el último valor como *
para que nmap automáticamente escanee todos los equipos que formen parte del mismo subnet.
Alternativamente podemos hacer uso de los switches
-PS (SYN Ping) o -PR (ARP Scan)
los cuales nos regresan resultados como estos:
De momento no explicaremos el uso de los switches/flags adicionales que puedes ver en la imagen anterior. Cubriremos esos más adelante en esta práctica.
Nmap incorpora scripts (NSE) que nos permiten indicar si durante el escaneo queremos que nmap también intente correr los scripts con los que viene incorporados. Estos scripts prueban vulnerabilidades comunes que pueden aportar buena información sobre el objetivo y sobre como lograr explotarlos para obtener acceso. Esto se realiza mediante el switch -sC
.
El comando para este tipo de scan es el siguiente:
nmap -sC 192.168.31.131
Vemos que los resultados que obtenemos incluyen mucha información sobre el controlador de dominio (en este caso) escaneado. Estos resultados varían dependiendo de que objetivo estemos escaneando y cuales sean las vulnerabilidades que nmap pueda detectar para cada caso en particular.
En esta parte del práctico veremos algunos escaneos más avanzados y comenzaremos a usar varios switches o flags al mismo tiempo en nuestros comandos.
Digamos que quiero obtener rápidamente toda la información que vimos, en los escaneos individuales, para tener un panorama general del objetivo lo más pronto posible. Normalmente cuando ejecuto un scan con nmap para algún laboratorio comienzo teniendo en cuenta lo siguiente:
Tipos de datos que necesito obtener
Tipos de datos que me gustaría obtener
Que tan rápido quiero obtener los resultados
Usualmente en los labs de práctica o challenges del tipo Capture The Flag (Captura la bandera), utilizo el siguiente set de switches o flags de nmap:
sudo nmap -sC -sV -Pn -p- -T5 -O -v -oN results 192.168.31.131
Como podemos ver en esa línea anterior, hay varios switches o flags nuevos que estamos pasando a nmap que no hemos visto en esta práctica aún. Veamos uno a uno que función cumplen.
Switch/Flag
Función
-T5
Indica la velocidad del scan. Valores posibles 1 a 5, siendo 5 el más alto. (Aumenta la detención de nuestro scan por parte de los mecanismos de defensa que tenga el objetivo)
-v
Indica a nmap que debe producir output verboso, proveyendo al usuario con mucho detalle sobre cada scan y su resultado.
-oN <archivoSalida>
Indica a nmap que debe generar un archivo de salida con los resultados. En este caso en formato común (texto).
Este tipo de escaneo suele resultar en un output extenso en la consola, por eso es buena idea guardarlo directamente a un archivo para consultarlo cuando sea necesario.
El resultado de este scan en su totalidad de puede ver en el siguiente bloque, dado que no amerita capturarlo en imágenes en su totalidad:
De esta forma vimos variados tipos de escaneos que podemos realizar con nmap para obtener importante información sobre nuestro objetivo. En la siguiente sección recopilaremos rápidamente todos los datos que logramos obtener a lo largo de esta práctica sobre el objetivo escaneado.
En esta parte recopilaremos y presentaremos toda la información que obtuvimos de todos los tipos de escaneos practicados.
Durante esta práctica vimos de que manera podemos utilizar un subset de funcionalidades ofrecidas por nmap para realizar distintos tipos de escaneos a nuestro objetivo con el fin de obtener una serie de detalles para nuestro pentest.
Dato
Detalle
Puertos abiertos y servicios (DC)
53 (domain Simple DNS Plus) 135 (MS Windows RPC) 139 (MS Netbios SSN) 445 (MS DS) 49703 (MS Win RPC) 9389 (.NET Message Framing) 49667 ( MS Win RPC) 3268 (MS Active Directory LDAP)
3269 (MS Active Directory LDAP) 636 (SSL LDAP) 49674 (MS Win RPC) 49666 (MS Win RPC) 593 (MS Win RPC Over HTTP 1.0) 5985 (Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP))
49673 (Microsoft Win RPC over HTTP 1.0)
88 (MS Kerberos)
464 (kpasswd5)
49710 (MS Win RPC)
49686 (MS Win RPC)
389 (MS Active Directory LDAP).
Domain Controller Domain Name
Chukaro-DC.CHUKARO.local
Sistema Operativo
MS Windows
Equipos activos en la subnet del DC
192.168.31.1
192.168.31.2
192.168.31.131 (DC) 192.168.31.31.132 (Client1) 192.168.31.31.133 (Client2)
192.168.31.31.134
Hasta acá llegamos con esta práctica de scanning con nmap, vimos como ejecutar distintos tipos de scan para obtener variadas piezas de información y aprendimos el usó básico de nmap.
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en el siguiente link.
Para esta práctica veremos como realizar un diagrama de una red, utilizando NTM para realizar un scan de topología de red.
Para esta práctica veremos como realizar un diagrama de una red, utilizando NTM para realizar un scan de topología de red.
SolarWinds NTM nos permite realizar un scaneo mediante el cual podemos descubrir los elementos que componen una red objetivo y según los IPs que usemos, automáticamente generar un diagrama de dicha red.
Al iniciar NTM vemos una suerte de wizard donde podemos iniciar nuestro primer scan. El wizard nos ofrece diversas opciones para configurar: Proveer credenciales, rangos de IP, Dominios, direcciones IPV6, etc.
En nuestro caso queremos realizar un scan básico por ende en el paso de Network Selection
definiré una serie de IPs obtenidas mediante Shodan.io
. Dichas IPs pertenecen a la Universidad de Ljubljana en Lituania
.
Si avanzamos por el wizard tendremos la posibilidad de definir un nombre para nuestro scan, debajo de esa opción vemos también una opción para ignorar los nodos de red que no únicamente respondan a ping (ICMP) y no a SNMP/WMI:
Si presionamos next
llegamos a la parte de scheduling
donde podremos configurar nuestro scan para ejecutarse inmediatamente o bajo cierta frecuencia que podemos definir manualmente.
Al darle next
veremos que la ultima etapa del wizard es un resumen de todos los seteos que configuramos en los distintos pasos. Vemos también un botón llamado discovery
que nos permite iniciar finalmente el proceso de scaneo:
Una vez que el scan comienza vemos que abre una nueva ventana con el progreso actual del mismo:
Una vez que el scan termina, podemos ver listados en el panel de la izquierda los nodos que fueron detectados:
Estos nodos podemos usarlos para ir construyendo nuestro diagrama, basta con arrastrarlos al mapa en blanco y serán agregados:
Como podemos ver el scaneo de las IPs que definimos realmente no sirvieron para generarnos un diagrama automáticamente.
Veamos si logramos encontrar algún IP objetivo que nos permita ver como NTM genera automáticamente un diagrama de los nodos de red luego de realizar el scaneo del objetivo. Para esto usaremos como ejemplo nuestra red local:
Como podemos observar esta vez obtenemos 8 nodos de red y una subnet como resultado de nuestro scan. Si arrastramos los nodos al mapa vemos que esta vez si se generan las líneas de conexión. De cada nodo podemos obtener su dirección IP, lo cual nos permitirá a futuro usar otras herramientas y obtener información adicional de cada nodo.
NTM nos ofrece distintas formas de organizar nuestro mapa de red usando las opciones listadas debajo de la lista de nodos en la sección llamada Map Layouts
. También podemos realizar distintas acciones sobre cada nodo. Para esto podemos hacer click derecho sobre cualquier nodo y veremos las opciones disponibles:
En este caso vemos que podemos realizar conexiones de escritorio remoto, TraceRoute, Ping y Telnet.
Por medio de esta práctica obtuvimos los siguientes datos:
La Subnet 192.168.1.0/24 contiene los siguientes nodos de red de los cuales obtuvimos las siguientes direcciones IP:
192.168.1.34
192.168.1.34
192.168.1.35
192.168.1.38
192.168.1.41
192.168.1.43
192.168.1.46
Esta recolección de información nos permite tener una idea más detallada de la red objetivo y la obtención de los IPs nos permitirá realizar distintos tipos de scaneos a futuro usando, por ejemplo, nmap para identificar puertos abiertos y servicios en ejecución.
En esta práctica veremos en que consiste la Esteganografía y realizaremos un ejercicio al respecto utilizando Steghide en Kali Linux.
En esta mini práctica veremos como podemos ocultar información dentro de otros archivos y veremos como es el proceso de extracción de esta información oculta. Con el uso de esteganografía, podemos ocultar información dentro de otro archivo que luego pueda ser distribuido sin importar que sea visto por terceros. Su contenido oculto es visible únicamente a quienes estén al tanto de que existe y sepan como extraerlo. Generalmente este contenido oculto es también encriptado de manera que se requiera una palabra clave para poder extraerlo.
Wikipedia: La esteganografía (del griego στεγανος steganos, "cubierto" u "oculto", y γραφος graphos, "escritura") trata el estudio y aplicación de técnicas que permiten ocultar mensajes u objetos, dentro de otros, llamados portadores, de modo que no se perciba su existencia. Es decir, procura ocultar mensajes dentro de otros objetos y de esta forma establecer un canal encubierto de comunicación, de modo que el propio acto de la comunicación pase inadvertido para observadores que tienen acceso a ese canal.
Existen diversas herramientas que nos permiten ver este proceso en acción, en esta práctica en particular usaremos Steghide.
Steghide
La ilustración de arriba puede parecer una imagen común, sin embargo contiene oculto en su interior el poema completo
llamado El Cuervo
de Edgar Allan Poe
. A simple vista la imagen no presenta indicios de ser algo más de lo que se puede apreciar, y con eso podemos darnos una idea del potencial de la esteganografía para ocultar información y trasladarla incluso ante la vista de terceros sin que el mensaje oculto pueda ser detectado a simple vista.
Steghide
Veamos los comandos básicos de steghide
que debemos usar para lograr replicar ese resultado y llevar a cabo nuestra práctica básica en esteganografía. Lo primero que debemos hacer es contar con los archivos básicos:
el uso básico de steghide es súper sencillo, basta con hacer uso de las siguientes opciones:
steghide embed -cf {cover_file} -ef {embed_image}
embed
: le indica a steghide el modo que queremos usar. En este caso embed inserta contenido dentro del archivo destino.
-cf FILE
: Indica a steghide el archivo que funcionara como cover, en este caso la imagen que contendrá la información oculta. Para nuestro ejemplo este archivo es RAVEN.jpg
.
-ef FILE
: Indica la ruta al archivo que se ocultará en el archivo cover. Para nuestro ejemplo este archivo es MESSAGE
que contiene el poema completo El Cuervo
.
passphrase
: la clave necesaria para extraer el contenido oculto. Para este ejemplo la clave es POE
.
Como podemos ver el tamaño del archivo RAVEN.jpg
sufre un cambio de peso luego del proceso. Es importante tener esto presente dado que si el mensaje que intentamos ocultar es demasiado grande, debemos recurrir a una imagen más grande que contenga la suficiente capacidad para poder almacenar nuestro mensaje. Esto ocurre así por la forma en la que la esteganografía hace uso de los bits menos significativos de la imagen para reemplazarlos por los bits que conforman nuestro mensaje oculto.
Podemos ver esto ejemplificado en la siguiente imagen donde los bits menos significativos de la imagen son alterados para almacenar los bits que conforman la palabra cat.
Información embebida
con Steghide
Veamos ahora de que manera podemos usar steghide para ver si nuestra imagen contiene información oculta embebida. Para esto hacemos uso de las siguientes opciones:
steghide info {Archivo_Cover}
info FILE
: el modo de operación que le indica a steghide que deseamos ver información del archivo. Entre los resultados devueltos se puede obtener: Algoritmo
de encriptado usado, tamaño
de archivo, nombre
del archivo embebido y formato
del archivo cover usado.
Como podemos ver para realizar esta operación necesitamos de la passphrase (clave) que haya sido utilizada al momento de ocultar la información. En este caso conocemos la clave
, en muchos casos esta información es desconocida y deberemos recurrir a la ingeniería social
, o al brute-forcing
con herramientas como stegcrack
para obtener la clave y poder usar este comando. Lo mismo aplica también para el proceso de extraer la información embebida.
información embebida
con Steghide
Llegado el momento necesitaremos extraer la información oculta de la imagen, para esto usaremos las siguientes opciones de steghide
:
steghide extract -sf {ARCHIVO_COVER}
extract
: Indica a steghide que queremos realizar la extracción de data embebida de un archivo cover.
-sf FILE
: Le indica a steghide la imagen cover desde donde queremos extraer la información embebida.
passphrase
: La clave para poder extraer el contenido oculto.
Si revisamos el contenido del archivo extraído, podemos ver que en efecto contiene el poema que habíamos ocultado antes:
De esta forma vimos como podemos hacer uso de la esteganografía para ocultar información dentro de otros archivos, que en apariencia se presentan normales para cualquiera que los vea.
Cabe aclarar que la esteganografía no se limita a archivos de imagen y texto y también se puede por ejemplo embeber Código fuente dentro audio y video con el uso de otras herramientas. En el caso de Steghide en particular nos permite ocultar información dentro de archivos con los siguientes formatos: WAV
, JPEG
, AU
y BMP
.
Steghide cuenta con numerosas opciones para refinar a gusto como se lleva a cabo el proceso de embeber contenido dentro de otros archivos. No esta dentro del alcance de esta práctica ver todo el funcionamiento de steghide y es importante tener en claro que existen distintas herramientas alternativas con las que podemos obtener el mismo resultado.
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en el siguiente link.
En este artículo veremos en que consiste el Website Defacement y realizaremos una práctica en un laboratorio local con nuestras VMs.
El Website Defacement
consiste en atacar una web con el objetivo de cambiar su apariencia. Normalmente la página de inicio es reemplazada por algún mensaje que indique que la misma fue vulnerada. Podemos pensar este tipo de ataque como una suerte de vandalismo como los graffitis
de protesta en los frentes de los destacamentos policiales o en los ventanales de centros comerciales.
Muchas veces este tipo de ataques están destinados a esparcir un mensaje de naturaleza política o de protesta, en otros casos se busca impactar la reputación del sitio web y en otros casos se realiza simplemente para que el atacante pueda presumir que ha hackeado la web en cuestión.
Algunas de las webs más famosas del mundo han sido victimas de este tipo de ataque en algún momento. En 2012 Google Romania fue hackeado y todo usuario de Rumania que intentaba acceder al buscador era presentado con una página que advertía que fueron hackeados. Cabe destacar que se sospecha que este ataque en realidad duró al menos 5 días hasta que lograron revertir los cambios en el lapso de unas horas luego de detectarlo. En 2018 una web de información médica y encuestas a pacientes manejada por la National Health Service de United Kingdom, fue también victima de este tipo de ataque. Durante ese tiempo cualquiera que intentaba acceder a la web podía ver el mensaje de defacement: "Hacked by AnoaGhost".
En 2019 al menos 15 mil sitios web de Georgia(el país europeo) fueron hackeados para realizar un masivo ataque de defacement y eventualmente estos sitios fueron puestos offline por los atacantes. Entre estas webs estaban sitios gubernamentales, bancos, medios periodisticos y cadenas de televisión.
Cabe destacar que para llevar a cabo este tipo de ataques, se utilizan variadas técnicas para explotar vulnerabilidades como XSS
, SQL Injection
, CSRF
, DNS Hijacking
, etc.
Es decir que los vectores de ataques que pueden usarse para obtener el control de la web dependen en realidad de las vulnerabilidades presentes en la web que se intenta atacar para hacer el Defacement.
ANTECIÓN: Este laboratorio de práctica esta pensado con fines educativos. No intentes realizar esto es una web que no te pertenece. No me hago responsable por uso ilícito de esta información.
Veremos como podemos ahora poner este tipo de ataque en práctica usando una aplicación web vulnerable, en una máquina virtual. Para levantar este laboratorio usaremos lo siguiente:
VM Windows 10: Esta VM será la encargada de servir nuestra aplicación vulnerable. Puedes usar Linux/OSx si así lo prefieres.
XAMPP: Nos permitirá instalar rápidamente nuestra aplicación webs vulnerable.
DVWA(Damn Vulnerable Web Application): La aplicación vulnerable con la cual podremos practicar variadas técnicas y ataques. En este caso la usaremos para hacer un Web Defacement.
NOTA: No incluiremos los pasos para configurar la VM con Windows en esta práctica. Es un proceso sencillo que puedes ver con una simple búsqueda en Google. No obstante, esta práctica si incluirá un breve instructivo para configurar XAMPP y DVWA.
La instalación de XAMPP
es bastante simple, basta con ejecutar el instalador y prácticamente hacer click en Next con los valores por default hasta que comience la instalación.
En mi caso optaré por instalar todo en Inglés, en tu caso puedes optar por otro idioma en el siguiente paso de la Instalación:
Una vez seleccionados los ajustes deseados, el instalador nos informará que todo esta listo para comenzar la instalación:
Al comenzar la instalación veremos una pantalla similar a esta:
Una vez completada la instalación, marcamos el checkbox para que se abra el panel de control de XAMPP:
Al abrirse el panel de control de XAMPP
solamente nos resta hacer click en el botón Start
para las opciones Apache
y MySQL
. Una vez completada la inicialización de estas opciones veremos lo siguiente:
NOTA: En caso de recibir algún error al intentar inicializar Apache, asegúrate de detener cualquier servicio que esté usando los mismos puertos que intenta utilizar Apache (80
y 443
).
En algunos casos puede que el Firewall de Windows
nos pida confirmación para darle acceso a Apache y MySQL
. Asegúrate de hacerlo en caso de que te salga esa confirmación.
Con esto ya tenemos nuestro stack de XAMPP
listo para cargar nuestra aplicación web vulnerable y comenzar con nuestra práctica. A continuación veremos como configuramos DVWA
para que sea servida con XAMPP
y podamos acceder a esta app.
Ahora que tenemos XAMPP configurado, el siguiente paso es instalar nuestra web app vulnerable para que pueda ser accedida y eventualmente atacada para nuestra práctica de Web Defacement. Lo primero que necesitamos hacer es descargar DVWA y descomprimir la carpeta en el escritorio de la VM de Windows 10 (o donde gustes).
En mi caso optaré por renombrar esta carpeta de su nombre original DVWA-master a simplemente DVWA. Esto lo hago dado que el nombre, cualquiera sea el que pongamos, será el que utilizaremos para acceder desde la URL a esta Aplicación Web.
Al tener la carpeta lista, debemos moverla o copiarla dentro del sub-directorio llamado htdocs
dentro la carpeta de instalación de XAMPP
. En mi caso opté por instalar XAMPP en la siguiente ruta C:\xampp
y luego dentro copie la carpeta DVWA
dentro de htdocs
. Como se muestra en la imagen a continuación:
El siguiente paso es modificar el archivo de configuración de DVWA
para que pueda conectarse a la base de datos MySQL
que fue configurada por XAMPP
. Para esto ingresamos al directorio DVWA
, luego al sub-directorio llamado config
y creamos una copia del file llamado config.inc.php.dist
y renombramos la copia como config.inc.php
. Una vez listo esto, abrimos ese archivo con el block de notas o tu editor de preferencia y veremos lo siguiente:
Lo único que necesitamos cambiar en este file es el username y password de la DB, por los siguientes:
db_user: root
db_password: lo dejamos vacío
.
El archivo debe quedarnos como en la siguiente imagen:
Al terminar guardamos los cambios y ya estamos listos para abrir nuestra web app en el browser. Para eso abrimos nuestro browser y navegamos a la siguiente URL: localhost/DVWA/setup.php:
Veremos que la aplicación cargará por default la página para hacer el setup de la base de datos. Una vez en esta página solo debemos hacer click en el botón llamado Create/Reset Database ubicado al final de la página y al cabo de un momento veremos lo siguiente:
Si todo ha salido bien, la aplicación nos redirigirá automáticamente al formulario de inicio de sesión de la app:
NOTA: Para acceder usamos las credenciales: admin
y password
Una vez dentro de la app, configuraremos el nivel de seguridad medio y aplicaremos los cambios. DVWA nos permite configurar distintos niveles de seguridad para practicar diversos tipos de ataques simulando aplicaciones más o menos vulnerables. En este caso usaremos el nivel Medium, basta con seleccionarlo en DVWA Security -> Medium y darle click al botón de Submit. Una vez hecho veremos el mensaje de confirmación debajo, como se muestra en la siguiente imagen:
Con todo esto configurado, estamos listos para ver que manera vulnerar esta app para lograr nuestro objetivo de practicar el Web Defacement.
Para nuestra práctica de defacement, usaremos las siguientes herramientas. Asegúrate de descargarlas en tu máquina de ataque y dejarla Burp instalado. En mi caso usare Kali que ya viene con Burp Suite Community
instalado. Debo aclarar que nunca antes había intentado vulnerar esta aplicación web, por ende este escrito puede ser bastante largo dado que voy a documentar todo proceso que intente seguir para poder hackearlo.
Herramientas que usaremos para el Defacement:
Burp Suite [LINK]: Para analizar el las requests que se generen desde/hacia la aplicación vulnerable. Incluso usaremos Burp para burlar ciertos mecanismos de seguridad de la aplicación con el fin de obtener el acceso necesario para hacer el defacement.
msfvenom: Crearemos un payload que nos permita un acceso inicial al servidor, desde el cual podamos eventualmente realizar el defacement.
Index.html [LINK]: El archivo HTML personalizado que será usado para reemplazar el home page de nuestra aplicación víctima. Este archivo esta adaptado para esta práctica de varios ejemplos de defacement que encontré por internet, incluyendo uno creado por Wh1t3R0s3
.
Lo primero que haremos en abrir Burp para usar el navegador integrado que tiene y revisar que tenemos acceso a la web que levantamos con XAMPP. Todo esto lo haré desde la VM con Kali. La idea es revisar el módulo de subida de archivos que tiene DVWA e intentar vulnerar sus protecciones, para poder subir un payload que nos de un acceso inicial a este servidor donde se aloja la app. Abrimos Burp entonces, y navegamos a la URL donde instalamos esta app.
Una vez abierto Burp Suite, navegamos a la siguiente ruta para abrir el browser integrado: Proxy Tab -> Intercept Tab -> Open Browser button
(both the one in the tab header and the one in the body of burp tab content do the same).
Navegamos hasta la URL de nuestra app web vulnerable: Windows-VM-IP:port/pathDVWA:
Windows-VM-IP: El IP de la VM (Windows 10 en mi caso) donde esta corriendo XAMPP
y nuestra app DVWA
.
Port: El puerto para conectarnos al contenido que esta sirviendo XAMPP
(80
y 443
).
pathDVWA: El nombre de la carpeta donde guardamos DVWA
, que esta dentro de XAMPP/htdocs
.
Login en DVWA: en este caso no nos interesa vulnerar este formulario de login, dado que ya conocemos las credenciales (admin:password)
. El reto que nos interesa resolver esta dentro de el dashboard de DVWA, y es el que nos dará el acceso para realizar nuestro defacement.
Una vez logueados en nuestra app, navegamos a la opción File Upload en el menú de la izquierda de la app:
La idea de nuestro ataque será la siguiente. Intentaremos vulnerar el formulario de carga que expone esta parte de la app, la cual únicamente admite imágenes. Y veremos de que forma podemos burlar esa protección para poder subir nuestro form PHP. Este form PHP nos dará acceso para poder eventualmente subir archivos que nos den acceso para poder manipular los archivos del servidor, en concreto el archivo que se carga como el home de esta web app(index.php
). Ese archivo index, será luego reemplazado por nuestro HTML para defacement que dejé preparado antes. De esta manera realizaremos nuestro defacement.
Para comenzar activaremos el interceptor en Burp suite de manera que la comunicación entre nuestro browser en Kali y la web app pueda ser interceptada. Nos interesa conocer que tipo de request se envía al servidor cuando subimos una imagen válida y cuando intentamos subir un archivo cuya extensión no esta permitida. Evaluaremos las diferencias con Burp y veremos como podemos manipular esta request inválida para convencer al servidor de que el archivo que intentamos subir es una imagen y no un PHP.
Veamos que sucede en la request enviada cuando subimos una imagen valida:
Y vemos que al hacer click en Forward, la request es procesada y aceptada por el servidor:
Podemos observar dos datos importantes en la request:
Content-Type: image/jpeg
: El cuál indica que el servidor interpretará el archivo que se intenta subir como, lo que en este caso, es. Una imagen.
Filename="Test1.jpg"
: El nombre de archivo y su extensión.
Y si navegamos a esa ruta, vemos que en efecto nuestro archivo de imagen se encuentra en el servidor:
Veamos como se comporta la request cuando el archivo subido contiene una extensión prohibida.
Y al hacer el forward de esa request, vemos que la misma es detectada invalida y rechazada como esperábamos:
Podemos observar los mismo datos importantes en esta request:
Content-Type: application/x-php
: El cuál indica que el servidor interpretará el archivo que se intenta subir como un archivo php
.
Filename="Test_shell.php"
: El nombre de archivo y su extensión.
Contando con esta información, podemos teorizar que ambos parámetros influyen cuando los controles (o filtros) implementados para sanitizar los archivos que se suben, son ejecutados.
Con esta información podemos intentar nuestro primer ataque para intentar subir nuestro form y burlar este control implementado por la app. Lo haremos mediante modificaciones a la request que se manda al servidor cuando hacemos click en Upload luego de adjuntar un archivo PHP.
Repasemos entonces lo que intentaremos:
Crearemos un formulario de carga de archivos propio, el cual no tenga ninguna protección y nos permita subir cualquier tipo de archivo. Este formulario será el primer archivo que debemos lograr subir, y es el que nos abrirá las puertas al servidor.
Intentaremos ver de que forma podemos lograr subir este formulario al servidor, para lo cual atacaremos el formulario de File Uploads de DVWA.
Al subir nuestro formulario, interceptaremos la request con Burp Suite
y modificaremos el Filename
y Content-Type
para especificar que nuestro Form PHP
es en realidad una imagen y ver si de esta forma podemos burlar la protección.
Enviaremos la request modificada al servidor.
Con esto probaremos si en efecto esta request modificada podrá pasar por alto las protecciones de la app y si nuestro archivo se subirá sin problemas.
Una vez tengamos el Custom File Upload Form
subido, lo usaremos para cargar un payload(php reverse shell en este caso)
con el cual, si todo sale bien, tendremos el acceso inicial para poder comenzar con el defacement.
No voy a ir en detalle sobre como crear este formulario PHP, dejaré el código que preparé debajo y el repositorio de una idea similar que me sirvió para mas o menos armar todo.
Es muy posible que el mecanismo de verificación de subidas que esta utilizando esta app pueda detectar nuestro código PHP como una app, a pesar de indicarle Content-Type
, Filename
y headers
como si fueran los de una imagen. Por este motivo intentaremos enmascarar lo mejor posible nuestro formulario, al mismo tiempo que tratamos de mantenerlo lo más pequeño posible.
Lo que haremos es crear un archivo PHP
y HTML
muy pequeño que simplemente genere un formulario de subida de archivos sin ningún tipo de restricción. Si logramos que este pequeño form suba sin problema, estaremos más cerca de tener el acceso necesario para hacer el defacement.
El código quedaría de esta manera:
Este archivo lo guardaré como GIF98.php.jpg
en un intento de burlar algún control que revise la extensión del archivo subido. Es bastante común que protecciones débiles implementadas en las web apps, únicamente verifiquen solamente desde el final del nombre de archivo hasta el primer punto (.jpg) ignorando la segunda extensión (.php). Algunas veces esta verificación se da al revés, y se controla de izquierda a derecha desde el nombre del archivo por ende es posible que tengamos que cambiar el nombre a GIF98.php.jpg.
También editaremos la request luego de hacer click en Upload
en la app, para eliminar la extensión jpg
y dejar el parámetro Filename
de esta manera: Filename=GIF98.php
.
El nombre de este formulario puede ser el que quieras, en mi caso opté por ese sin razón técnica alguna pero fue luego de revisar algunos recursos como Hacktricks y Penetration Testing Playbook, donde se menciona la posibilidad de burlar algunas protecciones mediante el agregado a nuestro PHP de una cabecera de imagen (header):
El concepto es simple se intenta que el servidor interprete las cabeceras de la request y luego al "ver" el contenido lo primero que encuentre sea una instrucción (header) que este normalmente asociado a un archivo de imagen. En el caso ejemplo de arriba vemos que este header es GIF89a
, pero también existen otros como GIF98
que es el que voy a usar en este lab.
Veamos si esta esta idea funciona: En DVWA -> File Upload
cargaremos nuestro formulario e interceptamos la request con burp luego de subirlo.
Modificaremos lo siguiente si es que la request evidencia que al subir el archivo el formato del mismo es detectado como application/x-php y no como imagen:
Cambiamos el valor de Filename=GIF98.php.jpg
a Filename=GIF98.php
Cambiamos el valor de Content-Type: application/x-php
a Content-Type: image/jpeg
La request nos quedará de la siguiente forma:
Al darle Forward a la quest modificada vemos el resultado:
Lo hemos logrado! pudimos burlar la protección de la app y subimos nuestro propio File Uploader. Veamos ahora si logramos cargarlo accediendo a la ruta que nos da la app en el mensaje:
Y en efecto podemos abrir nuestro File Uploader:
Podemos probar este formulario para ver que en efecto cualquier archivo que subamos, sin importar su extensión. En este caso ya lo he probado y funciona, por ende no voy a cubrir esa mini prueba dado que esta práctica ya esta bastante larga.
NOTA: En un escenario real muchos de estos payloads que creamos pueden ser fácilmente detectados por el Firewall y Antivirus que estén instalados en el servidor. En este caso como estamos practicando en un laboratorio de pruebas no tendremos ese problema e incluso de tenerlos podemos deshabilitarlos. Para mitigar esto podemos hacer uso de técnicas de ofuscación para lograr subirlos sin que sean detectados.
Veamos rápidamente como podemos crear nuestro reverse shell usando msfvenom
. No usaremos metasploit
, directamente intentaremos conectar el reverse shell a nuestro listener de netcat
en la terminal de Kali.
En mi caso:
Ahora que ya tenemos nuestro payload, dejamos nuestro listener preparado:
Con todo listo subimos nuestro payload:
En efecto si vamos a la URL donde se suben los archivos, veremos nuestro payload:
Por último veamos si logramos obtener la conexión al server por reverse shell al abrir nuestro payload:
Y en nuestra terminal finalmente recibimos la conexión:
Lo próximo es el defacement que veremos a continuación, para el defacement el objetivo es reemplazar index.php
con nuestro archivo web que preparamos para el defacement.
Antes que podamos proceder con el defacement debemos solucionar un pequeño problema, la conexión que recibimos con nuestro reverse shell es bastante inestable y la conexión al server se corta rápidamente. Para mitigar este problema intentaremos crear un segundo payload
con en formato exe para la plataforma Windows donde corre la app. La idea es que una vez tengamos la conexión inicial con el payload1
, ejecutaremos el payload2
para obtener una sesión más estable en un netcat
listener secundario.
Para crear este segundo payload, también usaremos msfvenom
:
Creamos este segundo payload:
Y una vez creado lo subimos con nuestro custom upload form, como hicimos con el primer payload.
Ahora dejaremos 2 listeners
corriendo con netcat
, cada uno apuntando al puerto seleccionado durante la creación de estos payloads. En mi caso, 2112 para el payload php
y 2113 para el exe
. Ejecutaremos entonces el payload php
y al recibir la conexión rápidamente ejecutaremos el payload .exe para recibir la otra conexión por reverse shell que quizá sea más estable:
Ahora finalmente tenemos un segundo shell más estable para trabajar. Lo próximo, finalmente, es el defacement.
Finalmente, luego de varios procesos tenemos el acceso inicial al servidor para poder realizar el defacement. Veamos si podemos llevarlo a cabo sin encontrar ningún otro obstáculo.
Lo primero es tener nuestro HTML para reemplazar el index.php
listo y lo serviremos online usando un HTTP server local
levantado con python:
Luego descargamos ese archivo en el webserver, usando Curl:
Y en efecto vemos que hemos logrado cargar nuestro HTML
para el defacement:
Veamos si logramos ver el defacement al acceder a la ruta principal de DVWA
:
Lo hemos logrado, lo más dificultoso fue aprender de que manera vulnerar las protecciones de la carga de archivos de esta web app y como generar una conexión estable por reverse shell que nos permita luego llevar a cabo nuestro Website Defacement.
Espero que este práctica te sea de utilidad en tus estudios, ciertamente yo he aprendido mucho durante esta práctica y la elaboración de este escrito.
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en el siguiente link.
En esta práctica veremos como usar Shodan para localizar servers con puertos 22 y 23 abiertos y usaremos nmap para obtener información básica de los objetivos.
CEH: "En el escaneo, por lo general, encontramos puertos abiertos, cerrados y filtrados. Cada uno son servicios totalmente diferentes, excepto unos puertos utilizados en cuanto a la presentación de un sitio web (80 o 8080). Una de las mayores vulnerabilidades es encontrar puertos de sencillo acceso, tanto el puerto 22 (SSH) como el puerto 23 (Telnet)."
En esta mini-práctica
veremos como usar Shodan
para localizar servers que tengan determinados puertos abiertos. Para el caso de este ejemplo estamos interesados en encontrar los puertos 22
y 23
abiertos. Luego usaremos nmap
para confirmar que dichos servidores en efecto tienen ambos puertos abiertos.
Wikipedia: Telnet (Teletype Network) es el nombre de un protocolo de red que nos permite acceder a otra máquina para manejarla remotamente. También es el nombre del programa informático que implementa el cliente. Su mayor problema es de seguridad, ya que todos los nombres de usuario y contraseñas necesarias para entrar en las máquinas viajan por la red como texto plano (cadenas de texto sin cifrar). Esto facilita que cualquiera que espíe el tráfico de la red pueda obtener los nombres de usuario y contraseñas. Por esta razón dejó de usarse, ante la llegada de SSH.
Wikipedia: SSH (o Secure SHell) es el nombre de un protocolo y del programa que lo implementa cuya principal función es el acceso remoto a un servidor por medio de un canal seguro en el que toda la información está cifrada. SSH permite copiar datos de forma segura (tanto archivos sueltos como simular sesiones FTP cifradas), gestionar claves RSA para no escribir contraseñas al conectar a los dispositivos y pasar los datos de cualquier otra aplicación por un canal seguro tunelizado mediante SSH y también puede redirigir el tráfico del (Sistema de Ventanas X) para poder ejecutar programas gráficos remotamente.
Shodan nos permite realizar búsquedas tanto desde su sitio web como desde la terminal utilizando una llave de acceso a la API. En este caso usaremos rápidamente la versión web, Shodan.io
utilizando la búsqueda. La cual refinaremos con el uso de filtros
, en este caso el filtro por puertos llamado port:
.
Este filtro lo podemos utilizar de la siguiente manera:
En la barra de búsqueda ingresamos el texto port:
seguido del número de puerto que por el que queremos filtrar. Por ejemplo: port:80
.
Está búsqueda con shodan
la realizaremos para encontrar los objetivos para esta práctica, basta con seleccionar de la lista de resultados ofrecidos por shodan
las direcciones IP
. Esas direcciones IP las usaremos a continuación para confirmar que los puertos abiertos para cada objetivo reportados por shodan
están en efecto abiertos. Para esa confirmación usaremos la herramienta nmap
.
Para el scanning voy a utilizar nmap
como herramienta, la misma viene preinstalada en distribuciones como Kali Linux
.
Como primer ejemplo usare el objetivo 35.199.79.95
al escanearlo con nmap
vemos que dicho server tiene el puerto 22
abierto. Para esto usaremos nmap con una serie de switches o flags que nos permiten refinar el tipo de scan, velocidad y puerto.
Una vez completado el scan vemos que obtenemos confirmación de que el objetivo cuenta con el puerto 22
abierto como había sido reportado por la búsqueda que realizamos en shodan
. Si observamos con atención el resultado del scan, vemos que nmap nos devuelve bastante información adicional.
Busquemos ahora algún objetivo que tenga el puerto 23
abierto, para lo cual refinamos nuestra búsqueda en shodan
con el filtro port:23
, alternativamente podemos buscar directamente por el nombre del servicio, telnet
.
Para encontrar servidores
con el servicio de telnet
activo, basta con ingresar el nombre del servicio
en la barra de búsqueda. Esto funciona con otros servicios como por ejemplo SSH
.
Una vez elegido el objetivo procedemos a escanearlo con nmap para confirmar que en efecto el puerto 23
esta abierto. En mi caso elegí 67.201.141.136
como objetivo:
Como vemos en los resultados el scan confirman que el puerto 23
se encuentra abierto. En este caso en particular también el puerto 21
se encuentra abierto. De esta manera vimos como ubicar servidores con determinados puertos abiertos y como usando nmap podemos comprobar que en efecto se encuentran abiertos.
En esta práctica veremos en que consiste el ataque llamado NTFS Stream Manipulation.
NTFS es un sistema de archivos propietario de Microsoft y fue introducido como reemplazo de sistemas de archivos anteriores como FAT (File Allocation Table) y HPFS (High Performance File System) e incorpora mejoras técnicas con respecto a estos. Entre algunas de las ventajas NTFS incorpora un soporte mejorado para metadatos, mejoras en la administración de espacio en disco, mejoras de performance, un mejorado sistema de seguridad y un sistema de encriptado de archivos llamado EFS (Encrypting File System).
Desde Windows NT 3.1 es el sistema de archivos por default en la familia de Windows NT como por ejemplo Windows Server 2008, Windows 7 y Windows 10 por nombrar algunos. Es soportado en sistemas operativos de escritorio y servidor. El soporte en Linux y BSD es posible mediante el NTFS Driver (NTFS-3G) el cual ofrece soporte para lectura y escritura. En macOS se ofrece soporte de lectura.
Para poder entender como funciona el ataque de NTFS Stream Manipulation
, primero debemos conocer lo básico sobre ADS
(alternate data streams)
. ADS es una característica del sistema de archivos NTFS
(NT File System)
que permite que más de un stream
de datos pueda estar asociado a mismo archivo. Cada archivo, tiene su contenido principal conocido como default stream
y puede tener uno o más ADS
.
Estos streams
de datos usan un formato en particular: fileName:streamName:streamType
. Por ejemplo un ADS
cuyo stream
es llamado payload
y esta alojado dentro de un archivo llamado malicioso.txt
se vería de esta forma: malicioso.txt:payload:$DATA
. Cabe destacar que los ADS pueden existir en cualquier tipo de archivo, incluyendo ejecutables. El contenido de los ADS puede ser de cualquier tipo y por ende no es necesario que sea del mismo tipo del archivo que lo contenga. Por ejemplo un archivo de imagen JPG
puede contener streams
de datos del tipo video, audio, etc.
Otra característica de ADS
es que su peso no es reportado como parte del peso total del archivo que lo contiene y tampoco aparecen listados en aplicaciones muy utilizadas en Windows como lo es Windows Explorer
. Que un archivo contenga uno o más ADS tampoco altera el funcionamiento original del archivo y este seguirá funcionando como siempre. Por estos motivos, los archivos con ADS maliciosos son algo bastante común.
Cuando se copian o mueven
archivos que contienen ADS a sistemas de archivos que no soportan Alternate Data Streams
, el usuario recibe una advertencia de que los streams
se perderán. Sin embargo, esta advertencia no suele ser emitida
cuando los archivos se adjuntan por correo
o son subidos a una web
. En esos casos toda información de ADS que estaba contenida en el archivo se perderá.
La idea principal detrás de la manipulación de NTFS Data Streams
es la de ocultar información dentro de otro archivo, normalmente con fines maliciosos. Como por ejemplo permite a un atacante ocultar información sensible recolectada de un sistema, dentro de los mismos archivos del usuario sin que este note cambio alguno en sus archivos. El atacante luego puede simplemente extraer esos archivos aparentemente normales del sistema objetivo llevándose consigo toda la información relevante almacenada en los ADS.
En esta parte de la práctica veremos como podemos crear un archivo de texto y posteriormente agregarle Alternate Data Streams con información únicamente visible para NTFS.
Para comenzar abrimos la consola de Windows (cmd) y creamos nuestro primer archivo, en este caso un archivo de texto. Para lo cual usamos el comando echo
, el contenido de nuestro archivo y finalmente el redireccionamos todo a nuestro archivo usando el carácter >
seguido por el nombre de archivo y extensión
que queremos crear. Veamos esto en la consola:
echo
{contenido} >
{nombre de archivo}.{extensión}
Como podemos observar en la imagen, el archivo es creado correctamente y tiene un peso de 36 bytes
. Podemos usar el comando type
para ver el contenido del mismo:
Ahora, usando nuevamente el comando echo
como hicimos en el paso 1, agregaremos el primer Alternate Data Stream
a nuestro archivo. La única diferencia es que en este caso debemos indicar el nombre del stream
. Veamos esto en la consola:
Como podemos observar el stream
parece haberse agregado sin error y nuestro archivo reporta el mismo tamaño de 36 bytes
. También vemos que en ningún lado es reportado que existe un ADS
en el archivo. Esto es precisamente lo que convierte a los ADS en una buena opción para esconder información sin que el usuario lo note.
Agreguemos un segundo ADS y veamos de que manera podemos obtener información de los mismos en la consola:
Para ver el contenido de data streams
adicionales que pueda contener un archivo, hacemos uso del comando dir /r
el cual lista los archivos incluyendo sus ADS
. Como podemos ver en la imagen anterior el tamaño reportado del archivo sigue siendo el mismo 36 bytes
a pesar de que contiene dos ADS
de 23 bytes
cada uno. Si prestamos atención al espacio en disco disponible luego de crear el archivo y luego de cada creación de los ADS
, podemos observar que NTFS si lleva el registro correcto de cuanto espacio esta siendo utilizado en realidad.
Si abrimos el archivo con el bloc de notas vemos que únicamente se presentan los datos del default stream
:
Si queremos editar o ver el contenido de cada ADS, debemos invocarlo directamente de la siguiente forma:
Como dijimos antes el contenido del ADS puede ser de cualquier formato al igual que el archivo que los contenga. Cabe destacar que Alternate Data Streams se pueden agregar a directorios
de la misma forma que conarchivos
. Veamos esto rápidamente en la consola:
Como podemos observar en la imagen la carpeta DIRECTORIO
contiene un ADS
llamado ADS1
.
PowerShell incorpora ciertos comandos (cmdlets) que facilitan trabajar con ADS. Veamos como podemos listar los ADS presentes en el archivo que hemos creado en esta práctica:
En el caso de PowerShell, el default stream
se conoce como unnamed stream
, o stream sin nombre
ya que aparece listado simplemente como :$DATA
.
Para ver el contenido por ejemplo del ADS2
, podemos hacer uso del comando Get-Content
de la siguiente manera:
Si queremos agregar contenido al ADS podemos hacerlo con el comando Set-Content
. Veamos como podemos agregar dentro de un nuevo archivo de texto un ADS llamado payload
que contenga un archivo ejecutable
como por ejemplo el clásico Microsoft Paint
. Para eso hacemos uso del siguiente comando:
También podemos hacer uso del cmdlet
Add-Content
.
En este comando explícitamente indicamos el encoding para los bytes
, el readcount en 0
(para leer el archivo en una sola operación y el comando Get-Command
para obtener rápidamente la ruta de mspaint.exe
sin tener que especificarla manualmente. Luego simplemente indicamos el nombre del stream
que queremos agregar usando el switch -stream {nombreDelStream}
.
Como podemos ver en la imagen, nuestro archivo de texto contiene un nuevo ADS. Veamos como podemos ejecutar
ese ADS que sabemos contiene un archivo ejecutable. Para lograr esto podemos usar Windows Management Instrumentation
para crear un proceso que ejecute nuestro ADS.
Este método de ejecución de archivos usando wmic
parece haber sido reparado en Windows en la versión que tengo en las VMs por ende al intentar ejecutarlo tanto en CMD
como en Powershell
obtengo un error y el programa no se ejecuta. En versiones vulnerables de Windows, el programa sería ejecutado directamente y veríamos en nuestro caso a mspaint.exe
en ejecución. Voy a investigar un poco más sobre otras formas de ejecutar ADS en versiones actualizadas de Windows, de encontrar alguna actualizaré este artículo.
Actualización: Luego de varios intentos logré agregar el contenido de la calculadora de Windows calc.exe
a nuestro archivo de práctica y ejecutarlo correctamente usando wmic
:
Como vemos al ejecutarse el comando correctamente genera un nuevo proceso el cual retorna un ProcessId = 4344
y un ReturnValue = 0
indicando que el proceso se completó exitosamente. No comprendo porque no funcionó el intento inicial, quizás sea el ejecutable de mspaint.exe
o algún error que estoy cometiendo y no logro darme cuenta. Si te das cuenta del problema, házmelo saber con un tweet a mi cuenta @tzero86.
Si queremos borrar un ADS en particular podemos hacer uso del cmdlet Remove-Item
de la siguiente manera. Por ejemplo para eliminar nuestro ADS llamado payload
:
Como podemos ver nuestro archivo ahora contiene solo dos ADS adicionales. Hasta aquí vimos y practicamos un poco NTFS Stream Manipulation.
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en el siguiente link.
En esta práctica veremos como podemos localizar diversos dispositivos IoT vulnerables, usando shodan.io y Python.
IoT o Internet de las cosas (Internet of Things) es básicamente la interconexión de distintos tipos de dispositivos en una red que compartan. Esta red puede ser incluso internet mismo, en otros casos redes privadas. Estos dispositivos entablan comunicación con otros dispositivos de la misma red y a su vez permiten monitoreo e control de sus funcionalidades.
Hoy en día este tipo de dispositivos es muy variado, desde cámaras de seguridad, sensores ambientales, luces, sistemas de sonido, etc. Incluso controladores industriales que mantienen operaciones críticas como ser controles para turbinas de parques de energía eólica, centrales de telecomunicaciones, controles críticos de vuelo. O sistemas mucho más mundanos como ser controles de sistemas de semáforos o heladeras "smart".
Todo este rango de dispositivos funciona por lo general, con cierto nivel de autonomía. Pero comúnmente disponen de algún panel de administración desde el cual se puede monitorear su funcionamiento e incluso modificarlo completamente.
Considerando que estos dispositivos en muchos casos están expuestos de cara a internet, normalmente pueden ser escaneados en busca de software vulnerable que permita el acceso con privilegios elevados, servicios expuestos que usen contraseñas comunes o de fábrica. Una de las herramientas que podemos usar para localizar este tipo de dispositivos es Shodan.io
, una suerte de buscador como DuckDuckGo, Google, etc. Pero a diferencia de esos, Shodan
nos permite ubicar dispositivos en internet.
Shodan tiene multiples servicios que se ejecutan 24/7 y que van escaneando internet en busca de dispositivos para escanearlos, detectar puertos abiertos y distintos tipos de información y posibles vulnerabilidades. Al consumir la data generada en este proceso por los crawlers de Shodan, podemos obtener información muy valiosa sobre los objetivos que tengamos intención de investigar.
A continuación veremos como podemos utilizar Shodan para localizar diversos dispositivos IoT vulnerables expuestos en internet y el tipo de información que podemos obtener.
Para comenzar con Shodan podemos hacer uso de su interfaz para navegar los resultados por categorías, tipos de dispositivos, países, etc. Esta interfaz web proporciona incluso una vista de mapa donde podemos ubicar dispositivos geográficamente. También disponemos de un programa de línea de comandos Shodan CLI para distintos sistemas operativos, y paquetes de desarrollo para Python, NodeJS, etc.
En Shodan también disponemos de un lenguaje de consultas, llamado Search Query Syntax. Esta sintaxis nos permite hacer uso de variados filtros para obtener resultados más específicos a nuestras necesidades. La información devuelta contiene diversas propiedades sobre el dispositivo y sus servicios expuestos, como puede ser el país donde opera, puertos abiertos a servicios, detalle sobre la organización a la que pertenece, etc.
Algunos de los filtros útiles que podemos usar con Shodan:
geo: Nos permite especificar coordenadas geográficas.
country: Nos permite buscar dispositivos en un determinado país.
city: Nos permite buscar dispositivos por ciudad.
hostname: Para ubicar hosts por nombre (google.com)
os: Buscar por Sistema operativo.
port: buscar por puertos.
net: Para buscar por IP o CIDR
Y algunos ejemplos de queries usando alguno de estos: Buscar servidores apache en un determinado país:
Buscar servidores Nginx en una ciudad en particular:
Una combinación de varios filtros:
De esta manera podemos generar nuestras propias consultas para obtener resultados más focalizados sobre nuestros objetivos. Cabe destacar que ese lenguaje de consultas soporta muchos otros filtros. Los mismos podemos aprenderlos de las mismas búsquedas en la web de Shodan y existen diversos repositorios con queries útiles que podemos probar. En lo que respecta a esta práctica haremos uso de algunas queries en particular para ubicar determinados dispositivos de nuestro interés.
Cabe aclarar que para obtener resultados de Shodan mediante queries, debes obtener tu API key en Shodan.io. Esta clave API será requerida para poder hacer consultas en Shodan y ver distintas páginas de resultados. Shodan ofrece una clave gratuita, pero obviamente provee funcionalidades limitadas, como el número de consultas que podemos realizar. Para este práctico usaré mi clave personal.
Para este práctico voy a utilizar la librería oficial de Python para Shodan, que puedes descargar del siguiente repositorio. Veamos como luce este banner al realizar una consulta con un básico programa en Python, una suerte de Hola mundo con Shodan.
Repositorio: https://github.com/achillean/shodan-python
En realidad contiene un poco más que lo necesario para un Hola mundo, pero es importante poder visualizar la información devuelta por Shodan en un formato más ameno al formato crudo en el que es inicialmente devuelta la respuesta:
Nota: Para usar este script basta con copiarlo y asegurarse de ejecutar:pip3 install IPy, shodan, json
Si observamos la respuesta, vemos el nivel de detalle que podemos obtener. Para este ejemplo puse como objetivo la web de Turismo Buenos Aires e intencionalmente removí algunos datos a fin de que sea mas simple visualizar la información base incluida en el banner:
Como podemos observar, la información devuelta sobre el objetivo incluye información valiosa, como ser puertos abiertos, el código de país y nombre del mismo entre algunos otros detalles. La respuesta completa incluye mucha más información que por cuestión de espacio no voy a mostrar en esta práctica.
Hasta acá vimos como obtener información básica con Shodan usando Python, veamos ahora de que manera podemos localizar webcams vulnerables.
Para esto usaremos la siguiente query:
Y consumiremos esa query en nuestro script de Python no con el método host()
sino haciendo uso del método search():
Y de esta manera obtenemos los primeros 3 dispositivos expuestos a internet de este tipo.
Al igual que antes vemos solo una parte de los resultados devueltos por nuestra query. En este caso podemos ver que este dispositivo es en efecto vulnerable y no cuenta con ningún control de acceso. Basta con dirigirnos a la IP y Puerto devuelto en los resultados y podemos ver la webcam en vivo e incluso controlar el movimiento de la misma. Todo esto sin haber siquiera ingresado un usuario y contraseña.
Veamos ahora como podemos localizar dispositivos con servicios de Remote Desktop Protocol, los cuales hayan caído victimas de ransomware:
Usaremos la siguiente query:
En este caso no hace falta revisar el script, solo necesitamos actualizar la variable query en nuestro script y ejecutarlo. Al hacerlo obtenemos la siguiente response desde Shodan:
Si vemos el screenshot que viene como parte de los resultados:
El mismo resultado que obtendríamos realizando la consulta en la web de Shodan.io:
Veamos ahora como podemos localizar otro tipo de dispositivos, como por ejemplo impresoras. Para esto haremos uso de la siguiente query para alimentar nuestro script en Python:
Actualizamos nuestro script con la nueva query y al ejecutarlo obtenemos lo siguiente:
Si analizamos este resultado, podemos ver que entre los datos devueltos por Shodan se incluye una enumeración de los Shares de SMB, o Samba. Los mismos podemos apreciarlos en un formato más ameno al realizar la misma consulta en la web de Shodan.io
De igual manera que Shodan nos provee este tipo de resultados, también puede incluir la lista vulnerabilidades detectadas en dichos dispositivos. En el caso de esta práctica no veremos mas que un ejemplo de este tipo de resultados tanto en modo API response como en la Web de Shodan:
Esta lista de vulnerabilidades se presenta de la siguiente forma en Shodan.io:
De esta manera vimos como podemos aprovechar el poder de Shodan.io para fácilmente localizar distintos tipos de dispositivos conectados a internet. Y vimos como ubicar Webcams, Sesiones RDP comprometidas por ransomware y finalmente localizamos una impresora cuyas SMB Shares fueron enumeradas por Shodan.io.
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en el siguiente link.
En esta práctica veremos como usar recon-ng para realizar un footprinting de un objetivo.
Al iniciar recon-ng
nos encontramos con un framework vacío. Lo primero que debemos hacer es instalar modulos
que habilitan diferentes tipos de funcionalidades en recon-ng
(podemos pensarlos como extensiones o plugins).
Para ver los comandos disponibles usamos el comando help
:
Con cualquier framework donde se utilicen módulos o extensiones es debemos conocer cuales comandos tenemos disponibles para poder buscar, instalar y eliminar los módulos cuando ya no los necesitemos.
Para buscar que módulos disponibles existen para recon-ng, contamos con el comando marketplace search
, con el cual recon-ng mostrara una lista de los módulos disponibles para ser instalados:
La lista de módulos disponibles es bastante extensa, y vemos que entre los detalles tenemos path
, version
, status
, updated.
Adicionalmente tenemos dos columnas llamadas D
y K
que nos indican si el modulo tiene Dependencias(D) o si necesita de una key(K), como es por ejemplo el caso de shodan_ip
.
Si el modulo que intentamos usar requiere una api key, podemos agregarla a recon-ng de la siguiente manera: keys add shodan_api {API_KEY}
:
Las keys añadidas son almacenadas en el archivo
keys.db
en la carpeta donde se encuentra instalado recon-ng.
Para poder instalar los módulos, contamos con el comando marketplace
. Para instalar un modulo, por ejemplo shodan_ip
. Usamos el siguiente comando: marketplace install shodan_ip
:
De esta manera dejamos instalado el modulo seleccionado.
Es necesario cargar el modulo que se desea utilizar, en este caso: modules load shodan_ip
. Similar a otros frameworks como metasploit
. En recon-ng los módulos tienen diferentes opciones que debemos setear para poder ejecutarlos. Para ver las opciones requeridas (y opcionales) del modulo seleccionado usamos el siguiente comando: options list
:
Si ejecutamos el comando info
, podemos ver los distintos tipos de opciones que se pueden setear y sus valores actuales. Adicionalmente obtenemos un detalle de que valores podemos setear para la opción SOURCE
.
Para setear las opciones usamos el comando options set {NOMBRE_OPCION}
, en este caso el modulo necesita que SOURCE
este seteado. El source en nuestro caso es el IP del objetivo (obtenido en shodan.io):
En este punto ya estamos listo para ejecutar el modulo, para eso usamos el comando run
:
Como podemos ver el modulo realiza un escaneo del objetivo y nos devuelve ciertos detalles sobre el mismo. Si ingresamos el comando show ports
podemos ver la lista de puertos descubiertos durante el scan:
También es posible usar otros módulos que devuelven otro tipo de información. Por ejemplo podemos instalar el modulo whois_pocs
, configurarlo y ejecutarlo:
De esta manera realizamos un scan simple utilizando shodan
para obtener puertos abiertos y luego usando el modulo whois_opcs
obtuvimos información de whois
en un scan adicional.
Es importante tener en cuenta que recon-ng nos permite organizar nuestra información en diferentes workspaces
o espacios de trabajo. La ventaja de esto es que podemos tener nuestra información separada por ejemplo, por objetivos o clientes para los cuales estemos haciendo reconocimiento. De esta manera es muy simple tener un espacio por ejemplo para todo lo relacionados a nuestras tareas de reconocimiento de microsoft.com
y en otro workspace tener todo lo relacionado a udemy.com
.
El uso de workspaces es muy simple como vemos a continuación:
workspaces list
nos deja ver todos los workspaces existentes.
workspaces create {NOMBRE_WORKSPACE}
nos permite crear uno nuevo.
workspaces load {NOMBRE_WORKSPACE}
nos permite cargar y marcar como activo un determinado workspace.
workspaces remove {NOMBRE_WORKSPACE}
nos permite borrar un workspace.
Web para registrarnos en el siguiente Link. La creación de la cuenta es un proceso trivial como en cualquier web y no lo cubriremos como parte de la práctica.
Página de descarga de Nessus: Link.
Si en este punto recibes un error de que la descarga de plugins falló, visita esta sección al final de este escrito llamada Troubleshooting Nessus. En caso contrario sigue leyendo.
Para conocer más sobre como se clasifican las severidades en CVSSv2 y sus respectivos valores, visita el siguiente link.
El laboratorio tiene varias vulnerabilidades y no es la intención remediarlas, dado que la idea es usarlo para practicar los distintos vectores de ataque. Sin embargo si te interesa leer como solucionar esta vulnerabilidad en particular, te recomiendo el siguiente post en español del blog de 0xsecure en el siguiente link.
Si el error persiste: Podemos usar los siguientes comandos en orden para resetear Nessus por completo. Más información en el siguiente link.
En este caso ejecutaremos el scan inmediatamente:
Leer más en el siguiente link.
Puedes descargar el ejemplo que usé de base desde el siguiente repositorio: LINK
En esta mini-práctica no vamos a ahondar en nmap
. Para conocer más sobre esta herramienta y como realizar distintos tipos de escaneos, sigue este link.
En este artículo veremos en que consiste el secuestro de sesión (Session Hijacking) y un simple ejemplo de reflected XSS.
Session Hijacking o secuestro de sesión consiste en interceptar la comunicación entre dos hosts con la intención de obtener un rol de usuario autenticado en un determinado objetivo. Normalmente esta práctica se suele realizar de modo pasivo
o activo
y con ataques como serMITM(Man-in-the-middle)
, STP(Session token prediction)
, TP(token tampering)
y SP(Session Replay)
, XSS(Cross-site-scripting)
, SF(Session-Fixation)
entre otros.
Los ataques pasivos
involucran el monitoreo del tráfico de red entre los hosts, haciendo sniffing del tráfico interesante pero sin influir en absoluto en la comunicación. En cambio los ataques de tipo activos
involucra el envío de paquetes de red por parte del atacante, lo que se conoce como packet-injection
.
A su vez, estos tipos de ataques se pueden clasificar entre las siguientes categorías:
Stealing: Ataques donde en efecto se "roba"
la sesión. Por ejemplo utilizando Troyanos
, Network-Sniffing
, etc.
Guessing: Ataques donde se intenta "adivinar"
el ID de sesión. Por ejemplo se identifica el patrón usado en la generación de Session IDs
y se emula hasta generar uno válido.
Brute-Forcing: Ataques donde se utiliza el enfoque de fuerza bruta con el uso de scripts. Por ejemplo ataques que prueban diversas combinaciones de usuario:password
hasta dar con el correcto.
A grandes rasgos, session-hijacking consta de las siguientes etapas:
Etapa
Descripción
Sniffing
El atacante intenta interceptar el trafico entre dos hosts, para hacer sniffing del tráfico de red entre hosts.
Monitoring
Monitoreo del tráfico de red en busca de información de sesión.
Session Desync
En este punto el atacante esta listo para quebrar o de-sincronizar la conexión entre los hosts.
Session ID
El atacante toma control de la sesión, via diversas técnicas como Session Guessing
. Para lograr generar un session-ID
válido.
Command Injection
Una vez el atacante controla la sesión comienza a inyectar los comandos maliciosos o puede tomar control completo de la sesión autenticada y operar en vez del usuario legítimo.
El secuestro de sesión se diferencia del Spoofing
en un rasgo fundamental: al hacer spoofing el atacante trata de impersonar a la victima y no cuenta con una sesión de ese usuario activa. Generalmente trata de obtener sesión una mediante la ayuda de la ingeniería social y el robo de datos. En
en cambio, se intenta session-hijackingtomar el control
de una sesión autenticada existente entre la victima y un determinado host.
También hay que tener presente que el session-hijacking se da en dos niveles: Network-Level Session Hijacking
y Application-Level Session Hijacking
. Veremos a continuación sus diferencias y distintos tipos de ataques.
En Application-level session hijacking, el atacante intenta el secuestro de sesión como también diversas técnicas para crear nuevas sesiones(session-ID
). En este tipo de enfoque necesitamos adaptar nuestros ataques acorde a la tecnología que alimenta por ejemplo la aplicación web que estemos intentando atacar. Para este fin se utilizan diversos tipos de ataques y técnicas, algunas de las cuales veremos a continuación.
Ataque
Descripción
Session Sniffing
Consiste en hacer sniffing del la comunicación para obtener un Session Token o ID y lograr autenticarse en la aplicación web objetivo. Normalmente se utiliza algún Network Sniffer(Wireshark o Ettercap
) o mediante el uso de un web proxy como (Burp Proxy
, ZAP
o Fiddler
).
Session ID Prediction
En este ataque lo que se busca en identificar el patrón usado en la generación de tokens de sesión o session-IDs
. De encontrarse dicho patrón
, el atacante puede entonces comenzar a generar session-IDs
que sean considerados como legítimos por la aplicación.
MITB(Man-in-the-browser)
Similar a al ataque Man-in-the-middle
generalmente se utilizan troyanos
, y extensiones maliciosas
para interceptar la comunicación entre el browser y los mecanismos de seguridad implementados en la aplicación. De esta manera el código malicioso puede directamente manipular el DOM (Document Object Model) y extraer o modificar la información sin que el usuario se de cuenta.
Dado que el servidor no tiene forma de detectar cuales valores fueron modificados por el atacante y cuales por el usuario, simplemente realiza la transacción solicitada. Imaginemos este escenario en una aplicación de home banking, la extensión maliciosa puede modificar el monto y la cuenta de destino de una transferencia sin que el usuario se percate y el atacante recibirá esos fondos en una cuenta bajo su control. Incluso el código malicioso puede re-setear los valores originales por ejemplo cuando el servidor emite el comprobante de transferencia. De esta forma el usuario no detecta actividad sospechosa alguna.
XSS(Cross site scripting)
Es un ataque en el cual se inyectan scripts en sitios normalmente benignos con el fin de que estos scripts sean ejecutados sin problemas dado que el sitio web no tiene forma de saber que ese código no es parte de la misma web que esta sirviendo.
Usualmente estos scripts que se inyectan son piezas de código en JavaScript que pueden incluir HTML. De esta forma se pueden obtener las cookies, tokens de sesión y cualquier otra información que sea almacenada por el browser o directamente hacer que se redirija al usuario a un servidor controlado por el atacante. Existen varios tipos de XSS:
Stored XSS: Cuando el input del usuario es almacenado en el servidor, por ej la DB o en un comentario en un foro. Al ser visitado por otro usuario este código no sanitizado es ejecutado directamente dado que se almacena directamente en la página.
DOM Based XSS: En este caso el código malicioso no es interpretado directamente y en cambio el código real de la página lo incluye al modificar el DOM para presentar por ej los resultados de una búsqueda.
Reflected XSS: En este caso el payload es leído por el servidor y renderizado directamente. Ya sea en un mensaje de error o en resultados de una búsqueda. Veremos un simple ejemplo de esta variante de XSS al final de este escrito.
CSRF(Cross site request forgery)
En este tipo de ataque se intenta forzar a la victima autenticada a realizar ciertas acciones en una aplicación web con peticiones maliciosas. El posible impacto de este ataque depende de que acciones están disponibles para la victima en la app. De ser un usuario con privilegios, la totalidad de la aplicación web puede verse comprometida.
CSRF
se ejecuta en los cambios de estado
de la aplicación, por ejemplo cuando se actualizan datos del perfil como ser el correo, password, direcciones, transferencias de fondos, etc.
Session Fixation
En este tipo de ataque se fuerza a la victima a utilizar un session-ID
controlado por el atacante. Comúnmente se engaña a la victima para que por ejemplo, haga click en un enlace de inicio de sesión que ya contiene un session-ID
activo.
Cuando esto sucede el servidor habilita la sesión de usuario y dado que el atacante posee el mismo session-ID, puede continuar operando en la webApp como si fuera el usuario legítimo.
Session Replay
En este tipo de ataque se hace uso de la captura de requests y el reenvío de las mismas con el fin de controlar el session-ID existente y poder realizar operaciones maliciosas en nombre de la victima.
En aplicaciones poco seguras, la información de session-ID
suele exponerse en forma de cookies o parámetros de URL
y en apps donde los session-IDs
no tienen configurado una fecha de caducidad. Por ende la misma request, una vez es capturada de la victima puede reenviarse para obtener control de la sesión.
El Network-level session hijacking tiene la ventaja de que los ataques no deben adaptarse según la tecnología usada por ejemplo en una determinada aplicación web, dado que este ataque se realiza directamente sobre el flujo de información de red el cual es independiente de la tecnología en cual este desarrollada la aplicación. En esta modalidad, el objetivo es interceptar y manipular el tráfico de red
entre los hosts y se utilizan variadas técnicas, a continuación veremos alguna de ellas.
Ataque
Descripción
IP Spoofing
Usando el spoofing de IP
, el atacante puede modificar paquetes de red y mandarlos al servidor indicando que la IP de origen es la de la victima cuando en realidad esos paquetes son emitidos por el atacante.
Estos paquetes serán tomados por tráfico válido originado en la sesión TCP
creada por la victima.
TCP Hijacking
En TCP Hijacking
la idea es generar un estado en el que la victima y el host no puedan comunicarse y poder emitir paquetes de red alterados que simulen venir de ambas partes y de esta manera obtener el control de la sesión.
Para esto es necesario que el atacante este en la misma red que la victima. Luego para evitar que la victima y el server puedan comunicarse puede hacerse uso de ataques como DoS(Denial-of-Service)
.
UDP Hijacking
Dado que en UDP
los paquetes de red no precisan ser secuenciales, ni usa paquetes ACK este protocolo es bastante más débil que TCP
y por ende UDP-Hijacking
es bastante mas simple que el TCP-Hijacking
.
En UDP Hijacking
el objetivo es crear y enviar un paquete de respuesta
antes de que el servidor tenga tiempo de responder. UDP es susceptible a ataques como MITM
donde el atacante puede incluso evitar que la respuesta del server llegue a la victima del todo.
MITM (Man-in-the-middle)
Este ataque consiste es sniffear
los paquetes de red entre la victima y el servidor. En este caso el trafico entre hosts esta pasando por el sniffer y el atacante puede modificarlos. Una técnica utilizada es ARP Poisoning
, que consiste en el envío de paquetes alterados para lograr que el host actualice sus ARP Table
y que la IP
de la victima sea
mapeada
a la dirección de hardware (MAC Address
) del atacante. De esta manera el tráfico del server hacía la victima sera redirigido hacia el atacante.
Otra forma es con paquetes ICMP
alterados intentando hacerle creer a la victima que rutear el tráfico de red mediante el atacante es mejor que hacerlo mediante el host. En este caso mejor puede entenderse como más rápido o menos propenso a errores.
Algunas de las herramientas usadas para Session Hijacking a nivel de App y Network se listan a continuación:
Tool
Descripción
OWASP ZAP (Zed Attack Proxy)
OWASP ZAP es un escáner de seguridad de aplicaciones web de código abierto. Y es utilizado para realizar auditorias de seguridad y analizar distintas vulnerabilidades en webapps.
Burp Suite
Es una herramienta integrada para realizar auditorias de seguridad en aplicaciones web. Incluye diversas herramientas para hacer reenvio de requests, modificaciones de requests, fuzzing, web crawling e incluso análisis de tokens de sesión, entre otras.
JHijack
Basado en Java es una herramienta multiplataforma para el análisis y detección de vulnerabilidades web. Algunos ataques que pueden ser simulados incluyen DOM Body Hijacking, URL Attack y session Hijacking. Require conocimientos de programación y protocolo HTTP para su uso, esta orientada a programadores.
DroidSheep
Herramienta para sniffing Mobile (Android) y análisis de red. Permite la captura de cookies y profiles para llevar a cabo session hijacking.
DroidSniff
Otra app Android que permite realizar análisis de seguridad en redes wireless y capturar cuentas de usuario de Facebook, Twitter entre otras.
Wireshark & Ethercap
Utilizadas entre otras cosas para realizar Network Sniffing y capturar tráfico de red sensible como tokens de sessión.
Veamos ahora un simple ejemplo de como funciona un ataque de Cross Site Scripting (XSS)
. Para este ejemplo usaremos una web de práctica llamada XSSGame
, en la cual podemos poner en práctica algunas diversas técnicas de XSS
. En particular en este caso veremos un ataque de tipo Reflected XSS
.
Anteriormente mencionamos la posibilidad de hacer robo de cookies de sesión mediante ataques XSS
. Veamos a continuación este ejemplo:
XSSGAME Foogle Challenge website.
Lo primero que realizaremos es la creación de una cookie, dado que este sitio de práctica filtra automáticamente la única cookie válida que utiliza (llamada ACSID).
NOTA: La creación de esta cookie es puramente para ejemplificar esta técnica de XSS con esta web de práctica. En web reales esto no es parte del proceso de ataque XSS.
Para crear una cookie de prueba basta con abrir la URL del sitio y luego presionando F12
abrimos las Devs tools
del navegador:
Una vez en las dev tools, vamos a la tab Application -> Storage -> Cookies -> http://xssgame.com
y veremos lo siguiente:
Para crear nuestra cookie basta con hacer doble click en la fila vacía (marcada en rojo en la imagen), en la columna Name ingresamos el nombre de la cookie y en value el valor. A continuación de los valores que puse.
Name: CEH_XSS
Value: Robo de Cookies con XSS
Una vez creada la cookie, debemos ver algo similar a esto:
Ahora veamos como explotando la vulnerabilidad de esta simple web, podemos robar directamente esa cookie sin mucho esfuerzo. Cabe aclarar que esto es posible dado que la web no procesa el input del user en el cuadro de búsqueda y directamente lo incluye en la página de la misma forma en que viene. Dado que esta app es intencionalmente vulnerable, aparte de un ataque XSS mediante el Input disponible en UI, veremos que también podemos hacer uso de un ataque XSS mediante la URL.
Veamos que simple resulta este ataque de XSS mediante el cuadro de búsqueda de la web de práctica. Basta con que prepararemos un pequeño script que se encargará de robar la cookie que hemos creado y presentar su valor en un alert box de Javascript:
El script es super simple y dado que la web procesa el contenido directamente sin hacer ningún chequeo sobre lo que se esta ingresando basta con hacer uso de una tag <script>
y un alert
que levante el valor de las cookies al llamar a document.cookie
.
<script></script>: Simple etiqueta HTML que nos permite incluir código JavaScript.
alert: Es un methodo que muestra una ventana de alerta con el contenido indicado.
document.cookie: cookie
es una propiedad
de document
, que nos permite leer y asignar cookies asociadas al documento (página web) que estamos accediendo. Leer más.
Veamos que sucede cuando ingresamos este código en el input de búsqueda de la web:
Y al hacer click en el botón search, nuestro ataque XSS se procesa exitosamente.
Obviamente este es un ejemplo super básico de un ataque de XSS, pero sirve para demostrar la importancia que tiene la sanitización de los valores ingresados por el usuario.
De la misma forma, podemos directamente atacar la URL de la web. Lo único a tener en cuenta en este caso es que debemos hacer URL encoding the los caracteres especiales como /
, ()
y los espacios
para luego anexar el resultado a la URL:
Si realizamos una simple búsqueda en esta web, podemos ver de que manera se construye la consulta que luego regresará o no los resultados:
Como vemos luego de una búsqueda la URL queda de la siguiente forma:
Teniendo esto en cuenta podemos convertir nuestro script de ataque para que pueda ser ejecutado directamente via URL. Para hacer el encoding a URL podemos hacer uso de una herramienta online como URL Decoder/Encoder(Link).
Ingresamos nuestro simple Script tal cual como lo usamos antes, y le damos click en el botón Encode
:
Una vez que tenemos nuestro código encodeado, podemos directamente usarlo en la URL respetando como el sistema normalmente forma la URL, para este ejemplo quedaría de la siguiente forma:
Si agregamos eso a la URL de nuestra web vulnerable y lo ejecutamos debemos obtener el mismo alert con el contenido de la cookie:
Como podemos ver el ataque XSS por URL es exitoso y si observamos bien la URL final, vemos que luego de ser procesada algunos caracteres que habíamos encodeado antes son ahora mostrados directamente. Este mismo ejemplo se puede ajustar para que en vez de mostrar la cookie en un alert, la misma sea enviada a nuestro equipo o a un sitio que controlemos y de esta manera hacer uso de esa cookie para poder impersonar una sesión de usuario válida.
La web presenta otros desafíos sobre ataques XSS que recomiendo explorar y practicar para comprender este tipo de ataques y sus variantes.
Cabe aclarar que fuera de XSS existen numerosas formas de ataques mediante las cuales se pueden realizar ataques de Session Hijacking, no es el objetivo de esta práctica demostrar estas otras técnicas. Pero hasta acá hemos visto los conceptos y variados ataques que pueden realizarse para llevar a cabo un robo de sesión.
Estas prácticas están sujetas a modificaciones y correcciones, la versión más actualizada disponible se encuentra online en el siguiente link.