クラウドワークス エンジニアブログ

日本最大級のクラウドソーシング「クラウドワークス」の開発の裏側をお届けするエンジニアブログ

脆弱性ホントにないですか?セルフペネトレーションテスト環境を構築してみた話

こんにちは!クラウドログでSREを担当している宮城です。

今回はセキュリティ勉強の一環として、セルフペネトレーションテスト環境を構築し、 Kali Linuxから自身のサービスの脆弱性を調査できるか検証してみた話について、 やった内容とその手順について紹介させていただこうと思います。

前提となりますが、ここで紹介する内容はMacbook M2 Pro (ARM版Mac) 上での検証を行っています。WindowsLinuxでの検証については触れないのでご注意ください。

なぜやったか?

最近クラウドログでは開発チーム全体的にセキュリティへの意識が高まっており、直近では外部のセキュリティ診断を行ったり、徳丸先生の著書「体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践」を使った勉強会が開催されたりしています。

インフラ領域を主に扱うSREとしても、キャッチアップしていかなければという思いもあり、 せっかくなら前から気になっていたKali Linuxを触ってみようということで実施に至りました。

Kali Linuxについて

Kali Linuxとは、脆弱性の研究や検証、ペネトレーションテストをするためのツールをまとめたDebianベースのLinuxディストリビューションになります。

Kali Linux | Penetration Testing and Ethical Hacking Linux Distribution

GUIもありますが、今回はCLIのみ使用します。

検証の手順

本記事の流れは以下のようになります。

  1. Kali Linuxの構築
  2. Nginxの構築
  3. ペネトレーションテストの実施

では進めていきます。

検証環境の構成

以下が構成イメージです。ペネトレーションテストを直接本番で行うわけにはいかないので、ローカル環境に検証環境を構築します。

環境イメージ

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

オプションについて

  • —script vuln: 脆弱性チェックするためのscirptを実行する(詳細はこちら
  • -n: 名前解決をしない
  • -A: OS情報なども含めてチェック
  • -vv: より詳細な表示を行う

結果は以下のようになりました。

# 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!

クラウドログをもっと知りたい方のために過去のブログをいくつか紹介しておきます。 クラウドログのカルチャーを紹介している記事なので、もしよければこれらも見てみてください。

最後に、クラウドワークスでは個人がより活躍できる社会を実現するため、仲間を募集しています! セキュリティに興味がある方以外にも幅広く募集しておりますので、ぜひ募集をご確認ください。

herp.careers

© 2016 CrowdWorks, Inc., All rights reserved.