netcat.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import argparse
  2. import socket
  3. import shlex
  4. import subprocess
  5. import sys
  6. import textwrap
  7. import threading
  8. def execute(cmd):
  9. cmd = cmd.strip()
  10. if not cmd:
  11. return
  12. output = subprocess.check_output(shlex.split(cmd), stderr=subprocess.STDOUT)
  13. return output.decode()
  14. def main():
  15. parser = argparse.ArgumentParser(
  16. description='BHP Net Tool',
  17. formatter_class=argparse.RawDescriptionHelpFormatter,
  18. epilog=textwrap.dedent('''Example:
  19. netcat.py -t 192.168.1.108 -p 5555 -l -c # command line
  20. netcat.py -t 192.168.1.1.8 -p 5555 -l -u=mytest.txt # load to file
  21. netcat.py -t 192.168.1.1.8 -p 5555 -l -e=\"cat /etc/passwd\" # execute command
  22. echo 'ABC' | ./netcat.py -t 192.168.1.1.8 -p 135 # send text to server's port
  23. netcat.py -t 192.168.1.1.8 -p 5555 # connect to server
  24. '''))
  25. parser.add_argument('-c', '--command', action='store_true', help='command shell')
  26. parser.add_argument('-e', '--execute', help='execute specified command')
  27. parser.add_argument('-l', '--listen', action='store_true', help='listen')
  28. parser.add_argument('-p', '--port', type=int, default=5555, help='specified port')
  29. parser.add_argument('-t', '--target', default='192.168.1.203', help='command IP')
  30. parser.add_argument('-u', '--upload', help='upload file')
  31. args = parser.parse_args()
  32. if args.listen:
  33. buffer = ''
  34. else:
  35. buffer = sys.stdin.read()
  36. nc = NetCat(args, buffer.encode())
  37. nc.run()
  38. class NetCat:
  39. def __init__(self, args, buffer=None):
  40. self.args = args
  41. self.buffer = buffer
  42. self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  43. self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  44. def run(self):
  45. if self.args.listen:
  46. self.listen()
  47. else:
  48. self.send()
  49. def send(self):
  50. self.socket.connect((self.args.target, self.args.port))
  51. if self.buffer:
  52. self.socket.send(self.buffer)
  53. try:
  54. while True:
  55. recv_len = 1
  56. response = ''
  57. while recv_len:
  58. data = self.socket.recv(4096)
  59. recv_len = len(data)
  60. response += data.decode()
  61. if recv_len < 4096:
  62. break
  63. if response:
  64. print(response)
  65. buffer = input('> ')
  66. buffer += '\n'
  67. self.socket.send(buffer.encode())
  68. except KeyboardInterrupt:
  69. print('User terminated.')
  70. self.socket.close()
  71. sys.exit()
  72. def listen(self):
  73. self.socket.bind((self.args.target, self.args.port))
  74. self.socket.listen(5)
  75. while True:
  76. client_socket, _ = self.socket.accept()
  77. client_thread = threading.Thread(target=self.handle, args=(client_socket,))
  78. client_thread.start()
  79. def handle(self, client_socket):
  80. if self.args.execute:
  81. output = execute(self.args.execute)
  82. client_socket.send(output.encode())
  83. elif self.args.upload:
  84. file_buffer = b''
  85. while True:
  86. data = client_socket.recv(4096)
  87. if data:
  88. file_buffer += data
  89. else:
  90. break
  91. with open(self.args.upload, 'wb') as f:
  92. f.write(file_buffer)
  93. message = f'Saved file {self.args.upload}'
  94. client_socket.send(message.encode())
  95. elif self.args.command:
  96. cmd_buffer = b''
  97. while True:
  98. try:
  99. client_socket.send(b'BHP: #> ')
  100. while '\n' not in cmd_buffer.decode():
  101. cmd_buffer += client_socket.recv(64)
  102. response = execute(cmd_buffer.decode())
  103. if response:
  104. client_socket.send(response.encode())
  105. cmd_buffer = b''
  106. except Exception as e:
  107. print(f'server killed {e}')
  108. self.socket.close()
  109. sys.exit()
  110. if __name__ == '__main__':
  111. main()