악성코드 분석
AMD 드라이버 취약점을 이용하는 Lunex Stealer
우크라이나어로 작성된 가짜 사이트를 통해 유포되는 Lunex Stealer 공격 캠페인이 발견됐다. ClickFix 공격에서부터 시작되는 캠페인은 정상 AMD 드라이버를 드랍, 취약점을 이용해 커널 수준의 제어권을 행사하는 BYOVD(Bring Your Own Vulnerable Driver) 기법을 사용해 보안 관련 드라이버를 방해하고 Lunex Stealer 를 다운로드해 사용자의 민감한 정보를 탈취한다.
![[그림 1] Lunex Stealer C2 로그인 페이지](/api/media/file/90371a4c20a9c8af451e0b26d66d3a1093caddde00f7d7dcf0ed7bc86dc2294c-V3CdU1apSqqQXkGRgiCSFMSYAjl4In.png)
Lunex Loader
Lunex Loader 는 취약점이 있는 정상 AMD 드라이버를 드랍, 취약점을 이용해 커널 수준의 제어 능력을 얻은 후 보안과 관련된 드라이버 기능을 방해하고 정보 탈취 기능을 보유한 Lunex Stealer 를 다운로드해 실행한다.
악성 동작에 사용되는 대부분의 문자열은 AES-256-CTR 알고리즘으로 암호화된 채 저장되며, 암호화된 문자열은 사용되기 직전에 하드코딩된 32 바이트 Key 와 16 바이트 IV 값으로 복호화된다.
![[그림 2] 암호화된 문자열 복호화 코드](/api/media/file/dd7028fced6d2032a821c901b654b40a48a0acec815ad35ca70b3d7cbbf4ab4e-wKC36icOocelJOEu0sYLQYXVrEToLk.png)
Lunex Loader 실행 시 파일 내 암호화된 채 임베디드된 정상 AMD 드라이버 파일 PDFWKRNL.sys 를 “C:\Users\Public” 경로에 무작위 파일명으로 드랍한다. 암호화 방식은 문자열과 동일한 AES-256-CTR 알고리즘이지만 사용되는 Key 와 IV 가 다르다. 드랍된 AMD 드라이버 파일은 윈도우 서비스로 등록된 후 실행된다.
![[그림 3] 서비스에 등록된 취약한 AMD 드라이버](/api/media/file/510f354ef463421ba85856a7dcc9f222418403a1ade6046de4b517672cab742e-wIqKXtLgXNj51gL8Mrluq0Q18BXfI9.png)
드랍한 드라이버 로딩에 성공하면 현재 피해자 시스템의 핵심 커널 실행 파일인 ntoskrnl.exe 파일의 경로를 찾아 파일 내에서 RSDS PDB GUID 바이너리 값을 찾고, PDB Age 값과 조합해 고유한 문자열을 생성한다. 이후 앞서 생성한 고유한 문자열을 경로로 사용해 Microsoft 의 심볼 서버로부터 현재 시스템의 ntoskrnl.exe 파일에 대응하는 ntkrnlmp.pdb 파일을 다운로드한다. 이 파일에는 현재 시스템의 커널 빌드 심볼 및 구조체 정보가 포함되어 이후 있을 커널 수준의 조작에 이용된다.
![[그림 4] 커널 PDB 다운로드에 사용되는 명령어](/api/media/file/98f2d43ef586afa73be2d04ddf088168034db0d495553743f75df24c238028f5-19s2Icn4cMtIumWrDvHXWrfmmYIWnv.png)
BYOVD 공격 준비를 마치면 현재 시스템에 로딩된 드라이버를 열거하고 미리 정의된 차단 대상 목록과 비교한다. 차단 대상 드라이버를 발견하면 앞서 실행한 AMD 드라이버의 취약점과 ntkrnlmp.pdb 파일로부터 얻은 커널 정보를 이용해 커널 수준의 제어를 행사하고 드라이버 기능을 방해한다.
![[그림 5] 차단 대상 드라이버 탐지 코드](/api/media/file/c7dd0156e7cf9ee9e3caa818a6c01a2d54108f33e7dfe9749ab24a6130c579a0-hetUxJ32Cdo22tumzyOgwHClwqjuXS.png)
차단 대상 드라이버 목록은 [표 1]과 같다.
![[표 1] 차단 대상 드라이버 목록](/api/media/file/0ffd6ce0ac5e7f83abe263cd1ea311216d2668344ce09603bc35ebb64247f4b7-xHILCfp8rYZa1ZarJ4CyvCV2uoUoJc.png)
BYOVD 공격 후 Lunex Loader 는 공격자 서버에 접속해 Lunex Stealer(psychedeliclove.exe) 를 다운로드, %APPDATA% 경로에 생성하고 실행한다. Lunex Stealer 실행에 성공하면 BYOVD 공격에 사용된 무작위 이름의 서비스를 제거한다.
![[그림 6] Lunex Stealer 실행 코드](/api/media/file/29d105caf119eccc39eaed5e300052aca03361fea5b61b9ade91cf7e57e2435b-mSXI70QdtEyXT0jlkvSUCv4f4Ms58W.png)
Lunex Stealer
Lunex Stealer 는 .embed 섹션에 하드코딩된 JSON 형식의 초기 설정 값을 사용해 C2 서버와 통신한다.
![[그림 7] 하드코딩된 JSON 형식 초기 설정 값](/api/media/file/961b23648e23291ac56ba82b4da0dc9273610314ee6d43b3cdbd1c18ff3edbd2-t5gh7YyUqzlgcXLUQHlKTH84hPfcpF.png)
초기 설정을 이용해 C2 서버와 통신하는데 성공하면 추가 설정 데이터를 다운로드하고, 이에 대응하는 악성 행위를 수행한다. 다운로드한 설정 키에 따른 악성 행위는 [표 2]와 같다. 일반적인 정보 탈취형 멀웨어와 마찬가지로 피해자의 민감한 정보를 수집하고 추가 페이로드를 다운로드, 실행하는 것이 주된 기능이다.
![[표 2] Lunex Stealer 설정 키와 기능](/api/media/file/2e7e47438a587f495e29844d2b99bffe62ac3605132ed0ea780b53a17acd223f-AK6JZnD23tHy4ipDXeFYcU27t1fTJI.png)
deploy_poll 설정 값이 true 이면 C2서버로부터 실행할 Task 정보를 추가로 다운로드한다. Task 정보에는 다운로드할 페이로드의 경로, 파일명, 파일 크기가 포함되며, 다운로드된 파일은 확장자에 따라 적절한 옵션과 방법을 선택해 실행된다.
![[그림 8] 페이로드 파일 확장자에 따라 분기되는 실행 코드](/api/media/file/9ab39356608b45e10b3e46f84cd3807c9297b92c40c32a86d83f2455a0c92898-Nw6kupmmA1ovxu9oehoZsSDsvIMu2E.png)
또한 Lunex Stealer 는 자체 C2 통신 기능 외에도 악성 브라우저 확장 프로그램과 PowerShell 호스트를 설치한다. 확장 프로그램은 HTTP 와 WebSocket 으로 C2 서버와 통신하며, 서버에서 받은 파일 관련 작업을 Native Messaging 메시지로 구성해 로컬 PowerShell 호스트에 전달한다. PowerShell 호스트는 전달받은 메시지에 따라 파일 시스템 제어, 실행 기능을 수행해 반환하고, 반환된 결과는 확장 프로그램을 통해 다시 C2 서버로 전송된다.
피해 시스템의 MachineGUID를 기반으로 생성한 문자열을 사용해 “%LOCALAPPDATA%\Packages\Extensions” 경로에 폴더를 생성, 러시아어로 된 Microsoft Office Word 편집기로 위장한 악성 확장 프로그램을 설치한다. 확장 프로그램의 주요 정보를 정의하는 manifest.json 파일에는 정보 탈취를 위한 권한과 백그라운드에서 실행될 service-worker-loader.js 파일에 대한 내용을 담고 있다.
![[그림 9] 정보 탈취를 위한 권한이 정의된 악성 확장 프로그램의 manifest.json 파일](/api/media/file/5da62628659ac677e86c314c16423f356b0694a81c28286bf98710b66eb33a40-FALJvLauQHAI3PGIqnanDTjVguaeOY.png)
백그라운드에서 실행되는 service-worker-loader.js 파일은 함께 확장 프로그램에 동봉된 난독화된 자바스크립트 파일 background.ts-CBVm7Il4.js를 로딩해 C2 서버와 통신하고 Native Messaging 기능을 통해 PowerShell 스크립트에 C2 메시지를 전달 후 처리 결과를 돌려받는 역할을 한다. 그 외 자바스크립트 파일들은 manifest.json 파일에 정의된 내용에 따라 웹 페이지에 로딩돼 로그인 입력 정보를 수집하고 CSP 관련 meta 요소를 제거한다.
![[그림 10] Native Messaging 기능을 이용한 자바스크립트 – PowerShell 간 통신](/api/media/file/6e55b7ef6f1e1c2af155b07cc30f2a9abdc03d4234d7018e3a0602657b4a0353-JUA5vu64h0cbYdRUgs9xYoiu8Rs6hN.png)
Lunex Stealer 가 드랍한 PowerShell 스크립트 host.ps1 파일은 앞서 설명한 확장 프로그램의 자바스크립트로부터 전달받은 메시지를 [표 3]과 같이 처리한다.
![[표 3] 악성 확장 프로그램과 통신하는 PowerShell 스크립트 명령어 기능](/api/media/file/53564aa187d07a3671985e2873ef82d75315e2520490c401305a12a48141082e-VxjVbpu4PbHyG3d4NFSaiWR7iGzAVQ.png)
![[그림 11] host.ps1 파일의 Native Message 처리 코드](/api/media/file/32ad6228abcaf22f39347db241c46d3a76e39f6807781e8bc308aa8284a1834d-SsICV8lIBJiMmbdQeROVrxK2rB22ZY.png)
이번 사례는 정상 드라이버와 브라우저의 정상 기능이 악성 행위에 악용될 수 있음을 보여준다. 악성 확장 프로그램 설치를 방지하기 위해 설치 전 확장 프로그램의 출처, 요청하는 권한이 적절한지 검증하고 이미 설치된 확장 프로그램 중 사용하지 않는 것은 정리하는 습관이 필요하다. 또한 ClickFix 공격이 최초 공격의 트리거로서 성행하는 만큼 본인 인증, 오류 해결, 등의 이유로 Windows 실행 창에 명령어를 복사해 실행할 것을 요구한다면 의심해야 한다.
상기 악성코드는 잉카인터넷 안티바이러스 제품 TACHYON Internet Security 6.0에서 진단 및 치료가 가능하다.
![[그림 12] TACHYON Internet Security 6.0 진단 및 치료 화면](/api/media/file/05e769b49c224d94f551bec4411392a69f2b6e49ab6fd89ce3952aec9fec71bc-fQvjAmy2IC9QCh8safR4Qe4BKasebU.png)