隐藏 ssh 版本

隐藏 ssh 版本

当我通过 ssh 连接到我的服务器时,我执行了 tcpdump。我看到的第一件事是:

SSH-2.0-OpenSSH_5.3

是否可以让服务器不发送其 ssh 版本?

答案1

如果不重新编译源代码则不行。

它用于协商服务器和客户端之间的兼容性。

有一种方法,描述这里,并为了完整性而复制,但我不推荐这样做,因为每次更新软件时都需要重复这样做。

  • 将文件复制/usr/sbin/sshd/tmp

    # cp /usr/sbin/sshd /tmp
    
  • 使用命令在其中找到文本 OpenSSH 的位置strings。查找文本,因为它是输出SSH-2.0-OpenSSH_5.x中显示的版本。telnet

    # cd /tmp
    # strings -t d -a -n 7 sshd | grep -i ssh-2
    521008 OpenSSH-2.0*,OpenSSH-2.1*,OpenSSH_2.1*,OpenSSH_2.2*
    
  • 使用命令从上面的输出中删除 521008 行dd

    # dd if=./sshd bs=1 skip=521008 count=11 | od -A n -c
    11+0 records in
    11+0 records out
       O   p   e   n   S   S   H   -   2   .   0
    11 bytes (11 B) copied, 0.000208606 s, 52.7 kB/s
    
    # dd if=./sshd bs=1 count=521008 of=sshd.1
    521008+0 records in
    521008+0 records out
    521008 bytes (521 kB) copied, 1.46733 s, 355 kB/s
    
    # dd if=./sshd bs=1 skip=521008 count=11 of=sshd.2
    11+0 records in
    11+0 records out
    11 bytes (11 B) copied, 0.00032878 s, 33.5 kB/s
    
    # dd if=./sshd bs=1 skip=521008 count=999999999 of=sshd.3
    131808+0 records in
    131808+0 records out
    131808 bytes (132 kB) copied, 0.368016 s, 358 kB/s
    

    OpenSSH_5.x 现在被剪切并复制到 sshd.2 文件。

  • 使用 od 命令检查 sshd.2 文件的内容。

    # od -A n -c sshd.2
    O   p   e   n   S   S   H   _   2   .   0
    
  • 写入文本“ItsHidden”sshd.2并检查前后文件大小的变化。

    # ls -l sshd.2 -rw-r--r-- 1 root root 11 May  6 14:11 sshd.2 
    # print -n ItsHidden > sshd.2 
    # ls -l sshd.2 -rw-r--r-- 1 root root 11 May  6 14:12 sshd.2
    
  • 将以上所有 sshd 文件合并为 sshd.new。

    # cat sshd.* > sshd.new
    
  • 授予 sshd.new 执行权限,并用 sshd.new 替换 sshd 二进制文件。

    # chmod 755 ./sshd.new
    # cp /usr/sbin/sshd /usr/sbin/sshd.bak
    # rm /usr/sbin/sshd
    # cp /tmp/sshd.new /usr/sbin/sshd
    
  • 重新启动 sshd 服务并使用 telnet 命令测试结果。

    # service sshd stop
    # ps aux | grep -i sshd
    # kill -9 <pid_sshd>
    # service sshd restart
    # telnet localhost 22
    

然而,这不是一个非常优雅或可维护的解决方案。

答案2

更快的方法,如果你小心的话,可以通过 ssh 工作:

首先,创建一个 700 root 拥有的可执行 bash 文件。我将其命名为 test.sh。内容:

#!/bin/bash
sleep 10
service sshd stop
sleep 10
sed -i.bak.$(date +%F.%s) 's/OpenSSH_5.3/Blocked_9.9/g' /usr/sbin/sshd
sleep 10
service sshd start

基本上:休眠 10 秒,停止 ssh 守护进程,等待 10 秒关闭,使用 sed 替换版本字符串,并在执行过程中备份。再休眠 10 秒,然后启动 sshd 服务。请注意,service sshd stop 和 service sshd start 命令可能需要针对您的系统进行一些自定义(例如,可能是“systemctrl stop sshd.service”而不是“service sshd stop”,并且您需要指定要查找的版本字符串;我的测试是在 CentOS 6 机箱上进行的,使用 OpenSSH 5.3)。这样,您就可以从 ssh 会话中将其作为后台守护进程调用 - 请注意,您需要立即退出。因此,通过类似以下方式调用它(显然是以 root 身份):

nohup ./test.sh & exit 0

并确保没有附加任何会话(如果有,则 sshd 可执行文件将很忙,您将无法进行编辑)。然后稍等片刻,然后尝试再次连接。

请注意,您可以通过以下方式测试它是否正常工作:

 echo "Hello" | nc [Server IP here] 22

其还获取版本字符串。

当然,作为脚本,您可以在更新后调用它以快速重新执行阻止。由于版本字符串首先存在的原因,因此不建议这样做,但这应该可以起作用。

相关内容