黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第四章 使用SCAPY掌控网络(1)窃取电子邮件凭证



文章目录

  • 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第四章 使用SCAPY掌控网络(1)窃取电子邮件凭证
  • 写在前面
  • 窃取电子邮件凭证
  • 小试牛刀



写在前面

偶尔,你会遇到这样一个经过深思熟虑的、令人惊叹的Python库,即使专门用一整章的篇幅来描述它也描述不好。Philippe Biondi在创建了一个包操作库Scapy。你可能会读完这一章,然后意识到我们让你在前两章做了很多工作,其实只需要一两行Scapy就可以完成。Scapy强大而灵活,其能力几乎是无限的。我们将通过嗅探流量来窃取明文电子邮件凭证,然后通过ARP毒害网络上的目标机器,以便我们能够嗅探他们的流量。我们将通过扩展Scapy的PCAP处理,从HTTP流量中分割出图像,然后对其执行面部检测,以确定图像中是否存在人类,从而结束这一切。
建议在Linux系统下使用Scapy,因为它是为了与Linux协同工作而设计的。Scapy的最新版本确实支持Windows,但我们将假设您使用的是具有完整功能的Scapy安装的Kali虚拟机(VM)。如果你没有Scapy,可以去https://scapy.net/安装它。
现在,假设我们已经渗透到目标局域网(LAN)中。下面将可以使用本章中学习的技术来嗅探本地网络上的流量。

窃取电子邮件凭证

我们已经花了一些时间了解了使用python嗅探的细节。接下来我们将了解Scapy的接口以嗅探数据包和解析其内容。我们将构建一个非常简单的嗅探器来捕获SMTP、POP3和IMAP凭据。稍后,通过将嗅探器与ARP中毒中间人攻击(MITM)相结合,我们可以轻松地从网络上的其他机器窃取凭据。当然,这项技术可以应用于任何协议,或者简单地捕获所有流量并将其存储在pcap文件中进行分析,我们也将对此进行演示。
为了了解Scapy,我们先构建一个嗅探器框架,它可以简单地解析和转储数据包。名为sniff的函数如下所示:

sniff(filter="",iface="any",prn=function,count=N)

filter参数允许我们为Scapy嗅探到的数据包指定一个Berkeley Packet Filter(BPF)过滤器,可将其留空以便嗅探所有数据包。例如,要嗅探所有的HTTP包,可以使用tcp端口80的BPF过滤器。iface参数告诉嗅探器要嗅探哪个网络接口;如果留空,Scapy将嗅探所有接口。prn参数指定要为每个与过滤器匹配的数据包调用的回调函数,回调函数接收数据包对象作为其单个参数。count参数指定要嗅探的数据包数量;如果留空,Scapy会一直嗅探下去。
我们从创建一个简单的嗅探器开始,它可以嗅探数据包并转储其内容。然后,我们将其扩展为仅嗅探与电子邮件相关的命令。打开mail_sniffer.py并输入以下代码:

from scapy.all import sniff

def packet_callback(packet):
    print(packet.show())

def main():
    sniff(prn=packet_callback, count=1)

if __name__ == '__main__':
    main()

我们先定义一个回调函数,用于接收每个嗅探到的数据包,然后简单地告诉Scapy在所有接口上开始嗅探,无需过滤。现在,我们运行一下脚本,应该会看到类似以下的输出:

black hat python 2nd black hat python 2nd pdf_python


这是多么容易啊!我们可以看到,当网络上接收到第一个数据包时,回调函数使用了内置函数packe.show()显示数据包内容并剖析一些协议信息。在进行脚本调试时,使用show()是一种很好的方法,可以确保捕获所需的输出。

到目前,我们已经完成了基本的嗅探器,接下来我们将应用一个过滤器并向回调函数添加一些逻辑,以剥离与电子邮件相关的身份验证字符串。

在下面的示例中,我们将使用数据包过滤器,以便嗅探器仅显示我们感兴趣的数据包。为此,我们将使用BPF语法,也称为Wireshark样式。您将在诸如tcpdump之类的工具以及Wireshark使用的数据包捕获过滤器中遇到这种语法。

这里介绍一下BPF过滤器的基本语法。我们可以在筛选器中使用三种类型的信息,可以指定描述符(如特定主机、接口或端口)、流量方向和协议,如下表所示。我们可以包括或省略类型、方向和协议(这取决于您希望在嗅探数据包中看到的内容)。

black hat python 2nd black hat python 2nd pdf_SMTP_02


例如,表达式src 192.168.1.100指定一个筛选器,仅捕获源于机器192.168.1.100的数据包。与之相反的筛选器是dst 192.168.1.100,它仅捕获目标为192.168.1.100的数据包。同样,表达式tcp端口110或tcp端口25指定了一个过滤器,只传递来自或前往端口110或25的tcp数据包。接下来,我们在示例中使用BPF语法编写一个特定的嗅探器:

from scapy.all import sniff, TCP, IP

# the packet callback
def packet_callback(packet):
    if packet[TCP].payload:
        mypacket = str(packet[TCP].payload)
        if 'user' in mypacket.lower() or 'pass' in mypacket.lower():
            print(f"[*] Destination: {packet[IP].dst}")
            print(f"[*] Destination: {str(packet[TCP].payload)}")

def main():
    # fire up the sniffer
    sniff(filter='tcp port 110 or tcp port 25 or tcp port 143', prn=packet_callback, store=0)

if __name__ == '__main__':
    main()

这相当简单,我们更改了sniff函数,添加了一个BPF过滤器,只包括发往公共邮件端口110(POP3)、143(IMAP)和25(SMTP)的流量。这里还使用了一个名为store的新参数,当设置为0时,它可以确保Scapy不会将数据包保留在内存中。如果您打算长期运行一个嗅探器,最好使用这个参数,这样不会消耗大量的RAM。我们调用回调函数时,会检查它是否有数据有效负载,以及有效负载是否包含典型的USER或PASS邮件命令。如果我们检测到一个身份验证字符串,我们会打印出要将其发送到的服务器和数据包的实际数据字节。

小试牛刀

以下是尝试将邮件客户端连接到的虚假电子邮件帐户的一些输出示例:

black hat python 2nd black hat python 2nd pdf_黑帽python_03


如上图所示,脚本已经启动监听,另开一个命令行端口,通过swaks检查邮箱连通性,如下图。

black hat python 2nd black hat python 2nd pdf_kali_04


这个时候,嗅探器上出现了一些warning,如下图所示。

black hat python 2nd black hat python 2nd pdf_kali_05


接着尝试用swaks发送邮件,如下图(这不是正常发送的,邮箱很久木有用,被冻结了)。

black hat python 2nd black hat python 2nd pdf_SCAPY_06

嗅探器准确捕获了相关内容,如下图,

black hat python 2nd black hat python 2nd pdf_黑帽python_07


更换电信189邮箱,再试试看,特意打印一下,实际上能够截获相关内容,如下图。

black hat python 2nd black hat python 2nd pdf_黑帽python_08


但是原书代码中,会报上面提示的WARNING,具体报告警的语句是“mypacket = str(packet[TCP].payload)”,貌似是直接str()强制类型转换引起的,原书中的代码也会报同样的告警信息,后续再研究一下。

实际上邮件已经正常发出去了,如下图。

black hat python 2nd black hat python 2nd pdf_kali_09


我们可以看到,我们的邮件客户端正在尝试登录到服务器,并通过线路发送明文凭证。这是一个非常简单的例子,展示了如何在渗透测试期间使用Scapy嗅探脚本并将其转化为有用的工具。该脚本适用于邮件流量,因为我们将BPF过滤器设计为关注与邮件相关的端口。您可以更改该过滤器以监视其他流量;例如,将其更改为tcp端口21以监视FTP连接和凭据。

嗅探自己的流量可能很有趣,但与朋友一起嗅探总是更好的;让我们看看如何执行ARP中毒攻击来嗅探同一网络上目标机器的流量。