.Net 어셈블리를 사용한 랜섬웨어 기법 이해하기: 5가지 주요 기법
랜섬웨어 공격은 탐지를 회피한 다음 시스템의 데이터를 암호화하는 데 성공합니다. 랜섬웨어 공격 후 분석에서 공격이 다양한 유형의 파일을 여러 가지 기법과 함께 조합하여 사용했다는 내용을 자주 접하게 됩니다.
그렇다면 이 모든 것이 실제로 무엇을 의미할까요? 이 시리즈에서는 .Net 소프트웨어 프레임워크를 사용하여 랜섬웨어의 이러한 기능이 어떻게 가능한지 보여드리겠습니다.
멀웨어 페이로드와 비콘에 대한 이전 3부 시리즈에서는 메타스플로잇 침투 테스트 프레임워크에 초점을 맞췄습니다. 이미 만들어진 미터프리터 멀웨어 페이로드를 사용하여 다양한 공격 기법을 보여주었습니다. 첫 번째 글 에서는 악성 통신이 시작되는 방법, 공격자의 인프라, 공격에 대한 포렌식 분석에 대해 살펴봤습니다. 두 번째 글 에서는 페이로드의 범주와 유형을 몇 가지 인메모리 조작 기법과 함께 살펴봤습니다. 이 시리즈의 마지막 파트에서는 회피 및 완화 기술에 중점을 두었습니다.
이 시리즈에서는 .Net 소프트웨어 프레임워크를 활용하지만 랜섬웨어에 초점을 맞춘 개별 페이로드 파일(어셈블리라고도 함)을 직접 만들어 보겠습니다. 먼저 랜섬웨어와 멀웨어의 기능을 개별적인 예시 기술로 나누어 각각의 작동 방식을 이해해 보겠습니다. 이러한 개별 기술 중 일부는 궁극적으로 하나의 악성 랜섬웨어 페이로드에 결합되어 종종 파괴적인 효과를 발휘합니다.
기술 1: 다운로더, 드로퍼, 로더
먼저 랜섬웨어나 멀웨어가 감염된 네트워크에서 어떻게 연결되는지 살펴봅니다. 원격 시스템에 연결하여 추가 페이로드를 다운로드하고, 이를 감염된 시스템에 드롭한 후 실행(즉, 메모리에 로드)하는 기능입니다.
다음은 .Net 명령줄(콘솔) 애플리케이션의 예입니다:
- 다른 원격 실행 애플리케이션(putty.exe)을 다운로드하여 다운로더 역할을 합니다. 인터넷에서
- 다운로드한 애플리케이션을 컴퓨터의 디스크에 있는 임시 폴더에 드롭합니다.
- 애플리케이션 이름을 putty_new.exe↪CF_200D↩로변경합니다.
- 다운로드한 애플리케이션을 컴퓨터에서 자동으로 실행하여 메모리에 로드합니다.

페이로드 스테이징이 사용되는 경우, 즉 여러 개의 악성 파일이 서로 다른 작업을 수행하는 경우 스테이저(초기 소형 페이로드)는 다운로더이자 느슨하게는 스테이지(주요 대형 페이로드)의 드롭퍼가 될 수도 있습니다. 스테이지의 로더가 될 수도 있습니다. 사용되는 기술은 운영 보안 고려 사항이라고도 하는 탐지 위험에 대한 위협 행위자의 평가에 따라 달라집니다.
다운로더는 웹 서버나 FTP 서버와 같은 원격 소스에서 페이로드를 가져오는 역할을 합니다. 보통 인터넷을 통해 이루어집니다. 따라서 다운로더는 원격 소스에 도달하기 위해 일부 네트워크 연결을 시도해야 합니다.
반면, 드롭퍼는 주로 피해 시스템에 페이로드를 전달하거나 드롭하는 역할을 담당합니다. 따라서 다운로더도 드로퍼일 수 있지만, 드로퍼에 이미 악성 페이로드가 휴대용 실행 파일(PE) 또는 DLL로 포함되어 있을 수 있으므로 드로퍼가 반드시 다운로더가 아닐 수도 있습니다. 이러한 파일 유형에 대해서는 나중에 설명합니다. 드로퍼는 일반적으로 공격에 사용되며, 솔라윈즈와 카세야 공급망 공격이 대표적인 예입니다. 두 가지 모두 악성 페이로드의 드롭퍼로 사용되는 손상된 공급업체 에이전트 소프트웨어의 사용과 관련이 있습니다. 후자는 REvil 랜섬웨어 그룹이 사용하고 있습니다.
로더는 특히 메모리 전용 페이로드의 경우 다른 악성 페이로드를 실행하도록 피해자 시스템을 설정하는 역할을 합니다. 여기서 설정이란 다른 프로세스의 메모리 공간에 DLL을 삽입하여 필요한 메모리 공간 할당을 보장한 다음 적절한 메모리 권한을 설정하는 것을 의미합니다. 그런 다음 로더가 페이로드를 시작하거나 필요한 스레드를 실행합니다.↪cf_200D↩
기술 2: EXE로 DLL 파일 로드하기
랜섬웨어 페이로드는 EXE 파일 또는 DLL 파일 형태일 수 있습니다. 다음으로, EXE 파일이라고도 하는 Windows 실행 파일이 동적 링크 라이브러리(DLL) 파일로 알려진 것을 로드하여 포함된 코드를 활용하는 방법을 살펴봅니다.

EXE와 DLL은 컴퓨터 프로그래밍 코드 명령과 관련 정보(메타데이터)를 포함하는 두 가지 유형의 .Net 어셈블리입니다. 이러한 지침과 메타데이터는 하나의 결과 파일인 EXE 또는 DLL .Net 어셈블리로 함께 조립됩니다. 이 두 가지 유형의 파일을 사용하면 컴퓨터 프로그래밍 코드를 Windows 시스템에서 실행(EXE)하거나 라이브러리 파일(DLL)로 저장한 다음 다른 파일에서 '빌려서' 읽을 수 있습니다. DLL의 경우, 이 과정은 여러 사람이 도서관에서 같은 책을 서로 다른 시간에 빌려서 내용을 읽는 것과 비슷합니다. 이 시리즈의 두 번째 파트에서는 이 두 어셈블리를 .Net과 관련하여 더 자세히 살펴보겠습니다. 소프트웨어 프레임워크입니다.
지금은 이 두 가지 유형의 .Net 어셈블리(자체 코드를 실행한 다음 DLL 파일에서 외부 코드를 로드하고 읽는 실행 파일(EXE)의 사용을 보여 주는 매우 간단한 예제를 살펴보겠습니다. 그런 다음 실행 파일은 로드된 DLL 코드에 일부 입력을 전달합니다. 마지막으로 DLL은 EXE에서 받은 입력을 사용하여 애플리케이션을 실행하는 사용자에게 다시 메시지를 표시합니다. 아래는 실제 작동하는 코드입니다:

이 간단한 애플리케이션은 EXE와 DLL .Net 어셈블리 간의 관계도 보여줍니다. 이러한 유형의 관계는 Windows 운영 체제 자체를 포함하여 많은 애플리케이션과 운영 체제(공유 라이브러리)에서 합법적으로 사용됩니다. Windows는 여러 애플리케이션에서 공유할 수 있도록 자체 코드의 대부분을 DLL로 패키징합니다.
아래 이미지는 이전 예제에서 EXE와 DLL의 프로그래밍 코드를 모두 보여줍니다. 이 코드는 .Net에서 지원하는 언어 중 하나인 C# 프로그래밍 언어를 사용하여 작성되었습니다. 이미지에서 DLL 코드 참조는 강조를 위해 강조 표시되어 있습니다:

DLL은 코드를 한 번 작성하면 여러 실행 파일에서 공유 또는 동적 라이브러리로 여러 번 사용할 수 있는 효과적인 수단입니다. 그 결과, 많은 멀웨어와 랜섬웨어 계열에서도 많이 사용됩니다. DLL 사이드 로딩 및 DLL 하이재킹과 같은 기술은 이러한 .Net 어셈블리 간의 관계를 활용하는 일반적인 악성 기법입니다.↪cf_200D↩
기술 3: 정찰 및 리빙 오프 더 랜드 바이너리 시작↪cf_200D↩
대상 시스템에 대한 유용한 정보를 수집하는 기능(Discovery)과 동시에 해당 시스템에서 다른 바이너리 또는 실행 파일을 실행하는 기능(Spawning) 등 중요한 기술을 조합하여 계속 진행합니다. 여기 이미지에서 초기 사용자 지정 실행 파일은 대상 Windows 시스템에서 기본 실행 파일 또는 바이너리를 실행하여 LotL(Living Off the Land) 공격을 보여줍니다.

이 예는 초기 C# 애플리케이션을 실행한 다음 출력의 녹색 텍스트로 표시된 대상 시스템에 대한 몇 가지 유용한 정보를 수집하는 과정을 보여줍니다. 수집된 드라이브 정보를 확인합니다. 랜섬웨어는 이 정보를 활용하여 이러한 드라이브의 파일을 표적으로 삼은 다음 암호화하기 전에 유출하여 보통 거액의 몸값을 요구할 수 있습니다.
애플리케이션은 외부 시스템 실행 파일인 Windows 명령 프롬프트(cmd.exe)를 실행하여 계속 진행됩니다. 실행 파일입니다. 그런 다음 사용자 지정 애플리케이션은 일부 Windows 명령을 Windows cmd.exe 프로세스에 전달하여 표시(이 경우 빨간색 텍스트로 표시)하는 Windows 시스템의 버전 정보를 표시합니다. 이 글의 편의를 위해 사용자 지정 C# 애플리케이션은 수행한 작업의 출력과 실행된 프로세스에 대한 정보를 표시합니다. 다른 외부 애플리케이션을 실행하는 이 기능은 피해 프로세스를 시작하여 결국 악성 코드를 주입하는 데에도 유용합니다.
↪f_200D↩기술4: 데이터 인코딩↪f_200D↩
또 다른 유용한 기술은 데이터 인코딩입니다. 알고리즘을 사용하여 데이터를 다른 형태로 표현하는 과정입니다. 예를 들어, 인코딩의 한 유형인 base64는 일부 웹 요청에서 HTTP 권한 부여 및 API 호출의 기본 인증과 같은 데이터를 주고받는 데 합법적으로 사용됩니다. 그러나 동일한 base64 인코딩 예제를 사용하면 악성 프로그램이나 페이로드에서 사용하는 특정 텍스트와 명령을 숨길 수도 있습니다. 콜백 URL이나 파일과 같은 코드의 일부를 난독화하는 데 사용할 수 있습니다. 이러한 기술은 아래 독립형 C# 프로그램에서 확인할 수 있습니다.

이 특정 앱 예제에서 코드는 일부 텍스트를 사용하며, 이 경우 URL은 "https://listener.malware.bad"입니다, 는 이를 컴퓨터 바이트 배열로 변환한 다음, 해당 바이트에 대해 base64 인코딩 알고리즘을 실행하여 위 애플리케이션 디스플레이의 인코더 섹션 아래에 표시된 "aHR0cHM6Ly9saXN0ZW5lci5tYWx3YXJlLmJhZA=="의 영숫자 ASCII 텍스트로 변환합니다. 이 프로세스는 디코더 섹션에 표시된 대로 프로그래밍 방식으로 되돌리면 원본 텍스트를 다시 가져올 수 있습니다. 이렇게 하면 URL이 눈에 잘 띄지 않게 숨겨져 악성 URL인지 여부를 즉시 확인할 수 없습니다.
↪f_200D↩기술5: 암호화↪f_200D↩
마지막으로 암호화에 대해 살펴봅니다. 감염된 시스템의 파일을 암호화하는 것이 랜섬웨어의 대명사가 되었습니다. 이 역시 다른 대부분의 기법과 마찬가지로 저장된 데이터를 보호하기 위한 합법적인 기능이지만 랜섬웨어에서 악의적인 목적으로 사용되기 시작했습니다.
아래 예시에는 C# 암호화 애플리케이션이 있습니다. 먼저 암호화할 파일의 복사본을 만든 다음 원본은 그대로 두고 복사본을 암호화합니다.

여기서 원본 파일인 Data1.txt의 원본 콘텐츠가 다른 파일인 Data1-Encrypted.txt로 복사됩니다, 를 클릭하면 이 새 파일이 암호화됩니다.

암호화는 랜섬웨어가 사용하는 주요 기술 중 하나이며, 손상된 시스템을 몸값을 요구하기 위한 기반이 됩니다. 또한 전송 중이거나 미사용 중인 멀웨어 페이로드 또는 로더를 숨겨 탐지를 회피하는 데 유용할 수 있습니다.
5월 22일에 시리즈 2부를 읽어보세요.
다음 글에서는 여기에 소개된 몇 가지 전술과 기법, 그리고 궁극적으로 이를 촉진하는 방법에 대한 참고 자료로 Microsoft의 .Net 소프트웨어 프레임워크와 관련 C# 프로그래밍 언어를 살펴봅니다.
일루미오 제로 트러스트 세분화가 랜섬웨어 침해를 차단하는 데 어떻게 도움이 되는지 자세히 알아보세요.