admin管理员组文章数量:1566366
通常一个DNS数据包,客户端发送DNSQR请求包,服务器发送DNSRR响应包。一个DNSQR包含有查询的名称qname、查询的类型qtype、查询的类别qclass。一个DNSRR包含有资源记录名名称rrname、类型type、资源记录类别rtype、TTL等等。
DNS(Domain Name System)是用于将域名解析为IP地址的互联网系统。在DNS通信过程中,客户端发送DNS查询请求(DNS Query)数据包,服务器接收并发送DNS响应(DNS Response)数据包。
DNS查询请求(DNS Query)包含以下重要字段:
- 查询名称(qname):要查询的域名。
- 查询类型(qtype):查询的记录类型,如A记录、CNAME记录等。
- 查询类别(qclass):查询的记录类别,通常为IN(Internet)类别。
DNS响应(DNS Response)包含以下重要字段:
- 资源记录名称(rrname):资源记录的域名。
- 类型(type):资源记录的类型,如A记录、CNAME记录等。
- 资源记录类别(rtype):资源记录的类别,通常为IN(Internet)类别。
- TTL(Time to Live):资源记录的生存时间,表示该记录在缓存中的有效期限。
通过DNS查询和响应包的交互,客户端可以向DNS服务器发送查询请求,服务器则会根据查询信息返回相应的资源记录,将域名解析为相应的IP地址或其他记录信息。
使用Scapy
找出fast-flux
流量,解析DNSRR的数据包,提取分别含有查询的域名和对应的IP的rrname和rdata变量
#coding=utf-8
from scapy.all import *
from IPy import IP as PYIP
# 检查数据包的IP层,提取出IP和TTL字段的值
def Get_TTL(pkt):
try:
if pkt.haslayer(IP):
ip_src = pkt.getlayer(IP).src
ip_sport = pkt.getlayer(IP).sport
ip_dst = pkt.getlayer(IP).dst
ip_dport = pkt.getlayer(IP).dport
ip_ttl = str(pkt.ttl)
print("[+] 源地址: %15s:%-5s --> 目标地址: %15s:%-5s --> TTL: %-5s"%(ip_src,ip_sport,ip_dst,ip_dport,ip_ttl))
except Exception:
pass
# 获取本机发送出去的DNS请求所对应的网站地址
def Get_DNSRR(pkt):
if pkt.haslayer(DNSRR):
rrname = pkt.getlayer(DNSRR).rrname
rdata = pkt.getlayer(DNSRR).rdata
ttl = pkt.getlayer(DNSRR).ttl
print("[+] 域名: {} --> 别名: {} --> TTL: {}".format(rrname,rdata,ttl))
if __name__=="__main__":
sniff(prn=Get_DNSRR,store=0)
继续使用Scapy
找出Domain Flux
流量:
这里只检查服务器53端口的数据包,DNS数据包有个rcode字段,当其值为3时表示域名不存在。
#coding=utf-8
from scapy.all import *
from IPy import IP as PYIP
# 检查数据包的IP层,提取出IP和TTL字段的值
def Get_TTL(pkt):
try:
if pkt.haslayer(IP):
ip_src = pkt.getlayer(IP).src
ip_sport = pkt.getlayer(IP).sport
ip_dst = pkt.getlayer(IP).dst
ip_dport = pkt.getlayer(IP).dport
ip_ttl = str(pkt.ttl)
print("[+] 源地址: %15s:%-5s --> 目标地址: %15s:%-5s --> TTL: %-5s"%(ip_src,ip_sport,ip_dst,ip_dport,ip_ttl))
except Exception:
pass
# 获取本机发送出去的DNS请求所对应的网站地址 IP --> URL
def Get_DNSRR(pkt):
if pkt.haslayer(DNSRR):
rrname = pkt.getlayer(DNSRR).rrname
rdata = pkt.getlayer(DNSRR).rdata
ttl = pkt.getlayer(DNSRR).ttl
print("[+] 域名: {} --> 别名: {} --> TTL: {}".format(rrname,rdata,ttl))
# 获取本机发送出去的网址请求解析为IP URL --> IP
def Get_DNSQR(pkt):
# 判断是否含有DNSRR且存在UDP端口53
if pkt.haslayer(DNSRR) and pkt.getlayer(UDP).sport == 53:
rcode = pkt.getlayer(DNS).rcode
qname = pkt.getlayer(DNSQR).qname
# 若rcode为3,则表示该域名不存在
if rcode == 3:
print("[-] 域名解析不存在")
else:
print("[+] 解析存在:" + str(qname))
if __name__=="__main__":
sniff(prn=Get_DNSQR,store=0)
版权声明:本文标题:Python 使用Scapy操作DNS流量 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726532565a1074319.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论