このチートシートは、様々な環境やツールにおけるリバースシェルの確立手法を目的別にまとめたものです。基本的な手法から応用的な手法まで網羅しています。
リスナーの準備 (攻撃者側) 🎧
リバースシェルを受け付けるために、攻撃者側のマシンでリスナーを起動する必要があります。最も一般的に使用されるのは Netcat (nc) です。
ツール | コマンド例 | 説明 |
---|---|---|
Netcat (nc) |
| 指定したポートでTCP接続を待ち受けます。-l : Listenモード, -v : 詳細表示, -n : 名前解決無効, -p : ポート指定。 |
Socat |
| より高機能なNetcat代替。TCP接続を待ち受けます。fork オプションで複数接続に対応可能。 |
Metasploit Framework (multi/handler) |
| Metasploitを使用してリバースシェルを受け付けます。様々なペイロードに対応可能。Windows/Linuxなどターゲットに合わせたペイロードを指定します (例: windows/shell_reverse_tcp , linux/x86/shell_reverse_tcp )。 |
OpenSSL (暗号化リスナー) |
| OpenSSLを使用して暗号化された接続を待ち受けます。通信内容の盗聴を防ぎます。 |
Socat (暗号化リスナー) |
| Socatで暗号化されたTCP接続を待ち受けます。verify=0 はクライアント証明書の検証を無効にします。 |
基本的なリバースシェル (ターゲット側) 💻
ターゲットシステム上で実行し、攻撃者のリスナーに接続を確立する基本的なコマンドです。
環境/ツール | コマンド例 | 説明 |
---|---|---|
Bash (TCP) |
| Bashのネットワークリダイレクト機能を利用します。-i でインタラクティブシェルを起動。標準入出力/エラー出力をTCPソケットにリダイレクトします。一部のBashバージョンでのみ利用可能です。 |
Bash (TCP, 代替1) |
| ファイルディスクリプタ(ここでは196)を利用してTCP接続を確立し、シェルに接続します。/dev/tcp が使えない環境でも `sh` があれば動作する可能性があります。 |
Bash (UDP) |
| UDP経由でリバースシェルを確立します。リスナー側もUDPで待機 (nc -lunvp <ポート番号> ) する必要があります。 |
Netcat (nc – Traditional) |
(Windows) | Netcatの -e オプションで指定したプログラム (シェル) を接続先にバインドします。注意: このオプションはセキュリティリスクのため、最近のバージョンのNetcatでは削除されていることが多いです。 |
Netcat (nc – OpenBSD / BusyBox) |
| -e オプションがないNetcat向けの手法。名前付きパイプ (FIFO) を利用して、シェルの入出力をNetcat経由でリダイレクトします。mknod はmkfifo が使えない環境用です。 |
Ncat (Nmap付属) |
(UDP) | Nmapに付属する高機能なNetcat。-e オプションが利用可能です。 |
Socat |
| 高機能なNetcat代替。より安定したインタラクティブシェル (PTY) を確立できます。pty,stderr,setsid,sigint,sane オプションで擬似ターミナルを適切に設定します。 |
Telnet |
(2ポート使用) | Telnetクライアントを利用した手法。名前付きパイプを使う方法と、2つのポートを使う方法があります。リスナー側もTelnetに対応している必要があります。 |
プログラミング言語を利用したリバースシェル (ターゲット側) 🐍🐘💎
ターゲットシステムにインストールされているプログラミング言語の機能を利用してリバースシェルを確立します。
言語 | コマンド例 / スクリプト | 説明 |
---|---|---|
Python 🐍 |
| PythonのsocketライブラリでTCP接続を確立し、os.dup2 で標準入出力をソケットにリダイレクト、subprocess.call (または subprocess.run ) でシェルを起動します。Python 2/3で若干異なります。Windowsの場合は ["cmd.exe"] などに変更します。 |
Perl 🐪 |
| PerlのSocketモジュールを利用します。基本的な構造はPythonと同様です。Windows用の短いバージョンもあります。 |
PHP 🐘 |
| PHPのfsockopen でソケットを開き、exec やshell_exec でシェルを実行します。ファイルディスクリプタ (<&3 ) は環境によって変更が必要な場合があります (4, 5…)。より安定した接続のために専用スクリプト (php-reverse-shell) もあります。 |
Ruby ♦️ |
| Rubyのsocketライブラリを利用します。ファイルディスクリプタを取得してシェルに渡す方法や、シェルに依存せずコマンドを直接実行する方法があります。 |
Java ☕ |
| JavaのRuntime.exec またはProcessBuilder を使用して外部コマンド (Bashや他のシェルスクリプト) を実行し、ソケット接続を確立します。より複雑なコードでプラットフォーム間の互換性を高めることも可能です。 |
Node.js 🟩 |
| Node.jsのchild_process モジュールで外部コマンド (ncなど) を実行するか、net モジュールとchild_process を組み合わせて純粋なJavaScriptでリバースシェルを実装します。 |
Groovy ☕️ |
| Javaと同様のコードが利用できます。ProcessBuilder とSocket を使用します。 |
Go 🐹 |
| Goのnet パッケージでTCP接続し、os/exec パッケージでシェルを起動して標準入出力をリダイレクトします。一時ファイルを作成して実行します。 |
Awk 🐧 |
| Awkのネットワーク機能 (gawkで利用可能) を使ってTCP接続を確立し、対話的にコマンドを実行します。 |
Lua 🌙 |
| LuaSocketライブラリ、または標準のposixライブラリ (Linux) を使用してソケット接続とシェル実行を行います。 |
Windows環境向けリバースシェル 🪟
Windows環境に特化したリバースシェル手法です。
ツール/言語 | コマンド例 / スクリプト | 説明 |
---|---|---|
PowerShell 💪 |
| PowerShellの.NET機能 (System.Net.Sockets.TCPClient ) を利用してTCP接続を確立し、受信したコマンドをInvoke-Expression (iex) で実行、結果を返します。Nishangなどの有名なPowerShellスクリプトを利用する方法もあります。 |
C# 🎵 |
| C#でTCPクライアントを作成し、cmd.exe プロセスを起動してその標準入出力をソケットに接続します。実行には.NET Frameworkが必要です。コードをコンパイルしてexeファイルとしてターゲット上で実行します。 |
暗号化リバースシェル 🔒
通信経路を暗号化し、盗聴や検知を困難にする手法です。
ツール | コマンド例 (ターゲット側) | リスナー側の準備 | 説明 |
---|---|---|---|
OpenSSL |
|
| OpenSSLクライアント (s_client ) を利用して暗号化された接続を確立します。名前付きパイプを使ってシェルの入出力をリダイレクトします。リスナー側はs_server で待ち受けます。 |
Socat (OpenSSL利用) |
|
| Socat自体がOpenSSLライブラリを使った暗号化接続をサポートしています。verify=0 でサーバー証明書の検証をスキップします (オレオレ証明書用)。PTYオプションも利用可能です。 |
Webシェル経由のリバースシェル 🌐
WebサーバーにアップロードしたWebシェルからリバースシェルを起動する手法です。
Webシェル言語 | 実行コマンド例 (Webシェル経由で) | 説明 |
---|---|---|
PHP |
| Webシェルが提供するコマンド実行機能を使って、上記で紹介した各種リバースシェルコマンド (PHP, nc, Python等) を実行します。Webサーバーの実行ユーザー権限 (例: www-data, apache) でシェルが起動します。 |
ASP / ASPX |
| ASP/ASPX WebシェルからPowerShellやcmd.exe経由でリバースシェルコマンドを実行します。ターゲットに nc.exe や PowerShell が存在する必要があります。 |
JSP |
| JSP Webシェルから直接シェルコマンドを実行するか、JSP内でJavaコードを実行してリバースシェルを起動します。LinuxサーバーならBash、Windowsサーバーならcmd.exe/PowerShellがターゲットになります。 |
⚠️ 注意: Webシェル自体がバックドアとして機能します。Webシェルからリバースシェルを起動する場合、Webサーバープロセスの権限でシェルが動作することに留意してください。
TTY (インタラクティブシェル) のアップグレード ✨
基本的なリバースシェル (Dumb Shell) は、タブ補完やCtrl+C
などが機能しない場合があります。より完全なインタラクティブシェル (TTY) にアップグレードする手法です。
手法 | ターゲット側で実行 | 攻撃者側で実行 | 説明 |
---|---|---|---|
Python PTY Spawn |
| (特になし) | ターゲットにPythonがインストールされている場合、pty.spawn を使って擬似ターミナルを生成します。最も一般的で簡単な方法の一つです。 |
script コマンド |
| (特になし) | script コマンドはセッションの記録に使われますが、擬似ターミナルを生成するためにも利用できます。 |
Socat を利用 | (Socatで接続時にPTYオプションを指定) |
| Socatで接続する際にPTY関連のオプションを指定することで、最初からインタラクティブシェルを確立できます。リスナー側でもtty に接続する設定が必要です。 |
stty を利用 (手動) |
(シェル取得後)
|
(シェル取得後)
| すでに確立したDumb Shellを、stty コマンドとシェルのバックグラウンド/フォアグラウンド機能を使って手動でアップグレードします。攻撃者側のターミナルサイズに合わせてstty rows cols を設定します。 |
コメント