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

loo*_*bee 53 filesystems bash cat root-filesystem system-recovery

root@system:~# less myfile
-bash: /bin/less: Input/output error
Run Code Online (Sandbox Code Playgroud)

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

root@system:~# cat > /tmp/somefile
C^d
root@system:~#
Run Code Online (Sandbox Code Playgroud)

虽然他有点孤独,但他所有的朋友都走了:

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
Run Code Online (Sandbox Code Playgroud)

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

我想从捐赠者那里带他平时的朋友。我不敢尝试 scp 它们,以防 ssh 尝试加载它并切断线路(无论如何二进制文件已经消失了)。这听起来像是我猫表弟的工作:

root@system:~# netcat -l 1234 > /tmp/less
-bash: netcat: command not found
Run Code Online (Sandbox Code Playgroud)

可惜他早已不在了。

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

cat > netcat < /dev/tcp/localhost/9999
Run Code Online (Sandbox Code Playgroud)

那种工作。他几乎还活着:

root@system:/tmp# /tmp/netcat
-bash: /tmp/netcat: Permission denied
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*mer 36

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

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

    $ /lib64/ld-linux-x86-64.so.2 ./chmod
    chmod: missing operand
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 如果您有一个挂载的 vfat 或 NTFS 文件系统,或者其他将所有文件视为 777 的文件系统,您可以在那里创建您的可执行文件。

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果你有一个挂载的网络文件系统,即使它不是本地可写的,你也可以在远程系统上创建文件并正常使用这些文件。
  • 如果有一个您不关心其内容的挂载分区,在仍然大部分工作的驱动器上,您可以用包含您想要的可执行文件的相同文件系统类型的新映像替换内容 -cat在人们通常使用的角色dd,您可以通过网络提供图像。

    $ cat > /dev/sdb1 < ...
    
    Run Code Online (Sandbox Code Playgroud)

    这个是合理的,但有很多地方不能工作,这取决于该分区的内存中到底有什么。

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

    $ cat > ~/test.py < ...
    
    Run Code Online (Sandbox Code Playgroud)
  • 由于 Bash 仍在运行,您可以将 Bash 插件动态加载到暴露 chmod 的进程中。特别是,您可以安装和加载ctypes.sh,它为 Bash 提供了一个外部函数接口,然后dlcall chmod ./netcat 511.
  • 您可以引入foo.so您构建的动态库文件,然后cat通过 代表您加载它LD_PRELOAD,从而允许您执行任意代码。

    $ LD_PRELOAD=./hack.so cat /dev/null
    
    Run Code Online (Sandbox Code Playgroud)

    例如,如果您拦截open

    $ /lib64/ld-linux-x86-64.so.2 ./chmod
    chmod: missing operand
    
    Run Code Online (Sandbox Code Playgroud)

    然后你可以在那里做任何你需要做的事情。

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

  • 关于“静态链接的`busybox`”:请注意,[`sash`](https://en.wikipedia.org/wiki/Stand-alone_shell) 是专门为这种用例设计的,可能更容易获得在紧要关头(例如,您可以提前安装它,并在某处运行一个副本,以便在系统崩溃时将其保存在内存中……或者您可以放弃您的宠物并购买一堆牛,我想)。 (3认同)