Nginx升级加固SSL/TLS协议信息泄露漏洞(CVE-2016-2183)和HTTP服务器的缺省banner漏洞
时间:2022-07-25
本文章向大家介绍Nginx升级加固SSL/TLS协议信息泄露漏洞(CVE-2016-2183)和HTTP服务器的缺省banner漏洞,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Nginx升级加固SSL/TLS协议信息泄露漏洞(CVE-2016-2183)
漏洞说明
// 基于Nginx的https网站被扫描出SSL/TLS协议信息泄露漏洞(CVE-2016-2183),该漏洞是在安装Nginx时build的Openssl版本问题导致的漏洞,
// 需要重新编译安装Nginx并指定版本的Openssl(可以不升级系统的openssl,编译过程中只要指定新的openssl路径即可)。
加固方法和步骤
检查当前Nginx安装过程使用的openssl版本
[root@server ~]# nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
下载新版本Openssl
cd /tmp
wget https://www.openssl.org/source/openssl-1.1.0k.tar.gz
tar zxvf openssl-1.1.0k.tar.gz -C /usr/local
下载安装源码Nginx
yum install -y gcc gcc-c++ openssl-devel pcre-devel make zlib-devel wget
wget http://nginx.org/download/nginx-1.14.2.tar.gz
cd /root/nginx-1.14.2
./configure --prefix=/usr/local/nginx1.14 --with-http_ssl_module --with-http_stub_status_module --with-openssl=/usr/local/openssl-1.1.0k
make && make install
我之前make时如果将openssl放到root目录可能会编译报错,/usr/local就没报错,没报错就不要改下面文件了
# 错误信息
/bin/sh: line 2: ./config: No such file or directory
make[1]: *** [/usr/local/ssl/.openssl/include/openssl/ssl.h] Error 127
make[1]: Leaving directory `/usr/local/src/nginx-1.9.9'
make: *** [build] Error 2
解决方法
# 打开nginx源文件下的/usr/local/src/nginx-1.9.9/auto/lib/openssl/conf文件:
vi /root/nginx-1.14.2/auto/lib/openssl/conf
# 找到以下代码,差不多三四十行
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
# 修改成以下代码
CORE_INCS="$CORE_INCS $OPENSSL/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
验证Nginx使用Openssl版本
[root@JD sbin]# ./nginx -V
nginx version: nginx/1.14.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.1.0k 28 May 2019
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx1.14 --with-http_ssl_module --with-http_stub_status_module --with-openssl=/usr/local/openssl-1.1.0k
HTTP服务器的缺省banner
能让攻击者了解远程系统类型和远端HTTP Server信息以便进行下一步的攻击
Nginx
一般Nginx我们都会隐藏版本号
# 在http{}里面加上
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;
# 隐藏php版本只需要在php.ini配置文件修改expose_php = On改为expose_php=Off
# 但是我们访问时候还是能看到关键信息,让人窃取到你使用的是nginx
[root@JD nginx-1.14.2]# curl localhost -I
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 09 Sep 2020 13:36:34 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 09 Sep 2020 13:08:03 GMT
Connection: keep-alive
ETag: "5f58d3b3-264"
Accept-Ranges: bytes
由于Nignx没有提供相关配置项改变缺省banner,所以我们需要修改源码,隐藏Nginx软件名
# 我们可以隐藏掉server信息也可以制造假的server迷惑攻击者
# 修改第一个配置文件为nginx.h
ls /usr/local/src/nginx-1.12.2/
auto CHANGES.ru configure html Makefile objs src
CHANGES conf contrib LICENSE man README
# 我们找到当初make之前的那个源码包
cd /usr/local/src/nginx-1.12.2/src/
vim core/nginx.h # 修改下面三行
#define nginx_version 1012002
#define NGINX_VERSION "7.0"
#define NGINX_VER "IIS/" NGINX_VERSION
#ifdef NGX_BUILD
#define NGINX_VER_BUILD NGINX_VER " (" NGX_BUILD ")"
#else
#define NGINX_VER_BUILD NGINX_VER
#endif
#define NGINX_VAR "IIS"
# OR
#define nginx_version 1014002
#define NGINX_VERSION ""
#define NGINX_VER "UNKNOW/" NGINX_VERSION
#ifdef NGX_BUILD
#define NGINX_VER_BUILD NGINX_VER " (" NGX_BUILD ")"
#else
#define NGINX_VER_BUILD NGINX_VER
#endif
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
#endif /* _NGINX_H_INCLUDED_ */
# 修改第二个配置文件为ngx_http_header_filter_module.c,49行
grep IIS http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server:IIS" CRLF;
# OR
static u_char ngx_http_server_string[] = "" CRLF;
static u_char ngx_http_server_full_string[] = "" NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "" NGINX_VER_BUILD CRLF;
# 修改第三个配置文件为ngx_http_special_response.c,对外页面报错时,他会控制是否展示敏感信息,修改如下列
21 static u_char ngx_http_error_full_tail[] =
22 "<hr><center>IIS</center>" CRLF
23 "</body>" CRLF
24 "</html>" CRLF
25 ;
26
27
28 static u_char ngx_http_error_build_tail[] =
29 "<hr><center>IIS</center>" CRLF
30 "</body>" CRLF
31 "</html>" CRLF
32 ;
# OR
static u_char ngx_http_error_full_tail[] =
"<hr><center>" NGINX_VER "</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;
static u_char ngx_http_error_build_tail[] =
"<hr><center>" NGINX_VER_BUILD "</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;
# nginx -V 查看原来编译的参数,从新编译并且make && make install 才会生效,如果源码修改错误会编译不过去.如果编译前服务是启动的哪怕编译成功也是不生效的,需要重启服务.
# 编译,重启请看上面,接下来我们访问看下效果
[root@JD nginx1.14]# curl localhost -I
HTTP/1.1 200 OK
[root@JD nginx1.14]#
还有一种办法比较另类,我没试过
sub_filter '<hr><center>nginx</center>' '<hr><center>ws</center>';
Tomcat
1)我们可以编辑Tomcat(安装目录)/conf/server.xml 文件 ,找到我们应用程序端口对应的元素,新增 server="自定义" 属性,覆盖掉原来的server属性。
2) 重启服务即可
- Python标准库01 正则表达式 (re包)
- 剑指OFFER之栈的压入、弹出序列(九度OJ1366)
- Python标准库03 路径与文件 (os.path包, glob包)
- AI人工智能时代已经到来 “北斗即时判”实现纯语音交互
- 剑指OFFER之链表中倒数第k个节点(九度OJ1517)
- 用Qt写软件系列四:定制个性化系统托盘菜单
- Linux简介与厂商版本
- 用Qt写软件系列三:一个简单的系统工具之界面美化
- VS编译链接时错误(Error Link2005)的解决方法
- HttpClient使用心得
- 剑指OFFER之重建二叉树(九度OJ1385)
- 记录visual Studio使用过程中的两个问题
- 剑指OFFER之二维数组中的查找(九度OJ1384)
- Python标准库02 时间与日期 (time, datetime包)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- KVM 实现虚拟机在线热迁移
- 机器重启后 docker 容器启动报错 error creating overlay mount t
- 微信小程序开发实战(14):音频组件(audio)
- dotnet OpenXML 文本 BodyProperties 的属性作用
- 微信小程序开发实战(15):视频组件(video)
- LeetCode 91,点赞和反对五五开,这题是好是坏由你来评判
- 打破国外垄断,开发中国人自己的编程语言(1):编写解析表达式的计算器
- 在CentOS8上编译安装开源EDA工具——Surelog
- 直播带货小程序源码中,商品详情页是如何获取html图片的
- LeetCode 90 | 经典递归问题,求出所有不重复的子集II
- 万字长文|Swift语法全面解析|附示例
- sshd服务搭建与管理
- Airflow Dag可视化管理编辑工具Airflow Console
- 使用 Clientset 获取 Kubernetes 资源对象
- Python爬虫 - 解决动态网页信息抓取问题