Linux服务器“rm -rf”之后

Linux服务器“rm -rf”之后

自娱自乐,我决定启动一台Linux服务器,然后以root用户执行“rm –rf /”命令,然后观察下哪些文件或者指令会幸存下来。结果是什么也没少!因此你必须增加 —no-preserce-root 再试一遍:

  1. # rm -rf --no-preserve-root /

当你按下“Enter”时,一些重要的工具,比如

  • /bin/ls
  • /bin/cat
  • /bin/chmod
  • /usr/bin/file

将会应声消失!但是你当前的SSH连接以及bash终端都还在,这表明所有bash相关的内建指令都没有受影响,比如echo。

成为Bash达人

  1. root@rmrf:/# ls
  2. -bash:/bin/ls:No such file or directory

执行以上命令,发现已没有ls可用,但是echo和fileglobs还在。利用这些“幸存者”们,我们可以做点什么呢?

  1. root@rmrf:/# echo *
  2. dev proc run sys
  3. # echo /dev/pts/*
  4. /dev/pts/0/dev/pts/3/dev/pts/ptmx

注意!/dev,/proc,/run,/sys还在,我们一定要保存好它们。如果有了ls指令,那么对目录下内容的读取操作将会更加简单。

  1. root@rmrf:/# for file in /dev/pts/*; do echo $file; done
  2. /dev/pts/0
  3. /dev/pts/3
  4. /dev/pts/ptmx

许多Reddit用户指出,printf仍是可用的。CAMH-说:printf会将参数依次格式化到输出字符串中去。

  1. root@rmrf:/# ls() { printf '%s\n' ${1:+${1%/}/}*;}

既然在bash下可以定义函数,那么我们可以自建一个ls工具,虽然功能还不是很完善。

  1. root@rmrf:/# ls() { printf '%s\n' ${1:+${1%/}/}*;}
  2. -bash: syntax error near unexpected token `('

不对啊,这种操作应该完全合法才对,难道ls已经被映射,或者它是其他命令的别名?

  1. root@rmrf:/# type ls
  2. ls is aliased to `ls --color=auto'

原来如此,我们上面的指令被扩展成了ls--color=auto () { printf '%s\n' ${1:+${1%/}/}*; }。那么,我们可以先使用unalias指令,去掉ls与ls—color的关联。

  1. root@rmrf:/# unalias ls
  2. root@rmrf:/# ls() { printf '%s\n' ${1:+${1%/}/}*;}
  3. root@rmrf:/# ls
  4. /dev
  5. /proc
  6. /run
  7. /sys
  8. root@rmrf:/# ls /dev
  9. /dev/pts

把函数存储到utils.sh文件

  1. root@rmrf:/# echo 'ls() { printf '%s\n' ${1:+${1%/}/}*;}' >> utils.sh
  2. root@rmrf:/# source utils.sh

cat命令怎么样实现呢?借助read!read是幸存者之一,使用read结合管道和重定向,一个基本的cat就基本成型了!

  1. root@rmrf:/#(while read line;do echo "$line";done)< utils.sh
  2. ls(){ printf '%s\n' ${1:+${1%/}/}*;}

结合上述通过“幸存者”逐渐恢复一些指令的方法,以及echo可以写入任意多字节的特性,我们可以重新构建出linux的工具系统,并可以通过curl或者wget直接获得我们想要的二进制文件。首先,参照echoed by others,获取busybox。Busybox是嵌入式Linux的瑞士军刀,内嵌wget,dd,tar等许多工具。Eusebeîa详细介绍了如何获得一个busybox的escaped版本,我在这里就不多做赘述了。

但是,还有一个问题。

即使我们echo了整个二进制文件需要的所有字节,这些二进制文件仍无法执行。没法启动busybox!针对这个问题,早期的解决方法是找到一些可执行的程序,然后用echo覆盖它们。我们对/usr和/bin下的文件进行了诸如此类的改造,但这确实稍显复杂。

可以利用shell通配符和bash筛选出带有可执行位组的文件,记住要把目录排除在外。

  1. executable (){if[[(!-d $1 )&&-x $1 ]];then echo "$1";fi}

相关推荐