PYTHON 黑帽子第二章总结

  基于python3编写

import sys, socket, getopt, threading, argparse, subprocess

# globals options
listen = False
command = False
upload = None
execute = None
target = None
upload_destination = None
port = None


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

    # set up argument parsing
    parser = argparse.ArgumentParser(description="netcat clone")
    parser.add_argument("-p","--port", type=int, help="target port")
    parser.add_argument("-t", "--target_host", type=str, help="target host", default="0.0.0.0")
    parser.add_argument("-l", "--listen", help="listen on [host]:[port} for incomming connections", action="store_true",default=False)  # action 有参数为true,没有参数default false
    parser.add_argument("-e", "--execute", help="execute file-to-run execute the given file upn receiving a connection")
    parser.add_argument("-c", "--command", help="initialize a command shell", action="store_true", default=False)
    parser.add_argument("-u", "--upload",help="--upload=destination upon receing connection upload and write to destination")
    args = parser.parse_args()

    # parse arguments
    target = args.target_host
    port = args.port
    listen = args.listen
    execute = args.execute
    command = args.command
    upload_destination = args.upload

    # if listen is false and send send data from stdin
    if not listen and target is not None and port > 0:
        print("DBG:read data from stdin")
        # read buffer from stdin , this will block so send CTRL-D if not
        # sending to stdin 从stdin发送
        buff = sys.stdin.read()


        print("Sending {0} to client".format(buff))
        # send data
        client_sender(buff)

    # we are going to listen and potentially upload things ,excute
    # commands and drop a shell back ,depending on the command line options
    if listen:
        server_loop()


def client_sender(buff):
    print("DBG:sending data to client on port" + str(port))

    # create a sockets
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

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

        if len(buff):
            client.send(buff.encode())
        while True:
            # now let's wait for data response
            recv_len = 1
            response = ""

            while recv_len:
                print("DBG:waiting for response from client")
                data = client.recv(4096)
                recv_len = len(data)
                response += data.decode(errors="ignore")

                if recv_len < 4096:
                    break
            # end=""  statement does not end
            print(response, end="")

            # wait for more input
            buff = input("")
            buff += "\n"
            # send it off
            client.send(buff.encode())
    except:
        print("[*] Exception! Exiting.")
    finally:
        client.close()


def server_loop():
    global target
    print("DBG:entering server loop")

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

    server.listen(5)

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

        # spin a thread to handle the new client
        client_thread = threading.Thread(target=client_handler, args=(client_socket,))
        client_thread.start()


def run_command(command):
    # trim the newline rstrip trim the end of newline
    command = command.rstrip()
    print("DGB:executing command:" + command)

    try:
        # this will launch a new process ,note:cd commands are useless
        output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)
    except:
        output = "Failed to execute to command.\r\n"

    # send the output back to the client
    return output


# 服务端监听,获取从客户端发来的数据执行命令
def client_handler(client_socket):
    global upload
    global execute
    global command
    print("DBG:handling client socket")

    # check for upload
    if upload_destination is not None:
        print("DEBG:entering file upload")

        # read all of the bytes and write them to the destination
        file_buff = ""

        # keep reading data until none is available
        while True:
            data = client_socket.recv(1024)
            if not data:
                break
            else:
                file_buff += data.decode()

        # write bytes to file
        try:
            f = open(upload_destination, "wb")
            f.write(file_buff)
            f.close()

            # ACK file writing
            client_socket.send("Successfully saved file to {0}\r\n".format(upload_destination).encode())
        except:
            client_socket.send("Failed to save file to {0}\r\n".format(upload_destination).encode())

    if execute is not None:
        print("DBG: going to execute command")

        # run the command
        output = run_command(execute)
        client_socket.send(output.encode())

    # go into loop if a command shell was resquested
    if command:
        print("DBG:shell requested")

        # show a prompt
        client_socket.send("<BHP:#>".encode())
        while True:

            # now recieve until linefeed
            cmd_buff = ""
            while "\n" not in cmd_buff:
                cmd_buff += client_socket.recv(1024).decode()

            # send back the command output
            response = run_command(cmd_buff)

            # 判断一个response是否为str类型
            if isinstance(response, str):
                response = response.encode()

            # send back the response
            client_socket.send(response + "<BHP:#>".encode())


if __name__ == '__main__':
    main()

  使用实列:

服务端执行:

python necat_1.py -l -p 9999 -c

客户端执行:

python nccat_1.py -t localhost -p 9999

 

客户端执行需要EOF读取结束,linux(ctrl-d),windows(ctrl-z)

 

posted @ 2019-05-07 21:30  Junsec  阅读(286)  评论(0编辑  收藏  举报