Engineering Note

プログラミングなどの技術的なメモ

5.2 オープンソースのWebアプリケーションのインストール (サイバーセキュリティプログラミング Pythonで学ぶハッカーの思考)

本記事は、オライリージャパンから発行されている「サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考(原題:Black Hat Python)」の学習メモとして、書籍ではPython2で書かれていますが、自分なりに解釈した上でPython3に書き直しをしています。 

今回はオープンソースで利用できるCMSWordPressやJoomla、Drupalなど)を使ったWebアプリケーションにおける、ファイルやディレクトリ構成を把握するためのツール作成方法について学んでいきます。

 

 

CMSとは

CMSとは"Content Management System"の略で、その名の通りコンテンツを管理するシステムになります。

従来は、Webサイトやブログを立ち上げたり更新するためにはHTMLやCSSの知識が必要でした。

しかし、オープンソースCMSを利用することで、これらの知識がなくてもMicrosoftのWordを使っている感覚でWebサイトやブログの作成および更新などが可能となります。

以下サイトで2018年の世界と日本国内のCMSシェアなどの比較を行っています。

 

テスト環境について

上記のCMSをインストールすると管理者用の様々なディレクトリやファイルもWebサーバ上に作成されます。

これらのファイルやディレクトリ構造がデフォルトの状態かを確認することで、サーバに侵入するための手がかりを掴もうというのが狙いです。

手順としては、自ホストにインストールしたCMSを使って、インターネットからアクセス可能なファイルをすべて洗い出します。

これらのファイルをFQDNに形成をし、リモートサーバにアクセスします。

HTTPステータスコードの404以外が返ってくれば、何かしらのサービスが動いていると思われます。

なお、今回はCMSのインストールはせずに、ローカルサーバの特定のディレクトリをスキャンしてみます。

 

スクリプトの作成

以下が今回のスクリプトになります。

 

# web_app_mapper.py
from queue import Queue
import threading
import os
import requests

web_paths = Queue()
threads = 10
target = "http://localhost/bhp"
directory = "bhp"
filters = [".jpg", ".gif", ".png", ".css"]

def test_remote():
    while not web_paths.empty():
        path = web_paths.get()
        url = "{}/{}".format(target, path)

        try:
            request = requests.get(url)
            print("[{}] => {}".format(request.status_code, path))
        except:
            print("Failed to access'{}'".format(url))
            pass

def main():
    os.chdir(directory)
    for r, d, f in os.walk("."):
        for files in f:
            remote_path = "{}/{}".format(r, files)
            if remote_path.startswith("."):
                remote_path = remote_path[2:]
            if os.path.splitext(files)[1] not in filters:
                web_paths.put(remote_path)

    for i in range(threads):
        print("Spawning thread: {}".format(i))
        t = threading.Thread(target=test_remote)
        t.start()

if __name__ == '__main__':
    main()

 

今回はPythonの同期キュークラスであるqueueモジュールを使って、スキャンをしていきます。

Queue(キュー)とは、FIFO(First in First out)と呼ばれる先入れ先出し待ち行列)のデータ構造です。

threadingモジュールは非同期ですが、queueモジュールを使うことでスレッドセーフな同期処理が可能となります。

11行目の"filters"リストを使って、不要な拡張子のファイルへのアクセスを制限しています。

25行目のmain()では、まず自ホストのディレクトリ構造をos.walk()ですべて洗い出し、それをQueueクラスオブジェクトにプットしていきます。

13行目のtest_remote()では、QueueクラスオブジェクトにプットしていったURLを順番に取り出し、WebサーバへGETリクエストしていきます。

 

動作確認

今回はWSL Ubuntu上のApacheを使ってスクリプトの動作確認をしていきます。

Webサーバが起動したら、コマンドプロンプトを起動しスクリプトを実行します。

 

 > python web_app_mapper.py
 Spawning thread: 0
 Spawning thread: 1
 Spawning thread: 2
 Spawning thread: 3
 Spawning thread: 4
 Spawning thread: 5
 Spawning thread: 6
 Spawning thread: 7
 Spawning thread: 8
 Spawning thread: 9
 [200] => index.html
 [200] => login/auth.php
 [200] => login/login.html

 

問題なくファイルへアクセスできたことが確認できました。

 

最後に

今回は、CMSのインストール時のファイルが存在するか確認するためのツール作成方法について学びました。

実際にはここから侵入への手がかりを掴むのは難しいと思いますが、サーバ管理者がうっかり残してしまったクレデンシャルなどがあるかもしれません。

 

参考書籍

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考