꿈을꾸는 파랑새

오늘은 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) 몇 가지 (상당히 일반적인) 디버깅 방지기능 포함이 돼 있는 것을 확인할 수가 있습니다.
해당 코드는 다음과 같습니다.

macOS(맥 OS) 랜섬웨어 악성코드 디버깅 방지 기능
macOS(맥 OS) 랜섬웨어 악성코드 디버깅 방지 기능

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() 함수를 호출하여 프로세스 디버깅에 대한 권한을 요청해서 해당 콜을 사용하면 다른 프로세스에서 현재 실행 중인 프로세스를 감시하거나 제어할 수 있습니다.

macOS(맥 OS) 랜섬웨어 memcpy 함수 호출
macOS(맥 OS) 랜섬웨어 memcpy 함수 호출

해당 코드에서는 _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 함수 호출에 필요한 인자 중 하나인 데이터 크기를 지정하는 코드로 사용할 수가 있습니다.

맥북 OS 랜섬웨어 bdaemon 저장
맥북 OS 랜섬웨어 bdaemon 저장

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

입니다.

macOS(맥 OS) 랜섬웨어 de-XOR 처리
macOS(맥 OS) 랜섬웨어 de-XOR 처리

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 랜섬웨어를 분석해 보았습니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band