For the complete documentation index, see llms.txt. This page is also available as Markdown.

De1CTF 2019

Web

SSRF Me

from flask import Flask 
from flask import request 
import socket 
import hashlib 
import urllib 
import sys 
import os 
import json 
reload(sys) 
sys.setdefaultencoding('latin1')
app = Flask(__name__)
secert_key = os.urandom(16)


class Task: 
    def __init__(self, action, param, sign, ip):
        self.action = action
        self.param = param
        self.sign = sign
        self.sandbox = md5(ip)
        if(not os.path.exists(self.sandbox)): #SandBox For Remote_Addr
            os.mkdir(self.sandbox)
            
    def Exec(self): 
        result = {} 
        result['code'] = 500
        if (self.checkSign()): 
            if "scan" in self.action: 
                tmpfile = open("./%s/result.txt" % self.sandbox, 'w')
                resp = scan(self.param)
                if (resp == "Connection Timeout"): 
                    result['data'] = resp 
                else: 
                    print resp
                    tmpfile.write(resp)
                    tmpfile.close()
                result['code'] = 200
            if "read" in self.action: 
                f = open("./%s/result.txt" % self.sandbox, 'r')
                result['code'] = 200
                result['data'] = f.read()
                if result['code'] == 500:
                    result['data'] = "Action Error"
                else: 
                    result['code'] = 500
                    result['msg'] = "Sign Error"
                return result
            
    def checkSign(self): 
        if (getSign(self.action, self.param) == self.sign): 
            return True 
        else: 
            return False #generate Sign For Action Scan. 
        

@app.route("/geneSign", methods=['GET', 'POST']) 
def geneSign(): 
    param = urllib.unquote(request.args.get("param", "")) # ๅฐ† param ็š„ๅ‚ๆ•ฐ่งฃ็ ไธบๅŽŸๅง‹็š„ๅญ—็ฌฆไธฒๅฝขๅผ๏ผŒ่‹ฅไธบ็ฉบๅˆ™ไธบ็ฉบๅญ—็ฌฆไธฒ
    action = "scan"
    return getSign(action, param)

@app.route('/De1ta',methods=['GET','POST']) 
def challenge(): 
    action = urllib.unquote(request.cookies.get("action"))
    param = urllib.unquote(request.args.get("param", ""))
    sign = urllib.unquote(request.cookies.get("sign"))
    ip = request.remote_addr
    if(waf(param)):
        return "No Hacker!!!!"
    task = Task(action, param, sign, ip)
    return json.dumps(task.Exec())

@app.route('/') 
def index(): 
    return open("code.txt","r").read()

def scan(param):
    socket.setdefaulttimeout(1)
    try: 
        return urllib.urlopen(param).read()[:50] # ๅช่ฟ”ๅ›žURLๅ†…ๅฎน็š„ๅ‰50ไธชๅญ—็ฌฆ
    except: 
        return "Connection Timeout" 

def getSign(action, param): 
    return hashlib.md5(secert_key + param + action).hexdigest()

def md5(content): 
    return hashlib.md5(content).hexdigest()

def waf(param): 
    check=param.strip().lower()
    if check.startswith("gopher") or check.startswith("file"):
        return True 
    else: 
        return False 
    
if __name__ == '__main__': 
    app.debug = False
    app.run(host='0.0.0.0',port=80)

ๅฏไปฅ่Žทๅพ—ไธ€ไธช Hint flag is in ./flag.txt ๏ผŒ็›ฎๆ ‡ๅฐฑๆ˜ฏ่ฆ้€š่ฟ‡ไธŠ่ฟฐไปฃ็ ไธญ็š„ Task::Exec ๅฐ† flag.txt ๅ†™ๅ…ฅ result.txt ๅ†่ฏปๅ– result.txt ่Žทๅพ— flag ใ€‚็”ฑไบŽๅˆคๆ–ญ่ฏญๅฅๆ˜ฏ้€š่ฟ‡ in ๅ…ณ้”ฎๅญ—ๆฅๅˆคๆ–ญ็š„๏ผŒๅ› ๆญคๅฆ‚ๆžœ self.action ไธญๆ—ขๆœ‰ read ไนŸๆœ‰ scan ๅณๅฏๅŒๆ—ถๆ‰ง่กŒใ€‚

้ฆ–ๅ…ˆ้œ€่ฆ้€š่ฟ‡ checkSign() ๏ผŒๅ…ˆๅˆฉ็”จ getSign() ็”Ÿๆˆ Sign ๅฏไปฅๅพ—ๅˆฐ md5(secert_key + param + action) ใ€‚้€š่ฟ‡ๆž„้€  Payload ๅฆ‚ไธ‹

ๅณๅฏๅพ—ๅˆฐ action ไธบ readscan ็š„ Sign ๏ผŒๅฆ‚ไธ‹

็„ถๅŽๆž„้€  Payload ๅฆ‚ไธ‹ๆฅไฝฟๅพ— flag.txt ๅ†™ๅ…ฅ result.txt ๅ†่ฏปๅ– result.txt ใ€‚

ๅฐฑๅฏไปฅๅพ—ๅˆฐ flag ไบ†๏ผŒไนŸๅฏไปฅ้€š่ฟ‡ MD5 ้•ฟๅบฆๆ‹“ๅฑ•ๆ”ปๅ‡ป่งฃๅ†ณ่ฟ™้“้ข˜๏ผŒๅ…ˆ่Žทๅ– md5(secert_key + flag.txt + scan) ็š„ๅ€ผ๏ผŒๆž„้€  Payload ๅฆ‚ไธ‹

ๅฏไปฅๅพ—ๅˆฐๅ›žๆ˜พๅฆ‚ไธ‹

้€š่ฟ‡ secert_key = os.urandom(16) ๅฏ็Ÿฅ secert_key ้•ฟ 16 ไฝ๏ผŒ้€š่ฟ‡ hashpump ่ฟ›่กŒ็”Ÿๆˆ Payload๏ผŒๅฆ‚ไธ‹

ๅฐฑๅฏไปฅๆฑ‚ๅ‡บ md5(secert_key + flag.txt + scan + padding + read) ็š„ๅ€ผ๏ผŒ้€š่ฟ‡ๆž„้€  Payload ๅฆ‚ไธ‹

ๅณๅฏๅพ—ๅˆฐ flagใ€‚

Last updated