def is_out_of_date(main_tab): session = requests.Session() session.headers = { 'accept': 'application/vnd.github.v3+json', 'user-agent': 'jgoldshlag-padherder_sync_' + PH_PROXY_VERSION, } session.mount('https://', requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=1)) try: r = session.get('https://api.github.com/repos/jgoldshlag/padherder_proxy/releases') except Exception as e: evt = custom_events.wxStatusEvent(message='Error checking for updates: %s' % e) wx.PostEvent(main_tab, evt) if r.status_code != requests.codes.ok: evt = custom_events.wxStatusEvent(message='Error checking for updates: %s %s' % (r.status_code, r.content)) wx.PostEvent(main_tab, evt) releases = json.loads(r.content) current_ver = LooseVersion(PH_PROXY_VERSION) for rel in releases: rel_version = LooseVersion(rel['tag_name'][1:]) if rel_version > current_ver: return True return False
def serveDNS(logger, status_ctrl, main_frame): resolver = InterceptResolver('8.8.8.8', 53, '60s', status_ctrl, main_frame) DNSHandler.log = { 'log_request', # DNS Request 'log_reply', # DNS Response 'log_truncated', # Truncated 'log_error', # Decoding error } config = wx.ConfigBase.Get() host = config.Read("host") or socket.gethostbyname(socket.gethostname()) dnsport = config.Read("dnsport") or "53" try: udp_server = DNSServer(resolver, port=int(dnsport), address=host, logger=logger) except Exception as e: evt = custom_events.wxStatusEvent( message='Error starting DNS proxy: %s' % e) wx.PostEvent(status_ctrl, evt) return udp_server.start_thread() evt = custom_events.wxStatusEvent(message="proxy started") wx.PostEvent(status_ctrl, evt) try: while udp_server.isAlive(): time.sleep(1) except KeyboardInterrupt: sys.exit()
def handle_request(self, f): if f.client_conn.ssl_established: f.request.scheme = "https" sni = f.client_conn.connection.get_servername() port = 443 else: f.request.scheme = "http" sni = None port = 80 host_header = f.request.pretty_host m = parse_host_header.match(host_header) if m: host_header = m.group("host").strip("[]") if m.group("port"): port = int(m.group("port")) f.request.host = sni or host_header f.request.port = port evt = custom_events.wxStatusEvent(message="Got HTTPS request, forwarding") wx.PostEvent(self.status_ctrl,evt) flow.FlowMaster.handle_request(self, f) if f: f.reply() return f
def onDNSEvent(self, event): if self.proxy_master is not None: self.proxy_master.shutdown() if event.message.startswith('api-na'): region = 'NA' else: region = 'JP' config = wx.ConfigBase.Get() host = config.Read("host") or socket.gethostbyname( socket.gethostname()) httpsport = config.Read("httpsport") or "443" try: proxy_config = proxy.ProxyConfig( port=int(httpsport), host=host, mode='reverse', upstream_server=cmdline.parse_server_spec('https://%s:443/' % event.message)) proxy_server = ProxyServer(proxy_config) except Exception as e: evt = custom_events.wxStatusEvent( message='Error starting HTTPS proxy: %s' % e) wx.PostEvent(self.main_tab, evt) return self.proxy_master = PadMaster(proxy_server, self, region) thread.start_new_thread(self.proxy_master.run, ())
def main(): app = wx.App(False) if len(sys.argv) >= 2 and sys.argv[1] == '-test': config = wx.Config("padherder_proxy_test") print "In test mode" else: config = wx.Config("padherder_proxy") wx.ConfigBase.Set(config) frame = MainWindow(None, "Padherder Proxy v%s" % PH_PROXY_VERSION) host = config.Read("host") or socket.gethostbyname(socket.gethostname()) logger = dnsproxy.MyDNSLogger(frame.dns_tab) thread.start_new_thread(dnsproxy.serveDNS, (logger, frame.main_tab, frame)) try: app_config = proxy.ProxyConfig(options=moptions.Options(app_port=8080, app_host=host)) app_server = ProxyServer(app_config) app_master = dump.DumpMaster(app_server, dump.Options(app_host='mitm.it', app_port=80, app=True)) frame.app_master = app_master thread.start_new_thread(app_master.run, ()) except: evt = custom_events.wxStatusEvent(message='Error initalizing mitm proxy:\n' + traceback.format_exc() + '\n\nYou probably put in an incorrect IP address in Settings') wx.PostEvent(frame.main_tab, evt) app.MainLoop()
def main(): app = wx.App(False) if len(sys.argv) >= 2 and sys.argv[1] == '-test': config = wx.Config("padherder_proxy_test") print "In test mode" else: config = wx.Config("padherder_proxy") wx.ConfigBase.Set(config) frame = MainWindow(None, "Padherder Proxy v%s" % PH_PROXY_VERSION) host = config.Read("host") or socket.gethostbyname(socket.gethostname()) logger = dnsproxy.MyDNSLogger(frame.dns_tab) thread.start_new_thread(dnsproxy.serveDNS, (logger, frame.main_tab, frame)) try: app_config = proxy.ProxyConfig(port=8080, host=host) app_server = ProxyServer(app_config) app_master = dump.DumpMaster(app_server, dump.Options(app_host='mitm.it', app_port=80, app=True)) frame.app_master = app_master thread.start_new_thread(app_master.run, ()) except: evt = custom_events.wxStatusEvent(message='Error initalizing mitm proxy:\n' + traceback.format_exc() + '\n\nYou probably put in an incorrect IP address in Settings') wx.PostEvent(frame.main_tab, evt) app.MainLoop()
def serveDNS(logger, status_ctrl, main_frame): resolver = InterceptResolver('8.8.8.8', 53, '60s', status_ctrl, main_frame) DNSHandler.log = { 'log_request', # DNS Request 'log_reply', # DNS Response 'log_truncated', # Truncated 'log_error', # Decoding error } config = wx.ConfigBase.Get() host = config.Read("host") or socket.gethostbyname(socket.gethostname()) dnsport = config.Read("dnsport") or "53" try: udp_server = DNSServer(resolver, port=int(dnsport), address=host, logger=logger) except Exception as e: evt = custom_events.wxStatusEvent(message='Error starting DNS proxy: %s' % e) wx.PostEvent(status_ctrl,evt) return udp_server.start_thread() evt = custom_events.wxStatusEvent(message="proxy started") wx.PostEvent(status_ctrl,evt) try: while udp_server.isAlive(): time.sleep(1) except KeyboardInterrupt: sys.exit()
def resolve(self,request,handler): reply = request.reply() qname = request.q.qname qtype = QTYPE[request.q.qtype] if qname.matchGlob("api-*padsv.gungho.jp."): config = wx.ConfigBase.Get() host = config.Read("host") or socket.gethostbyname(socket.gethostname()) reply.add_answer(RR(qname,QTYPE.A,rdata=A(host))) evt = custom_events.wxStatusEvent(message="Got DNS Request") wx.PostEvent(self.status_ctrl,evt) evt = custom_events.wxDNSEvent(message=str(qname)[:-1]) wx.PostEvent(self.main_frame,evt) time.sleep(0.5) # we need to sleep until the proxy is up, half a second should do it... # Otherwise proxy if not reply.rr: if handler.protocol == 'udp': proxy_r = request.send(self.address,self.port) else: proxy_r = request.send(self.address,self.port,tcp=True) reply = DNSRecord.parse(proxy_r) return reply
def onDNSEvent(self, event): if self.proxy_master is not None: self.proxy_master.shutdown() if event.message.startswith('api-na'): region = 'NA' else: region = 'JP' config = wx.ConfigBase.Get() host = config.Read("host") or socket.gethostbyname(socket.gethostname()) httpsport = config.Read("httpsport") or "443" try: proxy_config = proxy.ProxyConfig(port=int(httpsport), host=host, mode='reverse', upstream_server=cmdline.parse_server_spec('https://%s:443/' % event.message)) proxy_server = ProxyServer(proxy_config) except Exception as e: evt = custom_events.wxStatusEvent(message='Error starting HTTPS proxy: %s' % e) wx.PostEvent(self.main_tab, evt) return self.proxy_master = PadMaster(proxy_server, self, region) thread.start_new_thread(self.proxy_master.run, ())
def resolve(self, request, handler): reply = request.reply() qname = request.q.qname qtype = QTYPE[request.q.qtype] if qname.matchGlob("api-*padsv.gungho.jp."): config = wx.ConfigBase.Get() host = config.Read("host") or socket.gethostbyname( socket.gethostname()) reply.add_answer(RR(qname, QTYPE.A, rdata=A(host))) evt = custom_events.wxStatusEvent(message="Got DNS Request") wx.PostEvent(self.status_ctrl, evt) evt = custom_events.wxDNSEvent(message=str(qname)[:-1]) wx.PostEvent(self.main_frame, evt) time.sleep( 0.5 ) # we need to sleep until the proxy is up, half a second should do it... # Otherwise proxy if not reply.rr: if handler.protocol == 'udp': proxy_r = request.send(self.address, self.port) else: proxy_r = request.send(self.address, self.port, tcp=True) reply = DNSRecord.parse(proxy_r) return reply
def add_status_msg(msg, status_ctrl): if status_ctrl: evt = custom_events.wxStatusEvent(message=msg) wx.PostEvent(status_ctrl, evt) else: print msg
def add_status_msg(msg, status_ctrl, simulate): if status_ctrl and not simulate: evt = custom_events.wxStatusEvent(message=msg) wx.PostEvent(status_ctrl, evt) else: print msg
def handle_response(self, f): flow.FlowMaster.handle_response(self, f) if f: f.reply() if f.request.path.startswith('/api.php?action=get_player_data'): evt = custom_events.wxStatusEvent(message="Got box data, processing...") wx.PostEvent(self.status_ctrl,evt) resp = f.response.content type, lines = contentviews.get_content_view( contentviews.get("Raw"), f.response.content, headers=f.response.headers) def colorful(line): for (style, text) in line: yield text content = u"\r\n".join( u"".join(colorful(line)) for line in lines ) cap = open('captured_data.txt', 'w') cap.write(content) cap.close() thread.start_new_thread(padherder_sync.do_sync, (content, self.status_ctrl, self.region)) elif f.request.path.startswith('/api.php?action=get_user_mail'): resp = f.response.content type, lines = contentviews.get_content_view( contentviews.get("Raw"), f.response.content, headers=f.response.headers) def colorful(line): for (style, text) in line: yield text content = u"\r\n".join( u"".join(colorful(line)) for line in lines ) cap = open('captured_mail.txt', 'w') cap.write(content) cap.close() mails = parse_mail(content) mails.reverse() evt = custom_events.wxMailEvent(mails=mails) wx.PostEvent(self.mail_tab, evt) evt = custom_events.wxStatusEvent(message="Got mail data, processing...") wx.PostEvent(self.status_ctrl,evt) else: config = wx.ConfigBase.Get() actions = config.Read("customcapture") if actions != "" and actions != None: for act in actions.split(','): act = act.strip() if f.request.path.startswith('/api.php?action=%s' % act): resp = f.response.content type, lines = contentviews.get_content_view( contentviews.get("Raw"), f.response.content, headers=f.response.headers) def colorful(line): for (style, text) in line: yield text content = u"\r\n".join( u"".join(colorful(line)) for line in lines ) cap = open('captured_%s.txt' % act, 'w') cap.write(content) cap.close() evt = custom_events.wxStatusEvent(message="Got custom capture %s" % act) wx.PostEvent(self.status_ctrl,evt) return f
def add_status_msg(msg, status_ctrl, simulate): if status_ctrl and not simulate: evt = custom_events.wxStatusEvent(message=msg) wx.PostEvent(status_ctrl, evt) else: print msg.encode('ascii', errors='ignore')