文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

渗透基础-利用IMAP协议读取邮件

2024-12-03 09:57

关注

0x00 前言

在渗透测试中,当我们获得了用户的邮箱凭据,需要对邮箱内容进行分析时,可以选择通过IMAP协议实现自动化来提高效率。

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

0x01 简介

本文将要介绍以下内容:

0x02 基础知识

1.IMAP

2.IMAP4_SSL

3.Python3 imaplib库

官方文档:

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

4.Python3 email库

官方文档:

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

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

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

参考资料:

https://docs.microsoft.com/en-us/exchange/clients/pop3-and-imap4/configure-imap4?view=exchserver-2019

开启方法如下:

启动IMAP4服务,并将服务配置为自动启动

Powershell命令如下:

  1. Start-Service MSExchangeIMAP4; Start-Service MSExchangeIMAP4BESet-Service MSExchangeIMAP4 -StartupType Automatic; Set-Service MSExchangeIMAP4BE -StartupType Automatic 

配置IMAP4设置

格式如下:

  1. Set-ImapSettings -ExternalConnectionSettings "::""::"...  -X509CertificateName  [-SSLBindings ":",":"...] [-UnencryptedOrTLSBindings ":",":"...] 

Powershell命令实例:

  1. Set-ImapSettings -ExternalConnectionSettings "mail.test.com:993:SSL","mail.test.com:143:TLS" -X509CertificateName mail.test.com 

重新启动IMAP4服务

Powershell命令如下:

  1. Restart-Service MSExchangeIMAP4; Restart-Service MSExchangeIMAP4BE 

查看配置:

Powershell命令如下:

  1. Get-Service MSExchangeIMAP4; Get-Service MSExchangeIMAP4BEGet-ImapSettings | Format-List *ConnectionSettings,*Bindings,X509CertificateName 

使用邮箱用户登录OWA,选择Settings->Options,能够看到IMAP配置,如下图:


默认情况下,Exchange中未启用日志功能

参考资料:

https://docs.microsoft.com/en-us/exchange/configure-protocol-logging-for-pop3-and-imap4-exchange-2013-help

开启方法如下:

开启日志功能

Powershell命令如下:

  1. Set-ImapSettings -Server "CAS01" -ProtocolLogEnabled $true 

重启服务

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

  1. Restart-Service MSExchangeIMAP4; Restart-Service MSExchangeIMAP4BE 

查看配置信息:

Powershell命令如下:

  1. Get-ImapSettings | Format-List ProtocolLogEnabled,LogFileLocation,LogPerFileSizeQuota,LogFileRollOverSettings 

默认的日志保存路径为:C:\Program Files\Microsoft\Exchange Server\V15\Logging\Imap4

0x04 Python3实现细节

测试代码1

  1. import imaplibM = imaplib.IMAP4_SSL('192.168.1.1','993')M.login('User1''Password')data = M.list()print(data)M.logout() 

以上代码用来获得所有邮箱文件夹对应的名称

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

注:

不同的邮件系统只有收件箱名称统一默认为INBOX,发件箱的名称一般不同,例如Exchange的发件箱名称为"Sent Items"。

测试代码2

  1. import imaplibM = imaplib.IMAP4_SSL('192.168.1.1','993')M.login('User1''Password')M.select('INBOX')typ, data = M.search(None, 'ALL')for num in data[0].split():typ, data = M.fetch(num, '(RFC822)')print('Message %s\n%s\n' % (num, data[0][1]))M.close()M.logout() 

以上代码用来读取收件箱所有邮件的内容。

(1)M.select('INBOX')表示选择收件箱

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

M.search()返回的结果为邮件的序列号,例如我的测试环境下,收件箱有9个邮件,此时返回的结果为:

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

注:

获得邮件序列号同UID对应关系可使用以下代码:

  1. import imaplibM = imaplib.IMAP4_SSL('192.168.1.1','993')M.login('User1''Password')M.select('INBOX')typ, data = M.search(None, 'ALL')for num in data[0].split():typ, data = M.fetch(num, 'UID')print(data)M.close()M.logout() 

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

如果只想获得邮件头部的内容,可以使用以下代码:

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

如果只想获得邮件体的内容,可以使用以下代码:

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

(4)M.close()用来关闭当前选择的邮箱

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

测试代码3

  1. import imaplibimport emailM = imaplib.IMAP4_SSL('192.168.1.1','993')M.login('User1''Password')M.select('INBOX')typ, data = M.search(None, 'ALL')for num in data[0].split():typ, data = M.fetch(num, '(RFC822)')msg = email.message_from_bytes(data[0][1])for part in msg.walk():if part.get('Content-Disposition'):fileName = part.get_filename()if bool(fileName):with open(fileName,'wb'as f:f.write(part.get_payload(decode=True))M.close()M.logout() 

以上代码用来保存收件箱所有邮件的附件

(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编码的形式存储,所以在读取时需要加入参数decode=True作Base64解码。

测试代码4

  1. import imaplibimport emailM = imaplib.IMAP4_SSL('192.168.1.1','993')M.login('User1''Password')M.select('INBOX')typ, data = M.search(None, 'ALL')for num in data[0].split():typ, data = M.fetch(num, '(RFC822)')msg = email.message_from_bytes(data[0][1])with open(num.decode('utf8') + '.eml','wb'as f:f.write(bytes(msg))M.close()M.logout() 

以上代码用来逐个保存收件箱的所有邮件,以邮件序列号为名称,后缀名为eml,可以使用Outlook打开。

0x05 开源代码

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

https://github.com/3gstudent/Homework-of-Python/blob/master/imapManage.py

代码支持以下功能:

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

默认支持通过IMAP4_SSL访问Exchange邮件,对于不同的邮件系统,收件箱没有区别,发件箱的名称有所不同。发件箱的名称可以通过。CheckConfig命令查询文件夹对应的名称进行修改。

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

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

0x06 小结

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

本文为 3gstudent 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址。

 

来源:嘶吼网内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯