Skip to content

Instantly share code, notes, and snippets.

@mdawaffe
Created December 2, 2013 03:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mdawaffe/7744344 to your computer and use it in GitHub Desktop.
Save mdawaffe/7744344 to your computer and use it in GitHub Desktop.
SOCKS4 Experiments Failed attempts at restricting a Socks 4/4a/5 proxy to only use Socks 4
#!/usr/bin/env python
import socket
import threading
import select
import SocketServer
class TCPServer( SocketServer.TCPServer ):
allow_reuse_address = True
class ThreadedTCPServer( SocketServer.ThreadingMixIn, TCPServer ):
pass
def relay( A, B ):
AtoB = threading.Thread( target = passthru, args = ( A, B ) )
BtoA = threading.Thread( target = passthru, args = ( B, A ) )
AtoB.start()
BtoA.start()
AtoB.join()
BtoA.join()
def passthru( A, B ):
while True:
r, w, x = select.select( [ A ], [ B ], [] )
if not r or not w:
continue
data = A.recv( 4096 )
hex = "PROXY:"
for i in data:
hex += " %02x" % ord( i )
print hex
print data
if not data:
break
B.sendall( data )
print str( A.getsockname() ) + ' -> ' + str( B.getsockname() ) + ( ' : %d' % len( data ) )
class Socks4Handler( SocketServer.BaseRequestHandler ):
def handle( self ):
data = self.request.recv(1024)
hex = "CLIENT:"
for i in data:
hex += " %02x" % ord( i )
print hex
if "\x04" != data[0]:
print "CLIENT NOT SOCKS4"
self.request.sendall( "\x00\x5B\x00\x00\x00\x00\x00\x00" )
self.request.close()
return
if "\x00" == data[4]:
print "CLIENT ATTEMPTED SOCKS4A"
self.request.sendall( "\x00\x5B\x00\x00\x00\x00\x00\x00" )
self.request.close()
return
self.ssh = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
self.ssh.connect( ( '127.0.0.1', 8080 ) )
self.ssh.sendall( data )
recvd = self.ssh.recv( 1024 )
hex = "SERVER:"
for i in recvd:
hex += " %x" % ord( i )
print hex
if "\x00" != recvd[0] or "\x5A" != recvd[1]:
print "SERVER SENT ERROR"
self.ssh.close()
self.request.sendall( recvd )
self.request.close()
return
self.request.sendall( recvd )
relay( self.ssh, self.request )
def finish( self ):
return
try:
print "CLOSE SSH"
self.ssh.close()
except:
pass
try:
print "CLOSE REQUEST"
self.request.close()
except:
pass
if __name__ == "__main__":
server = TCPServer( ( '127.0.0.1', 7070 ), Socks4Handler )
server.serve_forever()
# server = ThreadedTCPServer( ( '127.0.0.1', 7070 ), MyTCPHandler )
# server_thread = threading.Thread(target=server.serve_forever)
# server_thread.start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment