QNAP上で動いているMultimediaConsole用のMariaDBにログインする話

# QNAP上で動作しているMariaDBをハックしたくなった。
QNAPでは、「App Center」からインストールするMariaDBとは別に、Multimedia Consoleなどを動かすとデータ格納用MariaDBが動作する。
私のQNAP TS-453Beでは以下のようなプロセスが動いている。

``` Bash
admin@qnap:/share/CACHEDEV1_DATA/$ ps aux | grep mariadb
 4739 admin      2372 S   grep mariadb
13340 admin      2328 S   /bin/sh /usr/local/mariadb/bin/mysqld_safe --defaults-file=/usr/local/mariadb/my-mariadb.cnf --basedir=/usr/local/mariadb --datadir=/share/CACHEDEV1_DATA/.system/data --user=admin --default-storage-engine=MyISAM --wait_timeout=2628000 --pid-file=/var/lock/mariadb.pid --tmpdir=/share/CACHEDEV1_DATA/.system/tmp
21149 admin      2484 S   /bin/sh /share/CACHEDEV1_DATA/.qpkg/MultimediaConsole/mariadb10/bin/mysqld_safe --defaults-file=/share/CACHEDEV1_DATA/.qpkg/MultimediaConsole/my.cnf --basedir=/share/CACHEDEV1_DATA/.qpkg/MultimediaConsole/mariadb10 --datadir=/share/CACHEDEV1_DATA/.system/data.m10 --tmpdir=/share/CACHEDEV1_DATA/.system/tmp.m10 --user=admin --default-storage-engine=InnoDB --wait_timeout=2628000 --pid-file=/var/lock/mariadb10_mmc.pid
21900 admin    2181748  S   /share/CACHEDEV1_DATA/.qpkg/MultimediaConsole/mariadb10/bin/mariadbd --defaults-file=/share/CACHEDEV1_DATA/.qpkg/MultimediaConsole/my.cnf --basedir=/share/CACHEDEV1_DATA/.qpkg/MultimediaConsole/mariadb10 --datadir=/share/CACHEDEV1_DATA/.system/data.m10 --plugin-dir=/share/CACHEDEV1_DATA/.qpkg/MultimediaConsole/mariadb10/lib/plugin --user=admin --tmpdir=/share/CACHEDEV1_DATA/.system/tmp.m10 --default-storage-engine=InnoDB --wait_timeout=2628000 --log-error=/share/CACHEDEV1_DATA/.system/data.m10/qnap.err --pid-file=/var/lock/mariadb10_mmc.pid --socket=/tmp/mariadb10_mmc.sock --port=3310
```
`mysql` が `--port 3310` で動作していることが上記PS結果からわかる。

じゃあ、このMariaDBにアクセスできればMultimedia Consoleが保存しているデータを直接いじれちゃうよね？という話。

## なんでこんなことやろうと思った？
共有フォルダ名をもとのディレクトリ名ごと変更したら、MultimediaConsoleで画像解析がゼロから再実行することになってめちゃくちゃ大変なことになってしまい、もしMultimediaConsoleのもとのデータベースをいじれればそういうこともなくなるのかな、という後学のためにハックしておくか、というのが事の発端。

# ログインID/PWを調べるには？
QNAPの持ち主ということもあり、sudoもできるのでいったんmysqldを停止してパスワード不要モードで起動しなおしてもいいが、動作がどうなるか不安なのでMultimedia ConsoleがDB作成するときのスクリプトをのぞき込んでみる。

## どのような設定でインストールされている？
App Centerでインストールしたアプリは基本的に下記ディレクトリ配下にインストールされる。

``` 
admin@qnap:/share/CACHEDEV1_DATA/.qpkg$ ls -la
total 96
drwxrwxrwx 24 admin administrators 4096 2023-09-15 18:56 ./
drwxrwxrwx 41 admin administrators 4096 2023-09-18 13:32 ../
drwxr-xr-x 18 admin administrators 4096 2023-09-13 21:20 container-station/
drwxr-xr-x  2 admin administrators 4096 2023-09-15 18:57 .installation/
drwxrwxr-x 10 admin administrators 4096 2023-09-16 18:57 MalwareRemover/
drwxrwxrwx  9 admin administrators 4096 2023-09-07 18:32 MultimediaConsole/
drwxr-xr-x 13 admin administrators 4096 2023-09-06 00:53 QKVM/
drwxrwxrwx  8 admin administrators 4096 2023-07-09 11:29 .QKVM/
drwxrwxrwx  2 admin administrators 4096 2023-07-11 08:18 .@qRPlayCenter/
drwxrwxr-x 15 admin administrators 4096 2023-09-14 17:54 Qsirch/
drwxrwxrwx  5 admin administrators 4096 2023-09-13 21:18 qumagie/
drwxr-xr-x  7 admin administrators 4096 2023-09-06 00:35 QuMagieCore/
drwxrwxrwx  4 admin administrators 4096 2023-09-07 18:37 VideoStationPro/
```
`MultimediaConsole` 配下にインストールされていることは一目瞭然(ps結果のmariadbの実行ファイルの場所でもわかるけどね)
この配下に入り込んでごちゃごちゃとある怪しげなファイルを読んでみると以下のファイルが見事に怪しい。

```
admin@qnap:/share/CACHEDEV1_DATA/.qpkg/MultimediaConsole$ cat my_mariadb.sh 
#!/bin/bash
#
# Manages MariaDB
#
set -u

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
~~snip~~

```
このファイルを読み進めると `setup_user()` というファンクションがあり、その中の変数とかを見ているとROOTアカウントのID/PWがわかる。暗号化されていないので、普通に読み解ける。いいのかよこれ。
念のためIDPWは書かないでおくので自分で調べてみてください。

## MariaDBにログイン
ということで、ここまで分かったIDPWおよびPortを使ってMultimediaConsole用に起動しているMySQLにログインができる準備が整った。
mariadbのクライアントプログラムはQNAP全体にインストールされていないので、MultimediaConsoleのbinディレクトリ配下にあるものを使う必要がある。

```
admin@qnap:/share/CACHEDEV1_DATA/.qpkg/MultimediaConsole$ mariadb10/bin/mariadb -u <ROOTID> -p<ROOTPW> -P 3310
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 725257
Server version: 10.11.3-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| s00                |
| s01                |
| sys                |
| test               |
+--------------------+
7 rows in set (0.001 sec)

MariaDB [(none)]>
```
ということで、MultimediaConsole用Mariadbにログインできた。
ROOT権限なのでいじり放題、見放題。

## MultimediaConsole用MariaDBの中身は？
レコードが格納されているテーブル一覧を見てみる。
``` SQL
MariaDB [(none)]>  select table_schema ,table_name, table_rows from information_schema.TABLES where table_schema not in ('mysql','performance_schema') and table_rows > 0 ;
+--------------+--------------------------+------------+
| table_schema | table_name               | table_rows |
+--------------+--------------------------+------------+
| s00          | subtypeTable             |          6 |
| s01          | ACL2Table                |         74 |
| s01          | artistTable              |         22 |
| s01          | genreTable               |          8 |
| s01          | pictureKeyWordTable      |          1 |
| s01          | pictureTable             |     368680 |
| s01          | videoTable               |      16156 |
| s01          | playHistoryTable         |          3 |
| s01          | faceGroupTable           |          6 |
| s01          | faceGroupClusterMapping  |         34 |
| s01          | faceFeatureTable         |     249430 |
| s01          | pictureImageClassSummary |       1000 |
| s01          | placeAddress             |       2274 |
| s01          | placeAddressUnit         |     312455 |
| s01          | pictureImgClassSynonym   |       5620 |
| s01          | pictureImgClassCategory  |         16 |
| s01          | albumViewHistory         |         31 |
| s01          | pictureViewHistory       |        452 |
| s01          | pictureColorMapping      |     247985 |
| s01          | StorageTable             |          3 |
| s01          | pictureKeyWordMapping    |         21 |
| s01          | dirTable                 |      17225 |
| s01          | songTable                |        210 |
| s01          | albumTable               |         17 |
| s01          | pictureAlbumMapping      |          4 |
| s01          | subtypeTable             |          7 |
| s01          | objDeletionTable         |          2 |
| s01          | faceTable                |     288965 |
| s01          | faceClusterTable         |       2457 |
| s01          | pictureImgClass          |        420 |
| s01          | pictureImgClassMapping   |     255895 |
| s01          | faceClusterSuggestion    |      15460 |
| s01          | pictureImgHash           |     332303 |
| s01          | flagSummary              |         19 |
| s01          | keySummary               |         11 |
| s01          | mediaPick_tmp            |     336239 |
| s01          | mediaPick_5_0            |     415817 |
| s01          | mediaPick_5_1000         |     397388 |
| sys          | sys_config               |          6 |
+--------------+--------------------------+------------+
39 rows in set (0.178 sec)
```

ファイル管理をしているのが`pictureTable`で、それ以外のテーブルはその他付加情報を管理しているのかな。
これからもっと研究してみよう。