こんにちは!クラウドログでSREを担当している宮城です。
今回はセキュリティ勉強の一環として、セルフペネトレーションテスト環境を構築し、 Kali Linuxから自身のサービスの脆弱性を調査できるか検証してみた話について、 やった内容とその手順について紹介させていただこうと思います。
前提となりますが、ここで紹介する内容はMacbook M2 Pro (ARM版Mac)
上での検証を行っています。WindowsやLinuxでの検証については触れないのでご注意ください。
なぜやったか?
最近クラウドログでは開発チーム全体的にセキュリティへの意識が高まっており、直近では外部のセキュリティ診断を行ったり、徳丸先生の著書「体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践」を使った勉強会が開催されたりしています。
インフラ領域を主に扱うSREとしても、キャッチアップしていかなければという思いもあり、 せっかくなら前から気になっていたKali Linuxを触ってみようということで実施に至りました。
Kali Linuxについて
Kali Linuxとは、脆弱性の研究や検証、ペネトレーションテストをするためのツールをまとめたDebianベースのLinuxディストリビューションになります。
Kali Linux | Penetration Testing and Ethical Hacking Linux Distribution
検証の手順
本記事の流れは以下のようになります。
- Kali Linuxの構築
- Nginxの構築
- ペネトレーションテストの実施
では進めていきます。
検証環境の構成
以下が構成イメージです。ペネトレーションテストを直接本番で行うわけにはいかないので、ローカル環境に検証環境を構築します。
Kali Linuxの構築
dockerコマンドを使ってKali Linuxを構築します。
docker run -it --privileged kalilinux/kali-rolling:latest bash
オプションについて
-it
: インタラクティブにコンテナを操作する--privileged
: 強権限でコンテナを起動する。nmap
コマンドをコンテナ上で使用するために必要
コンテナにアタッチしたら、初期設定を行っていきます。
# Kali Linux上で実行する apt update # packageの最新情報を取得 apt full-upgrade -y # packageのアップグレード apt install -y kali-tools-information-gathering # nmapなどの情報収集ツールがまとめられているmeta package
apt install
の途中に sslh
の設定について確認が出ますが、 1
を選択して進めてください。
※ SSLHについてはここでは解説しないので、気になる方はググってみてください。
# SAMPLE: SSLHの設定 sslh configuration ------------------ sslh can be run either as a service from inetd, or as a standalone server. Each choice has its own benefits. With only a few connection per day, it is probably better to run sslh from inetd in order to save resources. On the other hand, with many connections, sslh should run as a standalone server to avoid spawning a new process for each incoming connection. 1. from inetd 2. standalone Run sslh: 1 # <- 1を選択
インストールが終われば、Kali Linuxの構築は終了です。
Terminalは閉じずに、続いてNginxの構築を進めていきます。
Nginxの構築
新たにTerminalを開いて、以下のdockerコマンドを使ってNginx構築します。
今回は脆弱性を持ったNginxを使用するため、あえて古いversionのイメージを使用します。
ARM版が公開されているイメージで、最も古い 1.12
を採用してます。
こちらはNginxが起動すれば終わりです。(初期設定などは不要)
# docker ps で、nginx:1.12 がUPしてればOK docker run -d nginx:1.12
ペネトレーションテストに向けた事前準備
ペネトレーションテストをする前に、それぞれのコンテナが同じNetwork内に配置されているか事前確認しておきます。
docker network inspect bridge
Containers
というオブジェクトの配下に、KaliLinuxとNginxのコンテナが所属していれば問題ありません。
NginxのIPアドレスはこのあと使うので、そのまま値を控えておいてください。
# SAMPLE: docker network inspect bridgeの表示例 $ docker network inspect bridge [ { "Name": "bridge", "Id": "fc17ec2ddbe09e3c114f2c79ce7f7d6acef3837256a6b77b4617c223b3b06291", "Created": "2024-10-23T08:20:23.294118126Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "99abfb6fb6bff5ba3a3df3d1f342831afe1bda889842cd2f870d024bddedd6c5": { "Name": "funny_neumann", # <- 名前はランダムで設定されるので、この名前のコンテナがKali Linux or NginxであればOK "EndpointID": "3bb918779d525053a4151b5b18aeab911acd783ad16e541e0236c81eb6539757", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", # <- Nginxの場合、値を控えておく "IPv6Address": "" }, "e5b85dbc5ca3064b60d39962bc67151726d2133c2baa3d47dc07946a883e813c": { "Name": "elated_joliot", # <- 名前はランダムで設定されるので、この名前のコンテナがKali Linux or NginxであればOK "EndpointID": "4a8cd0ce5a167c30ef285230f02378d103da394bbb51e707951fa97fb7a5c446", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", # <- Nginxの場合、値を控えておく "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "127.0.0.1", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "65535" }, "Labels": {} } ]
ペネトレーションテストの実施
それではテストをしていきます。
ペネトレーションテストは色々な手法がありますが、今回はシンプルにnmap
を使ったポートスキャンを行います。
Kali Linuxに接続しているTerminalから以下を実行します。
nmap --script vuln -n -A -vv {NginxのIPアドレス} # SAMPLE: Nginxのアドレスが 172.17.0.3/16 だった場合 nmap --script vuln -n -A -vv 172.17.0.3
オプションについて
結果は以下のようになりました。
# SAMPLE: nmapの結果 ┌──(root㉿5adebdcee90e)-[/] └─# nmap --script vuln -T5 -n -A -vv 172.17.0.3 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-06 07:15 UTC NSE: Loaded 150 scripts for scanning. NSE: Script Pre-scanning. NSE: Starting runlevel 1 (of 2) scan. Initiating NSE at 07:15 Completed NSE at 07:15, 10.02s elapsed NSE: Starting runlevel 2 (of 2) scan. Initiating NSE at 07:15 Completed NSE at 07:15, 0.00s elapsed Initiating ARP Ping Scan at 07:15 Scanning 172.17.0.3 [1 port] Completed ARP Ping Scan at 07:15, 0.06s elapsed (1 total hosts) Initiating SYN Stealth Scan at 07:15 Scanning 172.17.0.3 [1000 ports] Discovered open port 80/tcp on 172.17.0.3 Completed SYN Stealth Scan at 07:15, 0.02s elapsed (1000 total ports) Initiating Service scan at 07:15 Scanning 1 service on 172.17.0.3 Completed Service scan at 07:15, 6.01s elapsed (1 service on 1 host) Initiating OS detection (try #1) against 172.17.0.3 Retrying OS detection (try #2) against 172.17.0.3 NSE: Script scanning 172.17.0.3. NSE: Starting runlevel 1 (of 2) scan. Initiating NSE at 07:15 NSE Timing: About 97.32% done; ETC: 07:16 (0:00:01 remaining) NSE Timing: About 97.32% done; ETC: 07:17 (0:00:02 remaining) Completed NSE at 07:17, 62.34s elapsed NSE: Starting runlevel 2 (of 2) scan. Initiating NSE at 07:17 Completed NSE at 07:17, 0.01s elapsed Nmap scan report for 172.17.0.3 Host is up, received arp-response (0.00024s latency). Scanned at 2024-11-06 07:15:48 UTC for 72s Not shown: 999 closed tcp ports (reset) PORT STATE SERVICE REASON VERSION 80/tcp open http syn-ack ttl 64 nginx 1.12.2 |_http-stored-xss: Couldn't find any stored XSS vulnerabilities. | vulners: | nginx 1.12.2: | CVE-2017-7529 7.5 https://vulners.com/cve/CVE-2017-7529 |_ SSV:96273 5.0 https://vulners.com/seebug/SSV:96273 *EXPLOIT* |_http-jsonp-detection: Couldn't find any JSONP endpoints. |_http-server-header: nginx/1.12.2 | http-vuln-cve2011-3192: | VULNERABLE: | Apache byterange filter DoS | State: VULNERABLE | IDs: CVE:CVE-2011-3192 BID:49303 | The Apache web server is vulnerable to a denial of service attack when numerous | overlapping byte ranges are requested. | Disclosure date: 2011-08-19 | References: | https://www.tenable.com/plugins/nessus/55976 | https://www.securityfocus.com/bid/49303 | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3192 |_ https://seclists.org/fulldisclosure/2011/Aug/175 |_http-csrf: Couldn't find any CSRF vulnerabilities. |_http-litespeed-sourcecode-download: Request with null byte did not work. This web server might not be vulnerable |_http-wordpress-users: [Error] Wordpress installation was not found. We couldn't find wp-login.php |_http-dombased-xss: Couldn't find any DOM based XSS. MAC Address: 02:42:AC:11:00:03 (Unknown) OS fingerprint not ideal because: Timing level 5 (Insane) used Aggressive OS guesses: Linux 2.6.32 (96%), Linux 3.7 - 3.10 (96%), Linux 3.11 - 3.14 (95%), Linux 3.19 (95%), Linux 3.8 (95%), Linux 3.8 - 4.14 (95%), Linux 3.16 (95%), Linux 3.1 (95%), Linux 3.2 (95%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (95%) No exact OS matches for host (test conditions non-ideal). TCP/IP fingerprint: SCAN(V=7.94SVN%E=4%D=11/6%OT=80%CT=1%CU=32084%PV=Y%DS=1%DC=D%G=N%M=0242AC%TM=672B17EC%P=aarch64-unknown-linux-gnu) SEQ(SP=104%GCD=1%ISR=10A%TI=Z%CI=Z%TS=A) SEQ(SP=104%GCD=1%ISR=10A%TI=Z%CI=Z%II=I%TS=A) OPS(O1=MFFD7ST11NW7%O2=MFFD7ST11NW7%O3=MFFD7NNT11NW7%O4=MFFD7ST11NW7%O5=MFFD7ST11NW7%O6=MFFD7ST11) WIN(W1=8200%W2=8200%W3=8200%W4=8200%W5=8200%W6=8200) ECN(R=Y%DF=Y%T=40%W=8200%O=MFFD7NNSNW7%CC=Y%Q=) T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=) T2(R=N) T3(R=N) T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=) T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=) T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=) T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=) U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G) IE(R=Y%DFI=N%T=40%CD=S) Uptime guess: 11.980 days (since Fri Oct 25 07:45:19 2024) Network Distance: 1 hop TCP Sequence Prediction: Difficulty=260 (Good luck!) IP ID Sequence Generation: All zeros TRACEROUTE HOP RTT ADDRESS 1 0.24 ms 172.17.0.3 NSE: Script Post-scanning. NSE: Starting runlevel 1 (of 2) scan. Initiating NSE at 07:17 Completed NSE at 07:17, 0.00s elapsed NSE: Starting runlevel 2 (of 2) scan. Initiating NSE at 07:17 Completed NSE at 07:17, 0.00s elapsed Read data files from: /usr/share/nmap OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 81.92 seconds Raw packets sent: 1045 (47.584KB) | Rcvd: 1029 (42.532KB) ┌──(root㉿5adebdcee90e)-[/]
表示が多くて分かりづらいですが、以下に検出された脆弱性の情報が記載されてることがわかります。
# SAMPLE: Nginx1.12には CVE-2011-3192 の脆弱性が存在する PORT STATE SERVICE REASON VERSION 80/tcp open http syn-ack ttl 64 nginx 1.12.2 |_http-stored-xss: Couldn't find any stored XSS vulnerabilities. | vulners: | nginx 1.12.2: | CVE-2017-7529 7.5 https://vulners.com/cve/CVE-2017-7529 |_ SSV:96273 5.0 https://vulners.com/seebug/SSV:96273 *EXPLOIT* |_http-jsonp-detection: Couldn't find any JSONP endpoints. |_http-server-header: nginx/1.12.2 | http-vuln-cve2011-3192: | VULNERABLE: | Apache byterange filter DoS | State: VULNERABLE | IDs: CVE:CVE-2011-3192 BID:49303 | The Apache web server is vulnerable to a denial of service attack when numerous | overlapping byte ranges are requested. | Disclosure date: 2011-08-19 | References: | https://www.tenable.com/plugins/nessus/55976 | https://www.securityfocus.com/bid/49303 | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3192 |_ https://seclists.org/fulldisclosure/2011/Aug/175 |_http-csrf: Couldn't find any CSRF vulnerabilities. |_http-litespeed-sourcecode-download: Request with null byte did not work. This web server might not be vulnerable |_http-wordpress-users: [Error] Wordpress installation was not found. We couldn't find wp-login.php |_http-dombased-xss: Couldn't find any DOM based XSS.
無事(?)脆弱性があることをチェックすることができました。 以上でペネトレーションテストの検証終了です。
まとめ
今回は、 nmap
を使った検証だけでしたが、Kali Linuxには他にもたくさんのツールが用意されています。
ツールはカテゴリごとに分類されMetaPackageとして配布されているので、どういったツールがあるのか見るだけでも勉強になりそうですね。
Kali Linux Metapackages | Kali Linux Documentation
今回の検証を通して、nmap
の使い方と Kali Linux
に軽く触れることができました。
コンテナで構築もできるので、環境構築もとても手軽だと感じました。Kali Linuxで他にどんな事ができるのか、他のサーバへの攻撃手法についてなど、今後も検証していきたいと思います。
セキュリティはどこの会社・プロダクトでも、とても需要の高い分野です。 引き続きプロダクトの安全性を高めつつ、エンジニアとしても価値向上目指していこうと思います。
We are hiring!
クラウドログをもっと知りたい方のために過去のブログをいくつか紹介しておきます。 クラウドログのカルチャーを紹介している記事なので、もしよければこれらも見てみてください。
最後に、クラウドワークスでは個人がより活躍できる社会を実現するため、仲間を募集しています! セキュリティに興味がある方以外にも幅広く募集しておりますので、ぜひ募集をご確認ください。