π°[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:
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.

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Γ©:

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:
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:
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:
Khi ΔΓ³ Δα» cΓ³ flag thΓ¬
ΔoαΊ‘n payload cα»§a chΓΊng ta sαΊ½ nhΖ° nΓ y:
Last updated