当我通过 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
其还获取版本字符串。
当然,作为脚本,您可以在更新后调用它以快速重新执行阻止。由于版本字符串首先存在的原因,因此不建议这样做,但这应该可以起作用。