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错误信息

    

 

六、服务扫描

    

    

 

 

 

 

 

 

 

 

 

 

      

 

 

            

 

 

    

 

 

 

 

    

 

posted @ 2021-03-29 19:07  Annyan  阅读(2)  评论(0编辑  收藏  举报