Python程序设计
一、Socket模块
1、概念
目的:帮助在网络上的两个程序之间建立信息通道
分类:
(1)服务端Socket
(2)客户端Socket
当创建了一个服务端Socket之后,这个Socket就会在本机的一个端口上等待连接
客户端Socket会访问这个端口,当两者完成连接之后,就可以进行交互了
2、实例化Socket类---------->需要三个参数
(1)地址族
(2)流
(3)使用的协议
实例化格式:
[注]:1.family------->使用的地址族
2.type--------->指明Socket类型
3.第三个参数指使用的协议,这个参数是可选的。通常赋值“0”,由系统自动选择。
初始化TCP类型的Socket:
初始化UDP类型的Socket:
3、Socket常用的函数
(1)服务端函数
1.bind():会将之前创建Socket与指定的IP地址和端口进行绑定。
2.listen():用于在使用TCP的服务端开启监听模式(可以使用一个参数来指定可以挂起的最大连接数量)
3.accept():用于在使用TCP的服务端接收连接,一般是阻塞态
接受TCP连接并返回(conn,address)------>coon是新的套接字对象,可以用来接收和发送数据;address是连接客户端的地址。
(2)客户端的函数
1.connect():用于在使用TCP的客户端去连接服务端时使用,使用的参数时一个元组,形式为(hostname,port)
(3)服务端和客户端都可以使用的函数
1.send():用于在使用TCP时发送数据,完整的形式为send(string[,flag])------->将string代表的数据发送到已经连接的Socket,返回值是发送字节的数量,但是可能未将指定的内容全部发送。
2.sendall():用于在使用TCP时发送数据,完整的形式为send(string[,flag])------->完整发送TCP数据。成功返回None,失败则抛出异常。
3.recv():用于在使用TCP时接收数据-------->数据以字符串形式返回,bufsize指定最多可以接收的数量
4.sendto():用于在使用UDP时发送数据------->返回值时发送的字节数
5.recvfrom():UDP专用,接收数据,返回数据远端的IP地址和端口。
6.close():关闭socket
二、python-nmap模块
1、nmap的功能
(1)主机发现功能;(2)端口扫描;(3)服务及版本检测;(4)操作系统检测
2、python-nmap
(1)Linux中安装nmap和python-nmap
(2)基本用法
python-nmap模块类的实例化
1.PortScanner类:实现nmap工具功能的封装
2.PortScannerAsync类:实现异步扫描
(3)python-nmap模块中的函数
1.PortScanner类
scan()函数:
all_hosts()函数:返回一个被扫描的所有主机列表
command_line()函数:返回在当前扫描中使用的命令行
csv()函数:返回值是一个CSV(逗号分隔值文件格式)的输出
has_host(self,host)函数:检查是否由host的扫描结果。如果有则返回True,否则返回False
scaninfo()函数:列出一个扫描信息的结构
2.PortScannerAsync类
still_scanning():如果扫描正在进行,则返回True,否则返回False
wait(self,timeout=None):函数表示等待时间
stop():停止当前的扫描
三、Scapy模块文件
1、Scapy的基本操作
(1)Scapy采用分层的形式来构造数据包
(2)用ls()函数来查看一个类所拥有的属性
1.使用ls(Ether())来查看Ether类的属性
2.使用ls(IP())来查看IP类的属性
(3)Scapy模块中的函数
1.send ()和 sendp() 只发不收
send()------>第三层,发送IP数据包
sendp()----->第二层,发送Ether数据包
2.fuzz()函数
发送一个内容是随机填充的数据包,且保证数据包的正确性。
3.sr()、sr1()和srp()
在Scapy中提供了三个用来 发送和接收数据包的函数,分别是sr()、sr1()和srp(),其中,sr()和sr1()主要用于第三层,例如IP和ARP等。而srp()用于第二层。
4.sniff()
可以使用参数filter对数据包进行过滤。
5.iface、count 参数:
iface可以用来指定所要进行监听的网卡
count用来指定监听到数据包的数量,达到指定的数量就会停止监听
四、情报收集
1、信息收集基础
信息收集获得信息的方法可以分成两种:被动扫描和主动扫描。
1.选择扫描目标的nmap语法如下所示。
(1)扫描指定IP主机:nmap 192.168.169.133
(2)扫描指定域名主机:nmap www.nmap.com。
(3)扫描指定范围主机:nmap 192.168.169.1-20。
(4)扫描一个子网主机:nmap 192.168.169.0/24。
2.对目标的端口进行扫描的nmap语法如下所示。
(1)扫描一个主机的特定端口:nmap -p 22 192.168. 169.1。
(2)扫描指定范围端口:nmap -p 1-80 192.168. 169.1。
(3)扫描100个最为常用的端口:nmap -F 192.168. 169.1。
3.对目标端口状态进行扫描的nmap语法如下所示。
(1)使用TCP全开扫描:nmap -sT 192.168. 169.1。
(2)使用TCP半开扫描:nmap -sS 192.168. 169.1。
(3)使用UDP扫描:nmap -sU -p 123,161,162 192.168. 169.1。
4.对目标的操作系统和运行服务进行扫描的nmap语法如下所示。
(1)扫描目标主机上运行的操作系统:nmap -O 192.168.169.1。
(2)扫描目标主机上运行的服务类型:nmap -sV 192.168.169.1。
2、主机状态扫描
(1)基于ARP的活跃主机发现技术
ARP的中文名字是“地址解析协议”,主要用在以太网中。
需要明确的是,所有的主机在互联网中通信的时候使用的是IP地址,而在以太网中通信时使用的却是硬件地址(也就是常说的MAC地址)。
1.核心思想就是要产生一个ARP请求,首先查看Scapy库中ARP类型数据包中需要的参数,大多数参数都有默认值,其中,hwsrc和psrc分别是源硬件地址和源IP地址
2. 因为发送的是广播数据包,所以需要在Ether层进行设置,首先查看一下Ether的格式
dst是目的硬件地址,
src是源硬件地址,这里面src会自动设置为本机地址。
3.构造一个扫描192.168.26.100的ARP请求数据包并将其发送出去
4. 对这个请求的回应进行监听,如果得到回应,那么证明目标在线,并打印输出这个主机的硬件地址
5. 如果发出这个数据包,但是没有收到这个数据包回应,则说明目标主机不在线
2、基于ICMP的活跃主机发现技术
利用ICMP实现的活跃主机扫描程序
3、基于UDP的活跃主机发现技术
UDP协议是传输层的协议
五、端口扫描
1、基于TCP全开的端口扫描技术
根据收到对应的应答包来判断目标端口的状态(三种情况)
第一种:如果此时resp的值为空,就表示 没有收到来自目标的回应。
第二种:当收到了回应的数据包之后,需要判断一下这个数据包是“SYN+ACK”类型还是“RST”类型的。 第三种:如果resp.getlayer(TCP).flags的结果不是0x12,而是0x14(表示RST),那么表明目标端口是关闭的。
2、基于TCP半开的端口扫描技术
如果目标端口是开放的,那么在接到主机端口发出的SYN请求之后,就会返回一个SYN+ACK回应,表示愿意接受这次连接的请求,然后主机端口不再回应一个ACK,而是发送一个 RST 表示中断这个连接。这样实际上并没有建立好完整的TCP连接,所以称为半开。
目标端口的filtered状态,这种状态往往是由 包过滤机制造成的,过滤可能来自专业的防火墙设备、路由器规则或者主机上的软件防火墙。这种情况下会让扫描工作变得很难,因为这些端口几乎不提供任何信息。不过有时候它们也会响应ICMP错误消息,但更多时候包过滤机制不做出任何响应。
当TCP连接的数据包被屏蔽时,一般会返回如下所示的几种ICMP错误信息
六、服务扫描