mirror of
https://github.com/gnh1201/caterpillar.git
synced 2025-09-07 02:11:05 +00:00
Update server.py
This commit is contained in:
parent
486e71b1bd
commit
551656fa68
90
server.py
90
server.py
|
@ -87,27 +87,6 @@ def jsonrpc2_encode(method, params = None):
|
||||||
data['id'] = id
|
data['id'] = id
|
||||||
return (id, json.dumps(data))
|
return (id, json.dumps(data))
|
||||||
|
|
||||||
def jsonrpc2_decode(data):
|
|
||||||
type, id, method, rpcdata = (None, None, None, None)
|
|
||||||
typemap = {
|
|
||||||
"params": "call",
|
|
||||||
"error": "error",
|
|
||||||
"result": "result"
|
|
||||||
}
|
|
||||||
|
|
||||||
jsondata = json.loads(data)
|
|
||||||
if jsondata['jsonrpc'] == "2.0":
|
|
||||||
for k, v in typemap.items():
|
|
||||||
if k in jsondata:
|
|
||||||
type = v
|
|
||||||
rpcdata = jsondata[k]
|
|
||||||
id = jsondata['id']
|
|
||||||
|
|
||||||
if type == "call":
|
|
||||||
method = jsondata['method']
|
|
||||||
|
|
||||||
return type, id, method, rpcdata
|
|
||||||
|
|
||||||
def jsonrpc2_result_encode(result, id = ''):
|
def jsonrpc2_result_encode(result, id = ''):
|
||||||
data = {
|
data = {
|
||||||
"jsonrpc": "2.0",
|
"jsonrpc": "2.0",
|
||||||
|
@ -157,8 +136,10 @@ def parse_first_data(data):
|
||||||
def conn_string(conn, data, addr):
|
def conn_string(conn, data, addr):
|
||||||
# check is it JSON-RPC 2.0 request
|
# check is it JSON-RPC 2.0 request
|
||||||
if data.find(b'{') == 0:
|
if data.find(b'{') == 0:
|
||||||
jsonrpc2_server(conn, data)
|
jsondata = json.loads(data.decode(client_encoding, errors='ignore'))
|
||||||
return
|
if jsondata['jsonrpc'] == "2.0":
|
||||||
|
jsonrpc2_server(conn, jsondata['id'], jsondata['method'], jsondata['params'])
|
||||||
|
return
|
||||||
|
|
||||||
# parse first data (header)
|
# parse first data (header)
|
||||||
webserver, port, scheme, method, url = parse_first_data(data)
|
webserver, port, scheme, method, url = parse_first_data(data)
|
||||||
|
@ -174,33 +155,18 @@ def conn_string(conn, data, addr):
|
||||||
|
|
||||||
proxy_server(webserver, port, scheme, method, url, conn, addr, data)
|
proxy_server(webserver, port, scheme, method, url, conn, addr, data)
|
||||||
|
|
||||||
def jsonrpc2_server(conn, data):
|
def jsonrpc2_server(conn, id, method, params):
|
||||||
# get following chunks
|
if method == "relay_accept":
|
||||||
conn.settimeout(1)
|
accepted_relay[id] = conn
|
||||||
while True:
|
connection_speed = params['connection_speed']
|
||||||
try:
|
print ("[*] connection speed: %s miliseconds" % (str(connection_speed)))
|
||||||
chunk = conn.recv(buffer_size)
|
while conn.fileno() > -1:
|
||||||
if not chunk:
|
time.sleep(1)
|
||||||
break
|
del accepted_relay[id]
|
||||||
data += chunk
|
print ("[*] relay destroyed: %s" % (id))
|
||||||
except:
|
else:
|
||||||
break
|
rpcmethod = Extension.get_rpcmethod(method)
|
||||||
|
rpcmethod.dispatch("call", id, params)
|
||||||
# process JSON-RPC 2 request
|
|
||||||
type, id, method, rpcdata = jsonrpc2_decode(data.decode(client_encoding))
|
|
||||||
if type == "call":
|
|
||||||
if method == "relay_accept":
|
|
||||||
accepted_relay[id] = conn
|
|
||||||
connection_speed = rpcdata['connection_speed']
|
|
||||||
print ("[*] connection speed: %s miliseconds" % (str(connection_speed)))
|
|
||||||
while conn.fileno() > -1:
|
|
||||||
time.sleep(1)
|
|
||||||
del accepted_relay[id]
|
|
||||||
print ("[*] relay destroyed: %s" % (id))
|
|
||||||
else:
|
|
||||||
rpchandler = Extension.get_rpcmethod(method)
|
|
||||||
if rpchandler:
|
|
||||||
rpchandler.dispatch(type, id, method, rpcdata)
|
|
||||||
|
|
||||||
def proxy_connect(webserver, conn):
|
def proxy_connect(webserver, conn):
|
||||||
hostname = webserver.decode(client_encoding)
|
hostname = webserver.decode(client_encoding)
|
||||||
|
@ -357,10 +323,7 @@ def proxy_server(webserver, port, scheme, method, url, conn, addr, data):
|
||||||
if is_ssl and method == b'GET':
|
if is_ssl and method == b'GET':
|
||||||
print ("[*] Trying to bypass blocked request...")
|
print ("[*] Trying to bypass blocked request...")
|
||||||
remote_url = "%s://%s%s" % (scheme.decode(client_encoding), webserver.decode(client_encoding), url.decode(client_encoding))
|
remote_url = "%s://%s%s" % (scheme.decode(client_encoding), webserver.decode(client_encoding), url.decode(client_encoding))
|
||||||
remote_headers = {
|
requests.get(remote_url, stream=True, verify=False, hooks={'response': bypass_callback})
|
||||||
"User-Agent": "php-httpproxy/0.1.5 (Client; Python " + python_version() + "; Caterpillar; abuse@catswords.net)",
|
|
||||||
}
|
|
||||||
requests.get(remote_url, headers=remote_headers, stream=True, verify=False, hooks={'response': bypass_callback})
|
|
||||||
else:
|
else:
|
||||||
conn.sendall(b"HTTP/1.1 403 Forbidden\r\n\r\n{\"status\":403}")
|
conn.sendall(b"HTTP/1.1 403 Forbidden\r\n\r\n{\"status\":403}")
|
||||||
|
|
||||||
|
@ -373,7 +336,7 @@ def proxy_server(webserver, port, scheme, method, url, conn, addr, data):
|
||||||
|
|
||||||
proxy_data = {
|
proxy_data = {
|
||||||
'headers': {
|
'headers': {
|
||||||
"User-Agent": "php-httpproxy/0.1.5 (Client; Python " + python_version() + "; Caterpillar; abuse@catswords.net)",
|
"User-Agent": "php-httpproxy/0.1.5 (Client; Python " + python_version() + "; abuse@catswords.net)",
|
||||||
},
|
},
|
||||||
'data': {
|
'data': {
|
||||||
"buffer_size": str(buffer_size),
|
"buffer_size": str(buffer_size),
|
||||||
|
@ -407,9 +370,10 @@ def proxy_server(webserver, port, scheme, method, url, conn, addr, data):
|
||||||
# The tunnel connect forever until the client destroy it
|
# The tunnel connect forever until the client destroy it
|
||||||
relay = requests.post(server_url, headers=proxy_data['headers'], data=raw_data, stream=True, timeout=None, auth=auth)
|
relay = requests.post(server_url, headers=proxy_data['headers'], data=raw_data, stream=True, timeout=None, auth=auth)
|
||||||
for chunk in relay.iter_content(chunk_size=buffer_size):
|
for chunk in relay.iter_content(chunk_size=buffer_size):
|
||||||
type, _id, _, rpcdata = jsonrpc2_decode(chunk.decode(client_encoding))
|
jsondata = json.loads(chunk.decode(client_encoding, errors='ignore'))
|
||||||
if type == "error" and id == _id:
|
if jsondata['jsonrpc'] == "2.0" and ("error" in jsondata):
|
||||||
print ("[*] Error received from the relay server: (%s) %s" % (str(rpcdata['code']), str(rpcdata['message'])))
|
e = jsondata['error']
|
||||||
|
print ("[*] Error received from the relay server: (%s) %s" % (str(e['code']), str(e['message'])))
|
||||||
except requests.exceptions.ReadTimeout as e:
|
except requests.exceptions.ReadTimeout as e:
|
||||||
pass
|
pass
|
||||||
id, raw_data = jsonrpc2_encode('relay_connect', proxy_data['data'])
|
id, raw_data = jsonrpc2_encode('relay_connect', proxy_data['data'])
|
||||||
|
@ -457,7 +421,7 @@ def proxy_server(webserver, port, scheme, method, url, conn, addr, data):
|
||||||
# stateless mode
|
# stateless mode
|
||||||
proxy_data = {
|
proxy_data = {
|
||||||
'headers': {
|
'headers': {
|
||||||
"User-Agent": "php-httpproxy/0.1.5 (Client; Python " + python_version() + "; Caterpillar; abuse@catswords.net)",
|
"User-Agent": "php-httpproxy/0.1.5 (Client; Python " + python_version() + "; abuse@catswords.net)",
|
||||||
},
|
},
|
||||||
'data': {
|
'data': {
|
||||||
"buffer_size": str(buffer_size),
|
"buffer_size": str(buffer_size),
|
||||||
|
@ -550,22 +514,22 @@ class Extension():
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_rpcmethod(cls, method):
|
def get_rpcmethod(cls, method):
|
||||||
for extension in cls.extension:
|
for extension in cls.extension:
|
||||||
if extension.method == method:
|
if extension.type == "rpcmethod" and extension.method == method:
|
||||||
return extension
|
return extension
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.type = ""
|
self.type = ""
|
||||||
self.method = ""
|
self.method = ""
|
||||||
|
|
||||||
def test(self, filtered, data, webserver, port, scheme, method, url):
|
def test(self, filtered, data, webserver, port, scheme, method, url):
|
||||||
print ("[*] Not implemented")
|
print ("[*] Not implemented")
|
||||||
|
|
||||||
def dispatch(self, type, id, method, rpcdata):
|
def dispatch(self, type, id, params):
|
||||||
print ("[*] Not implemented")
|
print ("[*] Not implemented")
|
||||||
|
|
||||||
if __name__== "__main__":
|
if __name__== "__main__":
|
||||||
# load extensions (filters, rcpmethods)
|
# load filters
|
||||||
Extension.register(importlib.import_module("plugins.fediverse").Fediverse())
|
Extension.register(importlib.import_module("plugins.fediverse").Fediverse())
|
||||||
|
|
||||||
# start Caterpillar
|
# start Caterpillar
|
||||||
|
|
Loading…
Reference in New Issue
Block a user