跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

渗透基金会——使用IMAP协议阅读邮件

精选回复

发布于

0x00 前言

在渗透测试中,当我们获取用户的邮箱凭证,需要分析邮箱内容时,可以选择IMAP协议实现自动化,提高效率。

本文以Exchange为例,介绍了通过IMAP协议下载邮件和附件,开源代码,共享脚本编写细节的方法。

0x01 简介

本文将介绍以下内容:

基础知识

打开Exchange IMAP功能和登录日志。

3 Python3实现细节

开放源代码

0x02 基础知识

1.IMAP

全称是互联网邮件访问协议,即交互式邮件访问协议。

它是一个邮件获取协议,可以从邮件服务器获取邮件的信息。

使用端口143

2.IMAP4_SSL

全称是IMAP over SSL,是基于SSL安全协议的IMAP协议的变种。

非对称加密继承了SSL安全协议,具有很高的安全性和可靠性,可以防止邮件的泄露,也用于接收邮件。

使用端口993。

3.Python3 imaplib库

官方文件:

https://docs.python.org/3/library/imaplib.html

该模块定义了三个类,IMAP4、IMAP4_SSL和IMAP4_stream。

为了提高安全性,我们通常使用子类IMAP4_SSL进行安全连接。

4.Python3 email库

官方文件:

https://docs.python.org/3/library/email.html

当我们使用imaplib库读取邮件时,需要使用email库将收到的消息转换成EmailMessage对象,这样可以更方便地处理邮件内容。

0x03 Exchange开启IMAP功能和登录日志

默认情况下,在Exchange中不启用IMAP4客户端连接。

参考资料:

https://docs . Microsoft . com/en-us/exchange/clients/pop 3-and-IMAP 4/configure-IMAP 4?view=exchserver-2019

打开方法如下:

1.启动IMAP4服务并将该服务配置为自动启动。

Powershell命令如下:

启动服务MSExchangeIMAP4启动服务MSExchangeIMAP4BE

set-Service ms exchange IMAP 4-startup type Automatic;set-Service ms exchange IMAP 4 be-startup type Automatic

2.配置IMAP4设置

格式如下:

set-IMAP settings-external connection settings ':',':'.-x509 certificate name[-SSL bindings ':',':'.UnencryptedOrTLSBindings ':',':'.]

Powershell命令实例:

set-IMAP settings-external connection settings ' mail . test . com:993:SSL ',' mail . test . com:143:TLS '-x509 certificate name mail.test.com

3.重新启动IMAP4服务

Powershell命令如下:

restart-Service ms exchange IMAP 4;重新启动-服务MSExchangeIMAP4BE

4.检查配置:

Powershell命令如下:

get-Service ms exchange IMAP 4;Get-Service MSExchangeIMAP4BE

get-IMAP settings | Format-List * connection settings,*Bindings,X509CertificateName

通过邮件用户登录OWA,选择设置-选项,就可以看到IMAP的配置,如下图所示

2-1.png

默认情况下,Exchange中不启用日志记录。

参考资料:

https://docs . Microsoft . com/en-us/exchange/configure-protocol-logging-for-pop 3-and-IMAP 4-exchange-2013-help

打开方法如下:

1.打开日志功能。

Powershell命令如下:

set-IMAP settings-Server ' cas 01 '-ProtocolLogEnabled $ true

2.重新启动服务

重启IMAP4服务,Powershell命令如下:

restart-Service ms exchange IMAP 4;重新启动-服务MSExchangeIMAP4BE

3.检查配置信息:

Powershell命令如下:

get-IMAP settings | Format-List protocol logenabled,LogFileLocation,LogPerFileSizeQuota,LogFileRollOverSettings

默认的日志保存路径是:C:\ Program Files \ Microsoft \ Exchange Server \ V15 \ Logging \ IMAP 4。

0x04 Python3实现细节

测试代码1

导入imaplib

M=imaplib。IMAP4_SSL('192.168.1.1 ',' 993 ')

M.login('用户1 ','密码')

data=M.list()

打印(数据)

注销()

上面的代码用于获取所有邮箱文件夹的对应名称。

(1)M.list()用于列出邮箱文件夹的名称。

注:

在不同的邮件系统中,默认只有收件箱名称是统一的,发件箱名称一般是不同的。例如,Exchange的发件箱名称是“已发送邮件”。

测试代码2

导入imaplib

M=imaplib。IMAP4_SSL('192.168.1.1 ',' 993 ')

M.login('用户1 ','密码')

M.select('收件箱')

typ,data=M.search(无,'全部')

对于数据[0]中的数字。拆分():

typ,data=M.fetch(num,'(RFC822)')

print('Message %s\n%s\n' % (num,data[0][1]))

M.close()

注销()

上面的代码用于读取收件箱中所有邮件的内容。

(1)M.select(“收件箱”)表示选择收件箱。

如果你阅读Exchange的发件箱,对应的代码是M.select(“已发送邮件”)。

如果add参数2为False,则表示设置了只读标志,不允许修改邮箱。例如,M.select('已发送邮件',False)

(2)在typ中,data=m.search (None,' all '),None表示使用默认的ASCII编码,ALL表示搜索条件为所有邮件。

如果要过滤发件人是user2的邮件,对应的语句是typ,msgnums=m.search (none,'(from' user2 ')')

M.search()返回的结果是邮件的序列号。例如,在我的测试环境中,我的收件箱中有9封邮件,返回的结果是:

[b'1 2 3 4 5 6 7 8 9']

注:

需要区分邮件序列号和UID。

邮件序列号是从1开始累加的序列,UID是区分邮件的唯一标识符。

以下代码可用于获取邮件序列号和UID之间的对应关系:

导入imaplib

M=imaplib。IMAP4_SSL('192.168.1.1 ',' 993 ')

M.login('用户1 ','密码')

M.select('收件箱')

typ,data=M.search(无,'全部')

对于数据[0]中的数字。拆分():

typ,data=M.fetch(num,' UID ')

打印(数据)

M.close()

注销()

(3)M.fetch(num,'(RFC822)')用于提取邮件消息。

参数1num表示所选的邮件序列号。

参数1支持同时提取多个连续的邮件消息,例如,同时提取邮件序列号为2-5的邮件的命令是M.fetch('2:5 ','(RFC822)')

参数2'(RFC822)'表示数据项的名称,其中'(RFC822)'相当于BODY[],只返回消息正文文本的格式和大小的汇总信息。

如果你只想得到消息头的内容,你可以使用下面的代码:

M.fetch(num,' BODY[HEADER]')

如果您只想获取消息体的内容,可以使用下面的代码:

M.fetch(num,' BODY[TEXT]')

(4)M.close()用于关闭当前选中的邮箱。

在执行M.select()之后使用

测试代码3

导入imaplib

导入电子邮件

M=imaplib。IMAP4_SSL('192.168.1.1 ',' 993 ')

M.login('用户1 ','密码')

M.select('收件箱')

typ,data=M.search(无,'全部')

对于数据[0]中的数字。拆分():

typ,data=M.fetch(num,'(RFC822)')

msg=email . message _ from _ bytes(data[0][1])

对于msg.walk()中的部分:

if part . get(' Content-Disposition '):

文件名=part.get _文件名()

if bool(文件名):

用open(文件名,' wb ')作为f:

f . write(part . get _ payload(decode=True))

M.close()

注销()

上面的代码用于保存收件箱中所有邮件的附件。

(1)msg=email . message _ from _ bytes(data[0][1])用于将数据转换为email对象。

(2)msg.walk()用于遍历邮件对象的所有部分。

(3)part . get(' Content-Disposition ')用于获取对应字段名Content-Disposition的字段值。

如果电子邮件包含附件,它将具有字段Content-Disposition,该字段可用于确定电子邮件是否包含附件。

(4)part.get_filename()用于获取头的Content-Disposition字段中名为filename的参数值,该参数值对应于附件的名称。

(5)part.get_payload(decode=True)用于获取附件内容。

由于附件内容是以Base64编码的形式存储的,所以在读取时需要为Base64解码添加参数decode=True。

测试代码4

导入imaplib

导入电子邮件

M=imaplib。IMAP4_SSL('192.168.1.1 ',' 993 ')

M.login('用户1 ','密码')

M.select('收件箱')

typ,data=M.search(无,'全部')

对于数据[0]中的数字。拆分():

typ,data=M.fetch(num,'(RFC822)')

msg=email . message _ from _ bytes(data[0][1])

with open(num.decode('utf8 ')')。eml ',' wb ')作为f:

f.write(字节(消息))

M.close()

注销()

上面的代码用于将收件箱中的所有邮件逐一保存,以邮件序列号为名称,以eml为后缀,可以用Outlook打开。

0x05 开源代码

我已经将完整的代码上传到github,地址如下:

https://github . com/3g student/Homework-of-Python/blob/master/IMAP manage . py

该代码支持以下功能:

查看文件夹配置

从收件箱下载所有附件

从发件箱下载所有附件。

从收件箱下载所有邮件

下载发件箱中的所有邮件

下载文件时,先用邮箱用户名创建一个文件夹,保存对应用户下载的文件。

默认情况下,支持通过IMAP4_SSL访问Exchange邮件。对于不同的邮件系统,收件箱和不同名称的发件箱没有区别。可以通过使用CheckConfig命令查询文件夹的相应名称来修改发件箱的名称。

代码修复了附件名称因编码问题无法识别的bug。

为了记录邮件访问过程,增加了日志功能。

0x06 小结

本文以Exchange为例,介绍了通过IMAP协议下载邮件和附件的方法,开源代码imapManage.py,分享脚本编写的细节。对于其他邮件系统,可以参考这个代码,更改发件箱名称即可。

留下回复

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。