π°[WolvCTF 2023] Writeup Web
Mα» ΔαΊ§u
TrΖ°α»c khi bαΊ―t ΔαΊ§u ΔΓ’y lΓ source code dΓ nh cho cΓ‘c bαΊ‘n: link
Zoombie 101

BΓ i nΓ y cho source nhΖ°ng mΓ khΓ‘ basic, nΓ³ dΓnh lα»i XSS:


Payload:
Sau ΔΓ³ submit link cho bot->flag; dΓΉng burp suite Δα» bαΊ―t request lαΊ₯y link submit.

Zoombie 201

BΓ i nΓ y thΓ¬ mα»i thα»© giα»ng bΓ i 1 nhΖ°ng cΓ³ Δiα»u lΓΊc nΓ y cookie Δược set http only, nhΖ° trΖ°α»c ΔΓ’y mΓ¬nh hα»c tαΊp cΓ³ mα»t ngΖ°α»i anh ΔΓ£ nΓ³i vα»i mΓ¬nh lΓ nαΊΏu ΔΓ£ set http only thΓ¬ chα» cΓ³ leak nΓ³ ra giΓ‘n tiαΊΏp tα»« mα»t trang cΓ‘c chα»© khΓ΄ng thα» leak ra trα»±c tiαΊΏp Δược.
ChΓΊng ta sαΊ½ vΓ o phΓ’n tΓch nhα»―ng ΔoαΊ‘n code:
ChΓΊ Γ½ ΔoαΊ‘n code trΓͺn cΓ³ mα»t endpoint debug α» ΔΓ’y nΓ³ sαΊ½ kiαΊΏm tra biαΊΏn allowDebug trong config xem cho phΓ©p hay khΓ΄ng khi ΔΓ³ nαΊΏu true thΓ¬ req.headers (TαΊ₯t nhiΓͺn nΓ³ sαΊ½ kΓ¨m cαΊ£ cookie).
Xem xΓ©t tiαΊΏp file docker-compose:
Yaahh! α» ΔΓ’y allowDebug: true , vαΊy mα»i viα»c ΔΖ‘n giαΊ£n rα»i.
Γ tΖ°α»ng α» ΔΓ’y sαΊ½ khai thΓ‘c dα»― liα»u tα»« mα»t endpoint khΓ‘c bαΊ±ng cΓ‘ch exploit tα»« endpoint cΓ³ vuln XSS. CΓ³ thα» hiα»u Cross-origin resource sharing.
Tα»« Γ½ tΖ°α»ng trΓͺn mΓ¬nh sαΊ½ cΓ³ mα»t ΔoαΊ‘n payload JS API, mΓ¬nh sα» dα»₯ng fetch(Mα»i ngΖ°α»i cΓ³ thα» dΓΉng nhα»―ng thα»© khΓ‘c nhΖ° Ajax, HML HTTP Request ....)
MΓ¬nh sαΊ½ giαΊ£i thΓch chi tiαΊΏt ΔoαΊ‘n payload trΓͺn cho ai chΖ°a biαΊΏt tα»i JS:
ΔoαΊ‘n code nΓ y sα» dα»₯ng phΖ°Ζ‘ng thα»©c fetch Δα» gα»i mα»t yΓͺu cαΊ§u HTTP GET ΔαΊΏn Δα»a chα» 'https://zombie-201-tlejfksioa-ul.a.run.app/debug'. Sau ΔΓ³, nΓ³ sα» dα»₯ng phΖ°Ζ‘ng thα»©c then Δα» xα» lΓ½ phαΊ£n hα»i tα»« mΓ‘y chα»§.
Trong phΖ°Ζ‘ng thα»©c then thα»© nhαΊ₯t, nΓ³ trΓch xuαΊ₯t nα»i dung cα»§a phαΊ£n hα»i bαΊ±ng cΓ‘ch gα»i phΖ°Ζ‘ng thα»©c text() trΓͺn Δα»i tượng response. PhΖ°Ζ‘ng thα»©c text() sαΊ½ trαΊ£ vα» mα»t Promise chα»©a dα»― liα»u vΔn bαΊ£n cα»§a phαΊ£n hα»i.
Trong phΖ°Ζ‘ng thα»©c then thα»© hai, nΓ³ sα» dα»₯ng dα»― liα»u Δược trαΊ£ vα» tα»« phΖ°Ζ‘ng thα»©c text() Δα» tαΊ‘o mα»t Δα»a chα» URL mα»i. Δα»a chα» URL nΓ y sαΊ½ chα»©a mα»t tham sα» "c" vα»i giΓ‘ trα» lΓ dα»― liα»u vΔn bαΊ£n Δược trαΊ£ vα» tα»« phαΊ£n hα»i.
Sau ΔΓ³, nΓ³ sα» dα»₯ng phΖ°Ζ‘ng thα»©c concat() Δα» ghΓ©p chuα»i Δα»a chα» IP cα»§a yΓͺu cαΊ§u vΓ o Δα»a chα» URL mα»i vΓ sα» dα»₯ng Δα»i tượng document Δα» chuyα»n hΖ°α»ng trΓ¬nh duyα»t ΔαΊΏn Δα»a chα» URL mα»i nΓ y.
NαΊΏu cΓ³ lα»i xαΊ£y ra trong quΓ‘ trΓ¬nh gα»i yΓͺu cαΊ§u hoαΊ·c xα» lΓ½ phαΊ£n hα»i, ΔoαΊ‘n code sα» dα»₯ng phΖ°Ζ‘ng thα»©c catch Δα» xα» lΓ½ ngoαΊ‘i lα» vΓ ghi log lα»i ra console.
MΓ¬nh ΔΓ£ Δα»c qua code thΓ¬ chαΊ―c chαΊ―n debug khΓ΄ng dΓnh CSP khi ΔΓ³ cΓ‘ch nΓ y lΓ khαΊ£ thi nhαΊ₯t.
ChΓΊng ta sαΊ½ lαΊ‘i lαΊ₯y link submit cho con bot->flag

Zoombie 301

BΓ i nΓ y giα»ng nhα»―ng bΓ i nhΖ°ng nhα»―ng endpoint debug khΓ΄ng thα» truy cαΊp Δược.
VαΊ«n nhΖ° lα»i mα»t ngΖ°α»i anh ΔΓ£ nΓ³i vα»i mΓ¬nh muα»n Δα»c Δược cookie cΓ³ http only thΓ¬ hΓ£y xem file nΓ o chα»©a nΓ³ vΓ cΓ³ thα» leak ra hay khΓ΄ng.
Trong file index.js cΓ³ ΔoαΊ‘n nΓ y
VΓ file Docker cΓ³ vα» trΓ rΓ΅ cho chΓΊng ta biαΊΏt vα» trΓ file config.
VαΊy lΓ chΓΊng ta cΓ³ vα» trΓ file chα»©a flag: /ctf/app/config.json
Payload sαΊ½ nhΖ° bΓ i 201 nhΖ°ng cΓ³ mα»t cΓ‘i quan trα»ng nαΊΏu muα»n truy cαΊp file tα»« mΓ‘y cα»§a chΓnh mΓ¬nh thΓ¬ dΓΉng giao thα»©c file://

Yah cΕ©ng cΓ³ mα»t cΓ‘ch khΓ‘c lΓ sα» dα»₯ng constructor cα»§a JS Δα» return env
Payload:
MΓ¬nh sαΊ½ giαΊ£i thΓch qua nhΖ° nΓ y:
this.constructorlΓ mα»t tham chiαΊΏu ΔαΊΏn hΓ m constructor cα»§a Δα»i tượng hiα»n tαΊ‘i.(Dα» hiα»u nΓ³ lΓ Object)
this.constructor.constructorlΓ mα»t tham chiαΊΏu ΔαΊΏn hΓ m constructor cα»§a hΓ m constructor cα»§a Δα»i tượng hiα»n tαΊ‘i(Dα» hiα»u lΓ function cα»§a object).Trong ΔoαΊ‘n code nΓ y,
this.constructor.constructor('return process.env.FLAG')()Δược sα» dα»₯ng Δα» truy cαΊp ΔαΊΏn hΓ m constructor cα»§a hΓ m constructor cα»§a Δα»i tượng hiα»n tαΊ‘i. Sau ΔΓ³,('return process.env.FLAG')()Δược sα» dα»₯ng Δα» trαΊ£ vα» giΓ‘ trα» cα»§a biαΊΏn mΓ΄i trΖ°α»ngprocess.env.FLAG.
CΓ³ mα»t payload khΓ‘c lΓ ΔΓ‘nh cαΊ―p header kΓ¨m cookie khi server trαΊ£ vα» browser.
Khi mα»t cookie Δược thiαΊΏt lαΊp lΓ http-only, nΓ³ sαΊ½ khΓ΄ng thα» truy cαΊp Δược tα»« cΓ‘c client-side script nhΖ° JavaScript, vΓ chα» cΓ³ thα» Δược gα»i ΔαΊΏn server thΓ΄ng qua cΓ‘c yΓͺu cαΊ§u HTTP. Tuy nhiΓͺn, viα»c thiαΊΏt lαΊp cookie lΓ http-only khΓ΄ng cΓ³ tΓ‘c dα»₯ng trong viα»c ngΔn chαΊ·n viα»c gα»i cookie tα»« server ΔαΊΏn client thΓ΄ng qua cΓ‘c phαΊ£n hα»i HTTP.
Khi mα»t yΓͺu cαΊ§u Δược gα»i ΔαΊΏn server, server sαΊ½ trαΊ£ vα» phαΊ£n hα»i HTTP chα»©a cΓ‘c thΓ΄ng tin header nhΖ° cookie, cΓ‘c thΓ΄ng tin vα» cache, mΓ£ trαΊ‘ng thΓ‘i vΓ cΓ‘c thΓ΄ng tin khΓ‘c. TΓΉy thuα»c vΓ o cΓ‘ch server Δược cαΊ₯u hΓ¬nh, nΓ³ cΓ³ thα» trαΊ£ vα» cΓ‘c header chα»©a cookie ΔΓ£ Δược thiαΊΏt lαΊp lΓ http-only.
Trong trΖ°α»ng hợp cα»§a ΔoαΊ‘n mΓ£ trΓͺn, khi mα»t yΓͺu cαΊ§u Δược gα»i ΔαΊΏn trang web https://zombie-301-tlejfksioa-ul.a.run.app/ bαΊ±ng phΖ°Ζ‘ng thα»©c fetch, server sαΊ½ trαΊ£ vα» phαΊ£n hα»i HTTP chα»©a cΓ‘c thΓ΄ng tin header, bao gα»m header chα»©a cookie ΔΓ£ Δược thiαΊΏt lαΊp lΓ http-only. Tuy nhiΓͺn, cookie ΔΓ³ khΓ΄ng thα» truy cαΊp Δược tα»« client-side script, do ΔΓ³, nΓ³ khΓ΄ng thα» Δược ΔΓ‘nh cαΊ―p bα»i cΓ‘c script Δα»c hαΊ‘i.
Sau ΔΓ³, ΔoαΊ‘n mΓ£ tiαΊΏp tα»₯c sα» dα»₯ng phΖ°Ζ‘ng thα»©c fetch Δα» gα»i dα»― liα»u cα»§a phαΊ£n hα»i HTTP ΔαΊΏn mα»t Δα»a chα» URL khΓ‘c bαΊ±ng cΓ‘ch sα» dα»₯ng thuα»c tΓnh credentials Δược thiαΊΏt lαΊp lΓ include. NαΊΏu server cα»§a Δα»a chα» URL nΓ y ΔΓ£ Δược cαΊ₯u hΓ¬nh Δα» chia sαΊ» cookie giα»―a cΓ‘c tΓͺn miα»n khΓ‘c nhau (cross-domain) bαΊ±ng cΓ‘ch thiαΊΏt lαΊp header Access-Control-Allow-Credentials: true, thΓ¬ cookie cΓ³ thα» Δược gα»i ΔαΊΏn Δα»a chα» URL khΓ‘c thΓ΄ng qua phΖ°Ζ‘ng thα»©c fetch.
TΓ³m lαΊ‘i, viα»c thiαΊΏt lαΊp cookie lΓ http-only khΓ΄ng thα» ngΔn chαΊ·n viα»c gα»i cookie tα»« server ΔαΊΏn client, nhΖ°ng nΓ³ cΓ³ thα» ngΔn chαΊ·n viα»c truy cαΊp cookie tα»« cΓ‘c client-side script. Viα»c sα» dα»₯ng thuα»c tΓnh credentials Δược thiαΊΏt lαΊp lΓ include trong phΖ°Ζ‘ng thα»©c fetch chα» cho phΓ©p chia sαΊ» cookie giα»―a cΓ‘c tΓͺn miα»n khΓ‘c nhau nαΊΏu server cα»§a Δα»a chα» URL ΔΓch ΔΓ£ Δược cαΊ₯u hΓ¬nh Δα» chia sαΊ» cookie giα»―a cΓ‘c tΓͺn miα»n khΓ‘c nhau.

Zoombie 401
BΓ i nΓ y cΕ©ng cΓ³ thα» solve bαΊ±ng payload cα»§a bΓ i 301 truy cαΊp thαΊ³ng file config cα»§a server chα»©a flag

ChΓΊng ta sαΊ½ khΓ΄ng lαΊ₯y Δược flag α» payload 2 vΓ¬ biαΊΏn mΓ΄i trΖ°α»ng lΓΊc nΓ y khΓ΄ng chα»©a flag.
File config.json sαΊ½ dαΊ‘ng:
α» ΔΓ’y chΓΊng ta sαΊ½ nghiΓͺn cα»©u lαΊ‘i mα»t xΓu thΓ¬ ΔoαΊ‘n mΓ£ trΓͺn sα» dα»₯ng thΖ° viα»n zombie trong Node.js Δα» tαΊ‘o mα»t trΓ¬nh duyα»t khΓ΄ng ΔαΊ§u (headless browser).
Chα»u khΓ³ tΓ¬m zoombie.js α» git truy cαΊp vΓ o file CHANGELOG.md Δα» xem cΓ‘c thay Δα»i thΓ¬ thαΊ₯y rαΊ±ng:
Zombie phiΓͺn bαΊ£n cuα»i cΓΉng lΓ tα»« nΔm 2018, cΓ³ thα» chΓΊng ta sαΊ½ tΓ¬m thαΊ₯y mα»t sα» 1 day https://github.com/assaf/zombie/blob/master/CHANGELOG.md
α» ΔΓ’y mα»t lΓΊc research thΓ¬ chΓΊng ta cΓ³ mα»t POC cΓ³ thα» Δα»c file - thα»±c tαΊΏ nΓ³ lΓ vuln cα»§a nodeJS nhΖ°ng zoombie cΕ©ng gαΊ·p phαΊ£i:
Oke nhΖ°ng tα»« dΓ’y chΓΊng ta cΓ³ thα» xΓ’y dα»±ng mα»t payload khΓ‘c
Payload nΓ y cΓ³ thα» dΓΉng RCE Δược nαΊΏu khΓ΄ng biαΊΏt vα» trΓ chα»©a flag:
ChΓΊng ta sαΊ½ giαΊ£i thΓch cΓ‘ch hoαΊ‘t Δα»ng ΔoαΊ‘n payload nay nhΓ©:
DΓ²ng ΔαΊ§u mΓ¬nh ΔΓ£ giαΊ£i thΓch α» Zoombie 301, nΓ³ chα» khΓ‘c α» trΓͺn return ra ENV cΓ²n ΔΓ’y lΓ process.
Trong Node.js biαΊΏn toΓ n cα»₯c process (Global) tα»©c lΓ mα»i thα»© Δα»u cΓ³ quyα»n truy cαΊp ΔαΊΏn. BαΊ‘n khΓ΄ng cαΊ§n khai bΓ‘o hay import chΓΊng bα»i phΖ°Ζ‘ng thα»©c require() mΓ vαΊ«n cΓ³ thα» sα» dα»₯ng chΓΊng mα»t cΓ‘ch trα»±c tiαΊΏp. CΓ‘c Δα»i tượng nΓ y cΓ³ thα» lΓ cΓ‘c Module, cΓ‘c hΓ m, cΓ‘c chuα»i hoαΊ·c cΓ‘c Δα»i tượng.(CΓ³ thα» hiα»u nΓ³ lΓ mα»t tiαΊΏn trΓ¬nh tΖ°Ζ‘ng ΔΖ°Ζ‘ng 1 α»©ng dα»₯ng dược chαΊ‘y)
ΔoαΊ‘n code tiαΊΏp, process.mainModule Δược sα» dα»₯ng Δα» xΓ‘c Δα»nh module chΓnh Δược sα» dα»₯ng trong α»©ng dα»₯ng Node.js. require('child_process') Δược sα» dα»₯ng Δα» yΓͺu cαΊ§u module child_process. execSync('cat config.json') Δược sα» dα»₯ng Δα» thα»±c thi lα»nh cat config.json vΓ trαΊ£ vα» kαΊΏt quαΊ£. toString() Δược sα» dα»₯ng Δα» chuyα»n Δα»i kαΊΏt quαΊ£ trαΊ£ vα» thΓ nh chuα»i .
child_processlΓ mα»t module trong Node.js, cho phΓ©p tαΊ‘o ra cΓ‘c tiαΊΏn trΓ¬nh con (child process) Δα» thα»±c hiα»n cΓ‘c tΓ‘c vα»₯ bαΊ₯t Δα»ng bα» (asynchronous) mΓ khΓ΄ng αΊ£nh hΖ°α»ng ΔαΊΏn tiαΊΏn trΓ¬nh chΓnh (main process).
VΓ¬ NodeJS hay lΓ thα»±c hiα»n xα» lΓ½ bαΊ₯t Δα»ng bα» nghΔ©a lΓ nΓ³ sαΊ½ thα»±c hiα»n cΓ‘c tΓ‘c vα»₯ nhαΊΉ trΖ°α»c rα»i sαΊ½ tα»i tΓ‘c vα» nαΊ·ng vΓ¬ vαΊy chΓΊng ta dΓΉng execSync:
execSynclΓ mα»t phΖ°Ζ‘ng thα»©c cα»§a Δα»i tượngchild_processtrong Node.js. PhΖ°Ζ‘ng thα»©c nΓ y Δược sα» dα»₯ng Δα» thα»±c thi mα»t lα»nh Δα»ng bα» vΓ trαΊ£ vα» kαΊΏt quαΊ£ cα»§a lα»nh ΔΓ³.PhΖ°Ζ‘ng thα»©c
execSyncsαΊ½ chαΊ·n luα»ng thα»±c thi cho ΔαΊΏn khi lα»nh Δược thα»±c thi xong vΓ trαΊ£ vα» kαΊΏt quαΊ£. NαΊΏu lα»nh trαΊ£ vα» mα»t mΓ£ lα»i, phΖ°Ζ‘ng thα»©c sαΊ½ nΓ©m ra mα»t ngoαΊ‘i lα»

Hidden CSS


BΓ i nΓ y chΓΊng ta sαΊ½ gα»i mα»t url tα»i bot. VΓ chΓΊng ta sαΊ½ xem qua source code cα»§a chall nΓ y.

α» ΔΓ’y pritvate-server sαΊ½ chαΊ‘y α» locale, chΓΊng ta sαΊ½ phΓ’n tΓch code private:
α» ΔΓ’y Γ½ tΖ°α»ng chΓΊng ta sαΊ½ dΓΉng mα»t ΔoαΊ‘n css nΓ³i α» prefix, nΓ³ gα»i lΓ CSS Injection
Γ tΖ°α»ng α» ΔΓ’y chΓΊng ta sαΊ½ bypass tαΊ₯t cαΊ£ Δiα»u kiα»n cα»§a server private vΓ lαΊ₯y giΓ‘ trα» cα»§a biαΊΏn css.
Payload sαΊ½ nhΖ° sau:
PhΓ’n tΓch qua cΓ‘ch thα»©c hoαΊ‘t Δα»ng cα»§a ΔoαΊ‘n payload trΓͺn:
Trong ΔoαΊ‘n payload, chΓΊng ta Δang sα» dα»₯ng mα»t ΔΖ°α»ng dαΊ«n http://0:1337/css Δα» lαΊ₯y nα»i dung CSS. Trong ΔΖ°α»ng dαΊ«n nΓ y, chΓΊng ta Δang truyα»n tham sα» prefix vα»i giΓ‘ trα» p {--flag:". Δiα»u nΓ y sαΊ½ lΓ m cho ΔoαΊ‘n CSS trαΊ£ vα» chα»©a mα»t biαΊΏn --flag vα»i giΓ‘ trα» bαΊ±ng rα»ng vΓ tiαΊΏp ΔΓ³ Δược nα»i vα»i giΓ‘ trα» cα»§a biαΊΏn FLAG trong ΔoαΊ‘n code server.
TiαΊΏp theo, chΓΊng ta sα» dα»₯ng JavaScript Δα» lαΊ₯y giΓ‘ trα» cα»§a biαΊΏn --flag tα»« id #payload. Δiα»u nΓ y cΓ³ thα» Δược thα»±c hiα»n bαΊ±ng cΓ‘ch sα» dα»₯ng hΓ m getComputedStyle Δα» lαΊ₯y cΓ‘c thuα»c tΓnh CSS cα»§a phαΊ§n tα» vΓ sau ΔΓ³ sα» dα»₯ng getPropertyValue Δα» lαΊ₯y giΓ‘ trα» cα»§a biαΊΏn --flag.
Cuα»i cΓΉng, chΓΊng ta sα» dα»₯ng hΓ m fetch Δα» gα»i giΓ‘ trα» cα»§a biαΊΏn --flag ΔαΊΏn mα»t Δα»a chα» IP bαΊ₯t kα»³ Δα» lαΊ₯y giΓ‘ trα» cα»§a Flag.
TΓ³m lαΊ‘i, ΔoαΊ‘n payload nΓ y sα» dα»₯ng lα» hα»ng CSS Injection Δα» lαΊ₯y giΓ‘ trα» cα»§a biαΊΏn --flag tα»« ΔoαΊ‘n CSS trαΊ£ vα» vΓ sau ΔΓ³ gα»i giΓ‘ trα» nΓ y ΔαΊΏn mα»t Δα»a chα» IP bαΊ₯t kα»³ Δα» lαΊ₯y giΓ‘ trα» Flag.
Tα»i ΔΓ’y cΓ³ nhiα»u bαΊ‘n cΓ³ thα» sαΊ½ thαΊ―c mαΊ―c tαΊ‘i sao nαΊΏu dΓΉng p{flag: } hoαΊ·c p{color: }.... thΓ¬ khΓ΄ng thα» truy xuαΊ₯t Δược giΓ‘ trα» flag trαΊ£ vα».
VΓ¬, thα»© nhαΊ₯t flag α» trong css nΓ³ khΓ΄ng cΓ³, tiαΊΏp theo color hay background-color, font-size... tαΊ₯t cαΊ£ Δα»u lΓ thuα»c tΓnh trong CSS vΓ nΓ³ ΔΓ£ cΓ³ sαΊ΅n nΓͺn khi bαΊ‘n gα»i tα»i nΓ³ thΓ¬ nΓ³ sαΊ½ trαΊ£ vα» giΓ‘ trα» mαΊ·c Δα»nh tαΊ‘i endpoint CSS, thay vΓ o ΔΓ³ bαΊ‘n phαΊ£i khai bΓ‘o mα»t biαΊΏn α» CSS --ten-bien lΓΊc nΓ y nΓ³ sαΊ½ lΓ biαΊΏn vΓ nΓ³ cΓ³ giΓ‘ trα» rα»ng(nhα» kα»Ή lΓ rα»ng lΓ nΓ³ khΓ΄ng hα» cΓ³ trong endpoint CSS) khi ΔΓ³ chΓΊng ta cΓ³ thα» lαΊ₯y Δược flag nhΖ° ΔoαΊ‘n giαΊ£i thΓch payload trΓͺn.
Exploit
Ban ΔαΊ§y mΓ¬nh chαΊ‘y thαΊ³ng file payload.html lΓͺn local sau ΔΓ³ dΓΉng ngrok chαΊ‘y payload lΓͺn internet, nhΖ°ng khΓ΄ng thα» exploit.
VΓ¬: ngrok sα» dα»₯ng protocol https nhΖ°ng local mΓ¬nh dΓΉng http vΓ thαΊ» link cα»§a mΓ¬nh cΕ©ng dΓΉng http://0:1337..vΓ ip-request cΕ©ng http nΓͺn nΓ³ chαΊ·n script mαΊ·c dΓΉng vαΊ«n hiα»n thα» nα»i dung nhΖ°ng script khΓ΄ng Δược thα»±c hiα»n.
Sau ΔΓ³ mΓ¬nh dΓΉng python deploy lΓͺn trα»±c tiαΊΏp vα»i Δα»a chα» lΓ ip mΓ‘y nhΖ°ng server khΓ΄ng nhαΊn, sau ΔΓ³ thα» build bαΊ±ng flask cΕ©ng khΓ΄ng Δược.
Sau mα»t lΓΊc mΓ¬nh mΓ² α» request-ip mΓ¬nh cΓ³ mα»₯c response vΓ sα»a Δược nΓͺn mΓ¬nh ΔΓ£ up payload lΓͺn ΔΓ³ vΓ . LΓΊc nΓ y ip-request chα»©a ΔoαΊ‘n payload vΓ nhαΊn response cα»§a challenge.

BΓ’y giα» chα» cαΊ§n gα»i link cho bot vΓ nhαΊn flag:


Adversal

BΓ i nΓ y cho source code, nhΖ°ng trΖ°α»c khi tα»i source code chΓΊng ta sαΊ½ interface cΓ³ gΓ¬.

α» ΔΓ’y sαΊ½ cΓ³ mα»t endpoint opt sαΊ½ cho chΓΊng ta mα»t ΔoαΊ‘n code vΓ cΓ³ mα»t biαΊΏn ad cho chΓΊng ta truyα»n bαΊ₯t kα»³ giΓ‘ trα» nΓ o.

BΓ’y giα» chΓΊng ta sαΊ½ xem qua source code cα»§a chall:
ChΓΊng ta xem xΓ©t ΔoαΊ‘n code opt nΓ y:
Endpoint opt nΓ y bαΊ‘n cΓ³ thα» Δiα»n thΓͺm giΓ‘ trα» α» biαΊΏn ad vΓ sau ΔΓ³ render ra opt. CΓ³ Δiα»u ΔΓ‘ng nΓ³i α» trΓͺn ΔΓ£ Δược set header CSP nΓͺn khi ΔΓ³ chα»u, khΓ΄ng thα» khai thΓ‘c XSS hoαΊ·c Cors, nhΖ° trΓͺn cΓ³ ΔoαΊ‘n cmt chα» rαΊ±ng opt lΓ endpoint mΓ bot visit. Γ opt α» ΔΓ’y sαΊ½ Δược random vα»i 12 chα»― cΓ‘i a-zA-Z0-9
α» ΔΓ’y mΓ¬nh nghΔ© cΓ³ thα» dΓΉng cΓ‘ch khai thΓ‘c CSS Injection:
Brute-foce 12 kΓ½ tα»± sαΊ½ ra nhΖ°ng cΓ³ Δiα»u khΓ‘ lΓ’u cΓ³ mα»t bΓ i vα» kα»Ή thuαΊt CSS Injection α» giαΊ£i ctf khΓ‘c, cΓ³ thα» xem α» ΔΓ’y: link
NαΊΏu cΓ³ Δα»§ opt cα»§a bot khi ΔΓ³ sαΊ½ cΓ³ flag. NhΖ°ng chΓΊng ta sαΊ½ xem xΓ©t tα»i mα»t vuln khΓ‘c α» ΔΓ’y:
ΔΓ’y lΓ mα»t hΓ m visitUrl, nΓ³ tαΊ‘o mα»t trΓ¬nh duyα»t αΊ©n danh mα»i vΓ mα» mα»t trang web vα»i ΔΖ°α»ng dαΊ«n Δược cung cαΊ₯p. Sau ΔΓ³, nΓ³ tΓ¬m kiαΊΏm phαΊ§n tα» ΔαΊ§u tiΓͺn cα»§a trang web lΓ mα»t thαΊ» input vΓ lαΊ₯y giΓ‘ trα» cα»§a thuα»c tΓnh βvalueβ cα»§a nΓ³. NαΊΏu khΓ΄ng tΓ¬m thαΊ₯y phαΊ§n tα» input, giΓ‘ trα» cα»§a biαΊΏn otp sαΊ½ lΓ null. Cuα»i cΓΉng, nΓ³ ΔΓ³ng trang web vΓ trΓ¬nh duyα»t αΊ©n danh vΓ trαΊ£ vα» giΓ‘ trα» cα»§a biαΊΏn otp. NαΊΏu cΓ³ bαΊ₯t kα»³ lα»i nΓ o xαΊ£y ra trong quΓ‘ trΓ¬nh nΓ y, chΓΊng sαΊ½ Δược bαΊ―t vΓ xα» lΓ½ trong khα»i try-catch-finally cuα»i cΓΉng.
Yaahh nαΊΏu bαΊ‘n Δα»c ΔoαΊ‘n trΓͺn cΕ©ng hiα»u vuln α» ΔΓ’u rα»i chα»© nαΊΏu chΖ°a thΓ¬ xem xΓ©t kα»Ή hΖ‘n:
ΔoαΊ‘n code trΓͺn lΓ mα»t chα»©c nΔng JavaScript Δược sα» dα»₯ng Δα» trΓch xuαΊ₯t giΓ‘ trα» cα»§a input tα»« mα»t trang web ΔΓ£ cho.
ΔαΊ§u tiΓͺn, biαΊΏn otp Δược khα»i tαΊ‘o vα»i giΓ‘ trα» null. Chα»©c nΔng nΓ y sα» dα»₯ng thΖ° viα»n Puppeteer Δα» tαΊ‘o mα»t trΓ¬nh duyα»t ΔΖ‘n giαΊ£n. Sau ΔΓ³, chα»©c nΔng sα» dα»₯ng phΖ°Ζ‘ng thα»©c setUserAgent() Δα» thiαΊΏt lαΊp user agent lΓ "puppeteer".
TiαΊΏp ΔΓ³, chα»©c nΔng nΓ y sα» dα»₯ng phΖ°Ζ‘ng thα»©c goto() Δα» truy cαΊp ΔαΊΏn Δα»a chα» url ΔΓ£ cho. Tham sα» ΔαΊ§u tiΓͺn cα»§a phΖ°Ζ‘ng thα»©c nΓ y lΓ Δα»a chα» url cαΊ§n truy cαΊp. Tham sα» thα»© hai lΓ mα»t Δα»i tượng chα»©a cΓ‘c tΓΉy chα»n, trong ΔΓ³ timeout Δược thiαΊΏt lαΊp lΓ 20000 (20 giΓ’y) vΓ waitUntil Δược thiαΊΏt lαΊp lΓ 'networkidle2', cho phΓ©p trang web Δợi cho ΔαΊΏn khi mαΊ‘ng khΓ΄ng cΓ³ hoαΊ‘t Δα»ng nΓ o trΖ°α»c khi tiαΊΏp tα»₯c.
Sau khi ΔΓ£ truy cαΊp vΓ o trang web, chα»©c nΔng nΓ y sα» dα»₯ng phΖ°Ζ‘ng thα»©c $eval() Δα» trΓch xuαΊ₯t giΓ‘ trα» cα»§a thαΊ» input ΔαΊ§u tiΓͺn trΓͺn trang web. Δα»i sα» ΔαΊ§u tiΓͺn cα»§a phΖ°Ζ‘ng thα»©c nΓ y lΓ mα»t chuα»i CSS selector Δα» xΓ‘c Δα»nh phαΊ§n tα» HTML cαΊ§n Δược truy cαΊp. Trong trΖ°α»ng hợp nΓ y, phαΊ§n tα» HTML lΓ thαΊ» input ΔαΊ§u tiΓͺn trΓͺn trang web. Δα»i sα» thα»© hai cα»§a phΖ°Ζ‘ng thα»©c nΓ y lΓ mα»t hΓ m chα»©a cΓ‘c thao tΓ‘c Δα» lαΊ₯y giΓ‘ trα» thuα»c tΓnh cα»§a phαΊ§n tα» HTML. Trong trΖ°α»ng hợp nΓ y, chΓΊng ta sα» dα»₯ng phΖ°Ζ‘ng thα»©c getAttribute() Δα» lαΊ₯y giΓ‘ trα» cα»§a thuα»c tΓnh "value" cα»§a phαΊ§n tα» HTML ΔΓ³.
Sau khi trΓch xuαΊ₯t Δược giΓ‘ trα» cα»§a intput, chα»©c nΔng ΔΓ³ng trΓ¬nh duyα»t vΓ kαΊΏt thΓΊc phiΓͺn lΓ m viα»c bαΊ±ng cΓ‘c lα»nh page.close() vΓ ctx.close(). Cuα»i cΓΉng, giΓ‘ trα» cα»§a biαΊΏn otp Δược trαΊ£ vα». NαΊΏu khΓ΄ng tΓ¬m thαΊ₯y giΓ‘ trα» cα»§a trΖ°α»ng nhαΊp liα»u, giΓ‘ trα» cα»§a biαΊΏn otp sαΊ½ vαΊ«n lΓ null.
BαΊ‘n Δα»c kα»Ή phαΊ§n mΓ¬nh bΓ΄i mΓ u nhΓ©. TiαΊΏp xem ΔαΊΏn endpoint visit:
TiαΊΏp theo xem endpoint index /

Tα»ng kαΊΏt lαΊ‘i:
GiΓ‘ trα» otp sαΊ½ Δược hΓ m visitUrl lαΊ₯y α» input ΔαΊ§u tiΓͺn thΓ¬ α» endpoint / cΕ©ng cΓ³ input, khi ΔΓ³ nαΊΏu khΓ΄ng cΓ³ giΓ‘ trα» otp thΓ¬ nΓ³ sαΊ½ tα»± gαΊ―n session.opt = opt. NαΊΏu tΓ¬m cΓ‘ch chuyα»n hΖ°α»ng vα» /
VαΊy nαΊΏu khi ΔΓ³ chΓΊng ta chα» cαΊ§n submit thΓ¬ cΓ³ thα» lαΊ₯y Δược flag, nhΖ°ng phαΊ£i trong cΓΉng session.
Sau khi bot truy cαΊp trang, nΓ³ sαΊ½ tΓ¬m thαΊ» input ΔαΊ§u tiΓͺn vΓ trΓch xuαΊ₯t giΓ‘ trα» cα»§a nΓ³ vΓ trαΊ£ vα» dΖ°α»i dαΊ‘ng OTP.
Khi ΔΓ³ Δα» cΓ³ flag thΓ¬
ΔoαΊ‘n payload cα»§a chΓΊng ta sαΊ½ nhΖ° nΓ y:
Trong ΔoαΊ‘n payload, yΓͺu cαΊ§u GET tα»i endpoint /visit Δược gα»i ΔαΊΏn trang web cα»§a α»©ng dα»₯ng vα»i mα»t tham sα» truy vαΊ₯n (query parameter) ad chα»©a mα»t ΔoαΊ‘n mΓ£ HTML. Tuy nhiΓͺn, ΔoαΊ‘n mΓ£ nΓ y khΓ΄ng phαΊ£i lΓ mα»₯c ΔΓch chΓnh cα»§a cuα»c tαΊ₯n cΓ΄ng, mΓ chα» lΓ mα»t cΓ‘ch Δα» tαΊ‘o ra mα»t yΓͺu cαΊ§u ΔαΊΏn α»©ng dα»₯ng web mΓ khΓ΄ng cαΊ§n sα»± tΖ°Ζ‘ng tΓ‘c cα»§a ngΖ°α»i dΓΉng.
Sau khi yΓͺu cαΊ§u GET /visit ΔΓ£ Δược gα»i, payload tiαΊΏp tα»₯c gα»i mα»t yΓͺu cαΊ§u GET tα»i endpoint /flag vα»i mα»t tham sα» truy vαΊ₯n otp Δược ΔΓnh kΓ¨m. NhΖ°ng vΓ¬ ΔΓ£ sα» dα»₯ng mα»t Δα»i tượng session Δα» thα»±c hiα»n cαΊ£ hai yΓͺu cαΊ§u GET nΓ y, α»©ng dα»₯ng web sαΊ½ xΓ‘c Δα»nh ΔΓ’y lΓ hai yΓͺu cαΊ§u Δược thα»±c hiα»n bα»i cΓΉng mα»t ngΖ°α»i dΓΉng vΓ sαΊ½ cho phΓ©p yΓͺu cαΊ§u /flag Δược thα»±c hiα»n mΓ khΓ΄ng cαΊ§n xΓ‘c thα»±c lαΊ‘i ngΖ°α»i dΓΉng.
Last updated