상세 컨텐츠

본문 제목

LockBit 3.0 Builder 분석

악성코드 분석 리포트

by Hexer 2022. 10. 31. 17:12

본문

 

1. 개요

LockBit 랜섬웨어 그룹은 2019년 9월을 시작으로, 서비스형 랜섬웨어(Ransomware-as-a-Service)로 운영되어 온 조직이다. 지난 6월에는 LockBit 3.0을 출시하면서 랜섬웨어 조직으로써는 최초로 버그바운티 프로그램을 운영하는 등 다른 랜섬웨어 그룹과는 차별화된 행적을 보여준 바 있으며, 올해 상반기에는 가장 활발한 랜섬웨어 조직으로 급부상하였다.

[그림 1] LockBit 3.0 버그 바운티 페이지

 

[그림 2] 랜섬웨어 월별 피해 사고 (출처 : KARA)

 

하지만 최근 이러한 LockBit의 행적에 제동을 거는 이슈가 발생했다. 바로 LockBit 3.0 빌더가 유출된 것이다. 올해 상반기 주요 화두로 떠오른 랜섬웨어 조직인만큼 빌더 유출 이슈는 보안업계에서도 주요 관심사가 되었다.

 

지난 9월 21일, ali_qushji는 트위터를 통해 LockBit 랜섬웨어 그룹의 서버를 해킹하였다고 주장하며 LockBit 3.0 빌더를 유출하였다. 이에 대해 LockBit 랜섬웨어 그룹은 서버가 해킹 당한 것이 아니라 불만을 품은 내부 개발자가 유출한 것이며, 해당 개발자를 해고하였다는 입장을 밝혔다.

[그림 3] 트위터 (@ali_qushji, @3xp0rtblog)

 

LockBit 3.0 빌더는 트위터의 두 개의 계정(@ali_qushji, @protonleaks1)을 통해 유출되었으며, 현재 해당 계정은 비활성 상태이다.

 

유출된 LockBit 3.0 빌더는 랜섬웨어 구성 설정 파일(config.json)과 키 생성기(keygen.exe), 빌더(builder.exe), 모든 파일을 빌드하기 위한 배치 파일(build.bat)로 구성되어 있다.

[그림 4] 유출된 LockBit 3.0 빌더

 

배치 파일(build.bat)을 실행하면 dll 및 exe 포맷의 LockBit 3.0 랜섬웨어와 복호화 도구 등이 생성된다.

[그림 5] 배치 파일(build.bat) 실행 시 생성되는 파일

 

빌드 된 LockBit 3.0 랜섬웨어를 실행하면 [그림 6]과 같이 파일이 암호화되어 확장자가 변경되고 랜섬노트가 생성된다.

[그림 6] 빌드 된 LockBit 3.0 랜섬웨어 실행 후 암호화된 파일

 

암호화된 파일은 빌드 된 복호화 도구를 이용하여 복호화가 가능하다.

[그림 7] 빌드 된 복호화 도구를 사용하여 복호화

 

이처럼 유출된 빌더를 이용하면 누구나 손쉽게 랜섬웨어를 빌드하여 공격에 악용할 수 있다. 실제로, Bl00dy 갱단이 유출된 LockBit 3.0 빌더를 공격에 활용한 정황이 확인된 바 있으며, 이 외에도 다양한 공격자들에 의해 악용될 여지가 다분하기 때문에 보안업계 입장에서도 달가운 소식이라 할 수 없다.

 

물론, LockBit와 같이 서비스형 랜섬웨어(Ransomware-as-a-Service)로 운영되어 온 랜섬웨어의 유출 이슈가 이번이 처음은 아니다. 작년부터 올해까지만 돌이켜보더라도, Babuk 랜섬웨어와 Conti 랜섬웨어의 소스코드 유출 이슈가 있었다. RaaS로 운영되어 오던 주요 랜섬웨어의 소스코드가 유출되면서 유출된 소스코드를 기반으로 한 새로운 랜섬웨어들이 탄생하기도 하였다. 이번 이슈의 경우, 소스코드가 유출된 것은 아니지만 누구나 설정 파일을 커스텀하여 쉽게 재사용이 가능하므로 공격자들의 진입장벽이 낮아지면서 이를 활용한 범죄가 증가할 것으로 전망된다.

 

 

2. 상세 분석

 2.1 Build.bat

구분 내용
파일명 Build.bat
파일 크기 741 bytes
파일 유형 BAT
MD5 4E46E28B2E61643F6AF70A8B19E5CB1F
SHA1 804A1D0C4A280B18E778E4B97F85562FA6D5A4E6
SHA256 8E83A1727696CED618289F79674B97305D88BEEEABF46BD25FC77AC53C1AE339

[표 1] 파일 정보 (Build.bat)

 

Build.bat 파일은 키 파일을 생성하고, LockBit 3.0 랜섬웨어와 복호화 도구를 빌드하는 윈도우 배치파일이다. 배치 파일의 주요 행위는 다음과 같다.

-      키 생성기(keygen.exe)를 이용하여 RSA 공개키/개인키 파일 생성

-      빌더(builder.exe)와 설정 파일(config.json) 및 개인키를 이용하여 복호화 도구 빌드

-      빌더(builder.exe)와 설정 파일(config.json) 및 공개키를 이용하여 LockBit 3.0 랜섬웨어 빌드 (dll & exe)

[그림 8] Build.bat

 

 2.2 config.json

구분 내용
파일명 config.json
파일 크기 8,374 bytes
파일 유형 JSON
MD5 A6BA7B662DE10B45EBE5B6B7EDAA62A9
SHA1 F3ED67BDAEF070CD5A213B89D53C5B8022D6F266
SHA256 3F7518D88AEFD4B1E0A1D6F9748F9A9960C1271D679600E34F5065D8DF8C9DC8

[표 2] 파일 정보 (config.json)

 

config.json 파일은 LockBit 3.0 랜섬웨어 빌드 시 참조하는 JSON 포맷의 설정 파일이다. 해당 파일을 통해 랜섬웨어 동작과 관련한 각종 설정들을 커스텀 할 수 있다.

[그림 9] config.json

 

[표 3]은 JSON 포맷의 설정 파일(config.json)에서 확인되는 “settings” 하위 키에 대한 설명을 정리한 것이다. 각 Key는 플래그 값(“true” or “false”)을 통해 설정할 수 있다. (“encrypt_mode” Key 예외)

※ “encrypt_mode” Key는 “fast” 혹은 “auto” 설정 가능

Key 설명
encrypt_mode 암호화 모드 (“fast” or “auto”)
encrypt_filename 파일명 암호화
impersonation “impers_accounts” Key에 저장된 자격증명을 이용해 로그인
skip_hidden_folders 숨김 폴더를 암호화에서 제외
language_check 감염 시스템이 CIS(독립국가연합)에 해당하는지 확인
local_disks 로컬 드라이브 암호화
network_shares 네트워크 드라이브 및 공유 폴더 암호화
kill_processes “kill_processes” Key에 저장된 프로세스 종료
kill_services "kill_services" Key에 저장된 서비스 종료
running_one 하나의 프로세스만 동작 (중복실행 방지)
print_note 연결된 프린터를 통해 랜섬노트 출력
set_wallpaper 바탕화면 변조
set_icons 암호화된 파일의 아이콘 변경
send_report 감염 시스템 정보 수집
self_destruct 악성행위 완료 후 자가 삭제
kill_defender 안티바이러스 소프트웨어 종료
wipe_freespace 자가 삭제 시, 완전 삭제를 위해 Wipe Free space 작업을 추가로 진행
psexec_netspread psexec를 이용하여 네트워크 전파
gpo_netspread 그룹정책(GPO)을 통한 네트워크 전파
gpo_ps_update 파워쉘을 이용하여 모든 도메인의 그룹정책(GPO) 업데이트
shutdown_system 시스템 재부팅
delete_eventlogs 이벤트 로그 삭제
delete_gpo_delay 생성한 그룹정책(GPO) 삭제

[표 3] config – settings (config.json)

 

[표 4]는 “settings”를 제외한 “config” 하위 Key에 대한 설명을 정리한 것이다.

각 Key에 대한 설정 값은 하드코딩 되며, 값이 여러 개일 경우 “;”를 구분자로 사용한다.

Key 설명
white_folders 암호화 제외 폴더
white_files 암호화 제외 파일
white_extens 암호화 제외 확장자
white_hosts 암호화 제외 호스트 네임
kill_processes 프로세스 종료 대상
kill_services 서비스 종료 대상
gate_urls C2 URL
impers_accounts 로그온에 사용할 자격증명
note 랜섬노트 내용

[표 4] config (config.json)

 

 2.3 keygen.exe

구분 내용
파일명 keygen.exe
파일 크기 31,744 bytes
파일 유형 EXE
MD5 71C3B2F765B04D0B7EA0328F6CE0C4E2
SHA1 BF8ECB6519F16A4838CEB0A49097BCC3EF30F3C4
SHA256 EA6D4DEDD8C85E4A6BB60408A0DC1D56DEF1F4AD4F069C730DC5431B1C23DA37

[표 5] 파일 정보 (keygen.exe)

 

keygen.exe 파일은 3개의 실행 인자를 받아 동작하며, RSA 키 페어와 감염 시스템 식별을 위한DECRYPTION_ID를 생성하는 기능을 한다. 생성된 공개키와 개인키는 Base64 인코딩 되어 각각 실행 인자(-pubkey, -privkey)로 전달받은 파일 명으로 저장된다.

DECRYPTION_ID는 생성된 공개키의 0x80 offset의 Hex값을 8바이트만큼 읽어 16바이트 문자열로 변환한 값이며, DECRYPTION_ID.txt 파일로 저장된다.

[그림 10] RSA 키 페어 및 DECRYPTION_ID 생성

 

실행 인자 설명
-path RSA 키 페어 파일과 DECRYPTION_ID 파일을 저장할 경로
-pubkey 공개키 파일 명
-privkey 개인키 파일 명

[표 6] keygen.exe 실행 인자

 

 2.4 builder.exe

구분 내용
파일명 builder.exe
파일 크기 480,768 bytes
파일 유형 EXE
MD5 C2BC344F6DDE0573EA9ACDFB6698BF4C
SHA1 D6AE7DC2462C8C35C4A074B0A62F07CFEF873C77
SHA256 A736269F5F3A9F2E11DD776E352E1801BC28BB699E47876784B8EF761E0062DB

[표 7] 파일 정보 (builder.exe)

 

builder.exe 파일은 LockBit 3.0 랜섬웨어와 복호화 도구를 빌드하는 기능을 갖고 있다.

총 9개의 실행 인자를 받을 수 있으며, 각 실행 인자에 대한 설명은 [표 8]과 같다.

LockBit 3.0 랜섬웨어는 총 3가지 타입(exe, dll, Reflective DLL)으로 빌드 가능하며, -pass 옵션을 통해 랜섬웨어 실행에 특정 인자 값(비밀번호)이 필요하도록 빌드할 수 있다. 이는 샌드박스 및 동적분석을 우회할 목적으로 사용할 수 있는 옵션이다.

실행 인자 설명
-type enc : LockBit 3.0 랜섬웨어 빌드
dec : 복호화 도구 빌드
-privkey 복호화 도구 빌드에 사용할 개인키 경로
-pubkey LockBit 3.0 랜섬웨어 빌드에 사용할 공개키 경로
-exe
-dll
-ref (Reflective DLL)
LockBit 3.0 랜섬웨어 파일 타입
-pass LockBit 3.0 랜섬웨어 실행에 필요한 비밀번호 설정
(실행에 필요한 비밀번호는 Password_exe.txt, Password_dll.txt 파일에 저장)
-config 랜섬웨어 설정 파일 경로
-ofile 빌드 결과 파일을 저장할 경로

[표 8] builder.exe 실행 인자

 

다음은 Build.bat 파일에서 확인되는 builder Command Line이다. ([그림 8] 참조)

총 6개의 Command Line이 확인되며, 이는 크게 복호화 도구 빌드와 3가지 타입(exe, dll, ref)의 랜섬웨어 빌드로 분류할 수 있다.

builder -type dec -privkey priv.key -config config.json -ofile LB3Decryptor.exe
builder -type enc -exe -pubkey pub.key -config config.json -ofile LB3.exe
builder -type enc -exe -pass -pubkey pub.key -config config.json -ofile LB3_pass.exe
builder -type enc -dll -pubkey pub.key -config config.json -ofile LB3_Rundll32.dll
builder -type enc -dll -pass -pubkey pub.key -config config.json -ofile LB3_Rundll32_pass.dll
builder -type enc -ref -pubkey pub.key -config config.json -ofile LB3_ReflectiveDll_DllMain.dll

[표 9] Build.bat 파일에서 확인되는 builder Command Line

 

본 보고서에서는 빌드 유형을 4가지로 분류하여 살펴보도록 하겠다.

 

  01) 복호화 도구 빌드 (-type dec)

   ① builder -type dec -privkey priv.key -config config.json -ofile LB3Decryptor.exe

builder.exe는 실행 시 전달받은 인자를 확인하여 ‘-type’ 인자로 전달받은 값이 ‘dec’ 인지 ‘enc’ 인지 비교한다. 만약 ‘dec’ 일 경우, ‘-config’, '-privkey', ‘-ofile’ 인자로 전달받은 값을 특정 함수(sub_403844)에 파라미터로 전달한다.

[그림 11] 실행 인자 확인

 

sub_403844 함수가 호출되면, ‘-privkey’ 인자로 전달받은 값에 해당하는 RSA 개인키 파일(priv.key)의 데이터를 읽어 들여 Base64 디코딩을 수행한다.

[그림 12] RSA 개인키 파일(priv.key) Read

 

[그림 13] Base64 Decode

 

[그림 14] Base64 Decode

 

‘-privkey’ 인자로 전달받은 RSA 비밀키에 대한 Base64 디코딩이 완료되면, ‘-config’ 인자로 전달받은 설정 파일(config.json)의 데이터를 읽어 들인다.

[그림 15] 설정 파일(config.json) Read

 

JSON 포맷인 설정 파일([그림 9] 참조)에서 “white_folders” Key의 값을 해시 알고리즘을 통해 각각 4바이트 해싱한다.

[그림 16] 해시 알고리즘

 

다음은 "white_folders" Key에 존재하는 총 20개의 값들이 각각 4바이트 해싱 된 결과를 메모리에서 확인한 것이다.

[그림 17] "white_folders" Key의 값을 4바이트 해싱

 

[그림 17]에서 4바이트 해싱 된 데이터는 최종적으로 Base64 인코딩 된다.

[그림 18] 4바이트 해싱 된 데이터를 Base64 인코딩한 결과

 

이와 같이, ‘-privkey’와 ‘-config’ 인자로 전달받은 데이터에 대한 1차적인 가공([그림 14], [그림 18]참조)이 완료되면, 가공된 데이터를 XOR 인코딩 하기 위해 필요한 XOR Key 생성 작업을 수행한다.

 

먼저, rdrand, rdseed, rdtsc 등의 어셈블리 명령을 사용하여 난수를 생성한다.

[그림 19] 난수 생성

 

생성한 난수와 하드코딩 된 값을 조합하여 XOR Key를 생성한다.

[그림 20] 난수와 하드코딩 된 값을 조합하여 XOR Key 생성

 

XOR Key 생성이 완료되면, 1차 가공 데이터를 최종적으로 XOR 인코딩 한다.

[그림 21] 1차 가공 데이터를 XOR 인코딩

 

[그림 22] 1차 가공 데이터를 XOR 인코딩

 

[그림 22] 하단의 최종 인코딩 된 데이터는 복호화 도구에 해당하는 리소스의 특정 섹션에 삽입된다. 그 과정은 다음과 같다.

 

먼저, builder.exe 파일 내부에 존재하는 ID=100인 리소스를 메모리에 로드 한다.

[그림 23] 리소스(ID=100) 로드

 

※ builder.exe 파일 내부에는 총 4개의 리소스가 존재하며, 모두 PE파일로 확인된다. 그 중 ID=100인 리소스가 복호화 도구에 해당하며, 나머지 리소스는 “-type enc” 인자를 전달받았을 경우 사용되는 LockBit 3.0 랜섬웨어이다.

[그림 24] builder.exe에 내장되어 있는 리소스

 

메모리에 로드 된 리소스에서 NT Header를 찾고 해당 오프셋을 기준으로 섹션 명을 탐색하여 “.xyz” 섹션의 이름을 “.data”로 변경한다. 이후, 변경된 섹션에 [그림 22] 하단의 최종 인코딩 된 데이터(RSA 비밀키 + white_folders)를 삽입하고 체크섬을 확인하여 헤더에 반영한다.

[그림 25] 섹션 이름 변경 및 데이터 삽입

 

다음은 [그림 25]의 작업이 이루어지기 전후를 비교한 것이다. 리소스(ID=100) 원본은 .xyz 섹션이 비어 있는 것을 알 수 있으며, 작업이 완료되면 섹션 이름이 변경되면서 데이터가 삽입되는 것을 확인할 수 있다.

[그림 26] 섹션 이름 변경 및 데이터 삽입 전

 

삽입되는 데이터는 XOR Key 생성에 사용된 난수와 인코딩 된 데이터의 사이즈, 최종 인코딩 된 데이터이다.

[그림 27] 섹션 이름 변경 및 데이터 삽입 후

 

리소스에 대한 작업이 완료되면 최종적으로 “-ofile” 인자로 전달받은 파일명으로 복호화 도구를 생성한다.

[그림 28] 복호화 도구 생성

 

  02) LockBit 3.0 랜섬웨어 빌드 (-type enc)

[그림 29]는 “-type” 인자로 “enc”를 전달받았을 경우에 추가적인 실행 인자를 확인하는 로직이다.

“-exe”, “-pass”, “-dll”, “-ref”, “-config”, “-pubkey”, “-ofile” 인자로 전달받은 값을 확인한 뒤, 생성하고자 하는 랜섬웨어 파일 타입에 따라 특정 함수에 파라미터로 전달한다.

[그림 29] 실행 인자 확인 (-type enc 인 경우)

 

이후 수행되는 랜섬웨어 빌드 과정은 앞서 살펴본 복호화 도구 빌드 과정과 전체적인 맥락은 유사하다. 난수와 하드코딩 된 값을 조합하여 XOR Key를 생성하며, 공개키는 Base64 디코딩 되고 설정 파일 내 설정 값들이 구문 분석되어 최종적으로 인코딩 과정을 거친다. 최종 인코딩 된 데이터는 특정 리소스 내에 삽입된 후 랜섬웨어 파일로 생성된다.

 

큰 맥락은 복호화 도구 빌드 과정과 유사하지만 세부적으로 살펴보면 차이점들도 존재한다. 설정 파일 내 데이터를 처리하는 로직을 예로 들면, 복호화 도구 빌드 과정에서는 설정 파일의 "white_folders" Key의 값들을 4Byte 해싱 및 Base64 인코딩하였다. 반면, 랜섬웨어 빌드 과정에서는 "white_folders" 뿐만 아니라 "white_files", "white_extens", "white_hosts" Key도 4byte 해싱 및 Base64 인코딩 과정을 거친다.

[그림 30] 설정 데이터 해싱 및 Base64 인코딩

 

다음은 옵션(“-exe”, “-dll”, “-ref”)에 따른 랜섬웨어 빌드 타입 별 특징을 살펴보도록 하겠다.

 

   ① builder -type enc -exe (-pass) -pubkey pub.key -config config.json -ofile LB3_pass.exe

“-exe” 옵션은 exe 포맷의 랜섬웨어를 빌드하는 옵션으로, 내장하고 있는 리소스(ID=101)를 메모리에 로드한 뒤 인코딩 된 설정 데이터와 공개키를 삽입하여 파일로 생성한다.

[그림 31] 내장하고 있는 리소스(ID=101) 로드

 

만약 “-pass” 옵션이 사용되었다면 추가적으로 “LB3_pass.exePassword_exe.txt” 파일이 생성된다.

[그림 32] pass 옵션 사용 시 추가 파일 생성

 

추가로 생성된 “LB3_pass.exePassword_exe.txt” 파일에는 “-pass” 옵션을 활용한 사용법에 관한 내용이 담겨 있다.

※ "-pass" 인자는 랜섬웨어 실행에 필요한 비밀번호를 설정하는 옵션으로, 샌드박스 및 동적 분석을 우회하기 위한 옵션이다.

[그림 33] LB3_pass.exePassword_exe.txt

 

   ② builder -type enc -dll (-pass) -pubkey pub.key -config config.json -ofile LB3_Rundll32.dll

“-dll” 옵션은 dll 포맷의 랜섬웨어를 빌드하는 옵션으로, 내장하고 있는 리소스(ID=103)를 메모리에 로드한 뒤 인코딩 된 설정 데이터와 공개키를 삽입하여 파일로 생성한다.

[그림 34] 내장하고 있는 리소스(ID=103) 로드

 

생성된 dll의 Export 함수 목록은 다음과 같다. 총 7개의 Export 함수가 존재한다.

[그림 35] dll Export Functions

 

“-pass” 옵션이 사용되었다면 추가적으로 “LB3_Rundll32.dllPassword_dll.txt” 파일이 생성된다.

[그림 36] pass 옵션 사용 시 추가 파일 생성

 

추가로 생성된 파일에는 “-pass” 옵션을 활용한 사용법에 대한 내용이 담겨 있다.

[그림 37] LB3_Rundll32.dllPassword_dll.txt

 

   ③ builder -type enc -ref -pubkey pub.key -config config.json -ofile LB3_ReflectiveDll_DllMain.dll

“-ref” 옵션도 마찬가지로 dll 포맷의 랜섬웨어를 빌드하는 옵션으로, 내장하고 있는 리소스(ID=106)를 메모리에 로드한 뒤 인코딩 된 설정 데이터와 공개키를 삽입하여 파일로 생성한다.

[그림 38] 내장하고 있는 리소스(ID=106) 로드

 

단, 앞서 살펴본 “-dll” 옵션과 달리, “-pass” 옵션은 사용되지 않으며, 빌드 결과 생성되는 dll은 Export 함수가 존재하지 않는다.

 

 

3. 참고 자료

https://cybergeeks.tech/a-technical-analysis-of-the-leaked-lockbit-3-0-builder/

https://medium.com/s2wblog/quick-overview-of-leaked-lockbit-3-0-black-builder-program-880ae511d085

https://www.cynet.com/blog/cyops-threat-alert-lockbit3lockbit-black/

https://www.bleepingcomputer.com/news/security/lockbit-ransomware-builder-leaked-online-by-angry-developer-/

https://www.bleepingcomputer.com/news/security/leaked-lockbit-30-builder-used-by-bl00dy-ransomware-gang-in-attacks/

 

 

 

보안관제센터 MIR Team

관련글 더보기

댓글 영역