wargame/root-me.org

[web-server] Python - Blind SSTI Filters Bypass

asvv 2022. 3. 4. 11:27

 

시작 전 테스트

name, surname, email birth date에 아무값 넣으면 "Thank you! Your application will be reviewed within a week."라는 문구 확인 가능

 

웹 사이트 밑에 자신의 웹사이트는 오픈소스라 하여 다운 받으라고 한다. 해당 파일(cms.tar.gz)을 다운받으면 server_ch73.py 파일을 확인할 수 있다.

Our website's framework is now open source! You can download it

 

오픈 소스 파일 분석

해당 파일은 Flask가 필요해서 pip install 한다.

 

pip install flask --user

 

입력한 값이 jinja2 Template render 를 호출하는 것을 확인할 수 있다.

 

try:
	register_mail = jinja2.Template(mail).render(
		hacker_name=sanitize(request.form["name"]),
		hacker_surname=sanitize(request.form["surname"]),
		hacker_email=sanitize(request.form["email"]),
		hacker_bday=sanitize(request.form["bday"])
	)
except Exception as e:
	pass

 

해당 소스코드를 보면 sanitize 함수에서 간단한 필터링을 확인할 수 있다.

 

def sanitize(value):
    blacklist = ['{{','}}','{%','%}','import','eval','builtins','class','[',']']
    for word in blacklist:
        if word in value:
            value = value.replace(word,'')
    if any([bool(w in value) for w in blacklist]):
        value = sanitize(value)
    return value

 

mail에서 취약한 Template코드를 확인할 수 있다.

 

mail = """
Hello team,

A new hacker wants to join our private Bug bounty program! Mary, can you schedule an interview?

 - Name: {{ hacker_name }}
 - Surname: {{ hacker_surname }}
 - Email: {{ hacker_email }}
 - Birth date: {{ hacker_bday }}

I'm sending you the details of the application in the attached CSV file:

 - '{{ hacker_name }}{{ hacker_surname }}{{ hacker_email }}{{ hacker_bday }}.csv'

Best regards,
"""

 

sendmail함수에서 jinja2 Template을 다시 랜더링하면서 취약점이 발생한다. mail 안에 Jinja Template 코드에 payload를 삽입할 수 있다.

 

def sendmail(address, content):
    try:
        content += "\n\n{{ signature }}"
        _signature = """---\n<b>Offsec Team</b>\noffsecteam@hackorp.com"""
        content = jinja2.Template(content).render(signature=_signature)
    except Exception as e:
        pass
    return None
"""
...
 - '{{ hacker_name }}{{ hacker_surname }}{{ hacker_email }}{{ hacker_bday }}.csv'
...
"""

Start

InsomniaPowershell을 이용하여 진행

서버 시작

1. 시작전 코드에서 "0.0.0.0"을 "127.0.0.1"로 변경함.
2. 동작을 확인하기 위해 sendmail에서 content를 print함.

 

Post Test (with Insomnia)

테스트

sanitize 함수를 우회하기 위해 name에 "{" bday에 "}"만 넣고 surname과 email에 코드 삽입

 

 

 

<TemplateReference None>을 확인할 수 있음. 코드 삽입 관련 내용은 root-me reference (https://podalirius.net/en/publications/grehack-2021-optimizing-ssti-payloads-for-jinja2/)를 확인 가능함.

 

아래 코드를 삽입

 

cycler.__init__.__globals__.os

Reverse Shell

nc와 bash를 이용하는 reverse shell은 동작하지 않아서 socket을 이용함.

해당 사이트에서 code를 만듬 https://weibell.github.io/reverse-shell-generator/

 

Reverse Shell Generator

 

weibell.github.io

 

글자 50자에 맞게 잘 잘라서 넣으면 해당 서버 shell을 얻을 수 있다.

 

 

 

해당 서버에서 9f 폴더 확인하면 flag.txt를 확인할 수 있다.

반응형

'wargame > root-me.org' 카테고리의 다른 글

[Forensic] Find the cat  (0) 2017.03.05
[Root Me/ Challenges/ Forensic] Command & Control - level 2  (0) 2017.01.10