Я написал этот код как базовую c замену для netcat, чтобы позволить клиенту загружать файлы, выполнять файлы или открывать командную оболочку, а затем запустил простой python клиент для подключения к настроенному серверу, но я получаю Ошибка типа. Нужна помощь. Я в настоящее время на машине Windows 10. Вот мой код:
import socket
import threading
import sys
import getopt
import subprocess
from pip._vendor.distlib.compat import raw_input
# define global variables
listen = False
command = False
upload = False
execute = False
target = False
upload_destination = False
port = 0
# define main function
def usage():
print(" BHP Net Tool")
print()
print("Usage: bhpnet.py -t target_host -p port")
print("-l --listen - listen on [host]:[port] for incoming connections ")
print("-e --execute=file_to_run - execute the given file upon receiving a connection")
print("-c --command - initialize a command shell")
print("-u --upload=destination --upon receiving a connection, upload a file and write to [destination]")
print()
print()
print("Examples: ")
print("bhpnet.py -t 127.0.0.1 -p 5555 -l -c")
print("bhpnet.py -t 127.0.0.1 -p 5555 -l -u=c:\\target.exe")
print("bhpnet.py -t 127.0.0.1 -p 5555 -l -e=\"cat /etc/passwd\"")
print("echo 'ABCDEFGHI' | ./bhpnet.py -t 127.0.0.1 -p 135")
sys.exit(0)
def client_sender(buffer):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# connect to target host
client.connect((target, port))
if len(buffer):
client.send(buffer)
while True:
# wait for data back
recv_len = 1
response = ""
while recv_len:
data = client.recv(4096)
recv_len = len(data)
response += data
if recv_len < 4096:
break
print(response),
# wait for more input
buffer = raw_input("")
buffer += "\n"
# send it off
client.send(buffer)
except:
print("[*] Exception! Exiting...")
# tear down the connection
client.close()
def main():
global listen
global port
global execute
global command
global upload_destination
global target
if not len(sys.argv[1:]):
usage()
# read the commandline options
try:
opts, args = getopt.getopt(sys.argv[1:], "hle:t:p:cu:",
["help", "listen", "execute", "target", "port", "command", "upload"])
except getopt.GetoptError as err:
print(str(err))
usage()
for o, a in opts:
if o in ("-h", "--help"):
usage()
elif o in ("-l", "--listen"):
listen = True
elif o in ("-e", "--execute"):
execute = a
elif o in ("-c", "--commandshell"):
command = True
elif o in ("-u", "--upload"):
upload_destination = a
elif o in ("-t", "--target"):
target = a
elif o in ("-p", "--port"):
port = int(a)
else:
assert False, "Unhandled option"
if not listen and len(target) and port > 0:
# send CTRL-D if not sending input to stdin otherwise this will block if read from the buffer
buffer = sys.stdin.read()
# send data off
client_sender(buffer)
# we are going to listen, potentially upload things, execute commands and drop a shell back depending on the
# command line options given
if listen:
server_loop()
def server_loop():
global target
# if no target is defined, we listen on all interfaces
if not (target):
target = "0.0.0.0"
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((target, port))
server.listen(6)
while True:
client_socket, addr = server.accept()
# thread to handle new client
client_thread = threading.Thread(target=client_handler, args=(client_socket))
client_thread.start()
def run_command():
global command
# trim the newline
command = command.rstrip()
# run the command and get the output back
try:
output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)
except:
output = "Failed to execute command.\r\n"
# send the output back to the client
return output
def client_handler(client_socket):
global upload
global execute
global command
# check for upload
if len(upload_destination):
# read in all of the bytes and write to our destination
file_buffer = ""
# keep reading all the data until none is available
while True:
data = client_socket.recv(1024)
if not data:
break
else:
file_buffer += data
# now take the bytes and try to write them out
try:
file_descriptor = open(upload_destination, "wb")
file_descriptor.write(file_buffer)
file_descriptor.close()
# acknowledge that we wrote the file out
client_socket.send("Successfully saved the file to %s\r\n" % upload_destination)
except:
client_socket.send("Failed to save file to %s\r\n" % upload_destination)
# check for command execution
if len(execute):
# run the command
output = run_command(execute)
client_socket.send(output)
# now we go into another loop if a command shell was requested
if command:
while True:
# show a simple prompt
client_socket.send("<BHP:#>")
# Now we receive until we see a line feed
("enter key")
cmd_buffer = ""
while "\n" not in cmd_buffer:
cmd_buffer += client_socket.recv(1024)
# send back the command output
response = run_command(cmd_buffer)
# send back the response
client_socket.send(response)
main()
Вот код для моего клиента:
import socket
host = '127.0.0.1' # define host to connect to
port = 9999 # define port
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # create client object
client_socket.connect((host, port)) # connect to server
response = client_socket.recv(4096) # create variable to receive response from server
print(response) # print the response generated
После запуска сценария с помощью этой команды: python3 bhpnet.py -l -p 9999 -c
, здесь получена ошибка:
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.752.0_x64__qbz5n2kfra8p0\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.752.0_x64__qbz5n2kfra8p0\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
TypeError: client_handler() argument after * must be an iterable, not socket