def main(): banner() parser = optparse.OptionParser(formatter=optparse.TitledHelpFormatter()) parser.set_usage("python proxy.py -u <remoteurl> -l <localport> [options]") parser.add_option('-u', '--url', help='url of the remote webshell', dest='url', action='store') parser.add_option('-l', '--lport', help='local listening port', dest='local_port', action='store', type='int') #Verbosity parser.add_option('-v', '--verbose', help='Verbose (outputs packet size)', dest='verbose', action='store_true', default=Defaults['verbose']) #Legacy options legacyGroup = optparse.OptionGroup( parser, "No SOCKS Options", "Options are ignored if SOCKS proxy is used") legacyGroup.add_option('-n', '--no-socks', help='Do not use Socks Proxy', dest='useSocks', action='store_false', default=Defaults['useSocks']) legacyGroup.add_option( '-r', '--rport', help='remote port of service for the webshell to connect to', dest='remote_port', action='store', type='int', default=Defaults['remote_port']) legacyGroup.add_option( '-a', '--addr', help='address for remote webshell to connect to (default = 127.0.0.1)', dest='remote_ip', action='store', default=Defaults['remote_ip']) parser.add_option_group(legacyGroup) #Proxy options proxyGroup = optparse.OptionGroup( parser, "Upstream Proxy Options", "Tunnel connection through a local Proxy") proxyGroup.add_option('-x', '--up-proxy', help='Upstream proxy (http://proxyserver.com:3128)', dest='upProxy', action='store', default=Defaults['upProxy']) proxyGroup.add_option('-A', '--auth', help='Upstream proxy requires authentication', dest='upProxyAuth', action='store_true', default=Defaults['upProxyAuth']) parser.add_option_group(proxyGroup) #Advanced options advancedGroup = optparse.OptionGroup(parser, "Advanced Options") parser.add_option( '-b', '--buffer', help='HTTP request size (some webshels have limitations on the size)', dest='bufferSize', action='store', type='int', default=Defaults['bufferSize']) advancedGroup.add_option( '-q', '--ping-interval', help='webshprx pinging thread interval (default = 0.5)', dest='ping_delay', action='store', type='float', default=Defaults['ping_delay']) advancedGroup.add_option( '-s', '--start-ping', help= 'Start the pinging thread first - some services send data first (eg. SSH)', dest='start_p_thread', action='store_true', default=Defaults['start_p_thread']) parser.add_option_group(advancedGroup) (args, opts) = parser.parse_args() options = dict(Defaults.items() + vars(args).items() ) if args else Defaults #If missing options use Default if not options['local_port']: parser.print_help() parser.error("Missing local port") if not options['url']: parser.print_help() parser.error("Missing URL") if options['upProxyAuth']: #Upstream Proxy requires authentication username = raw_input("Proxy Authentication\nUsername:"******"Password:"******"Missing Proxy URL") else: from urlparse import urlparse u = urlparse(options['upProxy']) prx = "%s://%s:%s@%s" % (u.scheme, username, passwd, u.netloc) password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None, prx, username, passwd) proxy_handler = urllib2.ProxyHandler({u.scheme: prx}) proxy_basic_handler = urllib2.ProxyBasicAuthHandler(password_mgr) proxy_digest_handler = urllib2.ProxyDigestAuthHandler(password_mgr) options['upProxyAuth'] = [ proxy_handler, proxy_basic_handler, proxy_digest_handler ] try: T = TunnaClient(options) TunnaThread = threading.Thread(name='TunnaThread', target=T.run(), args=(options, )) TunnaThread.start() while True: sleep(10) except (KeyboardInterrupt, SystemExit) as e: print '[!] Received Interrupt or Something Went Wrong' if DEBUG > 0: import traceback print traceback.format_exc() if 'T' in locals(): T.__del__() if 'TunnaThread' in locals() and TunnaThread.isAlive(): TunnaThread._Thread__stop() sys.exit() except Exception as e: if DEBUG > 0: import traceback print traceback.format_exc() print "General Exception:", e
def startTunna(options): T = TunnaClient(options) T.run()