python的scapy库基础使用

scapy库

一.概述

Scapy是一个功能强大且灵活的Python库,用于操作和探索计算机网络中的数据包。它允许用户构建各种类型的网络数据包,并支持多种网络协议,如TCP、UDP、ICMP、ARP等。Scapy不仅可以发送和接收数据包,还可以捕获、修改和解析网络流量,使用户能够深入研究网络通信并进行网络安全测试。

二.scapy的基本使用

依赖npcap,最好是最新版本

安装:pip install scapy

有两种使用方式:1.交互式使用 2.python中使用

image-20240426141745205

  • 查看当前设备所有网卡信息
>>> show_interfaces()
Source   Index  Name                                    MAC                IPv4            IPv6
libpcap  1      Software Loopback Interface 1           00:00:00:00:00:00  127.0.0.1       ::1
libpcap  10     Realtek PCIe GbE Family Controller      80:fa:5b:11:9b:9e  169.254.136.18  fe80::14b7:abf9:a634:1813
libpcap  14     Intel(R) Dual Band Wireless-AC 7265     60:57:18:26:1f:29  192.168.2.8     fe80::12a1:306f:c371:b4fe
libpcap  17     Microsoft Wi-Fi Direct Virtual Adapter  60:57:18:26:1f:2a  169.254.106.74  fe80::6b57:f4f4:f5cf:5cb2
libpcap  18     WAN Miniport (IP)
libpcap  21     WAN Miniport (IPv6)
libpcap  9      WAN Miniport (Network Monitor)
  • 捕获数据包
>>> pkg=sniff(count=4,iface='Intel(R) Dual Band Wireless-AC 7265',filter='icmp')
如果卡住,说明还未抓到包,当抓到4个包,就会恢复>>>状态
  • 查看数据包
>>> pkg
<Sniffed: TCP:0 UDP:0 ICMP:4 Other:0>

>>> pkg.show()
0000 Ether / IP / ICMP 192.168.2.8 > 192.168.2.1 echo-request 0 / Raw
0001 Ether / IP / ICMP 192.168.2.1 > 192.168.2.8 echo-reply 0 / Raw
0002 Ether / IP / ICMP 192.168.2.8 > 192.168.2.1 echo-request 0 / Raw
0003 Ether / IP / ICMP 192.168.2.1 > 192.168.2.8 echo-reply 0 / Raw

>>> pkg[0]
<Ether  dst=80:05:88:e9:45:11 src=60:57:18:26:1f:29 type=IPv4 |<IP  version=4 ihl=5 tos=0x0 len=31 id=32438 flags= frag=0 ttl=128 proto=icmp chksum=0x36ce src=192.168.2.8 dst=192.168.2.1 |<ICMP  type=echo-request code=0 chksum=0x5941 id=0x64e1 seq=0x78 unused='' |<Raw  load='\\xe1dX' |>>>>

>>> pkg[0].show()
###[ Ethernet ]###
  dst       = 80:05:88:e9:45:11
  src       = 60:57:18:26:1f:29
  type      = IPv4
###[ IP ]###
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 31
     id        = 32438
     flags     =
     frag      = 0
     ttl       = 128
     proto     = icmp
     chksum    = 0x36ce
     src       = 192.168.2.8
     dst       = 192.168.2.1
     \options   \
###[ ICMP ]###
        type      = echo-request
        code      = 0
        chksum    = 0x5941
        id        = 0x64e1
        seq       = 0x78
        unused    = ''
###[ Raw ]###
           load      = '\\xe1dX'
           
>>> pkg[0][IP].ttl
128
  • 保存离线文件
wrpcap('H:\\demo.pcap',pkg)
第一个参数是路径,第二个参数是包名
  • 读离线文件
>>> pkg1=rdpcap('H:\\demo.pcap')
括号跟文件路径
  • 编辑数据包
pkg2=IP(src='192.168.2.8',dst='192.168.2.1')/ICMP(type=8,code=0)/'abcdefg'
  • 发送数据包
    send(pkt):发送三层数据包,但不会受到返回的结果
    sr(pkt):发送三层数据包,返回两个结果,分别是接收到响应的数据包和未收到响应的数据包
    sr1(pkt):发送三层数据包,仅仅返回接收到响应的数据包
    sendp(pkt):发送二层数据包
    srp(pkt):发送二层数据包,并等待响应
    srp1(pkt):发送第二层数据包,并返回响应的数据包

有数字1,就是发送1个数据包,有r就是有返回数据包,有p从二层协议发送数据包
>>> pkg3=sr1(pkg2)
Begin emission:
Finished sending 1 packets.
...*
Received 4 packets, got 1 answers, remaining 0 packets

发送完后返回的响应就存储在pkg3变量里
三.python使用scapy库
# 使用pycharm发送icmp报文
from scapy.all import *
from scapy.layers.inet import *

# 编写一个icmp包
pkg = IP(src='192.168.2.8', dst='www.woniuxy.com') / ICMP() / 'abcdefg'
# 发送数据包
pkg1 = sr1(pkg, verbose=0)
print(pkg1[IP].ttl)
四.基于arp扫描

arp作用:通过IP地址查找mac地址

pkg = ARP(pdst='192.168.2.33', psrc='192.168.2.8', op=1)
pkg2 = sr1(pkg, verbose=0)
print(pkg2[ARP].hwsrc)


优化
try:
    pkg = ARP(pdst='192.168.2.100', psrc='192.168.2.8', op=1)
    pkg2 = sr1(pkg, timeout=1)
    print(pkg2[ARP].hwsrc)
except Exception:
    print('该IP的主机不存在')
    
优化:引入循环
for i in range(1, 255):
    try:
        pkg = ARP(pdst=f'192.168.2.{i}', op=1)
        pkg2 = sr1(pkg, verbose=0, timeout=1)
        print(f'192.168.2.{i}的MAC是:{pkg2[ARP].hwsrc}')
    except Exception:
        print(f'192.168.2.{i}的MAC不存在')
        
优化:引入多线程(作业)
五.TCP三次握手
    F:FIN 结束,结束会话
    S:SYN 同步,表示开始会话请求
    R:RST 复位,中断一个连接
    P:PUSH 推送,数据包立即发送
    A:ACK 应答
    U:URG 紧急
    E:ECE 显式拥塞提醒回应
    W:CWR 拥塞窗口减少


# 第一次握手包
pkg = IP(dst='192.172.0.100') / TCP(dport=3306, flags='S')
pkg2 = sr1(pkg, verbose=0, timeout=1)
# 第二次握手包(pkg2)

# 第三次握手包
ack = pkg2[TCP].seq + 1
seq = pkg2[TCP].ack
pkg3 = IP(dst='192.172.0.100') / TCP(dport=3306, flags='A', seq=seq, ack=ack)
# 发送第三个握手包
pkg4 = sr1(pkg3, verbose=0, timeout=1)
# 返回了第四个包,整个三次握手就成功了
六.基于TCP的端口扫描
for i in range(1, 65536):
    random_port = random.randint(10000, 20000)
    pkg = IP(dst='192.172.0.100') / TCP(dport=i, sport=random_port, flags='S')
    pkg2 = sr1(pkg, verbose=0, timeout=1)
    if pkg2[TCP].flags == 'SA':
        print(f'端口:{i}已开放')
    elif pkg2[TCP].flags == 'RA':
        # print(f'----端口:{i}未开放----')
        pass
七.基于scapy的三次握手四次挥手
from scapy.all import *
from scapy.layers.inet import *
import random

random_port = random.randint(10000, 65535)
pkg1 = IP(src="192.168.7.25", dst="192.172.0.100") / TCP(sport=random_port, dport=8080, seq=3472901066, ack=0,
                                                         flags="S")
pkg2 = sr1(pkg1, iface="Intel(R) Dual Band Wireless-AC 7265")
seq = pkg2[TCP].ack
ack = pkg2[TCP].seq + 1
pkg3 = IP(src="192.168.7.25", dst="192.172.0.100") / TCP(sport=random_port, dport=8080, seq=seq, ack=ack, flags="A")
send(pkg3, verbose=0, iface="Intel(R) Dual Band Wireless-AC 7265")

pkg4 = IP(src="192.168.7.25", dst="192.172.0.100") / TCP(sport=random_port, dport=8080, seq=seq, ack=ack, flags="FA")
pkg5 = sr1(pkg4, iface="Intel(R) Dual Band Wireless-AC 7265")
pkg6 = IP(src="192.168.7.25", dst="192.172.0.100") / TCP(sport=random_port, dport=8080, seq=seq + 1, ack=ack + 1,
                                                         flags="A")
send(pkg6, verbose=0, iface="Intel(R) Dual Band Wireless-AC 7265")
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Scapy是一个强大的交互式数据包处理程序,使用Python编写。它可以伪造或解码各种网络协议的数据包,发送、捕获、匹配请求和回复包等等。它可以轻松处理一些常见操作,如端口扫描、tracerouting、探测、单元测试、攻击或网络发现。Scapy还具有一些其他优秀的特性,如发送无效数据帧、注入修改的802.11数据帧、解码加密通道(VOIP)上的WEP、ARP缓存攻击(VLAN)等。它是其他工具无法完成的任务的理想选择。\[3\] 在使用Scapy之前,你需要导入相关的模块。例如,你可以使用以下代码导入Scapy的相关模块: ``` from scapy.layers.inet import * from scapy.all import * ``` 接下来,你可以使用Scapy构造数据包、发送数据包、捕获数据包等等。你可以使用`IP()`、`TCP()`等函数构造不同类型的数据包,并使用`send()`或`sendp()`方法发送数据包。你还可以使用`sniff()`函数来捕获数据包,并指定过滤条件、网卡、处理函数和捕获数量等参数。你还可以使用`wrpcap()`和`rdpcap()`函数来保存和读取数据包。\[2\] 总之,Scapy是一个功能强大的Python,用于处理网络数据包。它提供了丰富的功能和灵活的接口,使得网络数据包的处理变得更加简单和高效。 #### 引用[.reference_title] - *1* *2* [Python-scapy](https://blog.csdn.net/qingguaxiaoxiao/article/details/131170191)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python———scapy(数据包发送)](https://blog.csdn.net/weixin_43803070/article/details/90549701)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值