почему функция вызывает итеративный вместо сокета? - PullRequest
0 голосов
/ 23 апреля 2020

Я написал этот код как базовую 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
...