NGINXDNS解析漏洞(CVE-2021-23017)
⼀、漏洞情况说明:
Nginx DNS解析漏洞(CVE-2021-23017):
在处理DNS响应时,ngx_resolver_copy()中的⼀个off-by-one错误将允许⽹络攻击者在堆分配的缓冲区中写⼊超出
边界的点字符(‘.’, 0x2E)。配置解析程序原语时,响应nginx服务器DNS请求的DNS响应可能会触发该漏洞。精⼼构造的数据包可以通过使⽤0x2E覆盖下⼀个堆块元数据的最低有效字节,此时,能够向nginx服务器提供DNS响应的⽹络攻击者可以实现拒绝服务攻击或远程代码执⾏攻击。
由于nginx中缺少DNS欺骗防御措施,并且在检查DNS事务ID之前调⽤了易受攻击的函数,因此远程攻击者可以通过在可⾏的时间内向⽬标服务器发送恶意DNS响应来利⽤该漏洞实施攻击。
⼆、影响范围:
Nginx DNS解析漏洞影响版本:
0.6.18 - 1.20.0
建议升级⾄1.20.1及以上版本
三、nginx1.20.1部署脚本
部署脚本如下:
#!/bin/bash
>>>>>>###
# copyright by hwb
# DATE:2021-05-05
#
# ⾃动化部署nginx 1.20
# 脚本及安装包统⼀放在/opt⽬录下
>>>>>>###
#nginx
NGINX_USER=nginx
NGINX_GROUP=nginx
NGINX_HOME=/usr/local/nginx
NGINX_PORT=80
NGINX_SOFTWARE=/opt/nginx
#调⽤函数库
[ -f /etc/init.d/functions ]&&source /etc/init.d/functions
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
source /etc/profile
#Require root to run this script.
[$(id -u) -gt 0 ]&&echo"请⽤root⽤户执⾏此脚本!"&&exit 1
function install_nginx_el7(){
echo""
echo -e "\033[33m***********************************************⾃动部署nginx服务*****************************************************\033[0m"
#建⽤户及⽬录
groupadd -r nginx &&useradd -r -g nginx nginx -d /home/nginx -m
[ -d ${NGINX_SOFTWARE}]||mkdir -p ${NGINX_SOFTWARE}
#关闭selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#常⽤module
#ngx_http_core_module:核⼼模块;内置模块。
#ngx_http_upstream_module:“upstream”模块,内置模块,核⼼模块;⽤于请求的“负载均衡”。
#ngx_http_proxy_module:“请求代理”模块,核⼼模块;将请求转发给代理Server,或者对请求进⾏额外的cache操作。
#ngx_http_proxy_module:“请求代理”模块,核⼼模块;将请求转发给代理Server,或者对请求进⾏额外的cache操作。
#ngx_http_rewrite_module:“URL重写”模块,内置模块;根据规则,rewrite特定的URL并转发给代理Server。
#ngx_http_access_module:“访问控制”模块;“允许”或者“拒绝”特定的IP列表对server的访问,内置模块。
#ngx_http_limit_conn_module:“访问控制”模块;可以限定每个key(可以为客户端IP)允许的最⼤并发连接数,内置模块。
#ngx_http_limit_req_module:“访问控制”模块;可以限定每个key(可以为客户端IP)在单位之间内允许处理的request个数,“流量控制”,内置模块。
#ngx_http_headers_module:“header”模块;主要是“add_header”和“expired”两个指令,向response中添加header信息,内置模块。
#ngx_http_charset_module:“字符集”模块;在响应头部的“Content-Type”中增加charset信息,内置模块。
#ngx_http_addition_module:“增添”模块;在response内容之前或者之后额外添加⽂本信息,内置模块。
#ngx_http_sub_module:“后置修改响应”模块;可以过滤并替换response内容中特定的字符串,附加模块,需要在编译时指定“--with-http_sub_module”。
#ngx_http_fastcgi_module:将请求发送给“fastcgi”服务器,内置模块。
#ngx_http_geo_module:“geo”模块;创建⼀个变量,此变量的值由client ip值决定,对实现⼩型私有“CDN”⽅案有参考价值,内置模块。
#ngx_http_geoip_module:“geo”模块;通过配置(数据源)可以得知clientip所属的“城市”、“区域”等信息,对实现⼩型私有的CDN有⼀定的参考价值,附加模块,需要在编译时指定“--with-http_geoip_module”。
#ngx_http_gzip_module:“gzip”模块;对response使⽤gzip压缩,对减少数据传输量有益,内置模块。
#ngx_http_gzip_static_module:“gzip”模块;对response使⽤gzip压缩,输出为“.gz”⽂件,附加模块,需要在编译时指定“--with-http_gzip_static_module”。#ngx_http_image_filter_module:“图⽚”模块;可以对“JPEG”、“GIF”、“PNG”格式的图⽚进⾏裁剪等操作,附加模块,需要在编译时指定“--with-http_image_fi lter_module”。
#ngx_http_status_module/ngx_http_stub_status_module:“nginx内部状态”模块;⽤于获取nginx内部的⼀些状态统计信息,通常⽤来获取⼀些简单的统计数据,其中nginx_http_stub_status_module为附加模块,编译时需要指定“--with-http_stub_status_module”。
#nginx-http-concat:第三⽅附加模块,由taobao开发,主要⽤于合并“静态资源”请求,提升性能,需要额外下载,并在编译时添加“--add-module=software/nginx-ht tp-concat-master”。(github/alibaba/nginx-http-concat)
#ngx_cache_purge:第三⽅附加模块,由frickle提供,当在proxy中使⽤cache保存静态资源时,那么cache_purge模块提供删除过期数据的功能⽀持,需要额外下载,并在编译时添加“--add-module=software/ngx_cache_purge”。(labs.frickle/nginx_ngx_cache_purge/)
#nginx_upstream_check_module:第三⽅附加模块,由taobao开发,通过它检测后端 realserver的健康状态,如果后端 realserver 不可⽤,则请求就不会转发到该节点上,该模块需打补丁。
#nginx-module-vts:第三⽅附加模块,Nginx virtual host traffic status module,nginx的监控模块,能够提供json、html、prometheus格式的数据产出。
#nginx-sticky-module:第三⽅附加模块,sticky模块与Ip_hash都是与负载均衡算法相关,Sticky是基于cookie的⼀种负载均衡解决⽅案,通过分发和识别cooki e,使来⾃同⼀个客户端的请求落在同⼀台服务器上,默认cookie标识名为route。
#wget /nginx-goodies/nginx-sticky-module-ng/get/
#ngx_http_referer_module:内置模块,可根据header中的referer信息屏蔽某些请求对⽹站或应⽤的访问,可以起到禁⽌直接访问⽹站static files的作⽤(防盗链或保护⽂件)
#nginx-http-sysguard:阿⾥巴巴开发的⼀个 Nginx 模块,⽤来保护运⾏ Nginx 服务器的系统负载和内存使⽤不会太⾼,不⽀持最新版本。
#下载nginx安装包
if[ -f ${NGINX_SOFTWARE}/nginx-1.20. ]&&[ -f ${NGINX_SOFTWARE}/nginx_upstream_check_module-master.zip ]&&[ -f ${NGINX_SOFTWA RE}/nginx_upstream_check_module-master.zip ]&&[ -f ${NGINX_SOFTWARE}/nginx-http-concat-master.zip ]&&[ -f ${NGINX_SOFTWARE}/nginx-modul e-vts-master.zip ]&&[ -f ${NGINX_SOFTWARE}/ ]&&[ -f ${NGINX_SOFTWARE}/ngx_cache_ purge-2. ];then
action "*****已存在nginx安装包,⽆需下载*****" /bin/true
else
ping -c 4 app.fslgz >/dev/null 2>&1
if[$? -eq 0 ];then
#wget /download/nginx-1.20.  -P /opt
#wget codeload.github/alibaba/nginx-http-concat/zip/master  -P /opt
#wget labs.frickle/files/ngx_cache_purge-2.  -P /opt
#wget codeload.github/yaoweibin/nginx_upstream_check_module/zip/master -P /opt
#wget codeload.github/vozlt/nginx-module-vts/zip/refs/heads/master -P /opt
#wget /nginx-goodies/nginx-sticky-module-ng/get/ -P /opt
#wget github/alibaba/nginx-http-sysguard/archive/master.zip -O nginx-http-sysguard-master.zip  -P /opt
#wget --progress=bar:force app.fslgz/portal/api/public/fs/association/file/downLoad?uploadId=839506330304708608 -O ${NGINX_SOFTWAR E}/nginx-1.20. 2>&1 | progressfilt
wget -q  app.fslgz/portal/api/public/fs/association/file/downLoad?uploadId=860117865959849984 -O ${NGINX_SOFTWARE}/nginx-1.20.1.tar. gz
wget -q  app.fslgz/portal/api/public/fs/association/file/downLoad?uploadId=839568288638894080 -O ${NGINX_SOFTWARE}/nginx_upstream _check_module-master.zip
wget -q  app.fslgz/portal/api/public/fs/association/file/downLoad?uploadId=839568884758544384 -O ${NGINX_SOFTWARE}/nginx-http-conca t-master.zip
wget -q  app.fslgz/portal/api/public/fs/association/file/downLoad?uploadId=839569060348887040 -O ${NGINX_SOFTWARE}/nginx-http-sysgu ard-master.zip
wget -q  app.fslgz/portal/api/public/fs/association/file/downLoad?uploadId=839569209208930304 -O ${NGINX_SOFTWARE}/nginx-module-vt s-master.zip
wget -q  app.fslgz/portal/api/public/fs/association/file/downLoad?uploadId=839568746614947840 -O ${NGINX_SOFTWARE}/nginx-goodies-n
wget -q  app.fslgz/portal/api/public/fs/association/file/downLoad?uploadId=839569359721529344 -O ${NGINX_SOFTWARE}/ngx_cache_purg e-2.
[$? -eq 0 ]&& action "nginx安装包及依赖包下载完成!" /bin/true
else
action "please download nginx package manual!" /bin/false
exit$?
fi
fi
#安装依赖包及打补丁
yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel patch gd-devel libgd2-xpm libgd2-xpm-dev GeoIP-devel.x86_64 >/dev/nul l
[$? -eq 0 ]|| action "依赖包未安装成功" /bin/false ||exit$?
cd${NGINX_SOFTWARE}&&tar -xvf nginx-1.20. >/dev/null  && unzip nginx_upstream_check_module-master.zip >/dev/null && unzip nginx-http-c oncat-master.zip >/dev/null && unzip nginx-http-sysguard-master.zip >/dev/null && unzip nginx-module-vts-master.zip >/dev/null  &&tar -xvf ngx_cache_pu rge-2. >/dev/null &&tar -xvf >/dev/null &&mv nginx-goodies-nginx-sticky-module-ng-0 8a395c66e42 nginx-sticky-module
chown -R root:root ${NGINX_SOFTWARE}&&chmod -R 755 ${NGINX_SOFTWARE}
action "*****开始打补丁*****" /bin/true
cd${NGINX_SOFTWARE}/nginx-1.20.1
patch -p1 <../nginx_upstream_check_module-master/check_1.16.1+.patch
#patch -p1 < ../nginx-http-sysguard-master/nginx_sysguard_1.3.9.patch
#编译安装nginx
cve漏洞库ps -ef|grep nginx |grep -v grep|grep -v sh
if[$? -eq 0 ];then
action "*****已存在nginx进程*****" /bin/false
exit$?
else
# 卸载 nginx
rpm -qa|grep nginx|xargs -i rpm -e --nodeps {}
# 安装nginx
action "*****编译安装nginx*****" /bin/true
cd${NGINX_SOFTWARE}/nginx-1.20.1
./configure --user=${NGINX_USER} --group=${NGINX_GROUP} --prefix=${NGINX_HOME}  --with-threads --with-http_stub_status_module --with-http_ssl _module --with-http_realip_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module  --with-stream  --with-http_flv_module --with-http_mp4_module  --with-http_addition_module --with-http_sub_module --with-http_dav _module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" --with-file-aio --with-debug --with-cc-opt='-g -O0' --add-module=${NGINX_SOFTWARE}/nginx_upstream_check_module-master --add-module=${NGINX_SOFTW ARE}/nginx-module-vts-master --add-module=${NGINX_SOFTWARE}/nginx-sticky-module  --add-module=${NGINX_SOFTWARE}/nginx-http-concat-mast er  --add-module=${NGINX_SOFTWARE}/ngx_cache_purge-2.3/  >/dev/null
make>/dev/null &&make install>/dev/null
[$? -eq 0 ]&& action "*****nginx编译安装成功*****" /bin/true
fi
cat>${NGINX_HOME}/f <<EOF
user ${NGINX_USER}${NGINX_GROUP};
#⼯作进程:数⽬。根据硬件调整,通常等于CPU数量或者2倍于CPU
worker_processes  8;
worker_cpu_affinity auto;
#指定进程可以打开的最⼤描述符:数⽬
worker_rlimit_nofile 65535;
error_log  logs/error.log  notice;
events {
#使⽤epoll的I/O 模型
use epoll;
accept_mutex off;
worker_connections  65500;
}
http {
include      pes; #设定mime类型,类型由pe⽂件定义
default_type  application/octet-stream;
log_format main '[\$time_local] \$remote_addr - \$remote_user  "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';
log_format log404 '[\$time_local] \$status \$remote_addr \$host$request_uri \$sent_http_location';
access_log  logs/host.access.log  main;
access_log  logs/host.access.404.log  log404; #⽤了log_format指令设置了⽇志格式之后,需要⽤access_log指令指定⽇志⽂件的存放路径;
sendfile        on; #指定 nginx 是否调⽤sendfile 函数(zero copy ⽅式)来输出⽂件,对于普通应⽤,必须设为on
tcp_nopush    on; #此选项允许或禁⽌使⽤socke的TCP_CORK的选项,此选项仅在使⽤sendfile的时候使⽤
tcp_nodelay on;
keepalive_timeout  600; #keepalive超时时间
keepalive_timeout  600; #keepalive超时时间
server_names_hash_bucket_size 128;
server_tokens off; #隐藏版本号
vhost_traffic_status_zone;  #流量监控,在server段增加/status配置
server {
listen      ${NGINX_PORT};
server_name  localhost;
location / {
root  html;
index  index.html index.htm;
}
error_page  500 502 503 504  /50x.html;
location = /50x.html {
root  html;
}
}
f;
f;
include vhosts/*.conf;
}
EOF
cat>${NGINX_HOME}/f <<EOF
gzip on;
gzip_min_length 2k; #设置允许压缩的页⾯最⼩字节数,页⾯字节数从header头的Content-Length中获取,默认值是0,不管页⾯多⼤都进⾏压缩,建议设置成⼤于1K,如果⼩与1K可能会越压越⼤。
gzip_buffers 4 32k; #压缩缓冲区⼤⼩,表⽰申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据⼤⼩相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1;#压缩版本,⽤于设置识别HTTP协议版本,默认是1.1,⽬前⼤部分浏览器已经⽀持GZIP解压,使⽤默认即可
gzip_comp_level 6; #压缩⽐例,⽤来指定GZIP压缩⽐,1压缩⽐最⼩,处理速度最快,9压缩⽐最⼤,传输速度快,但是处理慢,也⽐较消耗CPU资源。gzip_proxied any;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on; #varyheader⽀持,改选项可以让前端的缓存服务器缓存经过GZIP压缩的页⾯,例如⽤Squid缓存经过nginx压缩的数据
EOF
cat>${NGINX_HOME}/f <<EOF
#client_header_timeout 60;
client_body_timeout 60;
#client_header_buffer_size 1m; #客户端请求头部的缓冲区⼤⼩
#large_client_header_buffers 32 128k; #客户请求头缓冲⼤⼩
client_max_body_size      800m;  #通过nginx上传⽂件的⼤⼩
client_body_buffer_size    1024k; #Nginx分配给请求数据的Buffer⼤⼩,如果请求的数据⼩于client_body_buffer_size直接将数据先在内存中存储。如果请求的值⼤于client_body_buffer_size⼩于client_max_body_size,就会将数据先存储到临时⽂件中
reset_timedout_connection on;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_set_header Accept-Encoding 'gzip';
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
proxy_set_header Origin '';
proxy_redirect ;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_connect_timeout      9000; #单位秒,后端服务器连接的超时时间_发起握⼿等候响应超时时间
proxy_send_timeout        6000; #单位秒,后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_read_timeout        6000;  #单位秒,连接成功后_等候后端服务器响应时间_其实已经进⼊后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
proxy_ignore_client_abort  on;
proxy_buffer_size          256k; #设置从被代理服务器读取的第⼀部分应答的缓冲区⼤⼩
proxy_buffers              4 256k; #设置⽤于读取应答(来⾃被代理服务器)的缓冲区数⽬和⼤⼩,默认情况也为分页⼤⼩,根据操作系统的不同可能是4k或者8k proxy_busy_buffers_size    256k;
proxy_temp_file_write_size 100m; #设置在写⼊proxy_temp_path时数据的⼤⼩,预防⼀个⼯作进程在传递⽂件时阻塞太长
proxy_temp_path ${NGINX_HOME}/proxy_temp; #proxy_temp_path和proxy_cache_path指定的路径必须在同⼀分区
#proxy_cache_path ${NGINX_HOME}/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=1g; #设置内存缓存空间⼤⼩为200MB,1天没有被访问的内容⾃动清除,硬盘缓存空间⼤⼩为30GB。
EOF
mkdir -p ${NGINX_HOME}/conf/vhosts &&mkdir -p ${NGINX_HOME}/proxy_temp &&mkdir -p ${NGINX_HOME}/proxy_cache
#配置开机启动
cat> /usr/lib/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx - high performance web server
Documentation=/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
Type=forking
ExecStartPre=${NGINX_HOME}/sbin/nginx -t -c ${NGINX_HOME}/f
ExecStart=${NGINX_HOME}/sbin/nginx -c ${NGINX_HOME}/f
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
chown -R ${NGINX_USER}:${NGINX_GROUP}${NGINX_HOME}&&chmod -R 755 ${NGINX_HOME}
#启动nginx服务
action "*****启动nginx服务*****" /bin/true
systemctl daemon-reload
systemctl restart nginx.service
systemctl enable nginx.service
systemctl status nginx.service
echo -e "\033[33m************************************************完成nginx服务部署*************************************************\033[0m" cat> /tmp/nginx.log  <<EOF
nginx安装⽬录:${NGINX_HOME}
NGINX版本:NGINX-1.20.1
NGINX端⼝:${NGINX_PORT}
NGINX服务:systemctl status nginx
EOF
cat /tmp/nginx.log
echo -e "\e[1;31m 以上信息10秒后消失,保存在/tmp/nginx.log⽂件下 \e[0m"
echo -e "\033[33m*****************************************************************************************************************\033[0m" echo""
sleep 10
}
install_nginx_el7
忘记截图,就放⼀个状态好了…

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论