DUICUO

侵入テストの基礎 - IMAPプロトコルを使用したメールの読み取り

[[384830]]

0x00 はじめに

侵入テストでは、ユーザーの電子メール認証情報を取得し、電子メールの内容を分析する必要がある場合、効率を向上させるために IMAP プロトコルを使用してプロセスを自動化することを選択できます。

この記事では、Exchange を例に、IMAP プロトコル経由で電子メールと添付ファイルをダウンロードする方法を紹介し、オープンソース コードを提供し、スクリプトの記述の詳細を共有します。

0x01 はじめに

この記事では、次の内容について説明します。

  • 基礎知識
  • Exchange で IMAP 機能とログイン ログを有効にする
  • 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 の 3 つのクラスを定義します。
  • セキュリティを強化するために、通常、安全な接続には IMAP4_SSL サブクラスを使用します。

4. Python 3 メールライブラリ

公式ドキュメント:

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

  • imaplib ライブラリを使用して電子メールを読み取る場合、電子メール ライブラリを使用して受信したメッセージを EmailMessage オブジェクトに変換する必要があります。これにより、電子メールの内容を処理しやすくなります。

0x03 ExchangeでIMAPとログインログを有効にする

Exchange では、IMAP4 クライアント接続はデフォルトで有効になっていません。

参考文献:

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

アクティベーション方法は以下の通りです。

1. IMAP4 サービスを開始し、自動的に開始するように設定します。

PowerShell コマンドは次のとおりです。

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

2. IMAP4設定を構成する

形式は次のとおりです。

  1. -ImapSettings -ExternalConnectionSettings "::" "::" ... -X509CertificateName [-SSLBindings ":" ":" ...] [-UnencryptedOrTLSBindings ":" ":" ...]を設定します

PowerShell コマンドの例:

  1. -ImapSettings -ExternalConnectionSettings "mail.test.com:993:SSL"、"mail.test.com:143:TLS " -X509CertificateName mail.test.comを設定します

3. IMAP4 サービスを再起動します。

PowerShell コマンドは次のとおりです。

  1. 再起動サービス MSExchangeIMAP4; 再起動サービス MSExchangeIMAP4BE

4. 構成を表示します。

PowerShell コマンドは次のとおりです。

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

電子メール アドレスを使用して OWA にログインし、[設定] -> [オプション] を選択すると、次の画像に示すように IMAP 構成が表示されます。


Exchange では、ログ記録はデフォルトで有効になっていません。

参考文献:

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

アクティベーション方法は以下の通りです。

1. ログ機能を有効にする

PowerShell コマンドは次のとおりです。

  1. -ImapSettings -Server "CAS01" -ProtocolLogEnabled $ trueを設定します 

2. サービスを再起動する

IMAP4 サービスを再起動するには、次の PowerShell コマンドを使用します。

  1. 再起動サービス MSExchangeIMAP4; 再起動サービス MSExchangeIMAP4BE

3. 構成情報を表示します。

PowerShell コマンドは次のとおりです。

  1. Get-ImapSettings | フォーマットリスト ProtocolLogEnabled、LogFileLocation、LogPerF​​ileSizeQuota、LogFileRollOverSettings

デフォルトのログ保存パスは次のとおりです: C:\Program Files\Microsoft\Exchange Server\V15\Logging\Imap4

0x04 Python3実装の詳細

テストコード1

  1. 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の送信トレイの名前は「送信済みアイテム」です。

テストコード2

  1. imaplibをインポートM = 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')は受信トレイを選択することを意味します。

  • 代わりに Exchange の送信済みアイテム フォルダーを読み取る場合、対応するコードは M.select('"Sent Items"') になります。
  • パラメータ2がFalseに設定されている場合、読み取り専用フラグが設定され、メールアドレスの変更が禁止されていることを示します。例:M.select('"Sent Items"',False)

(2)`typ, data = M.search(None, 'ALL')`において、`None`はデフォルトのASCIIエンコードが使用されていることを示し、`ALL`は検索条件がすべてのメールであることを示します。

  • 「user2」が送信したメールをフィルタリングする場合、対応するステートメントは次のようになります: `typ, msgnums = M.search(None, '(FROM "user2")')`

M.search() はメールのシーケンス番号を返します。例えば、私のテスト環境では受信トレイに9件のメールがあり、返される結果は次のとおりです。

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

注記:

  • ここでは、電子メールのシリアル番号と UID を区別する必要があります。
  • 電子メールのシーケンス番号は 1 から増加する番号であり、UID は各電子メールの一意の識別子です。

次のコードを使用すると、電子メールのシリアル番号と UID の対応を取得できます。

  1. imaplibをインポートM = 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)')は電子メールメッセージを取得するために使用されます。

  • パラメーター 1num は、抽出された電子メールのシーケンス番号を表します。
  • パラメータ1は、連続する複数のメールメッセージを同時に取得することをサポートします。例えば、シーケンス番号2~5のメールを同時に取得するコマンドは、M.fetch('2:5', '(RFC822)')です。
  • パラメータ2「(RFC822)」はデータ項目名を表します。ここで「(RFC822)」はBODY[]と同等であり、メール本文のテキスト形式とサイズの概要のみを返します。

メールヘッダーのみを取得したい場合は、次のコードを使用できます。

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

メール本文の内容のみを取得したい場合は、次のコードを使用できます。

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

(4)M.close()は現在選択されているメールボックスを閉じるために使用されます。

M.select() 実行後に使用

テストコード3

  1. 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' )f:f.write(part.get_payload(decode= True ))M.close ( )M.logout()として開きます。

上記のコードは、受信トレイ内のすべての電子メールの添付ファイルを保存するために使用されます。

(1)msg ​​= email.message_from_bytes(data[0][1])はデータをメールオブジェクトに変換するために使用されます。

(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

  1. 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' )f:f.write(bytes(msg))M.close ( )M.logout()として実行します。

上記のコードは、受信トレイ内のすべてのメールを 1 つずつ保存し、メールのシリアル番号と .eml 拡張子で名前を付けて保存するために使用されます。このファイルは Outlook で開くことができます。

0x05 オープンソースコード

完全なコードを GitHub にアップロードしました。アドレスは次のとおりです。

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

コードは次の機能をサポートしています。

  • フォルダ構成の表示
  • 受信トレイからすべての添付ファイルをダウンロードします。
  • 送信済みアイテム フォルダーからすべての添付ファイルをダウンロードします。
  • 受信トレイからすべてのメールをダウンロードする
  • 送信済みアイテム フォルダーからすべてのメールをダウンロードします。

ファイルをダウンロードするときは、まず対応するメールユーザー名でフォルダーを作成し、そのユーザーがダウンロードしたファイルを保存します。

デフォルトでは、ExchangeメールへのIMAP4_SSLアクセスがサポートされています。受信トレイ名は異なるメールシステム間で同じですが、送信トレイ名は異なります。送信トレイ名は、`CheckConfig`コマンドを使用して対応するフォルダ名を照会することで変更できます。

このコードは、エンコードの問題により添付ファイル名が認識されないバグを修正します。

電子メール アクセス プロセスの記録を容易にするために、ログ記録機能が追加されました。

0x06 概要

この記事では、Exchangeを例に、IMAPプロトコル経由でメールと添付ファイルをダウンロードする方法を紹介します。オープンソースコード imapManage.py とそのスクリプトの詳細も公開しています。他のメールシステムでも、このコードを参考に、送信済みアイテムフォルダの名前を変更するだけで済みます。

この記事は3gstudentによるオリジナル作品であり、Sihouの許可を得て独占的に公開されています。転載をご希望の場合は、出典を明記してください。