JorekTheGlitch

socks5

Apr 30th, 2020
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.87 KB | None | 0 0
  1. import asyncio
  2.  
  3. PORT = 1080
  4.  
  5.  
  6. class SOCKS5Client:
  7.  
  8.     def __init__(self, reader:asyncio.StreamReader, writer:asyncio.StreamWriter):
  9.         print('new client connection!')
  10.         self.creader = reader
  11.         self.cwriter = writer
  12.         loop = asyncio.get_event_loop()
  13.         asyncio.ensure_future(self._init(), loop=loop)
  14.  
  15.     async def _init(self):
  16.         await self.auth()
  17.         await self.catch_addr()
  18.         await self.start_forwarding()
  19.  
  20.     async def auth(self):
  21.         ver = await self.creader.read(1)
  22.         nmeths = int.from_bytes(await self.creader.read(1) , 'little')
  23.         meths = await self.creader.read(nmeths)
  24.         print("auth request:\n  v: {}\n  nm: {}\n  m's: {}".format(ver, nmeths, meths))
  25.         self.cwriter.write(b'\x05\x00')
  26.  
  27.     async def catch_addr(self):
  28.         ver = await self.creader.read(1)
  29.         cmd = int.from_bytes(await self.creader.read(1) , 'little')
  30.         rsv = await self.creader.read(1)
  31.         atype = int.from_bytes(await self.creader.read(1) , 'little')
  32.         print('{} {} {} {}'.format(ver, cmd, rsv, atype))
  33.         if atype == 1:
  34.             addr_len = 4
  35.             addr_raw = await self.creader.read(addr_len)
  36.             addr = '.'.join(str(i) for i in addr_raw)
  37.         elif atype == 3:
  38.             addr_len = int.from_bytes(await self.creader.read(1) , 'little')
  39.             addr_raw = await self.creader.read(addr_len)
  40.             addr = addr_raw
  41.         elif atype == 4:
  42.             addr_len = 16
  43.             addr_raw = await self.creader.read(addr_len)
  44.             addr_hex = addr_raw.hex()
  45.             addr = ':'.join(addr_hex[s:s+4] for s in range(0, 32, 4))
  46.         port = int.from_bytes(await self.creader.read(2) , 'big')
  47.         print(addr, port)
  48.         if cmd == 1:
  49.             self.sreader, self.swriter = await asyncio.open_connection(addr, port)
  50.             bind_addr = self.swriter.get_extra_info('peername')
  51.             print(bind_addr)
  52.             response = b'\x05\x00\x00'
  53.             response += atype.to_bytes(1, 'little')
  54.             response += addr_raw
  55.             response += port.to_bytes(2, 'big')
  56.             print(response)
  57.             self.cwriter.write(response)
  58.             await self.cwriter.drain()
  59.  
  60.     async def start_forwarding(self):
  61.         loop = asyncio.get_event_loop()
  62.         asyncio.ensure_future(self._forwarding(self.sreader, self.cwriter), loop=loop)
  63.         asyncio.ensure_future(self._forwarding(self.creader, self.swriter), loop=loop)
  64.  
  65.     async def _forwarding(self, reader, writer):
  66.         while True:
  67.             writer.write(await reader.read(64))
  68.             await writer.drain()
  69.             await asyncio.sleep(0.01)
  70.  
  71.     async def drop(self):
  72.         pass
  73.  
  74.  
  75. if __name__ == "__main__":
  76.     loop = asyncio.get_event_loop()
  77.     loop.run_until_complete(asyncio.start_server(SOCKS5Client, port=PORT, loop=loop))
  78.     loop.run_forever()
Add Comment
Please, Sign In to add comment