최근 귀신(Gwisin) 랜섬웨어 피해 사례가 증가하고 있다. 귀신 랜섬웨어는 한국 기업을 타깃으로 공격을 수행하는 것으로 알려져 있으며, 랜섬웨어 작명에서부터 협상에 이르기까지 여러 정황들을 보았을 때 한국 정서나 기업 문화에 대해 잘 아는 조직으로 보인다.
랜섬웨어 감염 시 복호화 안내를 위해 생성되는 랜섬노트는 영어로 작성되어 있지만, KISA 등 전문기관에 신고하지 말 것을 경고하기도 하며, 피해 업체의 회사명과 피해 현황에 대한 내용도 포함되어 있다.
귀신 랜섬웨어는 윈도우 시스템뿐만 아니라 리눅스 시스템도 타깃으로 하는 것으로 확인된다.
본 보고서에서 다룰 내용은 리눅스용 귀신 랜섬웨어이며, 샘플 정보는 다음과 같다.
구분 | 내용 |
파일명 | x86_nix |
파일 크기 | 71,368 byte |
악성코드 유형 | 리눅스 랜섬웨어 |
MD5 | 95237D0C6E6B1822CECCA34994C0D273 |
SHA1 | F1BDB5151F24B175D4778052D072061DFC865AC8 |
SHA256 | 89958DBDB557286AD4D6CBF433B720535130237773E5184FB6091ED47047E5CD |
SSDEEP | 1536:JZHTLVHDU1KPYLH4WUGYTYK8IQKNOKTRHDQJ:9HPVHM5LYWUVPXOKS |
VirusTotal | 해시값 검색 결과 : 결과 없음 |
[표 1] 분석 샘플 정보
리눅스용 귀신 랜섬웨어는 실행시 /tmp 경로에 하드코딩 된 특정 이름의 파일을 생성한 뒤, fcntl() 함수를 이용하여 해당 파일을 잠금 설정한다. 이러한 루틴은 중복 실행 방지 목적으로 사용될 수 있다. 예를 들어, 랜섬웨어 프로세스가 이미 실행중인 경우에 중복 실행을 시도할 경우, 이미 잠금이 설정된 파일에 접근을 시도하게 되므로 에러를 반환하여 추가적인 악성행위를 수행하지 않고 종료된다. 또한, 정상적으로 파일이 생성되지 않는 등 여타 이유로 open64()함수가 에러를 반환할 경우도 추가적인 악성행위를 수행하지 않고 종료된다.
악성코드 내부에는 JSON 포맷의 랜섬웨어 관련 설정 데이터가 RC4 알고리즘을 통해 암호화되어 저장되어 있으며, 이는 악성코드가 실행되면서 메모리 상에서 복호화 된다.
[ RC4 Key (hex) ] – Size : 32Byte 10 64 f9 a0 32 55 df 45 4c 5f f2 b6 cf e3 07 80 14 41 18 f2 ab e7 d5 81 b5 83 f3 2b 93 77 23 6f |
[표 2] RC4 Key
복호화가 완료된 설정 데이터를 정리하면 아래 표와 같다.
※ 암호화 제외 확장자는 피해 기업명을 딴 확장자가 포함되어 있어 생략하였음
Key | 설명 | Value |
db
|
암호화 제외 디렉토리 | "bin", "boot", "dev", "etc", "lib", "lib64", "proc", "run", "sbin", "srv", "sys", "tmp", "usr", "var", "bootbank", "mbr", "tardisks", "tardisks.noauto", "vmimages" |
sk | 특정 서비스 종료 | "apache", "httpd", "nginx", "oracle", "mysql", "mariadb", "postgres", "mongod", "elasticsearch", "jenkins", "gitlab", "docker", "svnserve", "yona", "zabbix", "graylog", "java" |
fb | 암호화 제외 파일 | “imgdb.tgz", "onetime.tgz", "state.tgz", "useropts.gz", "jumpstrt.gz", "imgpayld.tgz", "features.gz", "!!!_HOW_TO_UNLOCK_[회사명]_FILES_!!!.TXT" |
ef | 최우선 암호화 디렉토리 |
“/Information/Database/", "/Information/korea_data/", "/Information/", "/Infra/", "/var/www/", "/var/opt/", "/var/lib/mysql/", "/var/lib/postgresql/", "/var/log/", "/usr/local/svn/", "/var/lib/docker", "/var/db/mongodb", "/var/lib/mongodb/", "/var/lib/elasticsearch/", "/u01/", "/ORCL/", "/var/lib/graylog-server/", "/usr/local/"
|
eb | 암호화 제외 확장자 | [생략] |
nd | 랜섬노트 내용 (base64) | [생략] |
nn | 랜섬노트 이름 | "!!!_HOW_TO_UNLOCK_[회사명]_FILES_!!!.TXT" |
[표 3] 랜섬웨어 설정 데이터
귀신 랜섬웨어는 실행 시 옵션을 인자로 받아 추가적인 기능을 수행할 수 있다.
[그림 5]는 사용 가능한 옵션 관련 정보가 저장되어 있는 구조체 배열이다.
각 구조체당 크기는 32바이트(0x20)이며, 구조체 내 주요 오프셋 정보는 [표 4]와 같다.
Offset | Size | 설명 |
0x00 | 4Byte | 옵션으로 전달받은 데이터의 파싱 방식에 따른 Flag |
0x04 | 4Byte | 옵션 검증 시 비교 문자 ( “-“ 포맷으로 사용하는 경우 검증) |
0x08 | 4Byte | 옵션 검증 시 비교 문자열을 가리키는 포인터 ( “--" 포맷으로 사용하는 경우 검증) |
0x0c | 4Byte | 옵션으로 전달받은 데이터의 파싱 결과를 가리키는 이중 포인터 |
0x10 | 4Byte | 옵션 기능 설명에 대한 문자열을 가리키는 포인터 |
[표 4] 구조체 주요 오프셋 정보
다음은 실행 인자로 입력 받은 옵션을 검증하는 루틴이다. 먼저, 인자로 입력 받은 값을 "-" 문자와 비교하여 옵션의 포맷( "-" or "--")을 확인한다.
"-" 포맷일 경우, 다음 문자를 [그림 5]의 각 구조체의 0x04 Offset에 위치한 문자와 비교한다. 즉, "-" 포맷으로 사용 가능한 옵션은 -h, -p, -m, -s, -z, -d, -y, -t 임을 알 수 있다.
"--" 포맷일 경우에는 사용자가 입력한 옵션과 [그림 5]의 각 구조체의 0x08 Offset에 위치한 포인터가 참조하는 문자열을 비교한다.
[그림 5]의 각 구조체의 0x08 Offset에 위치한 포인터가 참조하는 문자열은 “help”, “vp", “vm", “vs”, “sf”, “sd”, “pd”, “tb" 이다. 이는 앞서 확인한 -h, -p, -m, -s, -z, -d, -y, -t 옵션과 각각 매핑되어 동일한 의미를 가진 옵션으로 이용된다.
옵션 사용 포맷에 따른 매핑 결과를 정리하면 다음과 같다.
-h
|
--help |
-p | --vp |
-m | --vm |
-s | --vs |
-z | --sf |
-d | --sd |
-y | --pd |
-t | --tb |
[표 5] 옵션 사용 포맷에 따른 매핑 결과
-h 옵션(--help)은 사용 가능한 옵션과 그 사용법을 출력해주는 옵션이다. 하지만, 실제로 해당 옵션을 사용하여 실행 시 아무런 텍스트도 출력되지 않는다. 이는 표준 입출력을 /dev/null 로 리다이렉션 하도록 되어 있기 때문이다.
표준 입출력을 특정 파일로 리다이렉션 하도록 코드 패치 후, -h 옵션(--help)을 실행하면 다음과 같은 출력 결과를 확인할 수 있다. 사용 가능한 옵션과 입력 받는 값의 자료형에 대해 알 수 있으며, -h 옵션(--help)을 제외한 각 옵션에 대한 기능 설명은 생략되어 있다. 이는 악성코드 제작자가 의도적으로 제거한 것으로 판단된다.
-m 옵션(--vm)의 경우, 1 또는 2를 값으로 입력 받는다.
[그림 11]은 -m 1 옵션(--vm=1)을 주었을 때 실행되는 루틴이며, ESXi Cli command를 사용하여 가동 중인 ESXi VM을 종료하는 기능을 수행한다. 해당 옵션은 피해 서버가 ESXi 가상화 서버일 경우 원활한 암호화를 위해 사용되는 옵션일 것으로 판단된다.
다음은 -m 2 옵션(--vm=2)을 주었을 때 실행되는 루틴이다. [표 3]에서 확인하였던 ‘sk' Key에 지정된 특정 서비스들을 종료한다. 이 또한 원활한 암호화를 위해 특정 서비스들을 종료할 목적으로 사용하는 옵션인 것으로 판단된다.
-s 옵션(--vs)은 실행지연을 위한 옵션이다. sleep() 함수를 통해 -s 옵션(--vs)으로 입력 받은 값(초)만큼 암호화 행위를 지연시킨다.
옵션 사용 예시 : -s 60 (60초 만큼 실행지연)
※ 해당 루틴은 /tmp 경로에 특정 파일을 생성하는 초기 악성행위 이후에 실행이 되므로, /tmp 경로 내 생성되는 특정 파일의 시간정보와 실제 암호화가 진행된 시간정보의 갭이 발생할 수 있다. 타임라인 기반의 침해사고 조사 시 이러한 점은 유의해야 할 것이다.
-t 옵션(--tb)은 특정 시점에 암호화 행위를 수행하고자 할 때 사용되는 옵션이다. -t 옵션(--tb)의 값으로 입력 받은 유닉스 시간 값과 시스템의 현재 유닉스 시간 값을 비교하여 같은 값이 되면 sleep() 함수를 통한 실행지연이 종료된다. 특이점으로, -m 옵션(--vm)으로 1을 전달받았을 경우 14400초(4시간) 추가 지연이 발생하는 것을 알 수 있다.
옵션 사용 예시 : -t 1659508020 (2022년 8월 3일 15시 27분 까지 실행지연 – UTC+9 기준)
※ 해당 루틴 역시 /tmp 경로에 특정 파일을 생성하는 초기 악성행위 이후에 실행이 되므로, 타임라인 기반의 침해사고 조사 시 유의하여야 한다.
-y 옵션(--pd)은 옵션으로 전달받은 문자열에 해당하는 이름의 파일을 현재 경로에 생성하고, 파일명과 동일한 값을 해당 파일에 덮어쓰는 기능을 수행한다. 이미 존재하는 파일일 경우, 해당 파일에 파일명과 동일한 값을 덮어쓴다.
옵션 사용 예시 : -y cyberone (현재 경로에 cyberone 파일을 생성하고, “cyberone” 문자열을 기록)
-d 옵션(--sd)은 파일 암호화가 완료된 이후 악성코드를 자가 삭제하는 기능이다. 해당 루틴은 악성행위를 모두 수행한 이후 동작하며, -d 옵션(--sd)으로 양의 정수 값을 입력 받았을 경우 악성코드를 자가 삭제한다.
옵션 사용 예시 : -d 1 (파일 암호화가 완료된 이후 악성코드 자가 삭제)
-z 옵션(--sf)은 [표 3]의 “fb” Key에 암호화 제외 대상으로 설정되어 있는 특정 파일들에 대한 암호화 수행 여부를 결정하는 옵션이다. “fb” Key에는 ESXi 가상화 서버 관련 파일들과 랜섬노트가 암호화 제외 대상 파일로 설정되어 있다.
[그림 17]은 -z 옵션(--sf) 설정에 따라 실행 또는 스킵되는 루틴이다.
해당 루틴은 [표 3]에서 확인하였던 JSON 포맷의 암호화 설정 데이터에서 “fb” Key의 값을 확인하여 암호화하려는 대상 파일명과 비교하고 암호화 여부를 결정하는 기능을 한다.
-z 옵션(--sf)으로 양의 정수 값을 받으면 플래그가 1로 세팅되어 이러한 루틴이 스킵되므로 암호화 제외 대상으로 설정되어 있는 ESXi 가상화 서버 관련 파일들도 암호화가 진행된다. 반면, -z 옵션을 사용하지 않거나 -z 옵션으로 0의 값을 받으면 해당 루틴은 실행되므로 암호화 제외 대상으로 설정되어 있는 ESXi 가상화 서버 관련 파일들에 대한 암호화가 진행되지 않는다.
옵션 사용 예시 : -z 1 (암호화 제외 대상에 포함되어 있는 ESXi 관련 특정 파일들도 암호화 수행)
물론, 옵션과 무관하게 랜섬노트는 기본적으로 암호화 대상에서 제외된다.
-p 옵션(--vp)은 특정 디렉토리 경로를 지정하여 암호화하고자 할 때 사용할 수 있는 옵션이다.
암호화하고자 하는 디렉토리가 여러 경로일 경우에는 쉼표로 구분하며, 지정한 디렉토리가 암호화 제외 디렉토리로 설정되어 있더라도 암호화가 진행된다. 단, -p / 와 같은 형식으로 루트 경로를 지정해주었을 경우에는 암호화 제외 디렉토리는 암호화되지 않는다.
옵션 사용 예시 : -p /cyberone,/tmp (/cyberone 디렉토리와 /tmp 디렉토리를 암호화)
귀신 랜섬웨어의 전반적인 암호화 진행 과정을 정리하면 다음과 같다.
먼저, [표 3]의 ‘ef’ Key에 설정된 최우선 암호화 디렉토리에 대한 암호화를 우선적으로 수행한다. 이 경우, 암호화 제외 디렉토리에 대한 검증을 수행하지 않기 때문에 최우선 암호화 디렉토리로 설정된 경로는 암호화 제외 디렉토리에 포함되어 있더라도 암호화가 진행된다.
최우선 암호화 디렉토리에 대한 암호화가 완료되면, 최상위 경로인 루트 경로(하위 경로 포함)를 대상으로 암호화를 시작한다.
암호화 진행 시, 대상 디렉토리/파일이 암호화 제외 대상에 포함되는지 검증을 수행한다.
[표 3]의 ‘fb’ Key에 설정된 파일은 암호화에서 제외된다.
※ -z 옵션으로 양의 정수 값을 입력 받았을 경우에는 검증하지 않음 (z옵션 분석 참조)
또한, 랜섬노트는 기본적으로 암호화에서 제외된다.
[표 3]의 ‘db’ Key에 설정된 디렉토리는 암호화에서 제외된다.
※ -p 옵션으로 특정 경로(‘/’ 제외)를 지정하여 암호화할 경우 검증하지 않음 (p옵션 분석 참조)
※ 최우선 암호화 디렉토리([표 3] – ‘ef’ Key) 암호화 시 검증하지 않음 ([그림 20] 참조)
[표 3]의 ‘eb’ Key에 설정된 확장자를 가진 파일은 암호화에서 제외된다.
fseeko64() 함수와 ftello64() 함수를 이용하여 대상 파일의 크기를 구한 뒤, 파일 크기가 15 Byte 이하일 경우 암호화에서 제외된다.
최종적으로 암호화 제외 대상에 포함되지 않을 경우, 해당 파일은 확장자가 변경(피해 기업명을 딴 확장자)되며, 암호화가 진행된다.
파일 암호화가 진행된 디렉토리에는 랜섬노트가 생성된다.
분석을 통해 확인된 IOC 정보는 다음과 같다.
File Name | 설명 |
/tmp/.4d9b495d-5f41-40fc-964a-c65c585b5799 | 귀신 랜섬웨어에 의해 생성되는 파일 |
x86_nix | 귀신 랜섬웨어 |
!!!_HOW_TO_UNLOCK_[회사명]_FILES_!!!.TXT | 랜섬노트 |
MD5 | 설명 |
95237D0C6E6B1822CECCA34994C0D273 | 귀신 랜섬웨어 |
SHA1 | 설명 |
F1BDB5151F24B175D4778052D072061DFC865AC8 | 귀신 랜섬웨어 |
SHA256 | 설명 |
89958DBDB557286AD4D6CBF433B720535130237773E5184FB6091ED47047E5CD | 귀신 랜섬웨어 |
SSDEEP | 설명 |
1536:JZHTLVHDU1KPYLH4WUGYTYK8IQKNOKTRHDQJ:9HPVHM5LYWUVPXOKS | 귀신 랜섬웨어 |
보안관제센터 MIR Team
LockBit 3.0 Builder 분석 (0) | 2022.10.31 |
---|---|
한미연합훈련 기간 방산업체 노린 북한발 악성코드 (0) | 2022.09.30 |
F5 BIG-IP의 원격코드 실행 취약점을 통해 유포되는 Gh0st RAT (0) | 2022.06.03 |
깃허브 저장소를 통한 악성코드 유포 사례 (0) | 2022.05.24 |
RDP Bruteforce Attack을 통해 유포되는 MedusaLocker (0) | 2022.03.11 |
댓글 영역