Mostrando entradas con la etiqueta auditoría. Mostrar todas las entradas
Mostrando entradas con la etiqueta auditoría. Mostrar todas las entradas

jueves, agosto 01, 2024

Test de uso de GenAI para la detección de bugs de "Connection String Parameter Pollution" (CSPP) usando Ollama

En la primera parte de este artículo de ayer, titulado "Cómo utilizar GenAI para la detección de bugs en ficheros Web.config usando Ollama" explicaba cómo de bien detectaba el motor de GenAI basado en Ollama con diferentes LLMs los fallos de configuración de un fichero Web.config en aplicaciones ASP.NET , pero en la presentación del trabajo, me llevé deberes para casa, que os voy a contar ahora.

Figura 1: Test de uso de GenAI para la detección

Y es que cuando terminé de exponer mi trabajo con lo visto hasta el momento, Chema Alonso comentó que le gustaría probar cómo se comportaría este sistema frente a los ataques a los parámetros de las cadenas de conexión a bases de datos.

Vulnerabilidades de Connection String Injection

Chema Alonso y José Palazón presentaron en DEF CON 18 este tipo de ataques, donde destacan los ataques de Connnection String Parameter Pollution (CSPP). Tienes un paper publicado sobre estos ataques en BlackHat y una serie de artículos sobre Connection String Attacks en este blog.


Figura 2: Connection String Attacks en DefCON18

Aunque hay varias formas en las que se puede explotar esta vulnerabilidad, nos centraremos en el escenario de delegación de la autenticación en el motor de BD.  Es decir, tenemos una aplicación que recoge las credenciales del usuario y la cadena de conexión a la BD se calcula dinámicamente con estas. 

Cada usuario puede tener o no permisos de conexión a la BD y permisos de lectura o no a ciertas tablas. En el siguiente código C# de una aplicación ASP.NET se puede ver la idea:

private void EnlazarGrid(string usuario, string contraseña)
{
string cadenaConexion = $"Server=UK5FCMI;Database=WebApp;User Id={usuario};Password={contraseña};"; 
using (SqlConnection con = new SqlConnection(cadenaConexion))
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Products"))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
GridViewProductos.DataSource = dt;
GridViewProductos.DataBind();
}
}
}
}
}    

El método construye, mediante interpolación de cadenas, una cadena de conexión a una BD tipo SQL Server a partir de los parámetros de usuario y contraseña. Estos parámetros no se validan en ningún momento (ni en el llamador). Con esta cadena de conexión, se lanza una conexión contra la BD y se lee la información de la tabla Products (si el usuario de BD tiene permisos SELECT sobre dicha tabla) para mostrarla en la grid del formulario ASPXTodos estos ataques se explican en mucho detalle en el libro "Hacking Web Technologies 2ª Edición" de 0xWord.

donde Chema Alonso habla de los Connection String Attacks

Una forma de explotarlo sería, por ejemplo, introducir como contraseña la cadena ;Integrated Security=True;, con cualquier usuario. Si se permite la autenticación integrada en SQL Server y el usuario del pool de IIS con que se está ejecutando la aplicación tiene permisos de conexión y consulta a la BD de la aplicación, podemos conseguir acceder a información que no nos corresponde. 

Utilizando el mismo prompt que ya hemos diseñado, vamos a pedir al modelo de Llama 3.1 que evalúe la seguridad del código.

Figura 5: Análisis de vulnerabilidad de inyección en la cadena de conexión

El modelo detecta un problema en la cadena de conexión, identificando que los parámetros de usuario y contraseña, que provienen de los campos de un formulario, no se han validado ni comprobado. Detecta que esto puede presentar un problema de SQL Injection, sin embargo, la propuesta de solución NO es acertada. En la cadena de conexión, elimina los parámetros de usuario y contraseña:

string cadenaConexion = $"Server=UK5FCMI;Database=WebApp;";
using (SqlConnection con = new SqlConnection(cadenaConexion))
{
...

Y propone utilizar consultas parametrizadas, de la siguiente manera:

using (SqlCommand cmd = new SqlCommand("SELECT * FROM Products WHERE Usuario = @Usuario AND Contraseña = @Contraseña"))
{
cmd.Parameters.AddWithValue("@Usuario", usuario);
cmd.Parameters.AddWithValue("@Contraseña", contraseña);
...

} 

Pero esto NO funcionará. En primer lugar, no se podrá conectar a la BD sin un usuario y contraseña en la cadena de conexión. Y la consulta modificada de la tabla Products tampoco funcionará porque Usuario y Contraseña no son campos de dicha tabla.

Parece que el modelo está intentando encajar la solución de una SQL Injection clásica a este tipo de vulnerabilidad. Una solución podría ser utilizar la clase SqlConnectionStringBuilder, de la que Chema habla en la segunda parte de su serie en el blog.


Al ser Llama un modelo general, se probó también con un par de modelos especializados en código. Por ejemplo, el modelo Code Llama de Meta (basado en Llama 2), es un modelo especializado en código y está entrenado, entre otros, con lenguajes C#. El análisis de este modelo (en su versión 13B) del código anterior fue muy similar a Llama 3.1, proponiendo como solución la consulta parametrizada que incluye los parámetros de usuario y contraseña en la SELECT de productos.

Figura 7: Análisis de vulnerabilidad de Connection String Injection
 con Code Llama 13B

El modelo CodeGemma 7B también propuso el uso de consultas parametrizadas y además sacar la cadena de conexión a la sección ConnectionStrings del fichero Web.config. Esto tampoco soluciona la vulnerabilidad, aunque se saque la cadena a otro sitio.

Figura 8: Análisis de vulnerabilidad de Connection String Injection
con CodeGemma 7B

Es cierto que descubre que hay una inyección, pero no acierta con el tipo, y por lo tanto la solución no es correcta, lo que hace que para este caso, tenga una bonita alucinación. Así que queda tarea que hacer para conseguir que estas vulnerabilidades se puedan detectar y corregir correctamente.

miércoles, mayo 24, 2023

Latch Web3: Un pestillo de seguridad para SmartContracts (Parte 2)

Visto en la primera parte de este artículo cómo funciona Latch y Latch Cloud TOTP, así como todas las posibles integraciones que se pueden hacer, llegamos a la siguiente parte, en la que nos planteamos poner Latch en la infraestructura de una DApp al igual que lo ponemos en una WebApp o una App, con el objetivo de securizar la infraestructura.

Figura 8: Latch Web3: Un pestillo de seguridad para SmartContracts (Parte 2)

Para ello, primero tenemos que tener en cuenta los elementos de una arquitectura Web3 distribuida, donde tentemos una estructura similar a esta que vamos a analizar a continuación

Arquitectura de una DApp en Web3

Esta arquitectura, que vamos a ver a continuación, es similar, por ejemplo, a la que tenemos en el Market de NFTs de Telefónica, donde contamos con una serie de elementos que van a ser similares en infraestructuras basadas en Ethereum, así que más vale que te la conozcas al dedillo. Si quieres profundizar en ella, empezando desde cero, te recomiendo los cursos de la Bit2Me Academy, donde tienes todo este tipo de formaciones.
Como veis, tenemos un almacenamiento de datos basado en una cadena Blockchain, donde no solo tendremos Tokens, sino además datos que queramos anclar en la cadena. Por supuesto, el uso de la cadena de bloques está sometido al consumo de Tokens, porque la construcción, mantenimiento y uso de cualquier cadena de BlockChain está basado en Tokenomics.

Figura 10: Arquitectura de una Dapp

La lógica de la aplicación, que se ejecuta en la máquina del ledger, está construida en forma de SmartContracts que se anclan en la cadena de bloques. Estos SmartConracts son ejecutados para realizar las acciones necesarias en la DApp que es la que coordina el flujo y ejecución de SmartContracts en función de los usuarios conectados, las acciones que estos hagan, y los datos que aporten, consuman o generen. Cada SmartContrat tiene una dirección pública dentro de la cadena de bloques, y un dueño, en forma de usuario, que es identificado por la clave pública de su Wallet.

Por supuesto, la identificación de los usuarios, se mantiene con las Wallets, que tienen una clave pública que se usa en las cadenas de bloques para identificar las acciones que este haga, y para recibir las entregas de tokens que se hagan en la Blockchain. Así, cuando un usuario genera una Wallet con su identidad - a partir de una semilla - tiene una clave privada almacenada en el dispositivo, y una clave pública, que lo representa en la cadena de bloques.

Cuando un usuario se autentica en una DApp, ésta le pide acceso a la Wallet, para poder realizar acciones de acceso a su clave pública, e incluso hacer transacciones de tokens dentro de la cadena Blockchain, lo que genera también entornos de ataque de los que hay que protegerse, como veremos. Si además, cada uno de los elementos que interfieren en una o varias DApp que forman una solución Web3 pertenecen a diferentes organizaciones, empresas o individuos, tenemos una Organización Autónoma Distribuida o DAO.

Hacking y Seguridad en Web3

Vista la arquitectura anterior, tenemos ahora que darnos cuenta de que el modo en que se atacan estas arquitecturas son diferentes a cómo se atacaban las arquitecturas de Web, donde hemos hablado muchas veces de Hacking Web Technologies, de Client-Side Attacks o de Hacking Web Aplications: SQL Injection. Ahora en el mundo Web3 y las DApp, los ataques son diferentes, y hay que conocer las técnicas de hacking, de pentesting y de auditoría. Y como vamos a ver en este artículo de Latch Web3, de fortificación.


Para aprender y conocer estas técnicas, desde el equipo de Ideas Locas hemos lanzado la plataforma de entrenamiento Level_UP!, donde tienes retos de hacking Web3, y de los que hemos ido publicando ya algunos solucionarios.
Y esto hay que aprenderlo bien, porque los atacantes ya se conocen las vulnerabilidades, e incluso las pueden encontrar utilizando herramientas como ChatGPT, que permite localizar bugs que explotar en SmartContracts creados en Solidity solo con darle el código .sol del contrato.

Figura 14: ChatGPT encuentra el bug de Reentrancy Attack

Nosotros, a lo largo del último año hemos ido enumerando muchas de estas técnicas, utilizando para ello ejemplos de incidentes que han ido pasando - y que hemos ido incorporando a nuestra plataforma de Level_UP! -, para aprender las técnicas de Hacking Web3 y buscar formas de solucionarlas. Algunos de estos ataques a SmartContracts de los que hemos hablado son:
Y también os hemos dejado algunas herramientas de auditoría usando análisis de código estático, código dinámico y dando recomendaciones de arquitecturas de seguridad.
Si quieres saber el impacto que tienen estas vulnerabilidades en términos económicos para las empresas que han sido vulneradas, puedes visitar la web https://defillama.com/hacks donde puedes ver las grandes cantidades de dinero robado, la fecha, y la técnica utilizada.

Figura 15: Incidentes Web3 en https://defillama.com/hacks

Así que, como podéis ver, esto es poca broma, y hay que tomarse en serio cómo auditar y fortificar las arquitecturas DApp. En la próxima entrada comenzaremos con este proceso, hasta llegar al Latch Web3.

miércoles, marzo 22, 2023

"iBombShell: Revolution". Sólo para Pentesters!

El pasado día 10 de Marzo participamos en RootedCON 2023 dónde tuvimos la oportunidad de presentar el trabajo que hemos trabajado desde hace un tiempo. La idea es la de proporcionar a los pentesters y desarrolladores el potencial de iBombShell y poder integrarlo con sus herramientas. 

Figura 1: "iBombShell: Revolution". Sólo para Pentesters!

De este modo podemos decir que iBombShell o el Core de ésta es una API que permitirá a los usuarios poder integrar lo que ellos quieran. Damos un pequeño repaso a esta presentación, comentando las principales novedades de iBombShell: Revolution.

¿Qué era iBombShell y que ha cambiado?

Ya se ha hablado largo y tendido sobre iBombShell en este blog, desde Euskalhack 2018 dónde mostramos la idea de lo que queríamos hacer, pasando por técnicas de post-explotación y el desarrollo de nuevos módulos para esta herramienta Open Source. Sin olvidarnos de uno de los momentos más importantes para iBombShell que fue la presentación en la BlackHat Eruope 2018 en Londres. O la incorporación de iBombShell a la C2Matrix, un hito más que interesante de este proyecto, el cual nos llena de orgullo y nos rellena la barra de la ilusión para hacer nuevas cosas.

Figura 2: iBombShell en GitHub

iBombShell Legacy tenía dos modos de funcionamiento, el llamado “Everywhere”, que permitía descargar a memoria, en apenas 4 pasos, una consola PowerShell con funciones útiles y dinámicas para un pentester, y que estuviera disponible en cualquier momento y en cualquier lugar.
Y, por otro lado, también se contaba con el llamado modo “Silently” que permitía conectar una instancia de iBombShell a un C2 escrito en Python y que podía ordenar de manera remota instrucciones creadas en los módulos de PowerShell.

Figura  4: iBombShell Legacy y sus modos Everywhere y Silently

Para la renovación de iBombShell, se quería cambiar completamente el modo de trabajo, centrándonos en hacer una herramienta más sencilla, fácilmente extensible, integrable con varios clientes y que fuera un componente que estuviera centralizado, de tal manera que un equipo de trabajo pueda utilizar una misma instancia de iBombShell para realizar sus pruebas. De esta manera, queremos destacar como principales novedades de la versión Revolution:
  • Nuevo iBombShell "apificado": Como se ha comentado anteriormente, iBombShell ahora es una gran API a la que llamamos Core. ¿Cómo interactuar con el Core? Vamos a desarrollar algunos clientes “oficiales” del proyecto, pero cualquier desarrollador o pentester podrá integrar sus necesidades directamente con el Core gracias al uso de la API.
  • Gestión total desde el CORE: El Core gestiona todo lo que sucede en iBombShell, es decir, si hay que cargar un módulo, si hay que ejecutarlo, si llega la conexión de un nuevo warrior, etcétera.
  • Gestión de usuarios: El Core es una plataforma multiusuario, pero de esto hablaremos en otro artículo para explicar cómo funcionan los roles y los usuarios en iBombShell.
  • Autenticación (JWT): Toda acción que deba ser autorizada utilizará un JWT. Esto es algo que creemos que es importante para la gestión de usuarios y lo que cada uno puede hacer.
  • Generación warriors (code / file): La generación de los Warriors, tal como ocurría en la ‘Legacy’ iBombShell se puede hacer tanto en código como en un fichero. Iremos mostrando algunos ejemplos de uso para que se entienda mejor.
  • Nueva consola para los warriors (PowerShell): Se ha implementado una nueva consola en Powershell para interactuar con el nuevo Core.
  • Facilidad de integración.
Arquitectura de iBomShell

La nueva arquitectura de iBombShell cuenta con una pieza central: el core. Este elemento realiza toda la gestión de los usuarios, los módulos, los warriors y las tareas. Para almacenar la información se apoya en una base de datos local SQLite, además de algunos diccionarios para almacenar en memoria los usuarios activos y los warriors en ejecución.


Todo esto es accesible y gestionable desde la API, de tal manera que es posible integrar distintos clientes como web, interfaces gráficas de usuario para distintas plataformas, consolas, o automatizar la generación de warriors y creación de tareas con scripts en Bash, Python, JavaScript…

Figura 6: Arquitectura de iBombShell

La API se ha dividido en 4 principales tags, los mismos que gestiona el core y, a través de la especificación OpenAPI, se puede acceder a su documentación y prueba de la misma. Algunas de las peticiones que se tienen disponibles a través de la API son:
  • /auth: Permite la autenticación de usuarios y la obtención de un JWT para usar la API.
  • /get_modules: Permite obtener los módulos, ordenados por categorías.
  • /generate: Solicita la generación de un nuevo warrior.
  • /create_task: Crea una nueva tarea asociada a un warrior.
  • /get_task_warrior: Solicitado por un warrior para obtener su tarea a ejecutar.
  • /put_task: Utilizado por el warrior para guardar los resultados de una tarea ejecutada.
  • /get_task_results: Utilizado por un cliente para obtener los resultados de una tarea ya ejecutada.
Iremos publicando más información sobre la API y la doc de ésta, cuando se libere el proyecto. A día de hoy, queremos implementar clientes oficiales para que el core de lo mejor de sí. 

Figura 7: Documentación de la API de iBombShell

Para la charla de RootedCON todo lo mostramos de integración fue desarrollado con pocos días para mostrar a los desarrolladores el potencial que la Apificación del Core de iBombShell proporcionaba y cómo podían integrar fácilmente scripts u otro tipo de herramientas.

Workflows

Para darle un sentido a todo, es necesario contar con algunos flujos de trabajo. Por ejemplo, en primer lugar, contar con un Token JWT para acceder a gran parte de la API. Para realizar esto, haremos una petición a /auth con un usuario y contraseña válidos, y obtendremos el JWT que utilizaremos, a partir de ahora, en la cabecera Authorization [Bearer] para hacer el resto de peticiones.



Figura 8: Flujo de trabajo de la autenticación del cliente

A continuación, podemos leer todos los módulos disponibles, definir los valores necesarios para utilizar distintos módulos u optar por generar un nuevo guerrero. Una vez que se dispone de un guerrero en ejecución es posible asignar tareas y esperar a que el warrior descargue las instrucciones para ejecutarse y devolver los resultados.

Figura 9: Flujo de trabajo de creación de nuevas tareas

El workflow del warrior es bastante sencillo ya que se basa en, primero el registro del nuevo warrior, y después hacer peticiones constantes al listener de iBombShell (Core) para consultar si tiene nuevas tareas asociadas a su identificador para descargarlas, ejecutarlas y mandar los resultados de nuevo al listener.

Figura 10: Flujo de trabajo del Warrior

Y esto es, a grandes rasgos, las novedades del nuevo iBombShell. Pronto tendremos más novedades e iremos mostrando algunas cosas. Este año es el año en el que iBombShell se reinventa y viene con la capacidad de dar el control al desarrollador. En el siguiente vídeo tienes una demostración completa de siete minutos de las principales funciones de iBombShell Revolution mezclada con Kali Linux y Metasploit. Sólo para pentesters.



El repositorio oficial de iBombShell en Github mantiene la versión ‘Legacy’ sobre la que no haremos cambios hasta que publiquemos la nueva versión. Y antes de acabar… Gracias Securiters por darnos la oportunidad de presentar nuestro trabajo en vuestro track.

Happy Hacking with iBombShell!

Autores: Pablo González Pérez escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root",  “Pentesting con Powershell” y de "Empire: Hacking Avanzado en el Red Team", Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica.  Para consultas puedes usar el Buzón Público para contactar con Pablo González
Contactar con Pablo González

miércoles, enero 04, 2023

Cómo buscar vulnerabilidades en SmartContracts, SQL Injection, XSS o bugs Python con ChatGPT

Hace poco os hablaba del estudio que arrojaba como resultados que los programadores que utilizan asistentes de código basados en inteligencia artificial son más propensos a generar código con fallos de seguridad, y además hemos visto que si pides que te hagan código sin pedirle que mire la seguridad tanto Copilot, como ChatGPT, como otros asistentes, pueden generar código "buggy". Hoy vamos a ver lo contrario, cómo pedirle que nos ayude a hacer seguro nuestro código.

Figura 1: Cómo buscar vulnerabilidades en SmartContracts,
SQL Injection, XSS o bugs Python con ChatGPT.
Imagen hecha con Dall-e 2 (A happy hacker in Picasso style)

Vamos a hacer cuatro ejemplos de corrección de su propio código, de búsqueda de vulnerabilidades, de revisión en profundidad de un código, y de generación de código seguro desde el principio. Vamos a ello.

Ejemplo 1: Un SQL Injection en el código de ChatGPT

En el ejemplo primero, le pedía una función que accediera a una base de datos para comprobar si un usuario había introducido correctamente sus credenciales, y como veíamos, nos daba un código PHP con un SQL Injection de libro.

Figura 3: Código PHP con bug de SQL Injection generado por ChatGPT

Sin embargo, si le pedimos a ChatGPT que corrija el fallo de SQL Injection, lo cierto es que lo corrige perfectamente. 

Figura 4: Le pedimos a ChatGPT que elimine el bug de SQL Injection y lo hace.

Y esto abre muchas posibilidades que podemos aprovechar para securizar nuestro código o para buscar vulnerabilidades en códigos que estemos auditando. Es decir, como una herramienta de análisis de código estático.

Ejemplo 2: Encontrar un bug de Reentrancy Attack en un SmartContract

Para ello, en este ejemplo le he pedido que me busque si este código del mundo Web3 (que es un SmartContract que tiene una vulnerabilidad de Reentrancy Attack) tiene algún fallo de seguridad, pero como veis en la conversación, no le digo si existe o si no existe, ni por supuesto qué tipo de bug puede tener. Y ChatGPT lo encuentra perfectamente.

Figura 5: ChatGPT encuentra el bug de Reentrancy Attack

Así que, ya que lo ha encontrado, vamos a suponer que es nuestro código, así que vamos a darle cariño y pedirle que lo corrija él solito y nos dé el código sin esta vulnerabilidad. 

Figura 6: ChatGPT corrige el bug de Reentrancy Attack

Y listo. En un santiamén tenemos el código correcto de este SmartContract.

Ejemplo 3: Evaluar la fortificación de un código en Pyhton conjuntamente

En la siguiente prueba le doy el código inseguro para generar un fichero temporal que devolvió en la prueba de códigos inseguros generados por CoPilot. Así que le doy el código y le pido que busque si tiene alguna vulnerabilidad esta sección de un programa en Python.

Figura 7: No ha encontrado el bug a la primera

Sorprendentemente me dice que no ve ninguna vulnerabilidad, pero como yo sí sé que hay un problema en el método utilizado para la creación del archivo temporal, le pregunto directamente si ese método no es inseguro.

Figura 8: Insistiendo a ChatGPT sobre el método que sé que es inseguro

Como podéis ver, me ha contestado que no, SI tomo las medidas de prevención adecuadas. Pero claro, como programador de una aplicación, no puedo garantizar la configuración de los permisos del sistema donde esté implantado, así que le pregunto directamente por ese punto tercero.

Figura 9: Ahora sí que ha visto el problema, y me da la solución correcta

Y en ese caso, sí, ve el problema de seguridad, y ya me recomienda utilizar una función segura para evitarlo. Un ejemplo claro que la Mayeuita de Sócrates funciona perfectamente con la Inteligenica Artificial de hoy en día. 

Ejemplo 4: Generar un código JavaScript sin XSS ni bugs de Client-Side Attacks

Como veis, se puede utilizar ChatGPT para encontrar bugs, para evaluar código, pero también se puede utilizar para pedirle que el código que te genere sea seguro. Basta con enfatizar "sin vulnerabilidades de seguridad" en la conversación para que se lo tome muy en serio. Aquí, un caso muy típico donde muchos desarrolladores se comen un Client-Side Attack en forma de XSS, de CSRF, etcétera.

Figura 10: Código de JavaScritp con su entrada escapada para evitar XSS

Y como le hemos pedido que lo haga de forma segura, pues ha hecho un código en el que no deja meter código que pueda ser inyectado, mientras que si no le pides que se preocupe de la seguridad, te puede dar un código bastante buggy.

Conclusiones de estas pruebas

Así que, como decía en el vídeo que hice para explicar esto, no se trata de no utilizar los asistentes de Inteligencia Artificial para hacer código, sino de saber sacarles partido.

@chema_alonso ¿Generan código inseguro los asistentes de inteligencia artificial? #ai #ia #bug #sqli #copilot #chatgpt #seguridad #aprendoentiktok #aprendocontiktok ♬ Terminator 2: Judgment Day Theme - Everrune

ChatGPT, Copilot y todos los que irán apareciendo, son una herramienta de gran utilidad para:
  1. Descubrir vulnerabilidades: Lo que es bueno para los pentesters y auditores.
  2. Securizar código existente y revisarlo en profundidad: Lo que es bueno para QA y DevOps.
  3. Generar código de forma rápida y segura: Lo que es bueno para los desarrolladores.
En definitiva, más vale que vayas aceptando que tu trabajo en el futuro va a requerir de saber sacarle el máximo partido a la Inteligencia Artificial igual que en el pasado tuviste que aprender a sacarle partido a Internet.

¡Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)  


martes, noviembre 15, 2022

Pentesting SmartContracts: From Web 2.0 to Web3 #NNED10

Recientemente se ha celebrado la décima edición de Navaja Negra. Una CON que se ha celebrado de nuevo sin necesitar el online, una CON que ha mostrado que la comunidad sigue viva y con muchas ganas de compartir. Este año tuvimos la suerte de poder estar allí impartiendo un mini taller sobre "Pentesting a SmartContracts" (que no es lo único que se debe revisar en un proyecto Web3, pero sí es una parte fundamental de un proyecto Web3, ya que podemos decir que es la lógica de todo ello).

Figura 1: Pentesting SmartContracts: From Web 2.0 to Web3

Últimamente estamos muy metidos en el mundo Web3 y también en su seguridad. Aprendiendo mucho sobre ello en los últimos meses. Nuestra idea con el taller era mostrar a la comunidad cómo se abre un nuevo mundo para la ciberseguridad, ya que el mundo web3 requiere de perfiles en ciberseguridad que mejore notablemente la seguridad que allí existe. Son perfiles deseados por las empresas que han emprendiendo aventuras en el mundo Web3. Hay lo que se dice, un filón.

Figura 2: Libro dedicado a "Bitcoin: La tecnología Blockchain y su investigación"
de Yaiza Rubio y Félix Brezo

Muchas veces nos cuesta ver diferentes caminos, pero la ciberseguridad es transversal a disciplinas como la Inteligencia Artificial (fijaros en el proyecto OMLASP, un proyecto para recopilar técnicas de auditoría y revisión de fiabilidad de algoritmos de IA), Internet de las cosas y los sistemas embebidos, la industria 4.0 o la Web3. Miremos donde miremos, aunque no sea “nuestro mundo” necesitan ciberseguridad. Como digo somos una disciplina transversal que proporciona confianza a los negocios para poder avanzar.

Mini Taller

El taller no dejaba de ser unas pinceladas de lo que uno puede encontrar en el mundo Web3 y cómo se puede aplicar una metodología (o algo similar) a este mundo. El taller se partía en dos partes:
  • Introducción a la Web3, aplicación de metodología para auditar SmartContracts y tipos de vulnerabilidades (con ejemplos).
  • Análisis estático y análisis dinámico sobre SmartContracts, utilizando diferentes herramientas y aplicando algo de metodología.
  • Por último, propusimos un reto en el que los alumnos (ya para casa) debían hacer un ‘hackme’ y conseguir pasar tres retos. El premio un NFT (y solo había tres, por lo que solo podía haber tres ganadores). Respecto al reto, otro día os hago un post.
La primera parte del taller era “la sencilla”, la de contextualizar, la de poder “tocar” esa barrera de entrada que muchas veces tiene la Web3. La de poder entender de forma más práctica aquellos términos que todos conocemos, pero que muchas veces nos suenan tan lejanos: Blockchain, Wallet, Transacción, Gas, SmartContract, bytecode, OpCode, ABI (Application Binary Interface) se definieron términos y se mostró cómo crear nuestro propio laboratorio para el taller.

Figura 3: Introducción a Web3

Tras explicar la parte más introductoria y montar el laboratorio inicial dónde se pudo ver cómo funciona la importación de cuentas, cómo conectarnos contra nuestra blockchain local con Ganache o cómo funciona un pequeño SmartContract denominado “hiworld” pasamos a mostrar lo que es Solidity y sus posibilidades. Se dio una clase rápida de elementos de Solidity que son interesantes conocer (no se dio una clase de programación, ya que hubiera sido imposible en tiempo y forma).

Conocer el lenguaje principal en el que se crean SmartContracts es importante de cara a entender, posteriormente, cómo aplican las vulnerabilidades en este entorno. Es cierto que el pentester tendrá herramientas que permiten el análisis de código, pero no hay nada mejor que entender el código, ya que, si no, no podremos avanzar en el trabajo.

¿Cómo plantear la auditoría por cajas? 

Si tenemos que hacer un paralelismo con nuestras auditorías de caja blanca, gris y negra podríamos decir algo parecido a esto en el mundo web3:

Figura 4: Tipos de Auditorias por "cajas" en Web3

En otras palabras:
  • La caja blanca sería algo similar a tener el código de los SmartContracts y disponer de todo tipo de información sobre el proyecto que se va a auditar, es decir, tenemos rol de administrador.
  • La caja gris podría ser algo similar a encontrarnos el proyecto desplegado (puede ser en un entorno de pruebas) y disponer de la dirección del contrato (o contratos) y disponer del ABI de dicho contrato. En este punto veremos que podemos interactuar con el contrato, obtener el bytecode, hacer un análisis sobre este, etcétera.
  • La caja negra podría ser algo similar a solo poder disponer del bytecode y comenzar un proceso de ingeniería inversa interesante.
También se vieron algunas metodologías y estándares como: SWC, SCSVS y Hacken. Tras ver el SWC y cómo quiere asemejarse al CVE que todos conocemos y la metodología de Hacken dónde las fases de un pentesting tienen cierto paralelismo con, por ejemplo, la metodología PTES, vemos que hay intenciones de asemejar el pentesting en Web3 al que conocemos y tiene sentido.
 
Llegamos a la parte de presentar algunas de las vulnerabilidades más importantes (que no todas). La idea era presentar la vulnerabilidad, mostrar una animación que permitiese entenderlo mejor, explicar algunos casos reales que han afectado a un proyecto web3 por tener dicha vulnerabilidad y explicar mitigaciones. Vulnerabilidades como:
Os dejo el vídeo de OpenExpo para que podáis algunos ejemplos que se cuentan aquí:
 

Figura 5: SmartContracts, funcionamiento y vulnerabilidades

El taller avanzó con la parte de análisis estático de código, hablamos de la distribución de Halborn ZIION, la cual es interesante de utilizar ya que viene con una gran cantidad de herramientas y sus dependencias ya preparadas. Además, se hizo un listado interesante de herramientas y su clasificación, tal y como se puede ver en la imagen. Todas con su enlace a su Github o a dónde se encuentra la herramienta, si ésta es online.

Figura 6: Herramientas para el taller

Aquí comenzó la parte de análisis de código. Se hizo algunos ejemplos con contratos con vulnerabilidades y vimos en acción herramientas como Slither y Mythrill, tal y como se puede ver en la sigueitne imagen (de Slither) Se puede ver cómo Slither nos devuelve que este contrato tiene una vulnerabilidad alta (en rojo), un par medias (en amarillo) y nos va indicando las líneas exactas dónde se introduce la vulnerabilidad. Además, se puede ver una referencia que aporta más información a todo esto.


Por último, se trabajó sobre un ejemplo de DAST (o análisis dinámico), el cual también dejaremos para otro post, ya que requiere explicarlo con “mimo” y detalle.

Sin duda, fue extraordinario volver a vivir una Navaja Negra. He tenido la suerte de estar en muchas, pero fue especial ver cómo la gente vuelve a aquella normalidad que nunca pensamos que anhelaríamos tanto. Esperamos que los muchos asistentes (fue una grata sorpresa) que tuvimos disfrutasen y pudieran entrar en este mundo que inminente y que nos acompañará durante mucho tiempo: la Web3.

Más artículos de Web3, Blockchain & SmartContracts
Saludos,

Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root",  “Pentesting con Powershell” y de "Empire: Hacking Avanzado en el Red Team", Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica.  Para consultas puedes usar el Buzón Público para contactar con Pablo González

Contactar con Pablo González

Entrada destacada

+300 referencias a papers, posts y talks de Hacking & Security con Inteligencia Artificial

Hace un mes comencé a recuperar en un post mi interés en los últimos años, donde he publicado muchos artículos en este blog , y he dejado mu...

Entradas populares