黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第三章 网络工程-原始套接字与嗅探(1)主机发现工具与包嗅探

黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第三章 网络工程-原始套接字与嗅探(1)主机发现工具


写在前面

网络嗅探能够让你看清流入和流程目标主机的数据包,因此在(漏洞)开发前后有很多实际用途。有些情况下,你可以使用现成的网络嗅探工具,例如Wireshark(https://wireshark.org)或者Scapy(下一章节将会介绍)这样的Python解决方案。尽管如此,了解如何快速使用自己的嗅探器查看和解码网络流量还是很有好处的。
编写这样的工具能够让你对成熟的工具有深刻的了解,因为这些工具可以处理更加精细的点,而您只需付出较少的努力。你还将学习一些新的python技术,这也许会更好的理解低级网络位是如何工作的。
在前面的章节中我们介绍了如何使用TCP和UDP发送和接收数据,这可能是读者跟大多数网络服务交互的方式。但是,在这些高级协议下面,是决定网络数据包发送和接收方式的构建块。你将会使用原始套接字访问底层次的网络信息,例如原始的IP协议和ICMP协议头。在本章中,我们无需解包任何的以太网消息,但是如果你想要执行一些底层次的攻击,如ARP中毒,或者你想要开发无线接入工具,你应当熟悉以太网帧及其使用。
接下来,就让我们从如何发现网络上的活动主机开始这段旅程。

构建一个UDP主机发现工具

我们的嗅探器的主要目的是发现目标网络上的主机。作为一个攻击者,希望看到网络上的所有潜在目标,以便能够进一步的侦查和利用。
我们将会使用大多数操作系统已知的行为来确定在特定的IP地址上是否有活动的主机。当我们向主机的一个关闭的端口发送UDP数据报的时候,主机一般情况下会返回端口不可达的ICMP消息。这种ICMP消息告诉我们目标地址有个活动主机,如果没有主机的话,我们通常不会收到任何UDP响应数据报。因此,我们必需选择一个不太使用的UDP端口,为了获得更大的范围,我们可以探测多个端口,以确保没有命中活动的UDP服务。
为什么使用UDP协议?因为在整个子网中发送消息并等待ICMP响应没有任何开销。这是一个非常简单的扫描工具,因为大部分工作都要解码和分析各种网络协议头。我们将为Windows和Linux实现这个主机扫描程序,以最大限度地提高在企业环境中使用它的可能性。
我们还可以在扫描工具中构建额外的逻辑,以便在我们发现的任何主机上启动完整的Nmap端口扫描。这样,我们可以确定他们是否有可行的网络攻击面。接下来我们就开始。

windows和linux下的包嗅探工具

在Windows中访问原始套接字的过程与在Linux上略有不同,但我们希望能够灵活地将同一个嗅探器部署到多个平台。因此,我们将创建一个socket对象,然后确定我们在哪个平台上运行。在Windows下,我们将通过一个socket输入/输出控制设置一些额外的标志,这允许在网络接口上启用混杂模式。
在第一个示例中,我们简单地设置了原始socket嗅探,读入一个数据包,然后退出:

import socket
import os

# host to listen on
HOST = '192.168.65.141'

def main():
    # create raw socket, bin to public interface
    if os.name == 'nt':
        socket_protocol = socket.IPPROTO_IP
    else:
        socket_protocol = socket.IPPROTO_ICMP
    
    # constructing socket objet with parameters nessessary for sniffinf packets on network interface
    sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)
    sniffer.bind((HOST, 0))

    # set the socket options, include the iP header in the capture
    sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

    # if we are using windows, send an IOCTL to the network card driver to enable promiscuous mode.
    if os.name == 'nt':
        sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
    
    # read one packet, and print out the entire raw packet with no decoding
    print(sniffer.recvfrom(65565))

    # if we're on windows, turn off promiscuous mode
    # if we're on windows, disable the promiscuous mode
    if os.name == 'nt':
        sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
    
if __name__ == '__main__':
    main()

嗅探器在Windows下和Linux下的不同之处在于,Windows将会允许我们嗅探所有进来的数据包而不关注协议,Linux将会强制我们设置嗅探的是ICMP数据包。注意我们现在启用的是混杂模式,这将会需要Windows下的管理员或者Linux下的root权限。混杂模式允许我们嗅探网卡所见的所有数据包,包括那些跟我们的特定主机无关的。如果读者当前是在虚拟机上运行的windows,很有可能会收到一个提示信息,说明客户机操作系统正在启用混杂模式,允许即可。到目前为止,我们已经能做好了进行一个实际嗅探的准备。

小试牛刀

下面我们就分别在windows和linux下试用一下我们的脚本。

在Windows主机下

新开一个命令行窗口,直接python运行上述代码,如下图所示,说明已经开始监听。
在这里插入图片描述
在linux虚拟机下,ping 虚拟机的网关地址(192.168.65.1),在嗅探器上会得到如下图所示的内容。
在这里插入图片描述
在windows主机下直接ping虚拟机网关地址(192.168.65.1),嗅探器上返回结果如下图所示。
在这里插入图片描述

在Linux下

新开一个命令行窗口,同样运行脚本(试了一下,linux下得用sudo,另外需要修改一下脚本监听linux机器的IP地址),开始监听,如下图所示。
在这里插入图片描述
在windows主机下ping一下linux主机IP,嗅探器返回如下的结果,如下图。
在这里插入图片描述
在运行嗅探器的linux虚拟机本机ping其IP地址,嗅探器返回如下的结果,如下图。
在这里插入图片描述
从上面的运行示例中可以看出,我们正确捕获了初始化ICMP的ping请求包。仅仅获取一两个数据包没有实际的意义,接下来我们将加入一下其它的功能,来获取更多的包,并解码数据包。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值