はじめに
こんにちは、ネトヲです。
今回はコンセントにぶっさすだけで、消費電力をモニタしてくれるIoT機器を購入したので、早速使ってみました!
その名も
「【+Style ORIGINAL】スマートプラグ 消費電力/タイマー 動作 Amazon Alexa/Google Home 対応 アプリ連携 Wi-Fi 音声コントロール ハブ不要 スマートコンセント ソケット」
です。

購入してから気づいたんですが、このスマートプラグのブランド「+Style」って様々なスマート製品を販売しているようで、コーヒーメーカーやらカメラ、果ては水漏れセンサー等々面白そうな製品ばかりです。
ちなみに、ただ紹介するだけではつまらないので、若干技術的なネタも書く予定です。
開封

この「+Style」ですが、国内メーカが発売していることもあり、中華製品にありがちな中華フォントや誤字脱字はなく、パッケージは結構洒落てます。(若干Ankerっぽい?)

内容物は本体と取扱説明書のみとシンプルです。
取扱説明書は日本語で書かれていることもあり、私のようなIoT機器初心者でも簡単に導入できそうな雰囲気です。
設定
とくに難しいところはありませんが、いくつが注意点があります。
- 2.4GHz帯のWi-Fiのみ対応
- 設定にはスマートフォン必須
- オフライン環境では使用不可(オンラインアカウントとデバイスの紐付け必須)
以上3点、満たしていることを確認してくださいね。
スマートプラグをコンセントに差した後、正面のボタンを5秒間おして初期設定モード?的なものとし、続いてスマートフォンに「+Style – プラススタイル」アプリをインストール。
その後、アカウント作成後、Wi-Fi設定をするわけですが、

セキュリティの関係からSSIDはお見せできませんが、上記画面には現在スマートフォンが接続しているWi-Fiが表示され、かつ2.4GHzのみ対応なのでご注意ください。

後は画面の案内に従って、設定していけば何事もなくスマートプラグの導入ができます。
使ってみた
私的に一番気に入っている機能はやはり、電力量グラフ表示ですね。

本当はこの値を取り出して、運用管理サーバで処理させたかったんですが、APIがクローズドなのか公開されておらず、アプリ以外でアクセスする方法は無い雰囲気です。
その反面、オンラインアカウントと紐付けられているためか、ポート解放せずとも外部ネットワークから値を読み取ることが可能です。
私は手をつけてませんが、「スマートモード」という機能を用いて”シーンを作成”すれば、ある事象をトリガーとして、様々な動作をオートメーション化することが可能です。詳しくは公式HPをご覧ください。

当方にて検証した結果、ポート開放/フォワーディングしなくとも、外部ネットワークからアクセスできました。※
パケットキャプチャをしていないので「恐らく」としか言えませんが、本製品がオンラインアカウントに紐付けされており、逐次、データをクラウドにアップロードしているものと思われます。
※固定グローバルv4アドレスが振られない環境下で、数回IPを変更して試しました。
Nmapでポートスキャン
Alexa/Google Home対応とのことで、とりあえず所有しているGoogle Nest mini(Google Home)とリッスンしているポートを比較してみます。
ちなみにGoogle Home(v2)にはユーザ認証なしに、情報の取得や再起動(現在は不可)が可能とのことで、同じような動作をするか確認してみます。
とりあえずNmapでスキャンします。
スマートプラグ
# nmap <スマートプラグのIPアドレス> -p 8000-30000
Host is up (0.0076s latency).
Not shown: 21992 closed tcp ports (conn-refused)
PORT STATE SERVICE
8008/tcp open http
8009/tcp open ajp13
8012/tcp open unknown
8443/tcp open https-alt
9000/tcp open cslistener
10001/tcp open scp-config
10005/tcp open stel
10007/tcp open mvs-capacity
10101/tcp open ezmeeting-2
Nmap done: 1 IP address (1 host up) scanned in 31.99 seconds
Google Home
# nmap <Google HomeのIPアドレス> -p 8000-30000
Host is up (0.0031s latency).
Not shown: 21996 closed tcp ports (conn-refused)
PORT STATE SERVICE
8008/tcp open http
8009/tcp open ajp13
9876/tcp open sd
10001/tcp open scp-config
22222/tcp open easyengine
Nmap done: 1 IP address (1 host up) scanned in 22.23 seconds
やはりというか、どちらもHTTPの8008ポートが開いておりました。
このポートからcurlコマンドを利用していくつか確認してみます。
※私も詳しくないため、下記サイトを参考にしました。
Curlコマンドで情報取得
まずは端末情報を取得してみます。
# curl -s http://<スマートPlugのIPアドレス>:8008/setup/eureka_info
{"bssid":"XX:XX:XX:XX:XX:XX",
"build_version":"XXXXXX",
"cast_build_revision":"X.XX.XXXXXX",
"closed_caption":{},
"connected":true,
"ethernet_connected":false,"has_update":false,
"hotspot_bssid":"XX:XX:XX:XX:XX:XX",
"ip_address":"XXX.XXX.XXX.XXX",
"locale":"ja",
"location":{"country_code":"JP",
"latitude":255.0,"longitude":255.0},
"mac_address":"XX:XX:XX:XX:XX:XX",
"name":"ベッドルーム",
...
簡単に取得できましたね。IPアドレスやMACアドレス、uptime等開示されてしまうのは恐ろしい。。。
その他Wi-Fiスキャン
# curl -s http://<スマートPlugのIPアドレス>:8008/setup/scan_results
#
デバイスの再起動
# curl -Lv -H Content-Type:application/json --data-raw '{"params":"now"}' http://<スマートPlugのIPアドレス>:8008/setup/reboot
* Trying <XXX.XXX.XXX.XXX>:8008...
* Connected to XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX) port 8008 (#0)
> POST /setup/reboot HTTP/1.1
> Host: XXX.XXX.XXX.XXX:8008
> User-Agent: curl/7.77.0
> Accept: */*
> Content-Type:application/json
> Content-Length: 16
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 403 Forbidden
< Access-Control-Allow-Headers:Content-Type
< Cache-Control:no-cache
< Content-Length:0
<
* Connection #0 to host XXX.XXX.XXX.XXX left intact
等々試しましたが、穴が塞がれているようで期待した値を得ることはできませんでした。
上記3ファイルはGoogle Home界隈ではwell-knownファイルであり、これだけでは面白くないため、Webコンテンツスキャンを実施し、可能な限りディレクトリ構造を漁って見ましょう。
dirbコマンドでディレクトリスキャン
運用管理サーバにdirbがインストールされていなかったんで(Kali Linuxを除きプリインストールされてなさそう)、サクッとインストール。
# dirb <スマートPlugのIPアドレス>:8008/ -i -w
-----------------
DIRB v2.22
By The Dark Raver
-----------------
START_TIME: Sun Nov 14 16:14:42 2021
URL_BASE: http://XXX.XXX.XXX.XXX:8008/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
OPTION: Using Case-Insensitive Searches
OPTION: Not Stopping on warning messages
-----------------
GENERATED WORDS: 4456
---- Scanning URL: http://XXX.XXX.XXX.XXX:8008/ ----
-----------------
END_TIME: Sun Nov 14 16:15:01 2021
DOWNLOADED: 4456 - FOUND: 0
うーん、見つからないですね、というか/setupディレクトリは辞書に登録されてないのか。
次に/setup配下をスキャンしてみます。
# dirb http://<スマートPlugのIPアドレス>:8008/setup -i -w
-----------------
DIRB v2.22
By The Dark Raver
-----------------
START_TIME: Sun Nov 14 16:20:55 2021
URL_BASE: http://XXX.XXX.XXX.XXX:8008/setup/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
OPTION: Using Case-Insensitive Searches
OPTION: Not Stopping on warning messages
-----------------
GENERATED WORDS: 4456
---- Scanning URL: http://XXX.XXX.XXX.XXX:8008/setup/ ----
+ http://XXX.XXX.XXX.XXX:8008/setup/offer (CODE:403|SIZE:0)
-----------------
END_TIME: Sun Nov 14 16:21:17 2021
DOWNLOADED: 4456 - FOUND: 1
「http://XXX.XXX.XXX.XXX:8008/setup/offer」というファイルが見つかりましたが、sizeが0と空のファイルのような雰囲気。一応アクセスしてみましたが、案の定何も表示されず。
※ちなみにGoogle Homeだと
{"token":"XXXXXXXXXXXX...."}
と表示されます。なんのこっちゃ。
とりあえず、私の実力ではこれ以上探り入れることはできませんでした。。ゴメンなさい。
+Styleについて

冒頭でも紹介した「+Style」ですがどうやらソフトバンクホールディングスの1つである「BBソフトサービス株式会社」が運営している会社らしいです。
また、製品は”恐らく”内製ではなく、中国の「Tuya Global」と呼ばれる会社とパートナー契約を結んでいるようなので、同社「Tuya Smart」サービスの国内代理店的ポジションという感じです。
http://www.itmedia.co.jp/news/articles/1810/16/news089.html
まとめ
職業柄、このようなIoTデバイスをみると、脆弱性がないか探りを入れてしまうわけですが、ぱっと調べた限りは直接的な問題はありませんでした。
今回はここまでですが、パケットキャプチャを行い、不正な通信をしていないか確認し、何かありましたら報告したいと考えます。