Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import asyncio
- PORT = 1080
- class SOCKS5Client:
- def __init__(self, reader:asyncio.StreamReader, writer:asyncio.StreamWriter):
- print('new client connection!')
- self.creader = reader
- self.cwriter = writer
- loop = asyncio.get_event_loop()
- asyncio.ensure_future(self._init(), loop=loop)
- async def _init(self):
- await self.auth()
- await self.catch_addr()
- await self.start_forwarding()
- async def auth(self):
- ver = await self.creader.read(1)
- nmeths = int.from_bytes(await self.creader.read(1) , 'little')
- meths = await self.creader.read(nmeths)
- print("auth request:\n v: {}\n nm: {}\n m's: {}".format(ver, nmeths, meths))
- self.cwriter.write(b'\x05\x00')
- async def catch_addr(self):
- ver = await self.creader.read(1)
- cmd = int.from_bytes(await self.creader.read(1) , 'little')
- rsv = await self.creader.read(1)
- atype = int.from_bytes(await self.creader.read(1) , 'little')
- print('{} {} {} {}'.format(ver, cmd, rsv, atype))
- if atype == 1:
- addr_len = 4
- addr_raw = await self.creader.read(addr_len)
- addr = '.'.join(str(i) for i in addr_raw)
- elif atype == 3:
- addr_len = int.from_bytes(await self.creader.read(1) , 'little')
- addr_raw = await self.creader.read(addr_len)
- addr = addr_raw
- elif atype == 4:
- addr_len = 16
- addr_raw = await self.creader.read(addr_len)
- addr_hex = addr_raw.hex()
- addr = ':'.join(addr_hex[s:s+4] for s in range(0, 32, 4))
- port = int.from_bytes(await self.creader.read(2) , 'big')
- print(addr, port)
- if cmd == 1:
- self.sreader, self.swriter = await asyncio.open_connection(addr, port)
- bind_addr = self.swriter.get_extra_info('peername')
- print(bind_addr)
- response = b'\x05\x00\x00'
- response += atype.to_bytes(1, 'little')
- response += addr_raw
- response += port.to_bytes(2, 'big')
- print(response)
- self.cwriter.write(response)
- await self.cwriter.drain()
- async def start_forwarding(self):
- loop = asyncio.get_event_loop()
- asyncio.ensure_future(self._forwarding(self.sreader, self.cwriter), loop=loop)
- asyncio.ensure_future(self._forwarding(self.creader, self.swriter), loop=loop)
- async def _forwarding(self, reader, writer):
- while True:
- writer.write(await reader.read(64))
- await writer.drain()
- await asyncio.sleep(0.01)
- async def drop(self):
- pass
- if __name__ == "__main__":
- loop = asyncio.get_event_loop()
- loop.run_until_complete(asyncio.start_server(SOCKS5Client, port=PORT, loop=loop))
- loop.run_forever()
Add Comment
Please, Sign In to add comment