‘이력서 보고 연락 드립니다’ 채용 위장 피싱 사례
최근 ASEC(AhnLab SEcurity Intelligence Center)는 북한 배후 공격자 소행으로 추정되는 채용 위장 피싱 공격 정황을 확인했다. 해당 공격과 사용되는 악성코드는 주로 해외에서 발견되지만, 본 사례에서 다룬 공격은 국내에서도 유사한 정황이 확인되었다.
해당 공격의 수행 방식과 악성코드 분석 내용을 소개한다.

개요
2024년 11월 29일, Dev.to라는 개발자 커뮤니티에서 [그림 1] 같이 채용 공고 메일을 위장해 악성코드를 유포하는 사례가 공개되었다. 공격자는 프로젝트가 포함된 비트버킷(BitBucket) 링크를 전달했고, 피해자는 프로젝트 내부에 악성코드가 포함된 것을 확인하고 이를 커뮤니티에 공개했다. 프로젝트 내부에는 ‘tailwind.config.js’라는 이름의 비버테일(BeaverTail) 악성코드와 ‘car.dll’이라는 이름의 다운로더 악성코드가 있었다.
[그림 1] 개발자 커뮤니티에 공개된 공격 사례
현재 악성코드는 다운로드가 불가하지만 바이러스토탈(VirusTotal)에 car.dll 다운로더와 BeaverTail을 포함한 프로젝트 압축파일들이 있다. 해당 파일들을 분석한 결과 국내에서도 car.dll의 실행 로그와 BeaverTail가 실행된 정황이 확인됐다. BeaverTail은 해외에서 북한 기반 공격자들이 사용하는 것으로 알려진 악성코드로, 정보 탈취와 추가 페이로드 다운로드를 수행한다.
car.dll 다운로더는 분석 과정에서 페이로드 다운로드가 가능하였으며 실제로 백도어 악성코드도 확인할 수 있었다. 참고로, 백도어 악성코드는 윈도우 명령어들을 악성코드 내부에 구현하는 특징이 있다.
공격 정황
바이러스토탈에서 확보한 프로젝트 압축파일 내부에는 [그림 2]와 같이 다운로더 악성코드 car.dll, 다운로더를 실행하는 tailwind.confg.js(BeaverTail 악성코드) 파일이 있다. 또 다른 압축 파일에서도 BeaverTail 악성코드와 동일한 다운로더가 확인되었는데 img_layer_generate.dll라는 이름으로 유포되었다.

[그림 2] 프로젝트 압축파일 내부
BeaverTail 악성코드는 주로 해외에서 채용을 위장한 피싱 공격을 통해 유포되는 것으로 알려져 있는데 국내에서도 연관 사례가 확인된 바 있다. 이번에 확인한 사례도 해외 사례이지만 국내에서도 연관 로그가 확인됐다. 설치 경로도 [그림 1] 포스팅에서 언급한 것과 유사해 동일한 사례로 추정된다. 국내 사례의 경우, 최초 침투 방식은 확인되지 않았지만 악성코드는 파워쉘을 거쳐 Rundll32.exe로 실행된 것을 확인했다. BeaverTail 악성코드의 실행 방식과 동일하다.

[그림 3] 국내 사례에서 확인된 다운로더 악성코드
이 외에도 다운로더가 설치된 시스템에서는 몇 분 뒤, BeaverTail로 추정되는 로그가 확인되기도 했다. Curl을 이용해 다운로드하는 점, 다운로드되는 파일의 이름 p.zi와 p2.zip은 BeaverTail의 특징이기도 하다.
악성코드 분석 내용
1. BeaverTail 악성코드
tailwind.config.js라는 이름의 자바스크립트(JavaScript) 악성코드는 난독화된 루틴과 동일 경로에 위치한 car.dll을 실행하는 루틴이 함께 포함되어 있다.

[그림 4] 난독화 루틴 및 car.dll 실행 루틴
난독화된 루틴은 인포스틸러와 다운로더 기능을 수행하는 BeaverTail 악성코드다. 웹 브라우저를 대상으로 자격 증명 정보와 암호화폐 지갑 데이터를 탈취하며 InvisibleFerret과 같은 추가 악성코드를 다운로드하는 것으로 알려져 있다.

[그림 5] 탈취한 정보를 업로드하고 추가 페이로드를 다운로드하는 명령어
2. 다운로더 악성코드
본 사례에서 사용된 다운로더 악성코드는 %SystemDrive%\0_***workfile\_work\autosquare\autopart\car.dll 경로에 설치되었다. 그리고, BeaverTail 악성코드에 의해 파워쉘 및 Rundll32.exe 프로세스로 실행되었다.
참고로, 서두에 유사점을 언급한 ‘Lazarus 그룹의 윈도우 웹 서버 대상 공격 사례 분석 보고서’의 악성코드는 ac_lst.exe라는 이름의 실행 파일 포맷이었다. 그리고, 이번 사례에서 확인된 다운로더는 DLL 포맷이지만
외부에서 다운로드된 페이로드를 복호화하여 메모리 상에서 실행하며 복호화 과정에서는 “Node.js_NpmStart” 문자열을 키로 사용하는 것이 특징이다.

[그림 6] 웹 서버 사례와 동일한 복호화 키
3. 백도어 악성코드 (Tropidoor)
본 사례의 백도어 악성코드는 다운로드가 가능했는데, 복호화되어 메모리 상에서 실행되었다. 백도어가 실행되면 [표 1]과 같이 4개의 C&C 서버 주소를 복호화해 접속을 시도했다. 접속에 성공하면, 컴퓨터 이름, ID, IP 주소, 윈도우 버전, 프로세스 경로 등 시스템의 기본 정보들을 수집했다.
|
오프셋 |
내용 |
데이터 |
|
0x0000 |
Random (4바이트) |
ID |
|
0x0004 |
C&C Server 1 |
hxxps://45.8.146[.]93/proxy/Proxy.php |
|
0x0108 |
C&C Server 2 |
hxxps://86.104.72[.]247/proxy/Proxy.php |
|
0x020C |
C&C Server 3 |
hxxp://103.35.190[.]170/Proxy.php |
|
0x0310 |
C&C Server 4 |
hxxp://86.104.72[.]247/Proxy.php |
[표 2] C&C 서버 주소
이후 랜덤한 0x20 바이트 크기의 키를 생성하고 RSA 공개키로 암호화해 전송했다. RSA 공개키는 Base64로 암호화되고, 랜덤하게 생성된 0x20 바이트 키는 C&C 통신 시 패킷 암호화에 사용됐다.
C&C 서버와의 첫 통신에서는 확보한 시스템 정보와 RSA 공개키로 암호화된 랜덤한 키를 Base64로 인코딩하고 각각 tropi2p, gumi 파라미터를 통해 전송했다. 이후, 5 바이트 크기의 랜덤한 문자열을 생성하는데, 해당 문자열은 다른 통신 과정에서도 s_width 파라미터와 함께 사용되는 것을 볼 때 세션(Session) ID로 추정된다.
이후에는 letter 파라미터에 400BadRequest를 입력하고, C&C 서버에 전송했다. 이를 통해 C&C 서버로부터 명령을 수신 받는다. 명령 수행 후에는 동일하게 그 결과를 인코딩해 letter 파라미터를 통해 전송한다.
C&C 서버로부터 전달받아 수행한 명령들은 여러가지가 있다. 대부분 일반적인 백도어 악성코드와 유사하지만 34번 명령어인 ‘유틸리티 명령 실행’을 수행하는 점이 특징이다. 해당 명령은 schtasks, ping, reg 등 윈도우 기본 명령들을 직접 구현한 형태의 명령어들이다. 과거 보안업체 ESET이 발행한 보고서에서는 이와 같은 악성코드를 LightlessCan 악성코드로 칭한 바 있다. 하지만, 이 악성코드는 전체적인 코드 구조가 LightlessCan과 다르고 명령 번호 등에도 차이가 있어 Tropidoor라는 명칭으로 분류했다.

[그림 7] 악성코드 내부에 구현된 윈도우 명령어들
참고로, 해당 백도어 악성코드는 전달받은 명령을 수행하는 것뿐만 아니라 각 명령의 상태에 따라 다른 행위를 수행한다. 악성코드가 상태 플래그에 따라 동작하며, 초기 상태에서 시작해 대기 상태 및 알림이 발생하는 상태가 될 수 있다. 예를 들어, 명령 수행을 위한 대기 시간이 길더라도 사용자가 로그인하면 알림을 발생시켜, 대기 루틴을 끝내고 다시 C&C 서버와 통신할 수 있다.
결론
최근, 북한 배후 공격자들의 소행으로 추정되는 공격 사례들이 지속적으로 확인되고 있다. 이번 사례에서는 주로 해외에서 사용되는 것으로 알려진 BeaverTail 악성코드의 공격 정황을 다뤘는데 해당 정황은 국내에서도 확인되었다. 또한, 함께 사용된 악성코드들도 과거 북한 배후 공격자들의 공격 사례 연관성이 있는 것으로 나타났다.
이번 문서에서 다룬 사례들의 침해지표(IOC) 등 보다 자세한 내용을 담은 보고서 원문은 AhnLab TIP 구독 서비스를 통해 확인할 수 있다.
- AhnLab분석팀 이재진 선임