来自黑帽蟒蛇书的Netcat代码无效

时间:2017-07-07 04:08:44

标签: python linux unix netcat

我已经将Black Hat Python书中的一些代码转换为Python 3,但在运行它时,我总是得到“异常退出!”#39;错误。

我一直试图通过发送EOF向命令发送命令,然后发送命令
    import sys
    import socket
    import getopt
    import threading
    import subprocess

    #global variables
    listen = False
    command = False
    upload = False
    execute = ""
    target = ""
    upload_destination = ""             
    port = 0

    def usage():
        print("Loif Net TOol\n")
        print("Usage: loifnet.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 connection upload a
        file and write to [destination]""") 
        print("\n\n")
        print("""Examples of use are as follows:
              loifnet.py -t 192.168.0.2 -p 5555 -l -c
              loifnet.py -t 192.168.0.2 -p 5555 -l -u=c:\\target.exe
              loifnet.py -t 192.168.0.2 -p 5555 -l -e=\"cat /etc/passwd\"
              "echo 'ABCDEFGHI' | ./loifnet.py -t 192.168.11.12 -p 135""")

        sys.exit(0)

    def main():
        global listen
        global port
        global execute
        global command
        global upload_destination
        global target

        if not len(sys.argv[1:]):
            usage()

        #read 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"

        #are we going to listen or just sent data from stdin
        if not listen and len(target) and port >0:

            #read in buffer from commandline
            #this will block so send ctrl-d if not sending input
            #to stdin
            buffer = sys.stdin.read()

            #send data off
            client_sender(buffer.encode())

        #we'll be listening and potentially uploading, executing and
        #dropping shells back; depending on commandline options
        if listen:
            server_loop()



    def client_sender(buffer):

        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        try:
            #connect to target
            client.connect((target,port))

            if len(buffer):
                client.send(buffer.encode())

            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  = input("")
                buffer += "\n"

                #send it off
                client.send(buffer.encode())



        except:

            print("[*] Exception! Exiting.")

            #tear down connection
            client.close()


    def server_loop():
        global target

        #if target isn't defined, we listen on all interfaces
        if not len(target):

            target = "0.0.0.0"

        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.bind((target,port))
        server.listen(5)

        while True:
            client_socket, addr = server.accept()

            #spin off threat to handle new client
            client_thread = threading.Thread(target=client_handler,
                                             args=(client_socket,))
            client_thread.start()



    def run_command(command):

        #trim newline
        command = command.rstrip()

        #run command, get output back
        try:
            output = subprocess.check_output(command,stderr=subprocess.
                                             STDOUT, shell=True)
        except:
            output = ("Failed to execute command.\r\n")

        #send output back to client
        return output


    def client_handler(client_socket):
        global upload
        global execute
        global command

        #check for upload
        if len(upload_destination):

            #read in all bytes and write to destination
            file_buffer = ""

            #keep reading data until none is available
            while True:
                data = client_socket.recv(1024)

                if not data:
                    break
                else:
                    file_buffer += data

            #try to write bytes out
            try:
                file_descriptor = open(upload_destination, "wb")
                file_descriptor.write(file_buffer)
                file_descriptor.close()

                #acknowledge that bytes have been written out
                msg = ("Successfully saved file to %s\r\n" % upload_destination)

                client_socket.send(msg.encode())
            except:
                fmsg = ("Failure to save file to %s\r\n" % upload_destination)
                client_socket.send(fmsg.encode())


        #check for command execution
        if len(execute):

            #run command
            output = run_command(execute)

            client_socket.send(output.encode())

        #enter another loop if command shell is requested
        if command:

            while True:
                #show simple prompt

                prmsg = ("<LHP:#> ")
                client_socket.send(prmsg.encode())

                #receive until we see a linefeed
                #enter key

                cmd_buffer = ("")
                while "\n" not in cmd_buffer:
                    cmd_buffer += (client_socket.recv(1024))

                #send back command output
                response = run_command(cmd_buffer)

                #send back response
                client_socket.send(response.encode())

    main()           

0 个答案:

没有答案
相关问题