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

暗号化は、ランサムウェアが実行されて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

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 では以下のように検知している。

[ファイル検知]
- Ransomware/Win.Generic.C5387930 (2023.02.25.01)
[ビヘイビア検知]
- Ransom/MDP.Decoy.M1171
[IOC 情報]
- f791d1cf335353ea57c9475a69b261b0
関連 IOC および詳細な解析情報は、AhnLab の次世代脅威インテリジェンスプラットフォーム「AhnLab TIP」サブスクリプションサービスを通して確認できる。
Categories:マルウェアの情報