def test_socks5_premature_close(tctx: Context): assert ( Playbook(modes.Socks5Proxy(tctx), logs=True) >> DataReceived(tctx.client, b"\x05") >> ConnectionClosed(tctx.client) << Log(r"Client closed connection before completing SOCKS5 handshake: b'\x05'") << CloseConnection(tctx.client) )
def test_socks5_err(data: bytes, err: bytes, msg: str, tctx: Context): playbook = (Playbook(modes.Socks5Proxy(tctx), logs=True) >> DataReceived( tctx.client, data)) if err: playbook << SendData(tctx.client, err) playbook << CloseConnection(tctx.client) playbook << Log(msg) assert playbook
def test_socks5_trickle(tctx: Context): tctx.options.connection_strategy = "lazy" playbook = Playbook(modes.Socks5Proxy(tctx)) for x in CLIENT_HELLO: playbook >> DataReceived(tctx.client, bytes([x])) playbook << SendData(tctx.client, b"\x05\x00") for x in b"\x05\x01\x00\x01\x7f\x00\x00\x01\x12\x34": playbook >> DataReceived(tctx.client, bytes([x])) assert playbook << SendData(tctx.client, b"\x05\x00\x00\x01\x00\x00\x00\x00\x00\x00")
def test_socks5_eager_err(tctx: Context): tctx.options.connection_strategy = "eager" server = Placeholder(Server) assert (Playbook(modes.Socks5Proxy(tctx)) >> DataReceived( tctx.client, CLIENT_HELLO) << SendData( tctx.client, SERVER_HELLO) >> DataReceived( tctx.client, b"\x05\x01\x00\x01\x7f\x00\x00\x01\x12\x34") << OpenConnection(server) >> reply("out of socks") << SendData( tctx.client, b"\x05\x04\x00\x01\x00\x00\x00\x00\x00\x00") << CloseConnection(tctx.client))
def test_socks5_success(address: str, packed: bytes, tctx: Context): tctx.options.connection_strategy = "eager" playbook = Playbook(modes.Socks5Proxy(tctx)) server = Placeholder(Server) nextlayer = Placeholder(NextLayer) assert (playbook >> DataReceived(tctx.client, CLIENT_HELLO) << SendData( tctx.client, SERVER_HELLO) >> DataReceived( tctx.client, b"\x05\x01\x00" + packed + b"\x12\x34applicationdata") << OpenConnection(server) >> reply(None) << SendData( tctx.client, b"\x05\x00\x00\x01\x00\x00\x00\x00\x00\x00") << NextLayerHook(nextlayer)) assert server().address == (address, 0x1234) assert nextlayer().data_client() == b"applicationdata"
def test_socks5_trickle(tctx: Context): ProxyAuth().load(tctx.options) tctx.options.proxyauth = "user:password" tctx.options.connection_strategy = "lazy" playbook = Playbook(modes.Socks5Proxy(tctx)) for x in b"\x05\x01\x02": playbook >> DataReceived(tctx.client, bytes([x])) playbook << SendData(tctx.client, b"\x05\x02") for x in b"\x01\x04user\x08password": playbook >> DataReceived(tctx.client, bytes([x])) playbook << modes.Socks5AuthHook(Placeholder()) playbook >> reply(side_effect=_valid_socks_auth) playbook << SendData(tctx.client, b"\x01\x00") for x in b"\x05\x01\x00\x01\x7f\x00\x00\x01\x12\x34": playbook >> DataReceived(tctx.client, bytes([x])) assert playbook << SendData(tctx.client, b"\x05\x00\x00\x01\x00\x00\x00\x00\x00\x00")
def test_socks5_auth_fail(client_greeting: bytes, server_choice: bytes, client_auth: bytes, err: bytes, msg: str, tctx: Context): ProxyAuth().load(tctx.options) tctx.options.proxyauth = "user:password" playbook = (Playbook(modes.Socks5Proxy(tctx), logs=True) >> DataReceived( tctx.client, client_greeting)) if server_choice is None: playbook << SendData(tctx.client, err) else: playbook << SendData(tctx.client, server_choice) playbook >> DataReceived(tctx.client, client_auth) playbook << modes.Socks5AuthHook(Placeholder(modes.Socks5AuthData)) playbook >> reply() playbook << SendData(tctx.client, err) playbook << CloseConnection(tctx.client) playbook << Log(msg) assert playbook
def test_socks5_auth_success(client_greeting: bytes, server_choice: bytes, client_auth: bytes, server_resp: bytes, address: bytes, packed: bytes, tctx: Context): ProxyAuth().load(tctx.options) tctx.options.proxyauth = "user:password" server = Placeholder(Server) nextlayer = Placeholder(NextLayer) playbook = (Playbook(modes.Socks5Proxy(tctx), logs=True) >> DataReceived( tctx.client, client_greeting) << SendData(tctx.client, server_choice) >> DataReceived(tctx.client, client_auth) << modes.Socks5AuthHook(Placeholder(modes.Socks5AuthData)) >> reply(side_effect=_valid_socks_auth) << SendData( tctx.client, server_resp) >> DataReceived( tctx.client, b"\x05\x01\x00" + packed + b"\x12\x34applicationdata") << OpenConnection(server) >> reply(None) << SendData( tctx.client, b"\x05\x00\x00\x01\x00\x00\x00\x00\x00\x00") << NextLayerHook(nextlayer)) assert playbook assert server().address == (address, 0x1234) assert nextlayer().data_client() == b"applicationdata"