直接通过修改二进制文件OpenSSH和OpenSSL的版本为最高版版本来达到形式主义等保要求的操作
文章开头的解释和说明
- 本篇文章是通过形式上修改二进制文件中的版本号来达到某些像行尸走肉机器人类形式主义要求的等保标准要求,来完成其要求的“安全加固”。
- 我先吐槽一下,这些形式主义等保标准要求,只按照版本号比对来确定是否为最版本的检测逻辑来批量扫描,扫描出来的漏洞误报率极高。
- 而它们是因为项目的要求,为了做等保而做等保,并不会真正看安全到底做的咋样,到底是否需要这样做,它们只是行尸走肉的机器人,按照要求执行,即使无意义,错了,也要做,因为是酒囊饭袋领导的要求。
- 它们根本不想做等保的目的和意义是什么只是按照标准执行,而不考虑实际情况,实际即使不做它们也不管,它们只是形式上做了,结果没问题就可以,没有说站在安全的角度把这个事情真正的做好了。
- 所以既然是这样,便有了今天的文章,既然它们是形式主义,那么我们这些干活的也可以形式主义,它们要最高版本号,我就给它们最高版本号。
- 某公众号描述的原因,很认可,摘抄下来!!!
这几年信息安全要求很高,奈何口号响亮掩盖不了我们技术基础依然很低的事实,加上风口烧钱和政绩工程等因素,于是就诞生了一些乱象,其中一个就是安全扫描胡乱标记,这里面的典型就是OpenSSH的漏洞扫描报告。
比如,OpenSSH社区说我们最近修复了某个漏洞,发布补丁到新版本OpenSSH 9.7。然后像红帽,SUSE,欧拉,Ubuntu这些大公司或者Debian,ARCH等社区的发行版会第一时间把相关补丁打入自己的升级包,但是按照发行规则,命名就跟随大版本,如RHEL7/CentOS7新的升级包可能是openssh-server-7.4p1-23.el7_9.x86_64,也就是说版本继续在7.4后面增加小版本号。这时候某些漏洞扫描工具就闪亮登场了,它们无力去验证对端的ssh服务到底有没有这个漏洞,但是sshd的版本号是谁都可以看到的啊,你是7.4,低于9.7,那你这个OpenSSH就是有漏洞。
这种扫描版本号来判断是否存在漏洞的方式并非不可行,只要去该Linux发行版的官网,查询下修补漏洞记录就可以知道某个版本号是否修复了某个漏洞,可是直到现在,这么一个简单的事情却没见到有人做。可能对安全扫描来说,能多找出一些漏洞更重要吧,哪怕这些漏洞根本不存在。于是系统管理员花时间去修补不存在或者不必处理的漏洞,有时候,为了修补一个不存在的漏洞,还要升级OpenSSL,导致更多系统和应用的故障。
修改客户端SSH版本号为最高版本
通过修改客户端二进制文件的OpenSSH版本,保证等保截图是最高版本,达到“安全加固”
修改OpenSSH客户端版本号为最新的OpenSSH 9.8p1
备份二进制文件ssh
sudo cp /usr/bin/ssh /usr/bin/ssh.bak
使用sed命令直接修改二进制文件的版本号为OpenSSH_9.8p1
sed -i 's/OpenSSH_8.4p1/OpenSSH_9.8p1/g' /usr/bin/ssh
另一种方式,通过perl修改二进制文件的版本号为OpenSSH_9.8p1
sudo perl -pi -e 's/OpenSSH_8.4p1/OpenSSH_9.8p1/g' /usr/bin/ssh
执行ssh -V 命令确认验证修改后的效果
ssh -V
修改OpenSSL版本号为最新的OpenSSL 1.1.1w 11 Sep 2023
- 修改OpenSSL版本是需要找到其对应的依赖库,然后通过修改依赖库的版本号来达到修改OpenSSL版本。
查看OpenSSL的依赖库
ldd /usr/bin/openssl | grep libcrypto.so
执行结果输出的内容:libcrypto.so.1.1 => /usr/lib64/libcrypto.so.1.1 (0x00007f1afc739000)
确认依赖库路径及名称
- 通过上述执行的结果确认OpenSSL版本的依赖目录是/usr/lib64/ 对应的名称是libcrypto.so.1.1
- 所以只要修改libcrypto.so.1.1这个库文件的版本号就可以达到修改OpenSSL版本号的效果。
查看此目录有哪些文件
ll /usr/lib64/
- 这个目录下有很多库文件,执行确认下存在上面需要的库文件libcrypto.so.1.1存在即可。
开始执行修改版本号之前备份原始库文件libcrypto.so.1.1
cp /usr/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1.bak
查看OpenSSL依赖库中显示版本信息的原始内容
strings /usr/lib64/libcrypto.so.1.1 |grep 1.1.1
- 输出的内容:
(
OPENSSL_1_1_1
OPENSSL_1_1_1b
OPENSSL_1_1_1c
OPENSSL_1_1_1d
1!1'1-191C1E1K1]1a1g1m1s1
OpenSSL 1.1.1d 10 Sep 2019
c2tnb191v1
sect131r1
libcrypto.so.1.1-1.1.1d-150200.11.54.1.x86_64.debug
)
或者使用下面命令更精确
strings /usr/lib64/libcrypto.so.1.1 | grep "OpenSSL 1.1.1"
使用 sed 修改 libcrypto.so.1.1 文件中的版本号:
sed -i 's/OpenSSL 1.1.1d 10 Sep 2019/OpenSSL 1.1.1w 11 Sep 2023/g' /usr/lib64/libcrypto.so.1.1
或者使用 perl 修改 libcrypto.so.1.1 文件中的版本号:
perl -pi -e 's/OpenSSL 1.1.1d 10 Sep 2019/OpenSSL 1.1.1w 11 Sep 2023/g' /usr/lib64/libcrypto.so.1.1
查看验证修改OpenSSL版本号是否成功:
strings /usr/lib64/libcrypto.so.1.1 | grep "OpenSSL 1.1.1"
最终效果展示
修改服务端SSH版本号为最高版本
通过修改服务端二进制文件的OpenSSH版本,保证扫描器扫出来的版本号是最高版本。
修改OpenSSH服务端版本号为最新的OpenSSH 9.8p1
备份二进制文件ssh
sudo cp /usr/sbin/sshd /usr/sbin/sshd.bak
使用sed命令直接修改二进制文件的版本号为OpenSSH_9.8p1
sed -i 's/OpenSSH_8.4/OpenSSH_9.8/g' /usr/sbin/sshd
另一种方式,通过perl修改二进制文件的版本号为OpenSSH_9.8p1
sudo perl -pi -e 's/OpenSSH_8.4/OpenSSH_9.8/g' /usr/sbin/sshd
执行ssh -V 命令确认验证修改后的效果
ssh -v localhost
总结
最终需要执行的命令操作如下:
cp /usr/bin/ssh /usr/bin/ssh.bak sed -i 's/OpenSSH_8.4p1/OpenSSH_9.8p1/g' /usr/bin/ssh ssh -V cp /usr/sbin/sshd /usr/sbin/sshd.bak sed -i 's/OpenSSH_8.4/OpenSSH_9.8/g' /usr/sbin/sshd ssh -v localhost
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-09-23 Vulnhub-靶机-SYMFONOS: 5
2020-09-23 sqlilab-Less-21-30-writeup