ASEC
  • マルウェアの情報
  • AhnLab 検知
  • 総計
  • 対応ガイド
  • AhnLab
Posted By ATCP , 2023년 03월 09일

復号化が可能な iswr ランサムウェアが韓国国内で拡散中

ASEC(AhnLab Security Emergency response Center)はモニタリング中に、iswr ランサムウェアが配布されていることを確認した。

iswr ランサムウェアは、ファイルの暗号化を行う際にファイル名の後ろに iswr という拡張子が追加で付与される特徴があり、このランサムウェアのランサムノートは STOP ランサムウェアと同じ形態を持っている。しかし、暗号化方式や、暗号化対象の拡張子およびフォルダーのようなランサムウェアの動作ルーティンが STOP ランサムウェアとは大きく異なる。

[図1] iswr ランサムウェアのランサムノート

暗号化は、ランサムウェアが実行されて25秒後に作動し、ファイルサイズが比較的小さい拡張子のファイルから暗号化をはじめ、その次にファイルサイズが比較的大きいファイルを暗号化する。暗号化対象は以下の通りである。

  • 暗号化対象:すべてのドライブ内の以下の拡張子のすべてのファイル
  • ファイルサイズが小さい暗号化対象拡張子リスト:pdf, doc, docx, jpeg, png, jpg, ai, aep, eps, psd, dwg, odt, odp, odb, docm, xls, xlsx, xlsm, xlsb, xlk, ppt, pptx, mdb, pst, dxf, rtf, pdd, indd, cdr, dng, arw, sr2, crw, pst, nef, raw, rwl, rw2, rw2, r3d, crw, sr2, crw, x3f, max, 3DS, skp
  • ファイルサイズが大きい暗号化対象拡張子リスト:mp4, zip, rar
[図2] ランサムウェア感染後に暗号化されたファイル

iswr ランサムウェアの暗号化方式は、非対称鍵と対称鍵の2つを混ぜて使用する他の方式とは異なり、非対称鍵のみを利用して暗号化を行い、ランダムに作られたキー値(6バイト)を利用して256バイトのキーボックスを生成し、最終的にはキーボックスの特定演算を行った後で、データと XOR 演算をまとめて暗号化を行う方式である。

暗号化の方式が単純であるため、復号化も可能であるが、実際に感染したユーザーのファイルを解析しない限り、暗号化ルーティンを確認できないため、攻撃者にお金を払って復号化ツール(確実に復号化ツールを受け取れるかは不明)を渡してもらうか、フォーマットをするしかない状況になる。

ASEC では iswr ランサムウェアについて復号化できるスクリプトを製作して配布する。この復号化スクリプトは Python 3.x 環境で動作し、スクリプトコードは以下の通りである。

import sys
import os
import ctypes

key = ""
keyBox = []

suc_cnt = 0
fail = []

def genKeyBox():
    global key, keyBox

    k_arr = []

    for i in range(0, 256):
        keyBox.append(i)
        k_arr.append(key[i % 6])

    num = 0
    for i in range(0, 256):
        num = (num + keyBox[i] + ord(k_arr[i])) % 256
        keyBox[i], keyBox[num] = keyBox[num], keyBox[i]


def decrypt(filePath):
    global keyBox, suc_cnt, fail

    keyBoxCp = keyBox[:]

    file_ori = filePath[0:-5]

    try:
        fr = open(filePath, mode='rb')

        data = fr.read()

        num = 0
        num2 = 0
        res = bytearray()

        for i in range(0, len(data)):
            num2 = (num2 + 1) % 256
            num = (num + keyBoxCp[num2]) % 256
            keyBoxCp[num], keyBoxCp[num2] = keyBoxCp[num2], keyBoxCp[num]
            num3 = keyBoxCp[(keyBoxCp[num2] + keyBoxCp[num]) % 256]
            res.append(num3 ^ data[i])

        fr.close()

        fw = open(file_ori, mode='wb')
        fw.write(res)

        fw.close()

        os.remove(filePath)

        suc_cnt += 1
    except Exception as e:
        fail.append(filePath)


def search_dir(path):
    num = 0

    for (root, dirs, files) in os.walk(path):
        for file in files:
            if file[-5:]==".iswr":
                num += 1

    if num == 0:
        return

    print("[+] Number of encrypted files : " + str(num) + "\n")

    cnt = 0

    for (root, dirs, files) in os.walk(path):
        for file in files:
            if file[-5:]==".iswr":
                cnt += 1
                print("\r[+] Progress : %0.1f%% (%d/%d)"%(cnt / num * 100, cnt, num), end='')
                filePath = os.path.join(root, file)
                decrypt(filePath)


def help():
    print("Usage : decryptor.py [Personal_ID] [Recovery_Directory_Path]\n")
    print("Personal_ID : Personal ID at the bottom of the ransom note (44 characters)")


def main():
    global key, suc_cnt, fail
    print("iswr Decryptor v1 by ASEC Analysis Team\n")

    arg = sys.argv

    if len(arg) < 3:
        print("[-] Invalid parameter\n")
        help()
        return

    if len(arg[1]) != 44:
        print("[-] Invalid Personal ID\n")
        help()
        return

    if os.path.isdir(arg[2]) == False:
        print("[-] Not exist directory\n")
        help()
        return

    print("[+] Personal ID : " + arg[1])

    key = arg[1][-6:]

    print("[+] Key : " + key + "\n")

    genKeyBox()

    search_dir(arg[2])

    total = suc_cnt + len(fail)

    print("\n[+] Total : " + str(total) + " / Success : " + str(suc_cnt) + " / Fail : " + str(len(fail)) + "\n")

    if len(fail) > 0:
        print("[-] Fail list\n")

        for failFile in fail:
            print(failFile)

    print("\n[+] End")


main()

スクリプト実行時、以下のようなパラメータを与えて実行しなければならず、Personal_ID の場合はランサムノートの末尾の44桁の文字を入力すればよい。パラメータを与えて実行すると、自動でファイルが復号化され、暗号化された原本ファイルは自動で削除される。

decryptor.py [Personal_ID] [復旧対象フォルダー]

ランサムウェア被害の予防のため、出どころが不明なファイルを実行する際は注意しなければならず、疑わしいファイルはセキュリティソフトによる検査を行い、アンチウイルスを最新版にアップデートしておく必要がある。

V3 では以下のように検知している。

[図3] V3 製品の検知結果

[ファイル検知]

  • Ransomware/Win.Generic.C5387930 (2023.02.25.01)

[ビヘイビア検知]

  • Ransom/MDP.Decoy.M1171

[IOC 情報]

  • f791d1cf335353ea57c9475a69b261b0

関連 IOC および詳細な解析情報は、AhnLab の次世代脅威インテリジェンスプラットフォーム「AhnLab TIP」サブスクリプションサービスを通して確認できる。

Categories: マルウェアの情報

Tagged as: ASEC, ランサムウェア

RDP を通して拡散している GlobeImposter ランサムウェア(with MedusaLocker)
韓国国内の金融企業セキュリティメールを詐称した CHM マルウェア:RedEyes(ScarCruft)

Archives

  • Facebook
  • RSS Feed
follow us in feedly
 

Loading Comments...