상세 컨텐츠

본문 제목

한국 기업을 타깃으로 하는 귀신 랜섬웨어 (리눅스 ver)

악성코드 분석 리포트

by Hexer 2022. 8. 19. 14:59

본문

 

1. 개요

최근 귀신(Gwisin) 랜섬웨어 피해 사례가 증가하고 있다. 귀신 랜섬웨어는 한국 기업을 타깃으로 공격을 수행하는 것으로 알려져 있으며, 랜섬웨어 작명에서부터 협상에 이르기까지 여러 정황들을 보았을 때 한국 정서나 기업 문화에 대해 잘 아는 조직으로 보인다.

랜섬웨어 감염 시 복호화 안내를 위해 생성되는 랜섬노트는 영어로 작성되어 있지만, KISA 등 전문기관에 신고하지 말 것을 경고하기도 하며, 피해 업체의 회사명과 피해 현황에 대한 내용도 포함되어 있다.

[그림 1] 귀신(Gwisin) 랜섬웨어의 랜섬노트

 

2. 분석 샘플 정보

귀신 랜섬웨어는 윈도우 시스템뿐만 아니라 리눅스 시스템도 타깃으로 하는 것으로 확인된다.

본 보고서에서 다룰 내용은 리눅스용 귀신 랜섬웨어이며, 샘플 정보는 다음과 같다.

구분 내용
파일명 x86_nix
파일 크기 71,368 byte
악성코드 유형 리눅스 랜섬웨어
MD5 95237D0C6E6B1822CECCA34994C0D273
SHA1 F1BDB5151F24B175D4778052D072061DFC865AC8
SHA256 89958DBDB557286AD4D6CBF433B720535130237773E5184FB6091ED47047E5CD
SSDEEP 1536:JZHTLVHDU1KPYLH4WUGYTYK8IQKNOKTRHDQJ:9HPVHM5LYWUVPXOKS
VirusTotal 해시값 검색 결과 : 결과 없음

[표 1] 분석 샘플 정보

 

3. 상세 분석

3.1 특정 이름의 파일 생성 & 중복 실행 방지

리눅스용 귀신 랜섬웨어는 실행시 /tmp 경로에 하드코딩 된 특정 이름의 파일을 생성한 뒤, fcntl() 함수를 이용하여 해당 파일을 잠금 설정한다. 이러한 루틴은 중복 실행 방지 목적으로 사용될 수 있다. 예를 들어, 랜섬웨어 프로세스가 이미 실행중인 경우에 중복 실행을 시도할 경우, 이미 잠금이 설정된 파일에 접근을 시도하게 되므로 에러를 반환하여 추가적인 악성행위를 수행하지 않고 종료된다. 또한, 정상적으로 파일이 생성되지 않는 등 여타 이유로 open64()함수가 에러를 반환할 경우도 추가적인 악성행위를 수행하지 않고 종료된다.

[그림 2] /tmp 경로에 특정 파일 생성 및 잠금 설정

 

3.2 랜섬웨어 설정 데이터 복호화

악성코드 내부에는 JSON 포맷의 랜섬웨어 관련 설정 데이터가 RC4 알고리즘을 통해 암호화되어 저장되어 있으며, 이는 악성코드가 실행되면서 메모리 상에서 복호화 된다.

[그림 3] 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

 

[그림 4] 랜섬웨어 설정 데이터 복호화

 

복호화가 완료된 설정 데이터를 정리하면 아래 표와 같다.

※ 암호화 제외 확장자는 피해 기업명을 딴 확장자가 포함되어 있어 생략하였음

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] 랜섬웨어 설정 데이터

 

3.3 사용 가능한 옵션

귀신 랜섬웨어는 실행 시 옵션을 인자로 받아 추가적인 기능을 수행할 수 있다.

[그림 5]는 사용 가능한 옵션 관련 정보가 저장되어 있는 구조체 배열이다.

[그림 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 임을 알 수 있다.

[그림 6] 옵션 검증 루틴 ("-" 포맷인 경우)

 

"--" 포맷일 경우에는 사용자가 입력한 옵션과 [그림 5]의 각 구조체의 0x08 Offset에 위치한 포인터가 참조하는 문자열을 비교한다.

[그림 7] 옵션 검증 루틴 ("--" 포맷인 경우)

 

[그림 5]의 각 구조체의 0x08 Offset에 위치한 포인터가 참조하는 문자열은 “help”, “vp", “vm", “vs”, “sf”, “sd”, “pd”, “tb" 이다. 이는 앞서 확인한 -h, -p, -m, -s, -z, -d, -y, -t 옵션과 각각 매핑되어 동일한 의미를 가진 옵션으로 이용된다.

[그림 8] (그림 5)의 구조체의 0x08 Offset에 위치한 포인터가 참조하는 문자열

 

옵션 사용 포맷에 따른 매핑 결과를 정리하면 다음과 같다.

-h
--help
-p --vp
-m --vm
-s --vs
-z --sf
-d --sd
-y --pd
-t --tb

[표 5] 옵션 사용 포맷에 따른 매핑 결과

 

01) -h 옵션(--help)

-h 옵션(--help)은 사용 가능한 옵션과 그 사용법을 출력해주는 옵션이다. 하지만, 실제로 해당 옵션을 사용하여 실행 시 아무런 텍스트도 출력되지 않는다. 이는 표준 입출력을 /dev/null 로 리다이렉션 하도록 되어 있기 때문이다.

[그림 9] 표준 입출력 리다이렉션

 

표준 입출력을 특정 파일로 리다이렉션 하도록 코드 패치 후, -h 옵션(--help)을 실행하면 다음과 같은 출력 결과를 확인할 수 있다. 사용 가능한 옵션과 입력 받는 값의 자료형에 대해 알 수 있으며, -h 옵션(--help)을 제외한 각 옵션에 대한 기능 설명은 생략되어 있다. 이는 악성코드 제작자가 의도적으로 제거한 것으로 판단된다.

[그림 10] 표준 입출력을 특정 파일로 리다이렉션 하도록 코드 패치 후, -h(--help)옵션 결과 확인

 

02) -m 옵션(--vm)

-m 옵션(--vm)의 경우, 1 또는 2를 값으로 입력 받는다.

[그림 11]은 -m 1 옵션(--vm=1)을 주었을 때 실행되는 루틴이며, ESXi Cli command를 사용하여 가동 중인 ESXi VM을 종료하는 기능을 수행한다. 해당 옵션은 피해 서버가 ESXi 가상화 서버일 경우 원활한 암호화를 위해 사용되는 옵션일 것으로 판단된다.

[그림 11] -m 1 옵션(--vm=1) 실행 루틴

 

다음은 -m 2 옵션(--vm=2)을 주었을 때 실행되는 루틴이다. [표 3]에서 확인하였던 ‘sk' Key에 지정된 특정 서비스들을 종료한다. 이 또한 원활한 암호화를 위해 특정 서비스들을 종료할 목적으로 사용하는 옵션인 것으로 판단된다.

[그림 12] -m 2 옵션(--vm=2) 실행 루틴

 

03) -s 옵션(--vs)

-s 옵션(--vs)은 실행지연을 위한 옵션이다. sleep() 함수를 통해 -s 옵션(--vs)으로 입력 받은 값(초)만큼 암호화 행위를 지연시킨다.

옵션 사용 예시 : -s 60 (60초 만큼 실행지연)

※ 해당 루틴은 /tmp 경로에 특정 파일을 생성하는 초기 악성행위 이후에 실행이 되므로, /tmp 경로 내 생성되는 특정 파일의 시간정보와 실제 암호화가 진행된 시간정보의 갭이 발생할 수 있다. 타임라인 기반의 침해사고 조사 시 이러한 점은 유의해야 할 것이다.

[그림 13] -s 옵션(--vs) 실행 루틴

 

04) -t 옵션(--tb)

-t 옵션(--tb)은 특정 시점에 암호화 행위를 수행하고자 할 때 사용되는 옵션이다. -t 옵션(--tb)의 값으로 입력 받은 유닉스 시간 값과 시스템의 현재 유닉스 시간 값을 비교하여 같은 값이 되면 sleep() 함수를 통한 실행지연이 종료된다. 특이점으로, -m 옵션(--vm)으로 1을 전달받았을 경우 14400초(4시간) 추가 지연이 발생하는 것을 알 수 있다.

옵션 사용 예시 : -t 1659508020 (2022년 8월 3일 15시 27분 까지 실행지연 – UTC+9 기준)

※ 해당 루틴 역시 /tmp 경로에 특정 파일을 생성하는 초기 악성행위 이후에 실행이 되므로, 타임라인 기반의 침해사고 조사 시 유의하여야 한다.

[그림 14] -t 옵션(--tb) 실행 루틴

 

05) -y 옵션(--pd)

-y 옵션(--pd)은 옵션으로 전달받은 문자열에 해당하는 이름의 파일을 현재 경로에 생성하고, 파일명과 동일한 값을 해당 파일에 덮어쓰는 기능을 수행한다. 이미 존재하는 파일일 경우, 해당 파일에 파일명과 동일한 값을 덮어쓴다.

옵션 사용 예시 : -y cyberone (현재 경로에 cyberone 파일을 생성하고, “cyberone” 문자열을 기록)

[그림 15] -y 옵션(--pd) 실행 루틴

 

06) -d 옵션(--sd)

-d 옵션(--sd)은 파일 암호화가 완료된 이후 악성코드를 자가 삭제하는 기능이다. 해당 루틴은 악성행위를 모두 수행한 이후 동작하며, -d 옵션(--sd)으로 양의 정수 값을 입력 받았을 경우 악성코드를 자가 삭제한다.

옵션 사용 예시 : -d 1 (파일 암호화가 완료된 이후 악성코드 자가 삭제)

[그림 16] -d 옵션(--sd) 실행 루틴

 

 

07) -z 옵션(--sf)

-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 관련 특정 파일들도 암호화 수행)

[그림 17] -z 옵션(--sf) 설정에 따라 실행 또는 스킵되는 루틴

 

물론, 옵션과 무관하게 랜섬노트는 기본적으로 암호화 대상에서 제외된다.

[그림 18] 암호화하려는 대상이 랜섬노트인지 확인

 

 

08) -p 옵션(--vp)

-p 옵션(--vp)은 특정 디렉토리 경로를 지정하여 암호화하고자 할 때 사용할 수 있는 옵션이다.

암호화하고자 하는 디렉토리가 여러 경로일 경우에는 쉼표로 구분하며, 지정한 디렉토리가 암호화 제외 디렉토리로 설정되어 있더라도 암호화가 진행된다. 단, -p / 와 같은 형식으로 루트 경로를 지정해주었을 경우에는 암호화 제외 디렉토리는 암호화되지 않는다.

옵션 사용 예시 : -p /cyberone,/tmp (/cyberone 디렉토리와 /tmp 디렉토리를 암호화)

[그림 19] -p 옵션(--vp) 실행 루틴

 

3.4 암호화

귀신 랜섬웨어의 전반적인 암호화 진행 과정을 정리하면 다음과 같다.

 

01) 특정 디렉토리를 우선적으로 암호화

먼저, [표 3]의 ‘ef’ Key에 설정된 최우선 암호화 디렉토리에 대한 암호화를 우선적으로 수행한다. 이 경우, 암호화 제외 디렉토리에 대한 검증을 수행하지 않기 때문에 최우선 암호화 디렉토리로 설정된 경로는 암호화 제외 디렉토리에 포함되어 있더라도 암호화가 진행된다.

최우선 암호화 디렉토리에 대한 암호화가 완료되면, 최상위 경로인 루트 경로(하위 경로 포함)를 대상으로 암호화를 시작한다.

[그림 20] 최우선 암호화 디렉토리 암호화 이후 루트 디렉토리(하위 경로 포함) 암호화

 

암호화 진행 시, 대상 디렉토리/파일이 암호화 제외 대상에 포함되는지 검증을 수행한다.

 

02) 암호화 제외 파일 검증

[표 3]의 ‘fb’ Key에 설정된 파일은 암호화에서 제외된다.

※ -z 옵션으로 양의 정수 값을 입력 받았을 경우에는 검증하지 않음 (z옵션 분석 참조)

[그림 21] 암호화 제외 파일 검증

 

또한, 랜섬노트는 기본적으로 암호화에서 제외된다.

[그림 22] 랜섬노트 암호화 제외

 

03) 암호화 제외 디렉토리 검증

[표 3]의 ‘db’ Key에 설정된 디렉토리는 암호화에서 제외된다.

※ -p 옵션으로 특정 경로(‘/’ 제외)를 지정하여 암호화할 경우 검증하지 않음 (p옵션 분석 참조)

※ 최우선 암호화 디렉토리([표 3] – ‘ef’ Key) 암호화 시 검증하지 않음 ([그림 20] 참조)

[그림 23] 암호화 제외 디렉토리 검증

 

04) 암호화 제외 확장자 검증

[표 3]의 ‘eb’ Key에 설정된 확장자를 가진 파일은 암호화에서 제외된다.

[그림 24] 암호화 제외 확장자 검증

 

05) 파일 크기 검증 및 확장자 변경

fseeko64() 함수와 ftello64() 함수를 이용하여 대상 파일의 크기를 구한 뒤, 파일 크기가 15 Byte 이하일 경우 암호화에서 제외된다.

[ 그림 25] 파일 크기 검증 및 확장자 변경

 

최종적으로 암호화 제외 대상에 포함되지 않을 경우, 해당 파일은 확장자가 변경(피해 기업명을 딴 확장자)되며, 암호화가 진행된다.

 

3.5 랜섬노트 생성

파일 암호화가 진행된 디렉토리에는 랜섬노트가 생성된다.

[그림 26] 랜섬노트 생성

 

4. IOC

분석을 통해 확인된 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

관련글 더보기

댓글 영역