시작 전 테스트
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
Insomnia와 Powershell을 이용하여 진행
서버 시작
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/
글자 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 |