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
我现在无法背诵的小魔法咒语。
你能帮我把我猫的朋友带回来吗?
答案1
有多种可能性,全部取决于您现在情况的具体参数。在下面的示例中,我将假设 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
可执行文件作为第一个项目(或者实际上是唯一的项目),这样您就可以获得完整的可用命令,而无需重复使用任何让您疲惫不堪的黑客。