특정 경로와 확장자 제외한 모든 파일 암호화...ChaCha20 방식 사용
SaaS 형태로 공격자에 따라 유포 경로와 공격 대상 다양할 듯
마운트락커 및 퀀텀 랜섬웨어와 동일한 코드와 기능 사용
[보안뉴스 김영명 기자] DAGON LOCKER 랜섬웨어(이하 ‘다곤 랜섬웨어’)가 국내에 유포되고 있는 것이 최근 확인됐다. 다곤 랜섬웨어의 주 유포 경로는 피싱 또는 이메일 첨부파일이지만 서비스형 랜섬웨어(Ransomware-as-a-Service)이기 때문에, 공격자에 따라 유포 경로와 공격 대상은 다양할 수 있다.
안랩 ASEC 분석팀(이하 ASEC 분석팀)은 자체 보안 인프라의 랜섬웨어 의심 행위 차단 이력으로 최초 발견됐으며, 지난 10월에는 국내 모 기관이 안랩에 악성 의심 파일로 접수하기도 했다고 밝혔다.
다곤 랜섬웨어는 파일 외형이 패킹돼 있어 프로세스 메모리에 생성되는 64비트 EXE 바이너리가 핵심 코드다. 이 코드는 2년 전부터 유포되던 MountLocker(마운트락커) 랜섬웨어 또는 Quantum(퀀텀) 랜섬웨어와 동일한 코드를 쓰는 부분과 기능이 있어 유사 변종으로 볼 수 있다. 다곤 랜섬웨어 코드에 버전 정보를 의미하는 ‘Ver 5.1 x64’ 문자열이 확인됐다.
다곤 랜섬웨어의 주요 특징은 △실행 인자로 랜섬웨어의 암호화 범위를 제한 또는 확장하고 실행 옵션 지정 가능 △특정 경로와 확장자를 제외한 모든 파일을 대상으로 암호화한 후 ‘*.dagoned’ 파일명으로 변경 △파일 암호화는 ChaCha20 암호화 방식을 이용하고, 이때 사용하는 암호화 키는 RSA-2048로 암호화 △시스템의 윈도 서비스와 프로세스 목록을 확인하고 조건에 맞을 경우 서비스와 프로세스 종료 △사용자 시스템 정보와 랜섬웨어의 암호화 이력을 ‘.log’ 파일에 저장 △볼륨쉐도 복사본은 삭제하지 않음 등의 특징이 있다.
다곤 랜섬웨어의 64비트 EXE 바이너리는 모든 문자열을 인코딩한 상태로 저장하기 때문에 이를 디코딩하는 루틴을 거쳐서 필요한 문자열을 생성한다. 윈도 API 함수를 호출할 때도 동적 라이브러리를 로드해 함수를 호출하는데, 이 과정에도 같은 디코딩 루틴을 실행한다. Import 헤더 정보를 보면 초기 실행 단계에 필요한 함수만을 Import 하고 있다.
http://www.boannews.com/media/upFiles2/2022/11/943642277_9699.jpg
▲다곤 랜섬웨어(좌) 및 랜섬웨어 실행 후 확장자가 DAGON LOCKER로 바뀐 모습(우)[이미지=안랩 ASEC 분석팀]
다곤 랜섬웨어는 실행 인자로 랜섬웨어의 암호화 범위를 제한 또는 확장하고 실행 옵션을지정할 수 있다. GetCommandLineW 함수로 전달된 실행 인자에서 유효한 인자의 존재 여부를 확인하고 그 값에 따라 랜섬웨어 암호화 동작 범위를 제한 또는 확장한다.
예를 들면 ‘/LOGIN=’과 ‘/PASSWORD=’로 주어진 인자와 지정 값은 네트워크에 연결된 사용자 리소스에 접근할 때 필요한 크리덴셜이다. 다곤 랜섬웨어는 조건에 맞을 경우 네트워크로 연결된 다른 사용자 시스템도 암호화할 수 있다. 인자로 랜섬웨어 동작 범위 외에 실행 환경 옵션을 지정할 수도 있다. 예를 들면 ‘/NOKILL’은 윈도우 서비스와 프로세스를 종료하지 않도록 한다. 인자가 주어지지 않는 기본 실행 옵션으로도 정상적으로 사용자 파일 암호화 행위는 동작한다. 이번에 확인된 다곤 랜섬웨어는 실행 인자 정보가 확인되지 않아 단독으로 실행됐을 것으로 보인다.
http://www.boannews.com/media/upFiles2/2022/11/943642277_6250.jpg
▲다곤 랜섬웨어 분석 형태[이미지=안랩 ASEC 분석팀]
다곤 랜섬웨어는 특정 경로와 확장자를 제외한 모든 파일을 대상으로 암호화한 후 ‘*.dagoned’ 파일명으로 변경하는데, 기본적으로 드라이브 내 모든 파일을 암호화한다. 별도의 지정된 실행 인자가 없을 때는 A 드라이브부터 Z 드라이브까지 순차적으로 탐색하며, 드라이브 타입 중 GetDriveTypeW 함수로 네트워크 드라이브(DRIVE_REMOTE)는 제외한다. 이때 암호화 대상 파일 중 특정 경로와 확장자는 제외하는데, 총 46개의 경로와 15개 파일 확장자가 제외 대상이다. 암호화 이후 파일명은 ‘<기존파일명>*.dagoned’으로 변경한다. 암호화된 파일이 있는 경로에 랜섬노트 파일 ‘README_TO_DECRYPT.html’을 생성한다.
http://www.boannews.com/media/upFiles2/2022/11/943642277_3941.jpg
▲다곤 랜섬웨어 암호 형태[이미지=안랩 ASEC 분석팀]
다곤 랜섬웨어의 파일 암호화는 ChaCha20 암호화 방식을 이용하고, 이때 사용하는 암호화 키는 RSA-2048로 암호화한다. 다곤 랜섬웨어는 복합 암호화 방식을 이용한 랜섬웨어로 CryptImportKey 함수로 RSA 2048키를 로드하고 CryptEncrypt 함수에서 이 키를 이용해 ChaCha20 키를 암호화한다.
특히, 시스템의 윈도 서비스와 프로세스 목록을 확인하고 조건에 맞을 경우 서비스와 프로세스를 강제로 종료한다. 시스템에서 프로세스(SERVICE_32)로 유효(SERVICE_ACTIVE)하게 동작 중인 윈도 서비스를 EnumServiceStatus 함수로 조회하고 특정 3개 패턴의 이름이 서비스명에 포함돼 있을 경우 그 서비스 프로세스를 종료한다. 또한, 동작 중인 프로세스를 조회한 뒤, 그 가운데 49개 프로세스 목록과 일치하는 게 있다면, 해당 프로세스를 종료한다.
종료 대상 프로세스에는 △‘agntsvc.exe’ Panda Security Agent △‘dumpcap.exe’ △‘procmon.exe’ 등 악성코드 행위 모니터링 목적 프로세스가 있다.
http://www.boannews.com/media/upFiles2/2022/11/943642277_838.jpg
▲chacha20 암호화로직(좌)과 동작중인 프로세스 조회 화면(우)[이미지=안랩 ASEC 분석팀]
해당 랜섬웨어는 별도의 /NOLOG 실행 인자가 주어지지 않았을 때, 사용자 시스템 정보와 파일의 동작 과정 및 모든 암호화 이력을 동일 경로 내 ‘.log’ 파일로 저장한다. 파일이 단독으로 실행됐을 경우 ‘.log’ 파일이 외부 네트워크 주소로 전송되는 기능은 없다. 다곤 랜섬웨어가 정보 유출이 가능한 다른 악성코드와 함께 실행됐다가 공격자가 피해 시스템 확인 목적으로 ‘.log’ 파일을 이용할 가능성이 있다.
http://www.boannews.com/media/upFiles2/2022/11/943642277_2773.jpg
▲사용자 시스템 정보와 로그 파일[이미지=안랩 ASEC 분석팀]
랜섬웨어 내부 버전을 의미하는 문자열인 ‘er 5.1 x64’와 함께 △사용자 시스템 정보(프로세서 개수, 윈도 버전, 사용자명, PC명, 그룹 계정 등) △종료한 윈도 서비스 목록 △종료한 프로세스 목록 △암호화 이력(성공, 실패 여부 포함) △통계(암호화 속도, 암호화한 파일 및 경로 개수, 에러 발생 횟수 등) 등의 정보가 ‘.log’ 파일에 저장된다. 다만, 보편적인 랜섬웨어가 실행하는 볼륨쉐도 복사본 삭제 행위는 발견되지 않았다.
[김영명 기자(boan@boannews.com)]
느낀점 : 랜섬웨어에도 여러 가지 종류가 있는 것을 알 수 있는데, 대부분의 랜섬웨어는 그 이전에 개발한 랜섬웨어의 유사 변종일 확률이 높다는 것을 기사를 통해 짐작할 수 있었다. 또한, 다양한 패킹의 방식을 통해 랜섬웨어가 행하는 것을 1차적으로 숨기는 과정을 거치는데, 이러한 악성 프로세스를 감지하는 탐지 프로세스를 랜섬웨어 상에서 kill해버려 감지하지 못하게 하는 등 여러 기술들이 들어가는 것을 알 수 있었다. 이러한 랜섬웨어의 고도화는 우리 사회에 큰 악영향을 미칠 수 있기 때문에 이전에 발생한 랜섬웨어를 최대한 잘 분석해야 이러한 변종에 복호하 과정을 통해 대비할 수 있다는 것도 알게 되었다.
이번 주말에 SECCON CTF에서 랜섬웨어 관련 문제를 해결해볼 수 있는 기회를 갖게 되었다. 분석 과정이 생각보다 간단했지만, 사용하는 private key를 DMP file에서 leak하는 과정에서 windows api가 남기는 흔적과 internal logic에 대한 전반적인 이해가 필요했다. 결국 랜섬웨어 분석을 위해서는 작동 원리 뿐만 아니라 사용하는 다양한 라이브러리 함수의 원리를 이해하는 부분 역시 필요하다는 것을 직접적으로 느낄 수 있었다.