利用python的socket库写了一个udp的端口扫描的脚本

什么是 Socket?

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

好处

可以打包成exe文件在没有python环境的系统上运行。扫描的效果较差。

直接上代码


import sys,time
import socketdef scan(host,port):print("")print('Server %s,Port:%s is scaning'%(host,port))  #打印ip和端口try:port=int(port)  #整数型portsock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  # socket 实例化# s = scok.bind(host,port)sock.settimeout(4)    #设置超时时间re = sock.sendto(b'11',(host,port))   #发送数据#print(re)r,i = sock.recv(1024)#print(r)if r != 0:print('open')print("")elif r :print('close')except:print("close")  #异常退出print("")if __name__ == '__main__':host = sys.argv[1]port=sys.argv[2]scan(host,port)

利用socket模块,建一个udp服务端和客户端进行测试
服务端

import socket
# 创建 socket
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定 IP 和端口号
sk.bind(('127.0.0.1', 6000))
while True:# 接收数据报msg, addr = sk.recvfrom(1024)# 打印print('来自[%s:%s]的消息: %s' % (addr[0], addr[1], msg.decode('utf-8')))# 发送数据报sk.sendto(msg, addr)

客户端

import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送数据:
s.sendto( b'11' , ('127.0.0.1', 6000))
# 接收数据:
print (s.recv(1024))
s.close()

进行测试
开启服务端

运行客户端,服务端收到客户端的信息

运行udp.py进行测试,是open,开启状态。

把udp服务端关闭,再次测试,关闭状态。

利用scapy模块写udp端口扫描

什么是scapy?

scapy是python中一个可用于网络嗅探的非常强大的第三方库,可以用它来做 packet 嗅探和伪造 packet。 scapy已经在内部实现了大量的网络协议。如DNS、ARP、IP、TCP、UDP等等,可以用它来编写非常灵活实用的工具。

打包成exe在其他没有python环境的机器上运行出错,扫描的效果比较好。
简单的一个发包

from scapy.all import *data='woshiniyeye'
pkt=IP(src='172.20.10.3',dst='172.20.10.1')/TCP(sport=12345,dport=12345)/data
send(pkt,inter=1,count=5)  #每隔一秒发包,发5次

  • ls() 命令可以查看所有支持的协议
  • ls(IP) 命令列出ip协议头部字段格式,只要想查看哪个协议的参数,括号里就填哪个协议
  • IP().show() 列出ip包的信息
  • lsc() 命令列出scapy的所有命令
  • conf 命令列出scapy 的配置参数

发包的包的格式: 层的协议(参数)/上一层的协议(参数) /要发送的数据
如下:

IP(src='172.20.10.3',dst='172.20.10.1')/TCP(sport=12345,dport=12345)/data

两种发包格式:

发送三层包:send(pkt, inter=0, loop=0, count=1, iface=N)
发送二层包:sendp(pkt, inter=0, loop=0, count=1, iface=N)
使用tcpreplay在第二层以更快的速度发送数据包:sendpfast(pkt, pps=N, mbps=N, loop=0, iface=N)

发包和收包

发包仅仅是发送包,而发包和收包是对发包的回复信息进行收集

  • 三层发包和收包:sr(pkt, filter=N, iface=N)

  • 二层发包和收包:srp(pkt, filter=N, iface=N)

  • 三层发包但是仅仅接受第一个回复:sr1(pkt, inter=0, loop=0, count=1, iface=N)

  • 二层发包但是仅仅接受第一个回复:srp1(pkt, filter=N, iface=N)

  • 在环回口发包并且打印出所有的回复:srloop(pkt, timeout=N, count=N), srploop(…)

利用arp协议获取指定IP的MAC地址

from scapy.all import *ans,unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst="172.20.10.3"))
print(ans)
print(unans)
# ans 是回复的包,想获得ans回复的数据,我们可以查看ans的第一个包
print(ans[0])
# (<Ether  dst=ff:ff:ff:ff:ff:ff type=ARP |<ARP  pdst=172.20.10.3 |>>, <Ether  dst=ff:ff:ff:ff:ff:ff src=3c:a0:67:38:d2:0c type=ARP |<ARP  hwtype=0x1 ptype=IPv4 hwlen=6 plen=4 op=is-at hwsrc=3c:a0:67:38:d2:0c psrc=172.20.10.3 hwdst=00:00:00:00:00:00 pdst=0.0.0.0 |>>)
#ans[0]包中是一个元组,,第一部分是发的信息,第二部分是回复的信息,我们需要的是第二部分的信息for snd,rcv in ans:list_mac=rcv.sprintf("%Ether.src% - %ARP.psrc%") #按照指定的格式打印初我们需要的包print(list_mac)
#3c:a0:67:38:d2:0c - 172.20.10.3

抓包

  • scapy抓包使用 sniff() 函数,这个函数有很多参数

  • count:抓包的数量,0表示无限制;

  • store:保存抓取的数据包或者丢弃,1保存,0丢弃

  • offline:从 pcap 文件读取数据包,而不进行嗅探,默认为None

  • prn:为每一个数据包定义一个函数,如果返回了什么,则显示。例如: - prn = lambda x: x.summary(); ( packct.summar()函数返回的是对包的统计性信息 )

  • filter:过滤规则,使用wireshark里面的过滤语法

  • L2socket:使用给定的 L2socket

  • timeout:在给定的时间后停止嗅探,默认为 None

  • opened_socket:对指定的对象使用 .recv() 进行读取;

  • stop_filter:定义一个函数,决定在抓到指定数据包后停止抓包,如: - stop_filter = lambda x: x.haslayer(TCP);

  • iface:指定抓包的接口

将抓到的数据保存

from scapy.all import *
package=sniff(iface='eth0',count=10)  #扫描eth0网卡的数据包,总数为10个
wrpcap("test.pcap",package)  #将抓取到的包保存为test.pcap文件

查看抓取到的数据包

#coding=utf-8
from scapy.all import *
p=sniff(iface='eth0',count=10) #扫描网卡为eth0得数据包,数量为10个
print(p)    #查看抓到的数据包
# <Sniffed: TCP:0 UDP:9 ICMP:0 Other:1>
print(p[0]) #查看第一个数据包的数据
#
b"\xff\xff\xff\xff\xff\xff\xc8[v\xec5\xed\x08\x00E\x00\x01#8G\x00\x00@\x11\x17=\n`\n\x88\n`\n\xff\xd6\x83\xd6\x83\x01\x0fN\xa0\x00qu-PC\x00\x00H\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x1dF\x02\x00\x00\x00\x00\xd0\xb5\x1d\x07\x00\x00\x00\x003'\x00\x00\x00\x00\x00\x00\xd0\x1dF\x02\x00\x00\x00\x00\xc02\xc5\x05\x00\x00\x00\x00|j\x85`\x00\x00\x00\x00p\xa4/a\x00\x00\x00\x00\xf9\xb9\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xfe\xcc\x05\x00\x00\x00\x00D\xb6\x1d\x07\x00\x00\x00\x00`\xb6\x1d\x07\x00\x00\x00\x00H\xaa {efdced0c-1ada-40e0-a13e-2968030599d4}\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00@\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\xc5\xac"
print(p[0].show()) #查看第一个数据包的详情
# ###[ Ethernet ]### dst       = ff:ff:ff:ff:ff:ffsrc       = 00:50:56:c0:00:08type      = IPv4
###[ IP ]### version   = 4ihl       = 5tos       = 0x0len       = 291id        = 45383flags     = frag      = 0ttl       = 128proto     = udpchksum    = 0xfa31src       = 192.168.6.1dst       = 192.168.6.255\options   \
###[ UDP ]### sport     = 54915dport     = 54915len       = 271chksum    = 0x45ec
###[ Raw ]### load      = "\x00DESKTOP-53BNJAP\x00\x00\x00\x00\x00\x00\x00\x00\xb0rJ\x94y\x01\x00\x00 \xb9\x8f\xcf\x1c\x00\x00\x00 \xe9\x02\x95y\x01\x00\x003'\x00\x00\x00\x00\x00\x00\xa0rJ\x94y\x01\x00\x00\x00\x00\xac\x91y\x01\x00\x00\xe0\xbc\x8f\xcf\x1c\x00\x00\x00\xe0\xbc\x8f\xcf\x1c\x00\x00\x00Vo\xde\xed\xfb\x7f\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\xbb\x8f\xcf\x1c\x00\x00\x00\xb0\x911\x95y\x01\x00\x00p4\x0f\x95y\x01\x00\x00\xa8\xfc {0930d69a-e833-4a6a-93fd-72b68549bdd4}\x00\x8e\x91y\x01\x00\x00\x00\xbb\x8f\xcf\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xa0\xb9\x8f\xcf\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00y\x01\x00\x00\x80\xc8\x830\xd7z\x00\x00:I\xb3\xec\xfb\x7f\x00\x00\x07\x01\x00\xc9\xa9\x19\xf4"None

上面可以看到,我们抓取到了十个UDP的数据包,然后我们可以查看第一个数据包:package[0]是查看第一个数据包的数据,package[0].show()是查看第一个数据包的详细信息,scapy是按照按照 TCP/IP 四层参考模型显示详细包信息的,即:链路层 [Ethernet]、网络层[IP]、传输层[TCP/UDP]、应用层[RAW] 。我们还可以通过协议来查看指定的包:

package[UDP][0].show() ,因为我们这里只有UDP的数据包,所以就没有这样使用。,而我们也可以直接只获取指定层的数据,如: pcap[UDP][1][Ether].dst 这个包里面是等于ff:ff:ff:ff:ff:ff

格式化输出

要对抓取到的数据包进行格式化输出,我们可以使用 packet.sprintf() 函数进行格式化输出
如要读取IP包的源地址和目的地址: IP:%IP.src% -> %IP.dst%

from scapy.all import *
sniff(count=2,prn=lambda x:x.sprintf("{IP:%IP.src% -> %IP.dst%\n}"))


要读取UDP中的源端口和目的端口: UDP:%UDP.sport% -> %UDP.sport%

过滤抓包

如果我们想抓指定类型的数据包,就需要使用 filter 进行过滤,也就是我们在 wireshark 中可以使用的过滤语法

比如说我们只抓取 icmp 的包,并且按照 源ip-> 目的ip 的格式打印出来 。我在一直ping百度,下面是抓包的

sniff(filter="icmp",count=5,prn=lambda x : x.sprintf("{IP:%IP.src%-> %IP.dst%}"))

UDP端口扫描

代码如下 :

from scapy.all import *import optparse
import threading
import sysdef scan(target,port):pkt=IP(dst=target)/UDP(dport=int(port))res=sr1(pkt,timeout=1,verbose=0)if res==None:print(port,'是开放的')def main():parser=optparse.OptionParser("%prog"+"-t <target> -p <port>")parser.add_option('-t',dest='target',type='string',help='目标')parser.add_option('-p',dest='port',type='string',help='端口(多个端口中间用,分隔)')(options,args)=parser.parse_args()target=options.targetports=str(options.port).split(',')if(target==None) or (ports[0]==None):print('请您输入:目标(-t)和端口(-p)或查看帮助菜单(-h)!')sys.exit(0)for port in ports:t=threading.Thread(target=scan,args=(target,port))t.start()if __name__=='__main__':print("""    --------------------------udp端口扫描--------------------------""")main()

用法:
测试

利用nmap模块编写udp扫描

打包成exe在其他没有python环境的机器上运行出错,需要目标机器上安装nmap

nmap模块的两个常用类

  1. PortScanner()类,实现一个nmap工具的端口扫描功能的封装

  2. PortScannerHostDict()类,实现存储与访问主机的扫描结果

安装:pip install python-nmap

PortScanner()类的一些常用方法:

  1. scan()方法:
scan(self,host='127.0.0.1',ports=None,arguments='-sV')

实现指定主机,端口,nmap命令行参数的扫描
参数说明:

hosts:字符串类型,表示扫描的主机的地址,格式可以用"scanme.nmap.org","127.0.0.1/24"表示;
ports:字符串类型,表示要扫描的端口,可以用"22,80,443-1000"表示;
arguments:字符串类型,表示nmap命令行参数,格式为"-sU -sX -sC"表示
import nmap
#实例化
nm = nmap.PortScanner()#端口扫描nm.scan('www.baidu.com','22,80,443','-sV')


2. command_line(self)方法
返回的扫描方法映射到具体的nmap命令行:nm.command_line()

  1. scaninfo(self)方法
    返回nmap扫描信息,格式为字典类型:nm.scaninfo()
  2. all_hosts(self)方法

返回nmap扫描的主机清单,格式为列表类型:

nm.all_hosts()

PortScannerHostDict()类的一些常用方法

  1. hostname(self)方法

返回扫描对象的主机名:nm['14.215.177.39'].hostname()

2. state(self)方法

返回扫描对象的状态,包括四种状态(up,down,unknown,skipped)

nm['14.215.177.39'].state()


3. all_protocols(self)方法

返回扫描的协议:nm['14.215.177.39'].all_protocols()

4.all_tcp(self)方法

返回TCP协议扫描的端口:

nm['14.215.177.39'].all_tcp()


5.tcp(self,port)方法

返回扫描TCP协议port的信息:nm[‘14.215.177.39’].tcp(443)

脚本实现高效的udp端口扫描

代码:

import nmapnm = nmap.PortScanner()
nm.scan(hosts='192.168.100.0/24', arguments='-n -p 161 -sU ')
hosts_list = [(x, nm[x][u'udp'][161]['state']) for x in nm.all_hosts()]
#print nm.all_hosts()
#print nm[u'192.168.100.112'][u'udp'][161]['state']
for host, status in hosts_list:print('{0}:{1}'.format(host, status))

测试图如下:

socket模块教程:https://blog.csdn.net/Kris__zhang/article/details/114904786

time模块教程:https://blog.csdn.net/Kris__zhang/article/details/114884992?spm=1001.2014.3001.5501
另一个端口扫描的教程(扫描tcp开放端口的):https://blog.csdn.net/Kris__zhang/article/details/114888101?spm=1001.2014.3001.5501

python编写udp端口扫描工具全相关推荐

  1. Kali Linux渗透测试之端口扫描(一)——UDP、TCP、隐蔽端口扫描、全连接端口扫描

    端口扫描 二.三.四层发现的目的就是发现存活的IP,在存活的IP上面,展开进一步的扫描,及端口扫描,发现存活主机上存在着哪些开放的端口,端口后面就对应着各种各样的应用程序,应用程序的漏洞都是通过端口体 ...

  2. python监听多个udp端口_用Python写一个UDP端口测试工具(一)

    需求 最近有个运维需求,需要测试客户端的UDP端口与服务器的连通性. 需求也很简单:客户端测往服务端发UDP包,服务端收到包后响应客户端,当客户端能收到服务端的响应则可断定端口是可达的.但是客户端需要 ...

  3. python扫题软件_python 实现端口扫描工具

    # 简单的端口扫描工具 # 作者: Charles # 公众号: Charles的皮卡丘 import time import socket import threading # 判断是否为正确的IP ...

  4. “诸神之眼”——Nmap端口扫描工具使用小手册

    "诸神之眼"--Nmap端口扫描工具使用小手册 1.Nmap介绍 1.1.Nmap简介 Nmap ("Network Mapper(网络映射器)") 是一款开放 ...

  5. 一款强大的端口扫描工具(nmap)

    一款强大的端口扫描工具(nmap) 文章目录 一款强大的端口扫描工具(nmap) 前言 一.Nmap 使用技巧汇总 一.主机发现 二.端口扫描 三.指纹识别与探测 四.伺机而动 五.防火墙/IDS逃逸 ...

  6. 在 Linux 环境下,我用了这款端口扫描工具~

    为了保护计算机不受攻击和各种病毒.木马的侵扰,其实我们可以在网络设备上采取措施,对某些数据包进行阻挡.过滤等,但重要的还是用户需要有一定的意识,采取措施对自己的计算机进行保护安全: 那么,今天杰哥主要 ...

  7. android udp端口扫描,udp端口扫描-报告

    <udp端口扫描-报告>由会员分享,可在线阅读,更多相关<udp端口扫描-报告(17页珍藏版)>请在人人文库网上搜索. 1.网络协议分析利用UDP进行主机端口扫描专 业: 班 ...

  8. 扫描服务器端口信息工具,服务器端口扫描工具

    服务器端口扫描工具 内容精选 换一换 2.3.2 端口扫描Internet上的大部分服务都使用一种基于TCP/IP协议的客户机/服务器的模式.在这种模式下,服务器端在某个TCP或UDP(User Da ...

  9. 需要额外端口信息_使用Python进行TCP端口扫描

    使用Python进行TCP端口扫描 首先我们供给一台主机,要进行的步骤就是对其主机端口的扫描,查看其中开放的端口. 我们创建一个TCP的全连接的扫描器,使用socket来创建连接器. 扫描端口开放 # ...

  10. 交换机端口扫描工具小课堂

    交换机端口扫描工具指用于探测服务器或主机开放交换机端口情况的工具.常被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务. 什么是端口扫描工具? 交换机端口扫描定义是客户端 ...

最新文章

  1. Ubuntu 打开文件 (使用nautilus )
  2. redis中的string
  3. ios nil、NULL和NSNull 的使用
  4. 特斯拉上市十年回报率高达12倍,马斯克做对了什么?
  5. HDU 5536 字典树
  6. 苹果修复老旧设备中的两个 iOS 0day
  7. Vue指令之v-html
  8. 共享OrCAD9.2pSpice9.2+multisim下载地址
  9. java创新创业比赛项目教程_基于JavaWeb的计算机创新创业平台的功能设计与实现...
  10. 黄金分割法c语言源代码,黄金分割法-C语言
  11. contiki学习笔记-udp-server.c文件详细的解析
  12. 在B站被催更的恰饭视频是什么样的?
  13. 招投标行业114个数据源盘点
  14. 分段三次埃尔米特插值
  15. 腾讯招聘信息 爬取案例
  16. 网易运营微专业_用户运营
  17. Homebrew安装与配置(Linux)
  18. 008-break语句与continue语句的使用,循环嵌套
  19. UML图之类图,对象图和包图
  20. 全球与中国口腔引导性骨再生(GTR)膜市场深度研究分析报告

热门文章

  1. win10自带录屏工具
  2. MAML++:HOW TO TRAIN YOUR MAML论文精读
  3. “卫士通”杯首届四川省高校网络攻防大赛文档及题目
  4. win7查找计算机图片,win7系统全盘搜索图片的操作方法
  5. 工具类ConfigTool封装Nacos Config 本地缓存(实战附代码实现)
  6. 偏远的时代covid 19如何迎接下一个技术变革
  7. 欠采样dMRI图像矩阵的低秩稀疏分解
  8. html中好看的英文字体,一组漂亮的英文字体在线演示
  9. CSS:CSS的内联样式
  10. 将html的echarts导入excel,echarts 数据 表格 excel-求Excel数据导入echarts实现成图的代码,不胜感激!...