Advertisement
Guest User

Untitled

a guest
Aug 27th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.40 KB | None | 0 0
  1. import paramiko
  2. import socket
  3. import threading
  4. import select
  5. import sys
  6.  
  7. host_key = paramiko.RSAKey(filename='ch2_ssh_server.key')
  8. server_address = sys.argv[1]
  9. server_port = int(sys.argv[2])
  10.  
  11. #the server interface. Note that the socket is created here when the client requests
  12. #forwarded connections
  13. class Server(paramiko.ServerInterface):
  14. def __init__(self):
  15. self.event = threading.Event()
  16. def check_auth_password(self, username, password):
  17. if username == "user" and password == "password":
  18. return paramiko.AUTH_SUCCESSFUL
  19. return paramiko.AUTH_FAILED
  20. def check_port_forward_request(self, addr, port):
  21. self.listen = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  22. self.listen.bind(("127.0.0.1", int(port)))
  23. self.listen.listen(1)
  24. return self.listen.getsockname()[1]
  25. def cancel_port_forward_request(self, addr, port):
  26. self.listen.close()
  27. self.listen = None
  28. def check_channel_request(self, kind, chanid):
  29. if kind in ["forwarded-tcpip", "session"]:
  30. return paramiko.OPEN_SUCCEEDED
  31. return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
  32.  
  33. #we create a server ssh transport with the client socket and start the ssh server.
  34. #we create 2 channels: 1- session channel and 2- tunneled forward channel. The client requests
  35. #the session channel. The server opens the forward channel after we accept the client's
  36. #request to forward connections. We then read the data from the socket created locally for
  37. #this tunneled forwarded connection and relay to the forward channel and vice versa
  38. def client_handler(client_socket):
  39. session_transport = paramiko.Transport(client_socket)
  40. session_transport.add_server_key(host_key)
  41. server = Server()
  42. try:
  43. session_transport.start_server(server=server)
  44. except SSHException as err:
  45. print(f"[!] SSH Negotiation Failed")
  46. sys.exit(1)
  47.  
  48. print(f"[*] SSH Negotiation Success")
  49.  
  50. print("[*] Authenticating")
  51. session_chan = session_transport.accept(20)
  52.  
  53. if session_chan == None or not session_chan.active:
  54. print("[!] Failure - SSH channel not active")
  55. session_transport.close()
  56. else:
  57. print("[*] Success - SSH channel active")
  58. while session_chan.active:
  59. try:
  60. try:
  61. client_tunnel_socket, addr = server.listen.accept()
  62. except:
  63. print("[*] Closing associated channels")
  64. session_transport.close()
  65. break
  66. print(f"[*] Incoming tunneled conenction from {addr[0]}:{addr[1]}")
  67. tunnel_chan = session_transport.open_forwarded_tcpip_channel(client_tunnel_socket.getsockname(), client_tunnel_socket.getpeername())
  68. while True:
  69. r, w, x = select.select([client_tunnel_socket, tunnel_chan], [], [])
  70. if client_tunnel_socket in r:
  71. data = client_tunnel_socket.recv(1024)
  72. if len(data) == 0:
  73. break
  74. print(f"[*] Sending {len(data)} bytes via SSH Channel")
  75. tunnel_chan.send(data)
  76. if tunnel_chan in r:
  77. data = tunnel_chan.recv(1024)
  78. if len(data) == 0:
  79. break
  80. print(f"[*] Sending {len(data)} bytes via TCP Channel")
  81. client_tunnel_socket.send(data)
  82. except (paramiko.SSHException, Exception) as err:
  83. print("[*] ", str(err))
  84. try:
  85. print("[*] Closing associated sockets and channels")
  86. client_tunnel_socket.close()
  87. session_transport.close()
  88. except:
  89. pass
  90.  
  91. #bind the server to arguments parameters: address and port
  92. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  93. try:
  94. server_socket.bind((server_address, server_port))
  95. except:
  96. print("[!] Bind Error")
  97. sys.exit(1)
  98.  
  99. print(f"[*] Bind Success {server_address}:{server_port}")
  100. server_socket.listen(20)
  101. #Keep listening to incoming connections and spawn a thread to handle it
  102. while True:
  103. client_socket, addr = server_socket.accept()
  104. print(f"[*] Incoming TCP connection from {addr[0]}:{addr[1]}")
  105. client_thread = threading.Thread(target=client_handler, args=(client_socket,))
  106. client_thread.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement