躲开 cat 命令

原文地址:https://ura.d3npa.dev/posts/hiding-from-cats.md

躲开 cat 命令

/usr/bin/cat 是一种从一个位置读取数据并将其写入另一个位置的工具;在大多数情况下,它用于从文件读取文本并将其写入STDOUTCat还支持某些控制字符,例如换行符\f,回车符\r和换行符\n

这是一个有趣的小概念验证,说明如何\r使用它来隐藏catshell脚本命令:

1
2
3
4
5
6
7
cmd_h = "echo 'You forgot to check `cat -A`!' > oops" # hidden
cmd_v = "echo 'Hello world!'" # visible

with open("test.sh", "w") as f:
output = "#!/bin/sh\n"
output += cmd_h + ";" + cmd_v + " #\r" + cmd_v + " " * (len(cmd_h) + 3) + "\n"
f.write(output)

这会滥用cat的默认行为,即呈现回车\r符。本质上,一个\r会将光标移回该行的开头,并且此后打印的字符将被写在之前(覆盖)打印的任何内容。这也是为什么我们在字符串的末尾添加空格。

因此,当我们运行时cat test.sh:

1
2
3
4
$ cat test.sh
#!/bin/sh
echo 'Hello world!'
$

但是,运行文件实际上会执行:

1
2
echo 'You forgot to check `cat -A`!' > oops
echo 'Hello world!'
1
2
3
4
5
6
7
8
9
$ ls
test.sh
$ sh ./test.sh
Hello world!
$ ls
oops test.sh
$ cat oops
You forgot to check `cat -A`!
$

最后,有三种捕获方法:
1.test.sh的文件大小与cat打印的内容不匹配。
2.打开在文件中的编辑器,例如vivim,或nano,或一个类似less页调器。
3.如果我们使用cat -A ./test.sh替代,则禁用控制字符的呈现:

1
2
3
4
$ cat -A test.sh
#!/bin/sh$
echo 'You forgot to check `cat -A`!' > oops;echo 'Hello world!' #^Mecho 'Hello world!'
$

不幸的是,当从Internet下载脚本时,大多数人没有认真检查他们正在运行的脚本。在少数人中,有许多人依靠/usr/bin/cat这样做。这种攻击可以用来躲过攻击,即使是那些用cat费心检查代码的人。

从现在开始,让我们在检查脚本时使用一些更安全的东西,比如less

坚持原创技术分享,您的支持将鼓励我继续创作!