01. TeamCity ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์  ๊ฐœ์š”

์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ ์€ ์•…์˜์ ์ธ ๊ณต๊ฒฉ์ž๊ฐ€ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์šฐํšŒํ•˜๊ณ  ์‹œ์Šคํ…œ์˜ ์ธ์ฆ ์ ˆ์ฐจ๋ฅผ ํšŒํ”ผํ•˜์—ฌ ๊ถŒํ•œ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ทจ์•ฝ์ ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ทจ์•ฝ์ ์€ API ์˜ค์šฉ, ์ธ์ฆ ๋ฐ ์ ‘๊ทผ ์ œ์–ด ๊ฒฐํ•จ, ์ž…๋ ฅ ๊ฐ’ ๊ฒ€์ฆ ๋ฏธํก, ๋ณด์•ˆ ์„ค์ • ๋ฏธํก ๋“ฑ์˜ ๊ฒฐํ•จ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์ด๋ฅผ ์•…์šฉํ•ด ์ดˆ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์–ป๊ฑฐ๋‚˜ ๋ฏผ๊ฐ ์ •๋ณด ํƒˆ์ทจ ๋“ฑ์˜ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

API ์˜ค์šฉ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ œ๊ณต๋˜๋Š” ๊ธฐ๋Šฅ์ด๋‚˜ ์™ธ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ€์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค. ์ธ์ฆ ๋ฐ ์ ‘๊ทผ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ฒฐํ•จ์€ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐํ•จ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ž…๋ ฅ ๊ฐ’ ๊ฒ€์ฆ ๋ฏธํก์€ ์™ธ๋ถ€ ์š”์ฒญ์ด๋‚˜ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ ์ ˆ์ฐจ ๋ฏธํก์œผ๋กœ ์•…์˜์ ์ธ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•œ ๊ฒฐํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๊ฒฐํ•จ๋“ค์ด ์ทจ์•ฝ์ ์œผ๋กœ ์ด์–ด์ง€๋ฉด ์‹œ์Šคํ…œ์— ์‹ฌ๊ฐํ•œ ์œ„ํ—˜์ด ์•ผ๊ธฐ๋˜๊ฒŒ ๋œ๋‹ค.

 

JetBrains๊ฐ€ ๊ฐœ๋ฐœํ•œ CI/CD(์ง€์†์  ํ†ตํ•ฉ ๋ฐ ์ง€์†์  ๋ฐฐํฌ) ์„œ๋ฒ„ ์†”๋ฃจ์…˜์ธ TeamCity๋Š” 2023๋…„์— ์ด์–ด ์ตœ๊ทผ๊นŒ์ง€๋„ ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ ์ด ๋ฐœ๊ฒฌ๋˜์–ด ๋‹ค์ˆ˜์˜ ๊ณต๊ฒฉ ๊ทธ๋ฃน์—์„œ ๊ณต๊ฒฉ๋ฒกํ„ฐ๋กœ ์•…์šฉํ•˜์˜€๋‹ค. ๊ณต๊ฒฉ์ž๋“ค์€ ์ทจ์•ฝ์ ์„ ์•…์šฉํ•ด ๊ด€๋ฆฌ์ž ๊ถŒํ•œ ํš๋“์ด๋‚˜ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE)์„ ํ†ตํ•ด ์‹œ์Šคํ…œ์„ ์ œ์–ดํ•˜๋Š” ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ์ด๋ฒˆ ํ˜ธ์—์„œ๋Š” 2023๋…„์— ๋ฐœ๊ฒฌ๋œ CVE-2023-42793 ๊ณต๊ฒฉ ์‚ฌ๋ก€์™€ 2024๋…„ ๋ฐœ๊ฒฌ๋œ TeamCity ์ทจ์•ฝ์ (CVE-2024-27198)์„ ๋น„๊ต ๋ถ„์„ํ•˜์—ฌ ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ ์˜ ๋ฐœ์ƒ ์›๋ฆฌ ๋ฐ ๋Œ€์‘๋ฐฉ์•ˆ์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค.

[๊ทธ๋ฆผ 1] CVE-2024-27198 ๋ฐœ๊ฒฌ ํ˜„ํ™ฉ (24.05.02 ๊ธฐ์ค€) (์ถœ์ฒ˜: shadowserver)

02. CVE-2023-42793 ๊ณต๊ฒฉ ์‚ฌ๋ก€

CVE-2024-27198์„ ์‚ดํŽด๋ณด๊ธฐ์— ์•ž์„œ 2023๋…„ TeamCity ์ทจ์•ฝ์ ์œผ๋กœ ๋ฐœ๊ฒฌ๋œ CVE-2023-42793์˜ ๊ณต๊ฒฉ์‚ฌ๋ก€์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค. 2023๋…„์— ๋ฐœ๊ฒฌ๋œ CVE-2023-42793์€ HTTP POST ์š”์ฒญ์„ ํ†ตํ•ด ์œ ํšจํ•œ ์•ก์„ธ์Šค ํ† ํฐ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ์œผ๋กœ ์ด๋ฅผ ์•…์šฉํ•ด ์ดˆ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์–ป๊ณ  ๋ฐฑ๋„์–ด๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ์ทจ์•ฝ์ ์€ ๋ถํ•œ๋ฐœ ๊ณต๊ฒฉ๊ทธ๋ฃน์ธ ํžˆ๋“  ์ฝ”๋ธŒ๋ผ(Hidden Cobra)์™€ ์•ˆ๋‹ค๋ฆฌ์—˜(Andariel)์—์„œ ์•…์šฉํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1) Lazarus ๊ณ„์—ด APT ๊ทธ๋ฃน : Hidden Cobra

๋ถํ•œ๋ฐœ APT ๊ณต๊ฒฉ๊ทธ๋ฃน Hidden Cobra(aka. Diamond Sleet)๋Š” 2023๋…„ 10์›” ์ดˆ CVE-2023-42793 ์ทจ์•ฝ์ ์œผ๋กœ TeamCity ์„œ๋ฒ„์— ์ ‘๊ทผํ•œ ํ›„ Powershell์„ ํ†ตํ•ด Forest64.exe์™€ 4800-84DC-063A6A41C5C ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ณ  ๋ผ์ž๋ฃจ์Šค(Lazarus)์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” DeathNote campaign์˜ ForestTiger ๋ฐฑ๋„์–ด๋ฅผ ์‚ฌ์šฉํ•ด LSASS ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ž๊ฒฉ ์ฆ๋ช…์„ ๋คํ”„ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ถœํ•˜์˜€๋‹ค. ์ด์™ธ์—๋„ ๋™์ผ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•ด DLL Hijacking ๊ณต๊ฒฉ์„ ํ†ตํ•ด์„œ RAT ์•…์„ฑ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋„ ํ•˜์˜€๋‹ค.

[๊ทธ๋ฆผ 2] Diamond Sleet ๊ณต๊ฒฉ ํ๋ฆ„๋„ (์ถœ์ฒ˜: Microsoft Threat Intelligence)

 

2) Lazarus ๊ณ„์—ด APT ๊ทธ๋ฃน : Andariel

๋ถํ•œ๋ฐœ APT ๊ณต๊ฒฉ๊ทธ๋ฃน Andariel(aka. Onyx Sleet)์€ ์ผ๋ฐ˜ ๊ธฐ์—… ๋ฐ ๊ธˆ์œต๊ธฐ๊ด€์ด๋‚˜ ๊ตญ๋‚ด ์ •๋ถ€๊ธฐ๊ด€์„ ํ‘œ์ ์œผ๋กœ ๊ณต๊ฒฉํ•œ๋‹ค. ์ด๋“ค์€ CVE-2023-42793์„ ์ด์šฉํ•ด ์„œ๋ฒ„์— ์ ‘๊ทผํ•œ ํ›„ Kerberos ํ‹ฐ์ผ“์„ ๋ถ€์—ฌํ•˜๋Š” Windows ๊ณ„์ • ์ด๋ฆ„์ธ KRBTGT์„ ์ด์šฉํ•˜์—ฌ krtbgt๋ผ๋Š” ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  tasklist, whoami, netstat, systeminfo ๋“ฑ ๋‹ค์ˆ˜์˜ ์‹œ์Šคํ…œ ๊ฒ€์ƒ‰ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‹œ์Šคํ…œ ์ •๋ณด๋ฅผ ํ™•์ธํ–ˆ๋‹ค. ์ดํ›„ Powershell์„ ํ†ตํ•ด temp.exe์™€ inetmgr.exe๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜์˜€์œผ๋ฉฐ, ๋‹ค์šด๋กœ๋“œ ๋œ ์•…์„ฑ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜๋Š” ํ˜•ํƒœ๋กœ HazyLoad ์•…์„ฑ์ฝ”๋“œ๋ผ ๋ช…๋ช…๋œ๋‹ค.

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

[๊ทธ๋ฆผ 3] Onyx Sleet ๊ณต๊ฒฉ ํ๋ฆ„๋„ (์ถœ์ฒ˜: Microsoft Threat Intelligence)

 

03. CVE-2024-27198 ์ทจ์•ฝ์  ๋ถ„์„

’02. CVE-2023-42793 ๊ณต๊ฒฉ ์‚ฌ๋ก€’์—์„œ ํ™•์ธํ•œ ๋ฐ”์™€ ๊ฐ™์ด TeamCity ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ ์€ TeamCity์˜ ์‹œ์Šคํ…œ ์ธ์ฆ์„ ์šฐํšŒํ•˜๊ณ  ๊ณ„์ • ์ƒ์„ฑ ๋ฐ TeamCity์˜ ํ”„๋กœ์ ํŠธ, ๋นŒ๋“œ, ์—์ด์ „ํŠธ, ์•„ํ‹ฐํŒฉํŠธ ๋“ฑ์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ณต๊ธ‰๋ง ๊ณต๊ฒฉ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. TeamCity ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์˜ ๋ชจ๋“  ๋ฒ„์ „์—์„œ ๋ฐœํ˜„๋˜๊ณ  ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค์— ์ œํ•œ์—†์ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ RCE ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์œ„ํ—˜ ์ทจ์•ฝ์ ์— ์†ํ•œ๋‹ค.

2023๋…„์— ๋ฐœ๊ฒฌ๋œ CVE-2023-42793 ์ดํ›„ 2024๋…„์— ๋ฐœ๊ฒฌ๋œ CVE-2024-27198์€ ํ•ดํ‚น๊ทธ๋ฃน์—์„œ ์•…์šฉ๋œ ์‚ฌ๋ก€๋Š” ํ™•์ธ๋˜์ง€ ์•Š์•˜์œผ๋‚˜, ์ž์Šค๋ฏผ(Jasmin) ๋žœ์„ฌ์›จ์–ด ๋ณ€์ข…, XMRig, SparkRAT ๋ฐฑ๋„์–ด ๋“ฑ์—์„œ ์•…์šฉํ•œ ์‚ฌ๋ก€๊ฐ€ ํ™•์ธ๋จ์— ๋”ฐ๋ผ ํ–ฅํ›„ ๋‹ค์ˆ˜์˜ ํ•ดํ‚น๊ทธ๋ฃน์—์„œ ์•…์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค.

CVE-2024-27198์€ CVSS 3.0 ๊ธฐ์ค€ 9.8์— ํ•ด๋‹นํ•˜๋ฉฐ, CVE์™€ ๋‹ค๋ฅด๊ฒŒ ์ทจ์•ฝ์  ์•…์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ์˜ˆ์ธกํ•˜๋Š” ์ง€ํ‘œ์ธ EPSS ์ˆ˜์น˜๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด [ํ‘œ 1]๊ณผ ๊ฐ™์ด ์ทจ์•ฝ์ ์˜ ์•…์šฉ ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๋‹นํžˆ ๋†’๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

[ํ‘œ 1] TeamCity ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ (CVE List)

 

CVE-2024-27198์€ ๋Œ€์ฒด ๊ฒฝ๋กœ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์›น ๊ตฌ์„ฑ์š”์†Œ ์ธ์ฆ์„ ์šฐํšŒํ•˜๋Š” ์ทจ์•ฝ์ ์ด๋‹ค. ์ฝ”๋“œ ๊ฒฐํ•จ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋ฉฐ ํŠน์ • ์š”์ฒญ ์ „์†ก ํ›„ updateViewIfRequestHasJspParameter ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ชจ๋“  ์ธ์ฆ์— ๋Œ€ํ•œ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค. CVE-2024-27198 ์ทจ์•ฝ์  ์›์ธ์— ๋Œ€ํ•ด์„œ๋Š” PoC์™€ ์ฝ”๋“œ ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ์ธ์ฆ ์šฐํšŒ ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜๊ณ ์ž ํ•œ๋‹ค.

1) CVE-2024-27198 : PoC ์‹œ์—ฐ

PoC ์‹œ์—ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰๋˜๋ฉฐ ๊ตฌ์„ฑ๋„๋Š” [๊ทธ๋ฆผ 4]๊ณผ ๊ฐ™๋‹ค.

[ํ‘œ 2] PoC ์‹œ์—ฐ ํ™˜๊ฒฝ

 

[๊ทธ๋ฆผ 4] CVE-2024-27198 PoC ๊ตฌ์„ฑ๋„

 

์•„๋ž˜ [๊ทธ๋ฆผ 5]์˜ PoC ์‹คํ–‰ ๊ฒฐ๊ณผ ํ™”๋ฉด์—์„œ ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ์ง€์ •ํ•œ ๊ด€๋ฆฌ์ž ๊ณ„์ •์ด ์ƒ์„ฑ๋˜๊ณ  ์›น ์‰˜์ด ํฌํ•จ๋œ ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์—…๋กœ๋“œ ๋˜์–ด RCE ๊ณต๊ฒฉ๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ PoC ์ฝ”๋“œ ๋ถ„์„๊ณผ ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

[๊ทธ๋ฆผ 5] CVE-2024-27198 PoC ์‹คํ–‰ ๊ฒฐ๊ณผ

 

2) CVE-2024-27198 : PoC ๋ถ„์„

[๊ทธ๋ฆผ 4]์˜ PoC ๊ตฌ์„ฑ๋„์— ๋”ฐ๋ผ ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ, ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘, ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋กœ๋“œ, RCE ๋ฐœํ˜„ ๊ณผ์ •์— ๋Œ€ํ•ด ๋‚˜๋ˆ„์–ด ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค.

๋จผ์ €, ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์  ๋ฐœํ˜„ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ฆ์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ž„์˜์˜ ๊ฒฝ๋กœ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•œ๋‹ค.

๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์„œ๋ฒ„ ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ํŽ˜์ด์ง€์ธ /app/rest/server ๋กœ ์ ‘๊ทผ ์š”์ฒญ์„ ํ–ˆ์„ ๋•Œ๋ฅผ ์›น ํ”„๋ก์‹œ ๋„๊ตฌ(Burp Suite)๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ์‘๋‹ต ์ฝ”๋“œ 302(Found)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

[๊ทธ๋ฆผ 6] /app/rest/server ์ง์ ‘ ์ ‘๊ทผ ์‹œ๋„

PoC ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด GetTeamCityVersion() ํ•จ์ˆ˜์—์„œ ์š”์ฒญ url์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ž„์˜์˜ ๊ฒฝ๋กœ(/hax)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ /app/rest/server ๋กœ ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ๋‹ค.

[๊ทธ๋ฆผ 7] ๋ฒ„์ „ ์ •๋ณด ํ™•์ธ PoC ์ฝ”๋“œ

 

์š”์ฒญ ๋ผ์ธ์˜ URL์„ PoC ์ฝ”๋“œ์™€ ๊ฐ™์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ(/hax)๋กœ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด [๊ทธ๋ฆผ 8]์˜ Response ๊ฒฐ๊ณผ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด /app/rest/server ํŽ˜์ด์ง€์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์„œ๋ฒ„์˜ ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋œ๋‹ค.

[๊ทธ๋ฆผ 8] /app/rest/server ์ ‘๊ทผ

 

์•ž์˜ ๊ณผ์ •์„ ํ๋ฆ„๋„๋กœ ํ‘œํ˜„ํ•˜๋ฉด [๊ทธ๋ฆผ 9]๊ณผ ๊ฐ™์œผ๋ฉฐ, ์ธ์ฆ์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ž„์˜์˜ ๊ฒฝ๋กœ๋ฅผ ์š”์ฒญํ•  ๊ฒฝ์šฐ ์ธ์ฆ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

[๊ทธ๋ฆผ 9] ์ทจ์•ฝ์  ๋ฐœํ˜„ ์—ฌ๋ถ€ ํ™•์ธ ํ๋ฆ„๋„

PoC ์ฝ”๋“œ์—์„œ /hax?jsp=/app/rest/server;.jsp ๋กœ ์š”์ฒญ URL์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์„œ๋ฒ„ ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ํŽ˜์ด์ง€์˜ ์ ‘๊ทผ ์œ ๋ฌด๋กœ ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ ์˜ ๋ฐœํ˜„ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

[๊ทธ๋ฆผ 10]์€ ๋””๋ฒ„๊น… ์‹œ ํ˜ธ์ถœ๋˜๋Š” ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ์š”์•ฝํ•œ ํ๋ฆ„๋„์ด๋‹ค. ์ •์ƒ์ ์ธ ์š”์ฒญ์ผ ๊ฒฝ์šฐ๋Š” ์ƒ๋žตํ•˜๋ฉฐ ๋‹จ๊ณ„๋ณ„ ๋””๋ฒ„๊น… ๊ณผ์ •์— ๋”ฐ๋ผ ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

[๊ทธ๋ฆผ 10] ํ˜ธ์ถœ๋˜๋Š” ํด๋ž˜์Šค ๋ฐ ๋ฉ”์„œ๋“œ ํ๋ฆ„๋„

๋จผ์ €, ์‚ดํŽด๋ณผ PageNotFoundController ํด๋ž˜์Šค๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ ํ™œ์šฉ๋˜๋ฉฐ doHandle ๋ฉ”์„œ๋“œ์—์„œ ModelAndView์— “404.jsp” ๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ  servletPath(์„œ๋ธ”๋ฆฟ ๊ฒฝ๋กœ)๋Š” “/404.html”์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

[๊ทธ๋ฆผ 11] PageNotFoundController ํด๋ž˜์Šค

 

[๊ทธ๋ฆผ 11]์—์„œ PageNotFoundController๋Š” BaseController๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, BaseController ํด๋ž˜์Šค๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์—์„œ ํ•ด๋‹น ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒ๋œ๋‹ค.

์•„๋ž˜์˜ [๊ทธ๋ฆผ 12]์—์„œ BaseController ํด๋ž˜์Šค์˜ handleRequestInternal ๋ฉ”์„œ๋“œ๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ, ์š”์ฒญ์ด ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด (์ฆ‰, ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‘๋‹ต ์ฝ”๋“œ 302(Found) ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ) updateViewIfRequestHasJspParameter ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

[๊ทธ๋ฆผ 12] handleRequestInternal ๋ฉ”์„œ๋“œ

 

[๊ทธ๋ฆผ 13]์—์„œ updateViewIfRequestHasJspParameter ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•˜๋ฉด modelAndView๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  ํ˜„์žฌ ์š”์ฒญ์˜ servletPath(์„œ๋ธ”๋ฆฟ ๊ฒฝ๋กœ)๊ฐ€ .jsp๋กœ ๋๋‚˜์ง€ ์•Š์„ ๊ฒฝ์šฐ isControllerRequestWithViewName ๋ณ€์ˆ˜๊ฐ€ true๋กœ ์„ค์ •๋œ๋‹ค.

์ด๋ฅผ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด์„œ HTTP 404(not found) ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋„๋ก ์š”์ฒญํ•˜๋ฉด [๊ทธ๋ฆผ 11]์—์„œ ํ™•์ธํ•˜๋“ฏ์ด modelAndView๊ฐ€ 404.jsp๊ฐ€ ๋˜๊ณ  ์„œ๋ธ”๋ฆฟ ๊ฒฝ๋กœ๋Š” /404.html์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด ๋•Œ ๊ฒฝ๋กœ๊ฐ€ .html๋กœ ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— True๋กœ ์„ค์ •๋œ๋‹ค.

[๊ทธ๋ฆผ 13] updateViewIfRequestHasJspParameter ๋ฉ”์„œ๋“œ

 

๊ทธ ๋‹ค์Œ getJspFromRequest ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ Spring Framework์˜ modelAndView.setViewName ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌ๋œ๋‹ค. ์ด ๋•Œ jspFromRequest ๋ณ€์ˆ˜์˜ ๋‚ด์šฉ์„ ๊ณต๊ฒฉ์ž๊ฐ€ ๋ณ€์กฐํ•˜์—ฌ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค๋ฉด DispatcherServlet์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” URL์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ž„์˜์˜ ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

[๊ทธ๋ฆผ 14]์—์„œ getJspFromRequest ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋ฐ‘์ค„ ์นœ ๋ถ€๋ถ„์—์„œ ์—ฌ๋Ÿฌ ํŒ๋‹จ์„ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ทธ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
1) jsp ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ
2) jsp ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด null ๋˜๋Š” .jsp ์ข…๋‹จ ๋ฌธ์ž์ผ ๊ฒฝ์šฐ
3) jsp ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์— “admin/” ๋ฌธ์ž์—ด์ด ํฌํ•จ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ

[๊ทธ๋ฆผ 14] getJspFromRequest ๋ฉ”์„œ๋“œ

 

[๊ทธ๋ฆผ 15] PoC ์ฝ”๋“œ์—์„œ ํ™•์ธํ•œ ์š”์ฒญ URL์„ ๋ณด๋ฉด ์œ„์˜ ์กฐ๊ฑด๋“ค์„ ๋งŒ์กฑํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ jspFromRequest๊ฐ€ True๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ updateViewIfRequestHasJspParameter ๋ฉ”์„œ๋“œ์— jspFromRequest ๊ฐ’์ด ์ „๋‹ฌ๋œ๋‹ค.

[๊ทธ๋ฆผ 15] /app/rest/server ์ ‘๊ทผ์„ ์œ„ํ•œ ์š”์ฒญ URL

 

๋‹ค์‹œ, updateViewIfRequestHasJspParameter ๋ฉ”์„œ๋“œ์— ๋Œ์•„์™€์„œ ํ™•์ธํ•ด๋ณด๋ฉด jspFromRequest ๋ณ€์ˆ˜์— ์ธ์ฆ๋œ ์—”๋“œ ํฌ์ธํŠธ์ธ “/app/rest/server;.jsp”๊ฐ’์ด ์ „๋‹ฌ๋˜๊ณ  modelAndView.setViewName ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

[๊ทธ๋ฆผ 16] jspFromRequest ๊ฐ’ ์ „๋‹ฌ

 

์ดํ›„ Java Servlet API์—์„œ ์‚ฌ์šฉ๋˜๋Š” getRequestDispatcher ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ์ถ”์ƒํ™”ํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

[๊ทธ๋ฆผ 17]์—์„œ๋Š” URI๋ฅผ ๋งคํ•‘ํ•˜๊ณ  ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„œ๋ธ”๋ฆฟ ์š”์ฒญ์„ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ธ getRequestDispatcher๋Š” ๋ทฐ ๊ฒฝ๋กœ๋ฅผ ์–ป๋Š” ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ด๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒฝ๋กœ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” stripPathParams ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

[๊ทธ๋ฆผ 17] getRequestDispatcher ๋ฉ”์„œ๋“œ

 

stripPathParams ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์„ธ๋ฏธ์ฝœ๋ก (;) ๋ฌธ์ž ์ „๊นŒ์ง€์˜ ๋‚ด์šฉ๋งŒ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๊ณ  ์žˆ๋‹ค. “/app/rest/server;.jsp” ๊ฐ’์ด ์ „๋‹ฌ๋  ๋•Œ ์„ธ๋ฏธ์ฝœ๋ก (;) ์ „๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ [๊ทธ๋ฆผ 18]์—์„œ uriNoParams ๊ฐ’์ด /app/rest/server๋งŒ ๋‚จ๊ฒŒ ๋œ๋‹ค.

org.apache.Catalina.core.ApplicationContext#getRequestDispatcher์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ์˜€๋˜ /app/rest/server;.jsp๊ฐ€ /app/rest/server๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ ํ•ด๋‹น ๊ฒฝ๋กœ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์„œ๋ฒ„์˜ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

[๊ทธ๋ฆผ 18] stripPathParams ๋ฉ”์„œ๋“œ

๊ณต๊ฒฉ์ž๋Š” ํ•ด๋‹น ๊ณผ์ •์œผ๋กœ ๋ฐœํ˜„๋˜๋Š” ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ 2์ฐจ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•  ์œ„ํ—˜์„ฑ์ด ์กด์žฌํ•œ๋‹ค. PoC ์ฝ”๋“œ์—์„œ๋Š” 2์ฐจ ๊ณต๊ฒฉ์œผ๋กœ ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ, ํ† ํฐ ์ƒ์„ฑ ๋ฐ ๋ถ€์—ฌ, ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋กœ๋“œ ๋ฐ RCE ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์–ด ์•„๋ž˜์˜ STEP1,2,3,4 ๊ณผ์ •์„ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

STEP1 : ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ
์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์  ๋ฐœํ˜„ ์‹œ ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ ํ™•์ธํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ ์ธ์ฆ์ด ์šฐํšŒ๋œ๋‹ค๋Š” ์ ์„ ์•…์šฉํ•˜์—ฌ REST API ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ณต๊ฒฉ์ž์˜ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

[๊ทธ๋ฆผ 19] ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ ๊ณต๊ฒฉ ํ๋ฆ„๋„

 

TeamCity์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•  ๋•Œ /app/rest/users ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค.

[๊ทธ๋ฆผ 20] ๊ณ„์ • ์ƒ์„ฑ ๊ฒฝ๋กœ ํ™•์ธ

 

PoC ์ฝ”๋“œ์—์„œ AddUser() ํ•จ์ˆ˜์˜ add_user_url ๋ณ€์ˆ˜์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ(/hax)๋ฅผ ํ†ตํ•œ ์š”์ฒญ URL์„ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฉฐ add_user_data ๋ณ€์ˆ˜์— ๊ณ„์ •๋ช…, ํŒจ์Šค์›Œ๋“œ, ๊ณ„์ •์˜ ๊ถŒํ•œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ roleId๋ฅผ “SYSTEM_ADMIN”๊ฐ’์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ์„ ์š”์ฒญํ•œ๋‹ค.

[๊ทธ๋ฆผ 21] ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ PoC ์ฝ”๋“œ

 

/app/rest/users ๊ฒฝ๋กœ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋ฉฐ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๊ณ„์ • ์ƒ์„ฑ์ด ์ด๋ฃจ์–ด์ง„๋‹ค. ๋‹ค์Œ์€, ์›น ํ”„๋ก์‹œ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ์‹ค์ œ๋กœ ๊ณ„์ •์ด ์ƒ์„ฑ๋˜๋Š” ๊ณผ์ •์„ ํ™•์ธํ•ด๋ณด์ž.

[๊ทธ๋ฆผ 22] /app/rest/users ์ ‘๊ทผ ์ธ์ฆ ์šฐํšŒ ์‹œ๋„

 

ํ•ด๋‹น ์š”์ฒญ์œผ๋กœ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๊ณ„์ •์ด ์ƒ์„ฑ๋˜๊ณ , ๋กœ๊ทธ์ธ๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

[๊ทธ๋ฆผ 23] ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ ๋ฐ ๋กœ๊ทธ์ธ ํ™•์ธ

 

๊ณ„์ • ์ƒ์„ฑ ํ›„ GetToken() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž์˜ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ถŒํ•œ์ด ์กด์žฌํ•˜๋Š” ํŽ˜์ด์ง€์— ์š”์ฒญ ์‹œ ์‚ฌ์šฉ๋œ๋‹ค. [๊ทธ๋ฆผ 21]์—์„œ ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ ํ•จ์ˆ˜์ธ AddUser()๋กœ ์ƒ์„ฑ๋œ ๊ด€๋ฆฌ์ž ๊ณ„์ •์— ๋Œ€ํ•œ ํ† ํฐ ๊ฐ’์„ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ํ•„์š”๋กœ ํ•˜๋Š” ํŽ˜์ด์ง€์— ์ ‘๊ทผ ์‹œ ํ•ด๋‹น ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ 2์ฐจ ๊ณต๊ฒฉ์„ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

PoC ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด /app/rest/users/id:{user_id}/tokens/{token_name} ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผํ•˜์—ฌ ์‘๋‹ต๊ฐ’์˜ name, value, creationTime์„ ํฌํ•จํ•˜๋Š” ํ† ํฐ(value)๊ฐ’์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

[๊ทธ๋ฆผ 24] ํ† ํฐ ์ƒ์„ฑ PoC ์ฝ”๋“œ

 

ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” ํ๋ฆ„์„ ๊ฐ„๋‹จํžˆ ํ‘œํ˜„ํ•˜๋ฉด [๊ทธ๋ฆผ 25]์™€ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด ์ž„์˜์˜ ํ† ํฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋ฐ›๊ฒŒ ๋˜๋ฉฐ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ์š”๊ตฌํ•˜๋Š” ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ๋•Œ ํ•ด๋‹น ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

[๊ทธ๋ฆผ 25] ํ† ํฐ ์ƒ์„ฑ ํ๋ฆ„๋„

 

STEP2 : ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘
๊ณต๊ฒฉ์ž๋Š” ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ, ํ† ํฐ ์ƒ์„ฑ์œผ๋กœ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ํ•„์š”๋กœ ํ•˜๋Š” ํŽ˜์ด์ง€์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ์ ์„ ์•…์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ์ด๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—…๋กœ๋“œํ•˜๋Š” ์‹œ๋„๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, PoC ์ฝ”๋“œ์—์„œ๋Š” ์›น ์‰˜์„ ํฌํ•จํ•œ .jar ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค. GetEvilPluginZipFile() ํ•จ์ˆ˜๋Š” Faker ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์งœ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  cmd ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ–๋Š” jsp ์›น ์‰˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž„์˜์˜ .jar ํŒŒ์ผ์„ ์ œ์ž‘ํ•œ๋‹ค.

[๊ทธ๋ฆผ 26] ์›น ์‰˜์ด ํฌํ•จ๋œ jar ํŒŒ์ผ ์ƒ์„ฑ PoC ์ฝ”๋“œ

 

[๊ทธ๋ฆผ 27]์—์„œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋ฉ”ํƒ€ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด XML ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. ์ดํ›„ [๊ทธ๋ฆผ 26]์—์„œ ์ƒ์„ฑํ•œ jsp๋ฅผ buildServerResources/ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ง€์ • ํ›„ jar ํŒŒ์ผ๊ณผ xml ํŒŒ์ผ์„ zip ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

[๊ทธ๋ฆผ 27] XML ํŒŒ์ผ ๋ฐ zip ํŒŒ์ผ ์ƒ์„ฑ PoC ์ฝ”๋“œ

 

STEP3 : ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋กœ๋“œ

๊ด€๋ฆฌ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋กœ๋“œ ํŽ˜์ด์ง€์— ๊ด€๋ฆฌ์ž ๊ณ„์ •์˜ ํ† ํฐ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์ ‘๊ทผํ•จ์œผ๋กœ์จ ์›น ์‰˜์ด ํฌํ•จ๋œ ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

[๊ทธ๋ฆผ 28] ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋กœ๋“œ ํ๋ฆ„๋„

 

[๊ทธ๋ฆผ 29] ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋กœ๋“œ PoC ์ฝ”๋“œ

 

LoadEvilPlugin()์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์กด์žฌ ์‹œ ํ™œ์„ฑํ™”๋ฅผ ์œ„ํ•ด /admin/plugins.html๋กœ POST ์š”์ฒญ์„ ์ „์†ก ํ•œ๋‹ค.

[๊ทธ๋ฆผ 30] ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™œ์„ฑํ™” PoC ์ฝ”๋“œ

 

STEP4 : ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE) ๋ฐœํ˜„
[๊ทธ๋ฆผ 28] ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋กœ๋“œ ํ๋ฆ„๋„์—์„œ ๊ด€๋ฆฌ์ž ๊ณ„์ •์˜ ํ† ํฐ์„ ์ด์šฉํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋กœ๋“œ ํ›„ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฒฝ๋กœ์— ์ ‘๊ทผํ•จ์œผ๋กœ์จ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE)์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

PoC ์ฝ”๋“œ์—์„œ ํ™•์ธํ•ด๋ณด๋ฉด ExecuteCommandByEvilPlugin()์—์„œ๋Š” ๋ฉ”์ธ ํ•จ์ˆ˜์— ์žˆ๋Š” shell_url๊ณผ command๋ฅผ ์ด์šฉํ•ด POST ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๊ณ  cmd ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ช…๋ น์–ด๋ฅผ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์›๊ฒฉ ๋ช…๋ น์–ด ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

[๊ทธ๋ฆผ 31] RCE ๋ฐœํ˜„ PoC ์ฝ”๋“œ

 

04. ๋Œ€์‘ ๋ฐฉ์•ˆ

TeamCity์—์„œ ๋ฐœ์ƒํ•œ ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ ์€ ์˜จํ”„๋ ˆ๋ฏธ์Šค(On-Premises) ์„ค์น˜ ๋ชจ๋“  ๋ฒ„์ „์—์„œ ๋ฐœํ˜„๋˜๋ฏ€๋กœ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

1) ์ตœ์‹  ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ(23.11.4)

TeamCity ์„œ๋ฒ„, ์—์ด์ „ํŠธ ๋ฐ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด์— ๋Œ€ํ•œ ์ตœ์‹  ๋ฒ„์ „ ๋ฐ ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋ฉฐ ์—…๋ฐ์ดํŠธ๋ฅผ ํ†ตํ•ด ์ทจ์•ฝ์  ์ž์ฒด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ตœ์‹  ๋ฒ„์ „์ธ 2023.11.4 ๋กœ ์—…๋ฐ์ดํŠธ ์ง„ํ–‰์„ ๊ถŒ๊ณ ํ•œ๋‹ค.

 

2) ๋ณด์•ˆ ํŒจ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ ์šฉ

JetBrains์—์„œ๋Š” ์ทจ์•ฝ์ ๋งŒ ํŒจ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ณด์•ˆ ํŒจ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์–ด ์—…๋ฐ์ดํŠธ๊ฐ€ ์–ด๋ ค์šด ํ™˜๊ฒฝ์ผ ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด ํŒจ์น˜๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค์น˜๋ฅผ ๊ถŒ๊ณ ํ•œ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ์ˆ˜๋™ ์„ค์น˜ ๋ฐฉ๋ฒ•์€ ZIP ํ”Œ๋Ÿฌ๊ทธ์ธ ํŒจํ‚ค์ง€๋ฅผ [TeamCity ์„ค์น˜ ๋””๋ ‰ํ„ฐ๋ฆฌ]/plugins ๊ฒฝ๋กœ์— ๋ณต์‚ฌํ•˜์—ฌ ์„ค์น˜ ํ›„ ๋กœ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

[๊ทธ๋ฆผ 32] ๋ณด์•ˆ ํŒจ์น˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ ์šฉ(Windows)

 

3) ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋กœ๋“œ ์‹œ ๋น„ํ™œ์„ฑํ™”

PoC ๋ถ„์„์—์„œ ํ™•์ธํ•œ ์•…์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์—…๋กœ๋“œ ๋  ๊ฒฝ์šฐ disabled-plugins.xml ํŒŒ์ผ์—์„œ ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ๋น„ํ™œ์„ฑํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ [ํ‘œ 3]์˜ OS ๋ณ„๋กœ ์œ„์น˜ํ•œ ๊ฒฝ๋กœ์—์„œ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

[ํ‘œ 3] OS๋ณ„ disabled-plugins.xml ๊ธฐ๋ณธ ๊ฒฝ๋กœ

 

[๊ทธ๋ฆผ 33] disabled-plugin ํƒœ๊ทธ ์ ์šฉ(Windows)

 

4) ๋กœ๊ทธ ํŒŒ์ผ ์ •๊ทœ ํ‘œํ˜„์‹ ์ ์šฉ

๋กœ๊ทธ ํŒŒ์ผ์—์„œ ์ •๊ทœํ‘œํ˜„์‹์„ ํ†ตํ•ด ํŠน์ • ๋ฌธ์ž์—ด ํŒจํ„ด์„ ๋งค์นญํ•˜์—ฌ ํ•ด๋‹น ํŒจํ„ด์ด ํฌํ•จ๋œ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์‹๋ณ„ํ•จ์œผ๋กœ์จ ํŠน์ • ์œ ํ˜•์˜ ํ™œ๋™ ํƒ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. OS ๋ณ„ ๋กœ๊ทธ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ๋กœ๋Š” [ํ‘œ 4]์™€ ๊ฐ™์œผ๋ฉฐ logs ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์— ์กด์žฌํ•˜๋Š” teamcity-*.log ํŒŒ์ผ์—์„œ ์ธ์ฆ ์šฐํšŒ๋ฅผ ์œ„ํ•œ ๊ฒฝ๋กœ ์ ‘๊ทผ ๋ฐ ์—…๋กœ๋“œ ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ •๋ณด ๋“ฑ์˜ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

[ํ‘œ 4] OS๋ณ„ logs ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ

 

teamcity-javaLogging.log ํŒŒ์ผ์—๋Š” ModelAndView.setViewName ํ˜ธ์ถœ ํ›„์— ์ฒ˜๋ฆฌ๋œ URL์„ ์„ค๋ช…ํ•˜๋Š” ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ–ˆ์„ ๋•Œ๋ฅผ ์˜ˆ์‹œ๋กœ ํ•˜์—ฌ [๊ทธ๋ฆผ 34]๊ณผ ๊ฐ™์€ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

[๊ทธ๋ฆผ 34] teamcity-javaLogging.log ๋‚ด์šฉ

 

์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒ๋  ๋•Œ ๋กœ๊ทธ ๋‚ด์šฉ์„ ํ™•์ธํ•ด๋ณด๋ฉด jsp= ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ;.jsp ๋ฌธ์ž์—ด์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์ด๋ฅผ ํƒ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ [๊ทธ๋ฆผ 35]์— ์žˆ๋Š” ์ •๊ทœํ‘œํ˜„์‹์„ ์ ์šฉํ•˜์—ฌ ์•…์šฉ ์‹œ๋„์— ๋Œ€ํ•œ ํƒ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

[๊ทธ๋ฆผ 35] ์ •๊ทœํ‘œํ˜„์‹ ๋‚ด์šฉ

 

05.๋งˆ๋ฌด๋ฆฌ

JetBrains์˜ TeamCity์—์„œ ๋ฐœ์ƒํ•œ CVE ์ทจ์•ฝ์ ์„ ์˜ˆ์‹œ๋กœ ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ ์— ๋Œ€ํ•œ ๋ถ„์„์„ ํ†ตํ•ด ์ทจ์•ฝ์ ์˜ ์œ„ํ—˜์„ฑ๊ณผ ๋ฐœ์ƒ ์›์ธ์— ๋Œ€ํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ธ์ฆ ์šฐํšŒ ์ทจ์•ฝ์ ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์ดˆ๊ธฐ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์šฐํšŒํ•˜์—ฌ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ ‘๊ทผ ๊ถŒํ•œ์„ ํš๋“ํ•˜๊ฒŒ ๋˜๋ฉด ํ† ํฐ์„ ์ƒ์„ฑํ•˜์—ฌ ์›น ์‰˜์„ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰๊ณผ ๊ฐ™์€ 2์ฐจ ๊ณต๊ฒฉ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ ์ธ์ฆ ๋ฐ ์ ‘๊ทผ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋„์ž…ํ•˜๊ณ  ์ž…๋ ฅ ๊ฐ’ ๊ฒ€์ฆ๊ณผ ์ธ์ฆ ํ”„๋กœ์„ธ์Šค ๊ฐ•ํ™”, ํŒจ์น˜ ์—…๋ฐ์ดํŠธ ๋“ฑ์„ ํ†ตํ•ด ์‹œ์Šคํ…œ์˜ ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

 

06.์ฐธ๊ณ  ์ž๋ฃŒ

1) Vulnerability Details : CVE-2024-27198 :
https://www.cvedetails.com/cve/CVE-2024-27198/?q=cve-2024-27198
2) Additional Critical Security Issues Affecting TeamCity On-Premises (CVE-2024-27198 and CVE-2024-27199) – Update to 2023.11.4 Now : https://blog.jetbrains.com/teamcity/2024/03/additional-critical-security-issues-affecting-teamcity-on-premises-cve-2024-27198-and-cve-2024-27199-update-to-2023-11-4-now/
3) Proof of Concept for Authentication Bypass in JetBrains TeamCity Pre-2023.11.4 : https://github.com/Chocapikk/CVE-2024-27198
4) CVE-2024-27198 and CVE-2024-27199: JetBrains TeamCity Multiple Authentication Bypass Vulnerabilities :
https://www.rapid7.com/blog/post/2024/03/04/etr-cve-2024-27198-and-cve-2024-27199-jetbrains-teamcity-multiple-authentication-bypass-vulnerabilities-fixed/

+ Recent posts