2013年7月24日水曜日

MySQL Proxyで認証をフックしようと悪戦苦闘(成功してない)

色々あって、MySQL ProxyでMySQLの認証パケットを書き換えたい。
具体的にはこんな感じ。

  • ユーザー名に"+"が含まれていた場合、"+"とそれ以降の文字列を握りつぶす。
    • mysql -uroot+yoku0825 -p だったら、rootに変換してやる。
  • パスワードやその他のオプションは入力されたものを素通し。
  • クライアントはmysqlコマンドラインクライアントとは限らない。

で、まあ取り敢えずソースコードに付属していたExampleのLuaスクリプトを覗いてみる。

https://github.com/cwarden/mysql-proxy/blob/master/examples/tutorial-scramble.lua

Lua読めないけど感じ的に、「user: replace, password: me」で認証パケットを投げると、「user: root, password: secret」に書き換えてバックエンドに投げてくれるような気配がする。
良いじゃない、素敵。

サンプルスクリプトだと書き換える先はテーブルで持ってるけど、これをユーザー名は正規表現で抽出してやって、パスワードは書き換えない方針にすればきっといける。


…と思ったのが1週間前、で、今まだ出来てない(´・ω・`)

$ /usr/mysql/proxy/bin/mysql-proxy --proxy-address=127.0.0.56:3306 --proxy-backend-addresses=127.0.0.1:64056 --proxy-lua-script=/usr/local/src/mysql-proxy-0.8.3/examples/tutorial-scramble.lua --log-level=debug
2013-07-24 18:38:24: (critical) plugin proxy 0.8.3 started
2013-07-24 18:38:24: (debug) max open file-descriptors = 8192
2013-07-24 18:38:24: (message) proxy listening on port 127.0.0.56:3306
2013-07-24 18:38:24: (message) added read/write backend: 127.0.0.1:64055

起動は問題なく。

$ mysql -h 127.0.0.56 -P 3306 -utpcc -ptest
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 214
Server version: 5.6.12-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| tpcc@%         |
+----------------+
1 row in set (0.05 sec)

実在するユーザーで認証をかけるのも問題なし。
でも。

$ mysql -h 127.0.0.56 -P 3306 -ureplace -pme
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'replace'@'localhost' (using password: YES)

え、ユーザー名すりかえられてない。。

for challenge "l-7mA=KCL7j3]Z,l^q>!\000" the client sent ",wョ。ア3礼P|ェ\
&濘\\m"
2013-07-24 18:45:20: (critical) network_mysqld_proto_password_check: assertion `20 == challenge_len' failed
2013-07-24 18:45:20: (debug) [network-mysqld.c:1134]: error on a connection (fd: -1 event: 0). closing client connection.

しかも認証パケットの長さがおかしいとか言われてる。。
バックエンドが5.6だからかなぁと思って5.5につないでみても同じ。
5.1, 5.0だとエラーメッセージがチャレンジコードの長さ云々じゃなくて.server_capabilities has to be setというのに変わるので云々。。

先は長そうだ。

0 件のコメント :

コメントを投稿