iPhoneのスマート家電アプリの偽装失敗

# いきさつ

Nodered で Alexa-remote2 を経由した Alexa での定型アクションの実行が出来なくなったため、
各スマート家電メーカーのAPIを Nodered 経由で叩こうとしたところ、
+Style のスマート電球だけ Nodered でのノードが存在しなかったため、
+Style の iPhone アプリでの通信を解析しようとする試み。
結論としては失敗。

https://qiita.com/shiganai/items/6eb81b5e359957c6ac2d

# 環境
* Windows11 Desktop
    * Wireshark v4.0.3
* iPhone 12 mini
    * +Styleのアプリ
* +Styleのスマート電球
* Wifiルータ
    * 上記全てのデバイスが有線/無線でこのルータに接続
    * インターネットWANもこのルータに接続

# 解析できると思ったきっかけ
非公開APIを解析しているブログがあったから。
なんとか自分でも真似れないかと思った。

https://www.gcd.org/blog/2020/09/1357/

# 初期構想

1. iPhone の +Style アプリから出される通信(パケット)をキャプチャ
1. キャプチャした情報からどのような指令が出されているか解析
1. RaspberryPi から特定の命令のパケットを送信

結論的に躓いたのは2.の解析。
だから3.に関しての情報は一切述べられない

# 1. iPhone の +Style アプリから出される通信(パケット)をキャプチャ

パケットキャプチャで有名なアプリケーション Wireshark を使うが、
PCで他端末間の通信をキャプチャするために思いついたのは

* リピータハブやポートミラーリングのあるスイッチを使う
* PCを経由して通信を行う

の2択。他にもあるかもしれない。
特に iPhone だと、 Macbook などがあれば簡単に Wireshark を使ってパケットキャプチャできるらしい。
ただ、自分は Macbook は持っていなかったため、この方法は取れなかった。

https://tech.griphone.co.jp/2022/12/05/easy-packet-monitoring-with-laptop/

はじめはポートミラーリングのあるスイッチを利用しようと思った。
丁度ネットワークの勉強もしていて、 vlan も遊んでみたかったから、
以下のスイッチを買って使おうと思っていた。

https://www.amazon.co.jp/gp/product/B07QT8TNPB/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1

宅配が届く間にWiresharkで遊ぼうと思っていたら
windows11/10 のモバイルホットスポットという項目が目に入って、
調べてみるとモバイルホットスポットをオンにすると
PCでのテザリングが出来るらしい。
デスクトップは有線でインターネットで繋がっていたからかもしれないが、
無事 iPhone を PC のアクセスポイントに接続することが出来て、
Wireshark上に「ローカルエリア接続*12」という名前で
192.168.137.1 のWifiアダプターが現れた。
そこに iPhone を接続して Twitter などを開いてみると
192.168.137.8 というipアドレスで接続していることが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/568589ca-692e-14e4-c2f9-bcf15068bde0.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/8102311b-af5d-74c0-1290-119c76ba4fd8.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/b832efb6-adfc-d8d1-4296-90696dee40cf.png)

iPhone にて +Style のアプリを開いたところのパケットを監視してみると
Wireshark上では以下のようなリストが得られた。
+Styleのサーバは 44.241.48.186 というipアドレスらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/28d76647-80fc-717b-1972-f6470d5ab320.png)

# 2. パケットの解析

iPhone上の+Styleアプリでスマート電球をOffにするコマンドを実行すると、
以下のような
Application Data
で表示される暗号化された通信が得られる。
TSLv1.2 という形式で暗号化されているらしく、
これを複合するには公開鍵や秘密鍵などの情報が必要らしい。
「Wireshark tsl 複合」で検索するとウェブブラウザ上の通信を複合する例が良く出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/1e991232-5dba-9896-aadd-d6879ad6c961.png)

公開鍵や秘密鍵に関する知識として、
以下の2つの記事が自分としては最も参考になった。
自分の理解では

1. 暗号化された通信の前に TCP ハンドシェイクが行われる
1. TCPハンドシェイク内で、電子証明の交換や暗号化方式の合意、そして公開鍵の交換が行われる

という感じ。
重要なのは秘密鍵が交換されないこと。
これはセキュリティとして当然なのだが、URLの位置調整のために次の段落で述べる。

https://qiita.com/Shinya-Yamaguchi/items/becd042f641362c432bc

https://qiita.com/n-i-e/items/41673fd16d7bd1189a29

公開鍵が送信されている様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/d14ca926-8aa9-76db-4132-0a9d51732a28.png)


公開鍵、秘密鍵の関係は、
RSA暗号について調べることで理解できたつもり。
数学的には一意に定まるが、コンピュータ的には解くことが難しく、
そして暗号化するには十分な情報を公開鍵として交換することで、
秘密鍵を持っていなくても暗号化でき、
そして秘密鍵を持っていると複合化できるという仕組み。
複合化するための秘密鍵をパケットキャプチャで入手出来てしまうと、
例えばルータにリピータハブを接続できる人は
誰でも複合化することが出来るようになってしまう
(家族のパスワードとかも知れてしまう)から、
秘密鍵は一切通信には乗らない。
実に合理的。

https://manabitimes.jp/math/1146

ただ、
RSA暗号1つだけだと2つのPC間で公開鍵と秘密鍵を作った側のPCは暗号化も複合化もできるが、
公開鍵を受け取る側のPCは暗号化しかできない。
これでは双方向通信が成り立たない。
だから公開鍵は交換しあうっぽい。
「SSL/TLS（SSL3.0～TLS1.2）のハンドシェイクを復習する」で書かれている
DHEはその交換し合う鍵に関しても相互に影響しあうっぽい。

server key exchange も client key exchange も存在する様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/609a8851-f6b7-38ae-3fc4-5c1aff8ad57f.png)

# まとめ

パケットを監視するだけではサーバ側の秘密鍵は得られないから、
+Styleアプリから送られる暗号化情報を複合化することはできない。
だから解析をあきらめる。
それでも、+Styleアプリで暗号化される前のコマンドを除けたりしたら
好感された公開鍵と合わせて上手く出来るかもしれないけど、
公開鍵の交換は+Styleアプリを開くたびに行われて、
公開鍵は更新されちゃうらしいから、
自分の技術力では RaspberryPi から偽装データを送信して
スマート電球を操作することはできなさそう。

改めて、SwitchBot や Tplink に関して Nodered 上での開発をしてくれた人に感謝。