在猫的帮助下更改文件的权限


56
root@system:~# less myfile
-bash: /bin/less: Input/output error

根文件系统已死。但是我的猫还活着(在我的记忆中):

root@system:~# cat > /tmp/somefile
C^d
root@system:~#

尽管他有点孤独,但他所有的朋友都不见了:

root@system:~# mount
-bash: /bin/mount: Input/output error
root@system:~# dmesg
-bash: /bin/dmesg: Input/output error
root@system:~# less
-bash: /bin/less: Input/output error
root@system:~# chmod
-bash: /bin/chmod: Input/output error

该系统仍在运行,并且可以实现其目的。我知道,对此,唯一明智的反应是关闭系统并更换根驱动器。不幸的是,这不是一种选择,因为它将花费大量时间和金钱。而且,它会杀死我的猫,这会让我伤心。

我曾想过要把他从捐赠人那里带回来的他的平常朋友。我不敢尝试将它们放进去,以防ssh尝试加载它并切断行(无论如何二进制文件都消失了)。对于我的猫表弟来说,这听起来像是一份工作:

root@system:~# netcat -l 1234 > /tmp/less
-bash: netcat: command not found

不幸的是他早已不在了。

现在,我可以尝试欺骗我的猫去执行一项仪式以使他复活:

cat > netcat < /dev/tcp/localhost/9999

这样的工作。他几乎还活着:

root@system:/tmp# /tmp/netcat
-bash: /tmp/netcat: Permission denied

他只需要一点生命的火花。+x我现在无法背诵的那小魔咒。

你能帮我把猫的朋友带回来吗?


3
您可以运行/lib/ld-linux.so.2 ./netcat(或您的系统的同等产品)并开始运行吗?
迈克尔·荷马

4
另外:这是什么操作系统?您是否安装了任何vfat或NTFS文件系统?网络文件系统?您可以擦除分区的内容吗?是否有任何与执行权限访问的文件?
Michael Homer

3
“而且,它会杀死我的猫,这会让我伤心。” –我一直认为“在制作过程中没有绑架儿童”只是一句话,但是……
地毯

7
对于所有这些猫类比,我完全不得不对此表示赞同…😂–
地毯

2
可怜的猫,我希望他没事:(

Answers:


37

有几种可能性,所有可能性都取决于您当前情况的确切参数。我将在以下适用的示例中假定Linux,但是在大多数情况下,其他平台上也存在类似的功能。

  • 您可能可以使动态加载程序为您运行可执行文件。假设cat是动态链接的,则您平台的等效对象/lib/ld-linux.so.2也可能位于内存中,因此可用于运行二进制文件:

    $ /lib64/ld-linux-x86-64.so.2 ./chmod
    chmod: missing operand
    

    这些可能有多个(可能是32位和64位),并且可能有多个副本,或者需要解析的符号链接。其中之一可能会起作用。

  • 如果您具有已安装的vfat或NTFS文件系统,或将所有文件都视为777的另一个文件系统,则可以在其中创建可执行文件。

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
  • 如果您有已安装的网络文件系统,即使它不是本地可写的,也可以在远程系统上创建文件并正常使用。
  • 如果有一个已挂载的分区,您根本不在乎它的内容,则在仍然可以正常工作的驱动器上,可以用包含所需可执行文件的相同文件系统类型的新映像替换该内容- cat在人们通常使用的角色dd,您可以通过网络提供图像。

    $ cat > /dev/sdb1 < ...

    这似乎是合理的,但是有很多地方不起作用,这取决于该分区中的确切内存。

  • 如果有任何有任何可写文件系统执行权限访问的文件,你可以cat >把它与您所选择的二进制的内容替换。

    $ cat > ~/test.py < ...
  • 由于Bash仍在运行,因此您可以将Bash插件动态加载到公开chmod的进程中。特别是,您可以安装和加载ctypes.sh,然后为Bash提供外部功能接口,然后单击dlcall chmod ./netcat 511
  • 您可以引入foo.so构造的动态库文件,然后cat通过代表您加载它LD_PRELOAD,从而允许您执行任意代码。

    $ LD_PRELOAD=./hack.so cat /dev/null

    例如,如果您拦截open

    int open(const char *path, int flags, ...) {
        chmod(path, 0755);
        return -1;
    }
    

    然后您就可以在那里做任何事情。

我的建议是引入一个静态链接的busybox可执行文件作为第一项(或者实际上是唯一项),这样您就可以获得所有可用的命令,而不必重用任何使您精疲力竭的技巧。


3
关于“静态链接busybox”:请注意,它sash是专门为这种用例而设计的,可能会在紧急情况下更容易使用(例如,您可以预先安装它,并将副本保留在某个地方运行,以便在系统运行时将其保存在内存中休息...或者我可以抛弃宠物并买一堆牛)。
凯文(Kevin)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.