发布于2022年11月8日3年前 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的配置,如下图所示 默认情况下,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,分享脚本编写的细节。对于其他邮件系统,可以参考这个代码,更改发件箱名称即可。 留下回复
创建帐户或登录后发表意见