世界を動かす技術を、日本語で。

洗濯機をハッキングしました

概要

  • 洗濯機をハッキング してDiscord通知を実現した体験談
  • 実用性よりも遊び心と技術練習 が主な動機
  • IoT家電のリバースエンジニアリング のプロセス解説
  • 暗号化通信の解析とAPI調査 の手順を紹介
  • 今後他の家電にも応用予定 のプロジェクト進行中

洗濯機ハッキング体験記:Discord通知までの道のり

  • 友人と一緒に洗濯機ハックに挑戦、主に遊びと実用性の両面からの動機
  • 「Hoover Wizard」アプリ経由で通知受信 できるが、同時に一人しか接続できない仕様
  • スマートプラグ等の簡易手段 もあるが、あえて複雑な方法に挑戦する理由は技術的チャレンジと面白さ
  • 賃貸物件の安価なスマート洗濯機、Wi-Fi接続とアプリ制御機能付き
  • 家の半分がサイバーセキュリティ専攻の学生、ネットワークに繋げること自体が話題

ドアベル通知システムからの着想

  • 433MHzドアベル+安価な受信機 でDiscord通知実装
  • 厚い壁や階で音が聞こえない問題 を技術で解決
  • 将来的にはセキュリティカメラ連携 も計画中
  • この成功体験が洗濯機通知ハックの発端

リバースエンジニアリングの計画

  • スマホアプリのAPI通信解析 を目指し、OpenWRTルーターを用意
  • 2.4GHzで洗濯機を接続、5GHzでWAN接続、ラップトップでパケットキャプチャ
  • tcpdumpで通信内容を監視、IPアドレス特定
  • 4つの通信先を発見
    • 自己IPアドレス(ループバック?)
    • 255.255.255.255へブロードキャスト
    • simplyfimgmt.candy-hoover.com(Heroku経由)
    • モバイルアプリとの直接HTTP通信(ポート80)
  • 最後のモバイルアプリ通信が最も有望 と判断

洗濯機APIの解析

  • /http-read.json?encrypted=1 と /http-write.json?encrypted=1 エンドポイント発見
  • http-write.jsonはコマンド送信用、今回は未使用
  • http-read.jsonは状態取得用、しかも暗号化済み
  • 暗号化データは16進数表記でHTML Content-Type
  • ?encrypted=0でも暗号化データのまま、または400エラー

暗号化解除への挑戦

  • IoT機器の単純な暗号化(XOR等)を想定
  • ファームウェア抽出(難)かブルートフォース(易)を検討
  • CyberChefでXORブルートフォースを試行も難航
  • MelvinGr/CandySimplyFi-toolを発見し、既知文字列を利用して秒で鍵特定
  • 取得した鍵でCyberChefを使いデータ復号化に成功
  • ofalvai/home-assistant-candyのスキーマも活用、データ内容の解釈も容易に

洗濯機の状態変化の観察

  • 洗濯機の各種操作を繰り返し、APIレスポンスの変化を記録
  • Wi-Fiチップが30秒ごとにスリープする問題、3秒ごとにリクエストすることで回避
  • 主な変化項目
    • Pr:プログラム選択ノブや電源オンで変化
    • PrPh:洗濯サイクル中に変化、現在のフェーズを示唆
    • Temp:プログラム変更や手動設定で変化
    • SpinSp:スピン速度設定で変化

今後の展望とまとめ

  • この経験でリバースエンジニアリングの実践力向上
  • 他の「おバカ家電」への応用計画
  • 実用性は限定的でも、技術的挑戦と面白さが主眼
  • IoT家電のセキュリティやAPI設計の脆弱性を体感
  • 今後もDiscord通知や自動化の幅を拡大予定

Hackerたちの意見

これがHacker Newsの投稿って感じだね。

そうそう。もっと実際のハッキング(いじくり回すこと)をして、最近のLLMのクソみたいな話はやめてほしい。

それはhttps://hackaday.com/だね :)

ルート化したAndroidを使ってない限り、自分の証明書をスマホに入れるのって面倒だよね。システム証明書ストアに入れなきゃいけないから、私の知る限りではMagiskモジュールが必要だよ。もっと簡単な方法は、古いAndroidバージョンのAndroid仮想デバイスをPCで動かすこと。そうすれば、スクリプトを使って証明書を追加して、Burpsuiteやmitmproxyにトラフィックをプロキシできる。デバイスを切り替える必要もないしね。APKLabやJadxを使ってアプリのコードを見るのも面白そう。キー導出アルゴリズムが見つかるかもしれないし。アプリと洗濯機は、何らかの方法でキーを生成するか、事前共有された秘密を持ってるはず。私の理解が正しければ、アプリは両方のデバイスが同じネットワークにいるときだけ動くんだよね?それがいいね。

私はボッシュの洗濯機で何かやったよ(OPとは違うけど)。洗濯機は家の反対側にあって、ホームオフィスからは遠いんだ。時々洗濯を始めるんだけど、アラームを設定しても忘れちゃうことがある(大事な会議中とかね)。だから解決策を考えたんだ。ボッシュのAPIを使って、サイクルが完了した時とドアが開いているかどうかを確認できるようにした。今はデフォルトのバージョンを使ってるけど、コンセプトがうまくいったから、ローカルホスト版に切り替える予定。Home Assistantを使って、洗濯機のサイクルが完了していて、ドアが開いていない時に通知する簡単なスクリプトを作った。つまり、洗濯機の中に濡れた服がまだ入ってるってこと。Home Assistantは、15分ごとに私のスマホ(妻が家にいる時だけ通知)に濡れた服が待ってるってアラートを送ってくれる。すごくシンプルで、完璧に動いてるよ。

うん、LGの内蔵センサーを使おうとしたけど、実際には「ドアが開いてる」センサーはなくて、「ロック成功」の信号だけだった。だから外部のZigbeeリードスイッチドアセンサーを追加しなきゃいけなかったよ。

寝る前に洗濯をすることがあるんだけど、朝起きて乾燥機に入れられないかもしれないって分かってる。幸い、私の洗濯機には「延長タンブル」サイクルがあって、少し水を使うけど、夜中ずっと服を新鮮に保ってくれる。子供たちの面倒を見てると一日中疲れちゃうから、オフピークの電気料金を優先して夜中に洗濯することが多いんだ。エレクトロラックスが大好きだけど、他のブランドにも同じような機能があると思う。

俺の洗濯機は90年代の「バカ」な機械なんだ。洗濯サイクルは、ただのタイマーのつまみの位置で動く。コンピュータやセンサーはなくて、水が溜まる段階以外では追加の時間が必要かどうかもわからない。だから、40分のタイマーをスマホでセットすれば、いつもその時間内に終わる。これ以上シンプルなものはないよ。リマインダーが必要なときは、アラームのスヌーズ機能があるしね。

カウンタートップオーブンでも似たようなことを実装しようと思ってるんだけど、APIや接続手段がないから、スマートプラグにただ差し込んで、電力消費の測定でアイドルかどうかを判断しようと思ってるんだ(つまり、電力消費がアイドルを超えたらアームして、アイドルに戻ったらアラートを出す感じ)。

それ、めっちゃエレガントな解決策だね。シンプルなロジックで、実際に効果がある。

俺はG-Shock 5600の時計を持っていて、洗濯機が終わったときにアラートを出してくれるんだ。サイクルの最初にかかる時間をメモして、その時間を時計のタイマーに設定してスタートボタンを押す。洗濯機が終わるとビープ音が鳴るんだ。これをもう15年くらいやってる。APIに関係なく、すべてのブランドで使えるよ。

洗濯機は本当に…自分自身と話すのが好きだったのかな?ネットワークスタックを設計した人はループバックインターフェースが何か知らなかったみたいで、自分のIPアドレスに向けて大量のトラフィックを送ってた。これが重要だとは思わなかったから無視してたけど、毎秒255.255.255.255にトラフィックを送るのが好きだったみたい。なんでだろうね。これって無駄なARPなのかな?よくある行動だね。

それ、まさに俺も思った。IoTデバイスでは、IPの衝突や変化を検出するのにこれがよく使われてるのを見たことある。

洗濯機と乾燥機にマグネット式のZigbee振動センサーをつけて、Home Assistantに接続してるんだ。スマートアウトレットの電流や電圧を監視するのもいいアイデアだね。

俺はこんな感じでやってるよ。洗濯機と乾燥機にスマートプラグをつけて、電力消費をMQTTでNode-REDに送ってる。そこで簡単な監視とトリガー条件を設定して、洗濯機が始まったり止まったりするときにダッシュボードが更新されて、自分にメールが届くんだ。これで十分だよ。機械にはアプリとBluetoothもあるけど、プロトコルを逆解析するために時間をかける意味がわからないし、アプリはカメラや音声、電話、連絡先へのアクセスを求めてくるから、俺のスマホでは絶対に使わない。追記: HA用にいくつかの統合作業が行われたみたいだね: https://github.com/home-assistant-HomeWhiz/home-assistant-Ho...

「3時間」の(実際は4〜5時間くらい)洗濯が終わったとき どんな洗濯サイクルを回してるんだ?俺の洗濯機は普通の「エコ」サイクルを30分以内で終わらせるよ。終わったときにはすごく大きな音でビープ音が鳴るし。短いサイクルとシンプルな通知信号のおかげで、変なテクノロジーの解決策にハマることはないね。

アメリカにいるんじゃない?ヨーロッパの洗濯機は、水や電気の使用量の規制があるから、時間がかかるんだ。それに、そのデバイスは洗濯機と乾燥機が一体になってるみたいで、さらに時間がかかるね。俺の洗濯機は通常のサイクルで104分かかるけど、もし過負荷になったら、3時間もかかることがある!しかも、俺のはただの洗濯機なんだ。

俺の乾燥機は無通気式(つまり、役立たず)だから3時間かかる。普通の洗濯物を洗って乾かすのに4.5時間もかかるんだ。今まで使った中で最悪の家電だよ。いいところが全くない。時々、洗濯物すら乾かないこともあるし。

長いサイクルの方が微生物の除去には効果的だよ、特に酵素や活性酸素系の漂白剤を使った洗剤だとね。30分のサイクルだと、ただ「すすぎ」だけで香りをつける感じだよ。 https://pubmed.ncbi.nlm.nih.gov/25207988/

俺は冷蔵庫をハッキングしてるんだ。ソフトウェアじゃなくてハードウェアのハックで、高価なキャンピングカー用の冷蔵庫なんだけど、ガス、12V、220Vで動くんだ。電子制御装置で内部火災が起きて、ケーブルや内部が焼けちゃったけど、冷蔵庫自体はなんとか大丈夫。新しい制御基板(250ドル)を買う代わりに、古いガスボイラーの部品を使って新しいシステムを組み立てるつもり。ガスボイラーのマザーボードにはガスバーナー用のスパークジェネレーターを作るための部品が揃ってるから、ロジックと安全性さえあれば、ガスだけで動かせるかもしれない。新しい冷蔵庫を買わずに済むし、9歳の息子に電子工学を教える楽しいプロジェクトになる。ガスが関わるから、誰にでもできる仕事じゃないけど、似たようなハックにはいつも抵抗があるんだ。でも、完成すると反発も収まることが多い。楽しい仕事だから、興味がある人がいたらどうなるか教えてほしい。ちゃんとした投稿を考えるかもしれない。

うーん、暗号化が見当たらないね。最初のスクリーンショットの「cyberchef.avif」の「入力ウィンドウ」では、データはただの暗号化されていない16進ASCIIだ。16進数はかなり簡単に読めるよ。最初のバイト7Dだけでも、これはおそらくJSONだね。7D = { 0D0A = CRLF 09 = TAB 22 = " 73 = s 74 = t 61 = a 74 = t 75 = u 73 = s 4C = L 74 = a .... だから、これはただの「デコードされた」テキストだ。言及されていたXOR暗号化はどこにあるの?それに、2つ目のスクリーンショットの「キー」はリストされたバイトのアライメントがずれてる。今の入力テキストのギャップからも切り取られてないし、視覚的な提示からはそう見えない。「キー」は「D0A097D0D0A7D」で、これは13桁の16進数で、またバイトのアライメントがずれてる。0が前にあったはずで、「0D0A09...」= CRLF TABになってる。合計で「CRLF TAB { CRLF {」だ。でも、元のギャップは「24F70...」で、バイトに合わせると「224F70...」= '"Op...' だから、スクリーンショットは偽物か編集されたものに見える。何が起こってるの?

まず最初に: これは元の投稿への批判じゃないよ。変なデバイスがWi-Fiに接続したがる仕組みを解明する素晴らしい旅だと思う。Androidアプリと通信するデバイスがあるなら、https://github.com/niklashigi/apk-mitm を試してみて。これを使うと、apkからほぼすべての既知の証明書ピンニング実装を取り除けるし、マニフェストも書き換えて、ユーザーがインストールした証明書を信頼するようにできる。元のアプリをアンインストールして、apk-mitmの出力をサイドロードすれば、ストックデバイスでmitmproxyを使えるようになる。もう一つのことは、デバイスがアプリに暗号化されたデータを提供していて、アプリがそのデータを復号化して表示しているなら、そのアプリにはどこかに復号化キーが含まれているか、どこかからダウンロードしているってこと。https://github.com/skylot/jadx を使うと、apkをJavaに近いものに変換できて、それを掘り下げることでキーが何かを見つけられることが多い。でも、いくつかのベンダーは、暗号処理をネイティブコードに移すことが適切だと判断するから、その場合はGhidraで何かを逆解析しなきゃいけなくなる。気持ち次第では、これはすごく面倒か、すごく楽しいかのどちらかだけど、一般的には可能だよ。著者は他の人がやった作業の上に構築できたけど、もし誰もその作業をしていない状況に直面したら、諦めないで。自分が持っているデバイス上で動いているコードがどうなっているのかを理解しようとするのは時間をかける価値があるし、たとえ最終的に成功しなくても、その過程で多くのことを学べるはず。

「今のところ、このキーをCyberChefに挿入して、データを復号化できました。」の後の画像リンクが壊れてる。具体的にはこの要素: https://nexy.blog/2025/07/27/how-i-hacked-my-washing-machine...