오늘은 LockBit(록빗)랜섬웨어는 기본적으로 몸값을 지불하는 대가로 컴퓨터 시스템에 대한 사용자 액세스를 차단하도록 설계된 악성이며 과거 목표에는 미국, 중국, 인도, 인도네시아, 우크라이나의 조직이 포함되었지만, 유럽 전역의 여러 국가(프랑스, 영국, 독일)에서 공격을 하고 있고 최근에서 한국 국세청을 털었다고 해서 한국에서도 뉴스가 된 랜섬웨어 조직입니다.
해당 악성코드는 macOS(맥 OS) 에 랜섬웨어를 감염시키게 돼 있습니다.
일단 개인적으로 다루는 것은 애플 M1 기준으로 하겠습니다. 먼저 해쉬값은 다음과 같습니다.
파일명:locker_Apple_M1_64
사이즈:402 KB
CRC32:f33bef38
MD5:abf01633960dd77c6137175a21fccf34
SHA-1:2d15286d25f0e0938823dcd742bc928e78199b3d
SHA-256:3e4bbd21756ae30c24ff7d6942656be024139f8180b7bddd4e5c62a9dfbd8c79
SHA-512: 4929d96033de0ecbb5a2356f12dc8e1cbf1a4d9659bb3c30005b55e8691981176e7162672b250ff1a8008e8dbdf4272df2a8d7fd0b7f03a6069df64f87ea01c3
locker_Apple_M1_64arm64를 Cerbero Suite Advanced로 열어보겠습니다.
디스어셈블러에서 악성코드 열기(해당 main) 몇 가지 (상당히 일반적인) 디버깅 방지기능 포함이 돼 있는 것을 확인할 수가 있습니다.
해당 코드는 다음과 같습니다.
ldr x8, 0x100050008 ; ___stack_chk_guard
locker_App:__TEXT:0x10000B100 08 01 40 F9 ldr x8, [x8]
locker_App:__TEXT:0x10000B104 E8 BF 00 F9 str x8, [sp, 0x178]
locker_App:__TEXT:0x10000B108 CB DD 00 94 bl sub_100042834 -> _getppid
locker_App:__TEXT:0x10000B10C E1 03 00 AA mov x1, x0
locker_App:__TEXT:0x10000B110 E0 03 80 52 movz w0, 0x1F
locker_App:__TEXT:0x10000B114 02 00 80 D2 movz x2, 0
locker_App:__TEXT:0x10000B118 03 00 80 52 movz w3, 0
locker_App:__TEXT:0x10000B11C 2C DE 00 94 bl sub_1000429CC -> _ptrace
locker_App:__TEXT:0x10000B120 1F 04 00 31 cmn w0, 1
locker_App:__TEXT:0x10000B124 20 1E 00 54 b.eq loc_10000B4E8
locker_App:__TEXT:0x10000B128 35 FB 26 10 adr x21, 0x10005908C
코드는 메모리 주소 0x100050008에 있는 값을 레지스터 x8에 로드합니다. 이 값은 스택 오버플로 공격을 탐지하는 데 사용되는 스택 가드 값일 가능성이 있습니다.
str x8, [sp, 0x178]
해당 코드는 x8의 값을 스택 포인터에 오프셋 0x178을 더한 메모리 위치에 저장 스택 가드 값을 스택에 저장하는 것일 수 있음
bl sub_100042834 -> _getppid
해당 코드는 sub_100042834 메모리 주소에 있는 함수, getppid를 호출 _getppid는 부모 프로세스의 프로세스 ID를 반환하는 함수 bl 명령은 분기하면서 링크 레지스터에 반환 주소를 저장
mov x1, x0
해당 코드는 x0의 값을 x1로 이동해서 나중에 사용하기 위해 _getppid가 반환한 프로세스 ID를 x1로 이동하는 것일 수 있음
movz w0, 0x1F
해당 코드는 0x1F 값을 레지스터 w0의 가장 낮은 16비트에 이동 movz 명령은 나머지 비트가 0으로 설정된 16비트 즉시 값을 레지스터에 이동
movz x2, 0
이 코드는 0 값을 레지스터 x2의 가장 낮은 16비트에 이동 이전 명령과 마찬가지로 movz 명령을 사용하여 16비트 즉시 값을 레지스터에 이동
movz w3, 0
코드는 0 값을 레지스터 w3의 가장 낮은 16비트에 이동
bl sub_1000429CC -> _ptrace
해당 코드는 sub_1000429CC 메모리 주소에 있는 함수, 아마도 _ptrace 시스템 콜을 호출_ptrace는 프로세스가 다른 프로세스를 추적할 수 있는 시스템 콜
bl 명령은 분기하면서 링크 레지스터에 반환 주소를 저장
cmn w0, 1
해당 코드는 레지스터 w0의 값을 1로 비트 보수 연산 _ptrace 시스템 콜의 반환 값
_ptrace 시스템 콜의 반환 값은 성공 또는 실패를 나타냅니다. cmn 명령은 두 개의 값을 더하면서 결과에 대한 비트 보수를 계산 해당 명령은 조건 코드를 설정하므로 다음에 실행될 분기 명령에 영향을 주게 됩니다.
해당 코드에서는 _ptrace 시스템 콜의 반환 값이 1이 아닌 경우에는 다음에 실행될 분기 명령으로 점프 이를 통해 _ptrace 시스템 콜이 성공하지 않으면 프로그램이 다른 동작을 수행하도록 설정 되며 해당 코드에서는 이후에 더 많은 명령어가 있지만, 해당 명령어들은 cmn 명령어가 설정한 조건 코드를 사용하여 분기를 수행하는 것이므로 _ptrace 시스템 콜이 실패하면 실행되지 않을 수 있습니다.
해당 코드는 어떤 종류의 보안 기능을 구현하는 데 사용 스택 가드 값과 _ptrace 시스템 콜을 사용하여 프로그램의 실행을 보호
즉 ptrace 시스템 콜은 디버깅을 방지하는 보안 기능 중 하나 이면서 _ptrace 시스템 콜은 ptrace() 함수를 호출하여 프로세스 디버깅에 대한 권한을 요청해서 해당 콜을 사용하면 다른 프로세스에서 현재 실행 중인 프로세스를 감시하거나 제어할 수 있습니다.
해당 코드에서는 _ptrace 시스템 콜의 결괏값을 확인하여, 프로세스가 디버그에 의해 감시되고 있는지를 확인하고 있으며 마약 _ptrace 시스템 콜이 성공하면, 프로세스가 감시되고 있는 것으로 판단하여 다음에 실행될 cmn 명령어로 분기해서 이를 통해 프로세스 디버깅을 방지하는 보안 기능을 구현합니다.
locker_App:__TEXT:0x10000B12C 1F 20 03 D5 nop
locker_App:__TEXT:0x10000B130 C1 76 26 10 adr x1, 0x100058008
locker_App:__TEXT:0x10000B134 1F 20 03 D5 nop
locker_App:__TEXT:0x10000B138 E0 03 15 AA mov x0, x21
locker_App:__TEXT:0x10000B13C 02 8D 84 52 movz w2, 0x2468
locker_App:__TEXT:0x10000B140 D2 DD 00 94 bl sub_100042888 -> _memcpy
locker_App:__TEXT:0x10000B144 08 00 80 D2 movz x8, 0
locker_App:__TEXT:0x10000B148 09 8B 84 52 movz w9, 0x2458
locker_App:__TEXT:0x10000B14C
에서는 memcpy 함수는 메모리 영역을 복사하는 함수로 memcpy() 라이브러리 함수의 내부 구현과 유사하며 해당 함수는 메모리의 시작 주소, 복사할 메모리의 시작 주소, 그리고 복사할 바이트 수를 인자로 받아서, 해당하는 메모리 영역을 복사하면
해당 코드에서는 _memcpy 함수를 호출하여, x21 레지스터에 저장된 값을 메모리 영역인 0x100058008에서 시작하는 위치에 0x2468 바이트만큼 복사 이를 통해 메모리에 새로운 값을 복사하고 있습니다.
해당 코드는 _memcpy 함수를 호출하여 x21 레지스터가 가리키는 주소에서부터 0x2468 바이트를 x1 레지스터가 가리키는 주소로 복사합니다. 이는 일반적인 메모리 복사 작업 코드를 악용하여 보안에 취약한 시스템의 메모리에 악의적인 코드를 삽입하는 등이 가능합니다.
즉 다음으로 보기 쉽게 하면 다음과 같습니다.
000000010000b 128 adr x21, #0x10005908c ;g_Config
000000010000b12c nop
000000010000b130 adr x1, #0x100058008 ;apple_config
000000010000b134 nop
000000010000b138 mov x0, x21
000000010000b13c mov w2, #0x2468
000000010000b140 bl imp___stubs__memcpy
0x2468은 w2 레지스터에 저장되는 값으로, _memcpy 함수에 전달되어 복사할 데이터의 크기를 지정하는 역할을 하고 있으며 해당 코드는 g_Config 변수의 데이터를 apple_config 변수로 복사하는 과정에서 사용되는 memcpy 함수 호출에 필요한 인자 중 하나인 데이터 크기를 지정하는 코드로 사용할 수가 있습니다.
XOR이 해제되면 다음과 같은 몇 가지 문자열을 찾습니다. "!!!-Restore-My-Files-!!!", "VMware vCenter Server"합니다.
_bdaemon:
0000000100059088 dd 0x00000001
.......
locker_App:__TEXT:0x10000B174 69 02 00 D0 adrp x9, 0x100059000
locker_App:__TEXT:0x10000B178 28 3D 00 F9 str x8, [x9, 0x78]
locker_App:__TEXT:0x10000B17C 28 00 80 52 movz w8, 0x1
locker_App:__TEXT:0x10000B180 1F 20 03 D5 nop
locker_App:__TEXT:0x10000B184 28 89 00 B9 str w8, [x9, 0x88]
locker_App:__TEXT:0x10000B188 A8 F8 26 10 adr x8, 0x10005909C
에서는
_bdaemon 변수를 1로 설정을 하며 adrp 명령어를 사용하여 x9 레지스터에 0x100059000 주소를 할당 그런 다음 mov 명령어를 사용하여 w8 레지스터에 0x1 값을 설정 그 다음 str 명령어를 사용하여 w8 값을 x9 레지스터가 참조하는 주소에서 0x88만큼 떨어진 위치에 있는 _bdaemon 변수에 저장합니다.
참고 하는 전역 변수는 다음과 같습니다.
iMinfilesize
iSpotMaximum
bdaemon
bSelfRemove
publickey
idelayinmin
wholefile
bfullog
bnostop
noext
no_log
bwipe
bVMDKmode
입니다.
0x100054370에 위치한 _xor_val 값으로부터 w8 레지스터에 값을 로드하고, 0x100057392 주소를 x9 레지스터에 저장합니다.
그리고 loc_10000B26C으로 이동하여, x9 레지스터에 있는 값을 ldrb 명령어로 w10 레지스터에 로드한 뒤, w10과 w8 레지스터에 있는 값을 XOR 연산하여 w10 레지스터에 저장합니다.
그리고 strb 명령어로 x9 레지스터에 있는 값을 w10 레지스터의 값을 포함한 1바이트 크기로 저장합니다.
tst 명령어를 이용하여 w10 레지스터의 최하위 1바이트가 0xFF인지 확인하고, 그렇지 않으면 loc_10000B26C으로 이동하여 다시 암호화 작업을 수행합니다.
w10 레지스터의 최하위 1바이트가 0xFF이면, 0x100057B71 주소를 x9 레지스터에 저장하고, loc_10000B288로 이동하여 같은 작업을 수행
with open("locker_Apple_M1_64", "rb") as f_in, open("strings", "wb") as f_out:
while True:
chunk = f_in.read(1024)
if not chunk:
break
encrypted_chunk = bytes(byte ^ 0x39 for byte in chunk)
f_out.write(encrypted_chunk)
de_xor_all 이를 단계별로 진행하고 각 문자열을 수동으로 덤프하거나 하드 코딩된 XOR 키를 사용할 수 있으며 몇 줄의 Python으로 구현을 할 수가 있으며 다음과 같이 볼 수가 있을 것입니다.
코드는 "locker_Apple_M1_64" 파일을 1,024바이트씩 읽어와서 XOR 연산을 통해 0x39와 비트 단위 XOR 연산을 수행하고, 그 결과를 "strings" 파일에 작성하는 코드입니다. 따라서 "strings" 파일은 "locker_Apple_M1_64" 파일의 XOR 암호화된 데이터를 담고 있습니다.
랜섬웨어의 명령 줄 사용법을 포함한 문자열이 생성됩니다.
Usage: %s [OPTION]... -i '/path/to/crypt'
Recursively crypts files in a path or by extention.
Mandatory arguments to long options are mandatory for short options too.
-i, --indir path to crypt
-m, --minfile minimal size of a crypted file, no less than 4096
-r, --remove self remove this file after work
-l, --log prints the log to the console
-n, --nolog do not print the log to the file /tmp/locker.log
-d, --daemonize runs a program as Unix daemon
-w, --wholefile encrypts whole file
-b, --beginfile encrypts first N bytes
-e, --extentions encrypts files by extentions
-o, --nostop prevent to stop working VM
-t, --wipe wipe free space
-s, --spot upper bound limitation value of spot in Mb
-p, --pass password
-f, --full full log
-a, --delay start delay in minutes
-y, --noexts do not search for extentions
-v, --vmdk search for extentions inside VMDK files
de-XOR'd 문자열 중에서 전체 랜섬 노트를 찾을 수 있습니다.
~~~ LockBit 3.0 the world's fastest and most stable ransomware from 2019~~~
>>>>> Your data is stolen and encrypted.
If you don't pay the ransom, the data will be published on our TOR darknet sites. Keep in mind that once your data appears on our leak site, it could be bought by your competitors at any second, so don't hesitate for a long time. The sooner you pay the ransom, the sooner your company will be safe.
토르 브라우저 링크
http://lockbitapt2d73krlbewgv27tquljgxr33xbwwsp6rkyieto7u4ncead(.)onion
http://lockbitapt2yfbt7lchxejug47kmqvqqxvvjpqkmevv4l3azl3gy6pyd(.)onion
http://lockbitapt34kvrip6xojylohhxrwsvpzdffgs5z4pbbsywnzsbdguqd(.)onion
http://lockbitapt5x4zkjbcqmz6frdhecqqgadevyiwqxukksspnlidyvd7qd(.)onion
http://lockbitapt6vx57t3eeqjofwgcglmutr3a35nygvokja5uuccip4ykyd(.)onion
http://lockbitapt72iw55njgnqpymggskg5yp75ry7rirtdg4m7i42artsbqd(.)onion
http://lockbitaptawjl6udhpd323uehekiyatj6ftcxmkwe5sezs4fqgpjpid(.)onion
http://lockbitaptbdiajqtplcrigzgdjprwugkkut63nbvy2d5r4w2agyekqd(.)onion
http://lockbitaptc2iq4atewz2ise62q63wfktyrl4qtwuk5qax262kgtzjqd(.)onion
Links for normal browser:
http://lockbitapt2d73krlbewgv27tquljgxr33xbwwsp6rkyieto7u4ncead.onion(.)ly
http://lockbitapt2yfbt7lchxejug47kmqvqqxvvjpqkmevv4l3azl3gy6pyd.onion(.)ly
http://lockbitapt34kvrip6xojylohhxrwsvpzdffgs5z4pbbsywnzsbdguqd.onion(.)ly
http://lockbitapt5x4zkjbcqmz6frdhecqqgadevyiwqxukksspnlidyvd7qd.onion(.)ly
http://lockbitapt6vx57t3eeqjofwgcglmutr3a35nygvokja5uuccip4ykyd.onion(.)ly
http://lockbitapt72iw55njgnqpymggskg5yp75ry7rirtdg4m7i42artsbqd.onion(.)ly
http://lockbitaptawjl6udhpd323uehekiyatj6ftcxmkwe5sezs4fqgpjpid.onion(.)ly
http://lockbitaptbdiajqtplcrigzgdjprwugkkut63nbvy2d5r4w2agyekqd.onion(.)ly
http://lockbitaptc2iq4atewz2ise62q63wfktyrl4qtwuk5qax262kgtzjqd.onion(.)ly
>>>> Very important! For those who have cyber insurance against ransomware attacks.
Insurance companies require you to keep your insurance information secret, this is to never pay the maximum amount specified in the contract or to pay nothing at all, disrupting negotiations. The insurance company will try to derail negotiations in any way they can so that they can later argue that you will be denied coverage because your insurance does not cover the ransom amount. For example your company is insured for 10 million dollars, while negotiating with your insurance agent about the ransom he will offer us the lowest possible amount, for example 100 thousand dollars, we will refuse the paltry amount and ask for example the amount of 15 million dollars, the insurance agent will never offer us the top threshold of your insurance of 10 million dollars. He will do anything to derail negotiations and refuse to pay us out completely and leave you alone with your problem. If you told us anonymously that your company was insured for $10 million and other important details regarding insurance coverage, we
>>>>> If you do not pay the ransom, we will attack your company again in the future.
귀찮아서 파파고 번역을 돌리면 다음과 같습니다.
>>>> 매우 중요합니다! 랜섬웨어 공격에 대비한 사이버 보험에 가입한 사람들을 위한 것입니다.
보험사들은 보험 정보를 비밀로 해달라고 요구하는데, 이는 계약서에 명시된 최대 금액을 절대로 지급하지 않거나 아예 지급하지 않아 협상에 차질을 빚는 것입니다. 보험 회사는 나중에 귀하의 보험이 몸값을 보장하지 않기 때문에 보장이 거부될 것이라고 주장할 수 있도록 가능한 모든 방법으로 협상을 중단하려고 할 것입니다. 예를 들어, 귀사는 1천만 달러의 보험에 가입되어 있습니다. 보험 대리인과 가능한 최저 금액, 예를 들어 10만 달러의 몸값에 대해 협상하는 동안, 우리는 소액의 금액을 거절하고 1천5백만 달러의 금액을 요구할 것입니다, 보험 대리인은 당신의 보험의 최고 한도인 천만 달러를 우리에게 절대 제공하지 않을 것입니다. 그는 협상을 방해하기 위해 무엇이든 할 것이고, 우리에게 돈을 지급하는 것을 거부할 것이고, 당신의 문제를 혼자 내버려 둘 것입니다. 만약 당신이 익명으로 우리에게 당신의 회사가 1천만 달러의 보험에 가입되어 있고 보험 적용에 관한 다른 중요한 세부사항들을 우리에게 말했다면, 우리는
만약 당신이 몸값을 지급하지 않는다면, 우리는 앞으로 당신의 회사를 다시 공격할 것입니다.
먼저 암호화할 디렉터리를 생성했습니다( ~/Downloads/lock_me_up) 암호화할 파일로 채우고
다음으로, 다음 명령줄을 사용하여 악성코드를 실행했습니다.
-f : full log
-p pass: 비밀번호
-i ~/Downloads/lock_me_up: 암호화할 디렉토리 / 랜섬웨어 노트 입니다.
암호화에서 제외될 65개의 파일 확장명 및 파일 이름 목록이 포함되어 있으며 모두 Windows 파일 확장명 및 폴더이며 다음과 같습니다.
.exe
.bat
.dll
msstyles
gadget
winmd
ntldr
ntuser.dat.log
bootsect.bak
autorun.inf
thumbs.db
iconcache.db
랏빗 랜섬웨어 갱단이 만든 macOS(맥 OS) 랜섬웨어 샘플을 간단하게 보았습니다.
2023-04-22 22:05:14 UTC 기준으로 바이러스 토탈에서 탐지를 하는 보안 업체들은 다음과 같습니다.
AhnLab-V3:Ransomware/OSX.LockBit.412227
ALYac:Trojan.Ransom.Linux.Gen
Antiy-AVL:Trojan[Ransom]/OSX.LockBit
Arcabit:Trojan.MAC.Ransom.D
Avast:Multi:Filecoder-X [Ransom]
AVG:Multi:Filecoder-X [Ransom]
Avira (no cloud):OSX/Lockbit.zicsf
BitDefender:Trojan.MAC.Ransom.D
ClamAV:Multios.Ransomware.Lockbit-9998553-0
Cynet:Malicious (score: 99)
DrWeb:Mac.Encoder.8
Emsisoft:Trojan.MAC.Ransom.D (B)
eScan:Trojan.MAC.Ransom.D
ESET-NOD32:A Variant Of OSX/Filecoder.Lockbit.A
F-Secure:Malware.OSX/Lockbit.zicsf
Fortinet:OSX/Filecoder_Lockbit.A!tr
GData:Trojan.MAC.Ransom.D
Google:Detected
Ikarus:Trojan-Ransom.MacOS.LockBit
Kaspersky:HEUR:Trojan-Ransom.OSX.LockBit.a
Lionic:Trojan.OSX.Agent.4!c
MAX:Malware (ai Score=87)
McAfee:OSX/RansomLockbit.a
McAfee-GW-Edition:OSX/RansomLockbit.a
Microsoft:Ransom:MacOS/LockBit.A
Panda:Trj/RansomGen.A
Rising:Ransom.LockBit!1.E508 (CLASSIC)
Sophos:OSX/Lockbit-Q
Symantec:Trojan Horse
Tencent:Osx.Trojan.Lockbit.Rgil
Trellix (FireEye):Trojan.MAC.Ransom.D
TrendMicro:Ransom.MacOS.LOCKBIT.A
TrendMicro-HouseCall:Ransom.MacOS.LOCKBIT.A
VIPRE:Trojan.MAC.Ransom.D
ViRobot:Linux.S.Ransom.412227
ZoneAlarm by Check Point:HEUR:Trojan-Ransom.OSX.LockBit.a
입니다. 이렇게 간단하게 맥OS 랜섬웨어를 분석해 보았습니다.
'소프트웨어 팁 > 보안 및 분석' 카테고리의 다른 글
American Express(아메리칸 익스프레스) 피싱 메일-American Express.html(2023.5.1) (0) | 2023.05.04 |
---|---|
PDF 피싱 악성코드-ProjectFunding-1678656308.PDF(2023.4.27) (0) | 2023.05.02 |
윈도우 10 22H2 버전이 윈도우 10 최종 버전 (0) | 2023.05.01 |
북한 라자루스(Lazarus) 산하 BlueNorOff(블루노로프) 만든 맥OS 악성코드-Internal PDF Viewer(2023.4.23) (0) | 2023.04.27 |
네이버 피싱 메일 ????님의 계정에 비정상적인 로그인 시도가 감지되었습니다.(2023.03.09) (0) | 2023.04.21 |
몸캠 악성코드 secret gallery.apk 분석(2023.2.28) (0) | 2023.04.20 |
파이어폭스 112.0.1(Firefox 112.0.1) 주요 쿠키 문제 해결 업데이트 (0) | 2023.04.19 |
국민건강보험 공단 피싱 사이트-r06 a9ij wtf(2023.04.17) (2) | 2023.04.18 |