wonder
정보보안 스터디 - 21주차 7일 - 복호화 가능한 iswr 랜섬웨어 유포중 본문
ASEC은 최근, 복호화가 가능한 iswr 랜섬웨어가 국내에서 유포중임을 확인하였습니다.
파일확장자는 iswr로 임의의 확장자라고 보시면 될 것 같고
기존 STOP 랜섬웨어와 똑같은 랜섬노트(readme)이기 때문에 같은 그룹인가? 라고 생각할 수 있습니다.
하지만 최근에는 공격자들도 안티포렌식 작전을 펼쳐 포렌식을 진행할 때 헛걸음하도록 노력합니다.
그렇기 때문에 날짜를 변경한다거나, 다른 나라로 의심하도록 만들거나, 다른 그룹 소속으로 의심하게 만듭니다.
그럼에도 조직의 행동패턴을 예측하는 방법은 반복적으로 활동하는 시간 찾기, 웹브라우저의 fingerprinting, 광고 기록 등이 있습니다.
하지만 암호화의 방식이 대상 확장자 및 파일은 동작 루틴이 많이 다릅니다.
일단 암호화가 실행되고나서 25초 후에 작동하도록 했으며, 파일크기가 작은 확장자 부터 먼저 암호화 시키고(pdf, xls, doc, xlsx, xlsm, ppt, rw2 등등), 그 다음 크기가 큰 zip, mp4 등을 암호화합니다.
그렇기 때문에 작은 문서부터 빠르게 암호화할수 있다는 점입니다.
암호화 방식은
다른 랜섬웨어가 비대칭키, 대칭키 두가지를 섞어서 이용하는 방식이였다면
비대칭키만 이용해서 암호화를 진행했습니다. 랜섬으로 만든 키 값(6bytes)를 이용해 256bytes의 키 박스를 생성하고 결국 키 박스에 특정 연산을 한 후 데이터와 XOR연산을 통해 암호화 시킵니다.
복호화가 가능한 비교적 단순한 랜섬웨어 암호화였지만
피해자는 제대로 된 소스코드 분석없이 복호화가 안된다고 판단해 돈을 지불하는 상황이 발생했습니다.
값을 지불하여 복호화 툴을 받습니다.
또한 피해자의 입장이라면 당장 시간이 촉박하기도 하고, 시스템을 확장당했으므로 어떤 대응을 하는지 감시당하게 됩니다. 그래서 돈을내야하는 부담감이 있을 수 밖에 없습니다.
복호화 스크립트는 다음과 같습니다. 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()
decryptor.py [Personal_ID] [복구 대상 폴더]
스크립트 실행 시 해당 인자값을 주어야 하며 personal_id는 랜섬노트 마지막 44글자를 입력하면 됩니다.
V3에서는 해당 랜섬웨어 종류를 위협요소로 추가했습니다.
'Culture > 보안 뉴스' 카테고리의 다른 글
정보보안 스터디 - 22주차 5일 - 의학계에서의 사이버보안 투자 (0) | 2023.03.15 |
---|---|
정보보안 스터디 - 22주차 4일 - 지능화 되어가고 있는 불법사이트 (0) | 2023.03.13 |
정보보안 스터디 - 21주차 3일 - 챗GPT 실무 활용법 8가지 (0) | 2023.03.05 |
정보보안 스터디 - 20주차 4일 - 해킹 알아차리지 못한 Godaddy 호스팅업체 (0) | 2023.02.28 |
정보보안 스터디 - 20주차 3일 - LG유플러스, 개인정보 유출 피해 지원 (1) | 2023.02.26 |