Posted in

Pentesting en APIs (Parte 1) – Fundamentos

En esta serie de entradas, repasaremos algunas técnicas para realizar pentesting sobre APIs. Esta primera parte cubrirá algunos aspectos fundamentales, para luego ir viendo vulnerabilidades de acuerdo a la clasificación de OWASP Top 10 para APIs.

Bien, lo primero que debemos hacer es entender algunos conceptos básicos. Sin embargo, debemos aclarar que este primer post no está basado en un enfoque de desarrollo de software, es decir, no entraremos en los detalles sobre como se construye una API, que lenguaje es ideal para hacerlo, o cual es la arquitectura adecuada para su despliegue, ya que esto depende enteramente de la estrategia y del diseño que haya elegido la organización. Nuestro enfoque será desde la perspectiva de ciberseguridad.

Dicho esto, comencemos.

¿Qué es una API?

Una API es un interfaz, que está compuesta de reglas y definiciones para permitir que dos aplicaciones se comuniquen entre sí. Desde el punto de vista tecnológico, es un componente programático que permite que dos aplicaciones puedan interactuar utilizando un interpreté común.

Veamos una analogía: Si estamos en un restaurante, le pedimos al mese lo que queremos, para ello nos presenta una carta, y seleccionamos lo que vamos a comer. Este mesero, tomará el pedido y lo llevará a la cocina para su preparación. Nosotros como clientes, no sabemos exactamente como preparan los cocineros nuestra comida, solo sabemos que el mesero nos la trae tal como la pedimos. En nuestro escenario, la API sería el mesero, nosotros seríamos la aplicación origen o cliente, y la cocina/chef sería la aplicación destino o servicio.

Fuente: https://code24.in/what-is-an-api-how-do-apis-work

¿Son las APIs seguras por defecto?

La respuesta en corto es NO. Más allá de los controles que deben existir como parte del desarrollo de una API, también va a depender de como el entorno donde se despliega es seguro, por lo que la seguridad de las mismas no dependen enteramente de cuán segura se haya desarrollado, sino también de qué equipo realiza la configuración de los componentes que las soportan. La conjunción de desarrollo y configuración, permitirá saber qué tan segura es una API.

¿Qué marco existe para contextualizar los escenarios vulnerables en APIs?

Un marco fundamental para entender cuales son las vulnerabilidades que están más presentes en todo proyecto de desarrollo de APIs, es OWASP Top 10 para APIs. Este proyecto nació en el 2019, y lista los riesgos de seguridad más comunes que afectan a las APIs. Además de mostrar el contexto del escenario que podría poner en peligro nuestras APIs, también brinda recomendaciones de como mitigarlas. La versión actual es la del 2023, y puedes encontrarla acá: https://owasp.org/www-project-api-security/

OWASP Top 10 para APIs: Comparativa entre la versión del 2019 y la del 2023

Para los profesionales que se dedican a realizar pruebas de seguridad sobre las tecnologías implementadas en las organizaciones, es necesario considerar las APIs como vectores de ataque adicionales. Para ello es importante entender lo siguiente:

  • Las APIs son creadas para entregar información (generalmente en un formato especifico) que otra aplicación puede tomar o procesar.
  • No dependen de una interfaz gráfica.
  • Pueden requerir autenticación y autorización para su uso, generalmente en forma de cabeceras.
  • Otros métodos HTTP son frecuentemente utilizados, tales como PUT o DELETE
  • Existen diferentes estándares o tipos, tales como REST, SOAP, o GraphQL. Cada tipo puede usar diferente formato de datos para el intercambio, por ejemplo JSON, XML, YAML.
  • En entornos productivos pueden estar de un WAF y un API Gateway con reglas configuradas para su protección.  Por ejemplo, reglas de rate limit

Aunque hay muchos más conceptos alrededor de las APIs, teniendo en cuenta los puntos anteriormente listados, podemos perfilar mejor nuestras pruebas.

¿Por donde empiezo las pruebas?

Teniendo ya nuestra base de referencia para orientar los escenarios de riesgo, lo siguiente que debemos hacer es definir un proceso. Si bien no existe un proceso «oficial», podemos adaptar un proceso de pentesting convencional y aplicarlo al mundo del pentesting en APIs. Aquí dejo un proceso que puedes tomar como referencia:

Lo siguiente es tener a la mano algunas herramientas que nos pueden ser útiles durante nuestro proceso. Aquí te listamos algunas:

  • Postman: Es una aplicación fundamental para realizar pruebas. Esta herramienta nos permitirá realizar peticiones y validar las respuestas entregadas.
  • Soap UI: Al igual que Postman, es una aplicación fundamental para nuestras pruebas. Esta optimizada para probar APIs basadas en SOAP.
  • Burp Suite: Esta aplicación nos sirve para poder interceptar y modificar peticiones. Es utilizada ampliamente para pentesting de aplicaciones Web y Móviles, y dispone de características adicionales como escaneo de vulnerabilidades, intruder, repeater, sequencer, etc.
  • Cats: Es una herramienta de fuzzing para APIs basadas en REST
  • Astra: Herramienta para la identificación de vulnerabilidades en APIs
  • Akto: Es una plataforma de seguridad de APIs, que permite hacer testing sobre las APIs para detectar vulnerabilidades conocidas.
  • appKnox: Es una herramienta para realizar test de seguridad en APIs de manera automática
  • GraphQLMap: Es una herramienta que permite interactuar con servicios basados en GraphQL
  • JWT_Tool: Herramienta que permite identificar vulnerabilidades en tokens JWT

Además, un repositorio que nos puede ayudar con una mayor cantidad de recursos para pentesting en APIs, es el siguiente: https://github.com/arainho/awesome-api-security. Recomendamos revisarlo.

Ahora sí, ya tenemos el marco de referencia, un proceso establecido, y nuestras herramientas para comenzar con el pentest. Es importante mencionar que el conocimiento de desarrollo de software/aplicaciones, así como el conocimiento del protocolo HTTP, sirven como base importante si queremos adentrarnos en este mundo. Si no has tenido experiencia o acercamiento en estos temas, te será más difícil entender como orientar los escenarios de prueba, además de como interpretar los resultados o comprender por que los ataques no están siendo efectivos.

¿Puedo practicar en un entorno controlado?

Sí. Existen múltiples proyectos que te permiten practicar escenarios de ataque sobre APIs, teniendo un ambiente controlado. Para esta serie de entradas, utilizaremos dos:

Instalarlos es sencillo, Tiredful corre en un contenedor, por lo que para desplegarlo solo debemos ejecutar lo siguiente:

git clone https://github.com/payatu/Tiredful-API
cd Tiredful-API/
docker build -t tiredful .
docker run -p 8000:8000 --name tiredful -it tiredful

En caso no funcione tu instalación de Tiredful (Error: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED]), modifica el archivo Dockerfile, añadiendo las siguientes lineas antes de instalar los requerimientos.:

  && /usr/bin/pip install --trusted-host pypi.python.org pytest-xdist \
  && /usr/bin/pip install --trusted-host pypi.python.org --upgrade pip \

Para instalar Rest API Goat, ejecutar lo siguiente:

git clone https://github.com/optiv/rest-api-goat
cd rest-api-goat/
docker build -t rest-api-goat:latest .
docker run -d -p 5000:5000 rest-api-goat

En caso el contenedor no inicie de manera correcta, esto puede deberse a problemas con las librerías obsoletas. Hay que cambiar el archivo requirements.txt, el cual debe tener el siguiente contenido:

Jinja2==3.0.3
itsdangerous==2.0.1
werkzeug==2.0.3
Flask==1.1.1

Para instalar DVGA, ejecutar lo siguiente:

git clone https://github.com/dolevf/Damn-Vulnerable-GraphQL-Application.git
cd Damn-Vulnerable-GraphQL-Application
docker build -t dvga .
docker run -d -t -p 5013:5013 -e WEB_HOST=0.0.0.0 --name dvga dvga

Una vez instalados, probamos que los servicios estén ejecutándose:

Dejaremos este post acá. En el siguiente, veremos el OWASP Top 10 2023 para APIs, y realizaremos algunos ataques sobre nuestros entornos preparados.

Deja una respuesta

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