아래 VirusTotal Blog 에서 공개한 PyPI 악성코드 분석 내용 중 Discord Token Grabber 등이 Skuld Stealer와 거의 동일한 것을 확인하였다. Skuld 제작자는 해당 악성코드를 차용 혹은 거의 그대로 가져와 구현한 것으로 보여진다.
해당 악성코드는 피해자 PC에 침투해 디스코드 계정 정보 등 디스코드 관련 정보 및 브라우저 정보들을 탈취한다. 또한, 피해자가 암호화폐 지갑 주소를 복사한 것을 감지하면 복사된 주소를 공격자의 암호화폐 지갑 주소로 바꾸는 행위를 수행한다.
Skuld 스틸러는 Go 언어를 기반으로 제작되어 분석시 일반 exe 파일에 비해 구조가 복잡한 형태를 띈다. 분석을 돕기 위해 맨디언트에서 공개한 GoReSym이라는 도구가 존재한다. GoReSym은 Go 언어 기반의 실행 파일에서 프로그램 메타데이터, 함수 메타데이터 등을 추출해주는 도구이다. 해당 도구를 사용하면 Go 언어 악성코드 분석을 더 편하게 할 수 있다.
Skuld 스틸러의 메인 수행 루틴은 main.main 함수에 존재한다. 해당 함수 내에서는 총 9개의 핵심 함수가 존재하며 각각 함수의 행위는 다음과 같다.
- fakeerror.Run : 가짜 에러창을 띄우는 함수
- antidebug.Run : 분석 환경 감지 함수
- injection.Run : 디스코드 해킹 방지 프로그램 우회 함수
- discodes.Run : 디스코드 계정 정보 등 디스코드 정보 탈취 함수
- browsers.Run : 브라우저 정보 탈취 함수
- system.Run : 시스템 정보 탈취 함수
- tokens.Run : 토큰 탈취 함수
- files.Run : 탈취 파일 업로드 함수
- clipper.Run : 암호화폐 지갑 주소 감지 함수
가장 먼저 fakeerror.Run 함수에서는 피해자가 Skuld 악성코드 실행시 악성코드라는 의심을 하지 않도록 에러 창을 띄우는 역할을 한다. 피해자가 단순 프로그램 에러라고 생각하도록 유도한다.
에러창을 띄운 이후에는 악성코드가 동작하고 있는 환경이 분석 환경인지를 감지한다. 해당 함수에서는 각각 아래와 같은 요소들을 확인한다.
- 유저 블랙리스트
- PC 블랙리스트
- HWID 블랙리스트
- IP 블랙리스트
- 실행중 환경 화면 크기
- 실행중 컴퓨터 Suspend 모드 여부
- 레지스트리 내 가상 환경 키 존재 여부
위 요소들이 감지될시에는 악성코드 동작을 중지하는 루틴이 포함되어 있다.
antidebug.Run 내 각각 함수를 하나씩 살펴본다. 먼저 isBlackListedUser 함수는 피해자 PC의 유저네임을 확인한 후, 블랙리스트에 있는 유저네임과 비교한다.
전체 블랙리스트 유저 네임은 본 글 마지막에 정리해두었다.
isBlackListedPC 함수는 피해자의 PC 명을 확인한 후, 블랙리스트에 있는 PC명과 비교한다.
전체 블랙리스트 PC명은 본 글 마지막에 정리해두었다.
isBlackListedHWID 함수는 피해자의 HWID 를 확인하고 블랙리스트와 비교한다. 피해자의 HWID를 얻기 위해 wmic 명령을 사용한다.
전체 블랙리스트 HWID는 본 글 마지막에 정리해두었다.
isBlackListedIP 함수는 https://api.ipify.org 를 이용해 피해자 PC IP 값을 얻어온 뒤 블랙리스트와 비교한다. 또한, MAC 값도 함께 비교한다.
전체 블랙리스트 IP 및 MAC 값은 본 글 마지막에 정리해두었다.
isScreenTooSmall 함수는 피해자 PC의 화면 크기 값을 가져온다. 200x200 이하인지를 비교하며 200x200 이하의 크기일 경우 가상환경으로 판단한다.
isComputerSus 함수는 컴퓨터 상태가 Suspend 인지 확인한다. 만약 Suspend 모드에 있을 경우, 분석 환경 및 악성코드 실행에 적합하지 않은 환경으로 판단한다. 또한, 동시에 시스템의 총 메모리 양도 확인한다. 총 메모리 양이 2GB 이하일 경우 분석환경으로 판단한다.
registryCheck 함수는 피해자 PC의 레지스트리 키 내 Vmware, Vbox 등의 문자열이 존재하는지 확인한다. 만약 존재할 경우 분석환경으로 판단한다.
전체 레지스트리 확인 경로는 본 글 마지막에 정리해두었다.
이외에도 x96dbg 등 디버거의 실행 등도 확인한다. 앞서 설명한 분석환경 확인시에는 악성코드의 동작을 멈추는 것과 달리 디버거가 확인될 경우에는 디버거 프로세스를 종료한다.
전체 디버거 확인 종류는 본 글 마지막에 정리해두었다.
안티디버깅과 관련한 항목들에 대한 확인이 모두 끝나면 본격적으로 정보 탈취 행위를 시작한다. 가장 처음으로는 inject.Run 함수 내에서 디스코드의 BetterDiscord 와 TokenProtector를 우회한다. Better Discord는 향상된 보안을 제공하는 Discord 요소이고Discord Token Protector는 악성 애플리케이션이 Discord의 보안 토큰을 훔치는 것을 방지하기 위해 설치할 수 있는 플러그인이다.
Skuld 악성코드는 BetterDiscord와 관련된 파일인 betterdiscord.asar 파일의 api/webhook 문자열을 ByDeathined로 변경함으로써 BetterDiscord를 무력화시킨다.
또한 Discord Token Protector의 무력화를 위해 관련된 파일인 DiscordTokenProtector.exe, ProtectionPayload.dll, secure.dat 파일을 찾아 삭제한다.
이후에는 DiscordTokenProtector\config.json 파일 내용을 수정해 자동 시작 기능 및 무결성 검사를 비활성화 시켜 Skuld 악성코드가 디스코드에 코드를 삽입할 수 있도록 한다.
위 탈취 행위들은 각기 탈취가 이루어질 때마다 디스코드 웹 훅 또는 gofile 을 이용해 Skuld 악성코드의 공격자에게 전송된다.
위 탈취 행위들과는 별개로 Skuld 악성코드는 피해자가 암호화폐 지갑 주소를 복사하는지 관찰한다. 만약, 피해자가 암호화폐 지갑 주소를 복사한다면 해당 주소를 공격자의 주소로 바꾸는 행위를 수행한다.
Skuld 악성코드 내 "Deathined" 추적
Skuld 악성코드 내에 발견된 "deathined" 문자열을 기반으로 관련된 유저 등이 있는지 추적해봤다. 가장 먼저는 "deathined" 유저명의 github 주소가 나타난다.
해당 github 첫 페이지에서 본인의 link 들을 소개한다. 각각 guilded, telegram 채널 링크다. 각각 링크로 접속을 시도해보면 아래 화면과 같이 deathined 유저가 운영하는 채널이 등장하는 것으로 확인된다. telegram 채널명은 "deathinews" 인데, 아직까지 어떤 글도 올라오지는 않았다.
또한 github 주소에서 발견할 수 있는 twitter 링크를 확인해보면 아래와 같이 "deathined" 유저의 twitter 프로필이 확인된다. 올린 글은 존재하지 않고, 다만 얼마전 trellix 에서 skuld 악성코드를 분석한 글에 대한 트윗을 리트윗한 것이 나타난다. 본인이 제작한 악성코드에 대한 과시로 보여진다.
이외에 검색을 통해 "deathined" 유저명과 관련된 것들을 찾아보면 reddit 계정과 tumblr 계정이 나타난다. reddit 계정은 생성만 되었을 뿐 활동기록은 없어보이고, tumblr 계정에서는 또 다른 프로필 사이트가 게시물로 게시되어있는 것을 확인할 수 있다.
tumblr 계정에 나타난 사이트를 찾아보면 아래와 같이 "dathined" 유저의 프로필 사이트를 확인할 수 있다. 해당 프로필 사이트에는 tumblur 계정 링크 두개와 twitter 계정 링크, ao3 계정 링크가 존재한다. 각각 아래 사항에 해당하는 계정들이다.
- main tumblr : 프로필 사이트 게시 텀블러 계정
- personal tumblr : 또 다른 deathined 텀블러 계정
- twitter : deathined twitter 계정
- ao3 : deathined ao3 계정
이 중 personal tumblr 사이트를 확인하면 deatined의 personal blog 라면서 계정명이 "meijki"인 것을 확인할 수 있다. 해당 유저명을 기반으로 검색해보면 유튜브, 스팀 계정등이 나타나지만 해당 계정들이 deathined와 연관되어있는지는 확실하지 않다.
또한, ao3 계정에는 2023-03-19 에 가입한 것으로 나타나있고 user Id가 16899472로 나타나있다. 이 외에 특별한 게시물 등은 존재하지 않는다.