멀웨어 페이로드 및 비콘: 악성 페이로드 유형
에서 이전 블로그 게시물페이로드가 악의적인 통신을 촉진하는 방법과 공격자가 페이로드 및 비콘을 성공적으로 실행한 후 시스템을 제어할 수 있는 방법에 대해 논의했습니다.메타스플로이트 프레임워크에서 가져온 Meterpreter 페이로드가 지원하는 reverse_tcp 통신 채널을 사용했습니다.
이 글에서는 페이로드의 고유한 유형과 페이로드가 사용할 수 있는 메모리 조작 기법의 예를 더 자세히 이해하는 데 초점을 맞출 것입니다.
멀웨어 구성과 실행이 더욱 정교해졌습니다. 특히 다음과 같은 단순한 바이러스 시대와는 대조적입니다. 덩굴 70년대 초반의 프로그램.주로 은밀한 목적을 목적으로 하는 위협 행위자의 경우, 탐지되지 않은 상태로 네트워크에 장기간 머무르기 위해 레이더를 피하는 것이 일반적으로 최우선 과제입니다.따라서 이들은 원하는 수준의 운영 보안을 달성하기 위해 유인, 인코딩, 난독화, 암호화 및 모방과 같은 해당 기술을 사용할 것입니다.
위협 행위자가 사용할 수 있는 실행 가능한 형식은 여러 가지가 있습니다.공격자의 선택은 초기 공격 벡터와 이후의 악용 후 조치에 따라 달라집니다.다음은 몇 가지 예입니다. 메타스플로잇 프레임워크의 실행 파일 및 변환 형식

에서 설명한 바와 같이 첫 번째 부분, 비콘 또는 페이로드는 공격 대상 시스템 또는 네트워크에 이식되는 것으로, 공격자에게 침입한 다음 거점을 제공합니다.이는 멀웨어 무기고 및 전체 공격 라이프사이클의 중요한 부분을 차지하며, 위협 행위자가 직접 액세스하여 추가적인 악의적 활동을 추적할 수 있도록 합니다.
실제로 광범위하게 분류하면 페이로드는 “스테이징”되거나 “스테이지리스”일 수 있습니다.위협 행위자는 여러 요인에 따라 둘 중 하나를 선택할 수 있으며, 그 중 가장 중요한 요소는 운영 보안 고려 사항일 수 있습니다.
스테이징된 페이로드란 무엇입니까?
스테이징된 페이로드는 단일 페이로드가 수행했을 법한 여러 페이로드 단계를 사용하여 공격의 개별 단계를 세분화합니다.이러한 페이로드는 일반적으로 '스테이저' (초기 페이로드 또는 비콘) 실행 파일과 '스테이지' (기본 페이로드) 실행 파일로 분류됩니다.
스테이저는 초기 페이로드인 작은 실행 파일입니다.스테이지 페이로드라고 하는 훨씬 크고 기능이 뛰어난 페이로드를 준비하기 위해 실행되는 비교적 작은 코드입니다.즉, “스테이저가 스테이지를 설정”한다는 뜻입니다.스테이저는 일반적으로 초기 항목이 취약점을 악용할 때 일부 익스플로잇 코드의 일부가 됩니다.여기서 익스플로잇 코드는 대상 취약점을 성공적으로 악용한 다음 스테이저 코드 (페이로드) 를 실행합니다.그러면 스테이저가 작업을 시작합니다.
스테이저의 기본 작업은 탐지 없이 성공적으로 실행하고, 공격자 인프라에 다시 접속하여 원하는 주 페이로드를 다운로드한 다음, 해당 페이로드를 실행하도록 시스템을 설정하는 것입니다.다운로드한 스테이지 또는 더 큰 메인 페이로드는 공격자가 요구하는 기능에 따라 하나 이상의 페이로드일 수 있습니다.스테이지가 다운로드되면 스테이저는 실행 제어를 전달하여 악의적인 활동을 계속합니다.
취약점 익스플로잇의 경우 초기 익스플로잇 프로그램은 스테이저가 메인 스테이지 페이로드에 대해 수행하는 것과 유사한 작업을 스테이저에 대해 손상된 시스템에 대한 리소스 할당 측면에서 수행합니다.다음과 비슷한 패턴을 따를 것입니다.

아래 예에서는 스테이징된 페이로드를 Windows 실행 파일로 보여 줍니다.

스테이징된 페이로드는 버퍼 오버플로우 취약점을 악용하는 데 사용되는 셸 코드의 경우와 같이 페이로드 전달 및 실행과 관련하여 디스크 및 메모리 공간과 같은 시스템 관련 제약이 있을 수 있는 시나리오를 수용합니다.
스테이지리스 페이로드란 무엇입니까?
스테이징된 페이로드와 반대되는 것은 스테이지리스 페이로드입니다.스테이지리스 페이로드는 독립적이며 일반적으로 스테이징된 페이로드보다 훨씬 큽니다.일반적으로 공격자에게 필요한 모든 기능을 하나의 실행 파일로 결합합니다.
여기서는 일반적으로 기본 페이로드 (stager) 를 다운로드하는 초기 페이로드 (stager) 가 필요하지 않습니다.스테이지리스 페이로드가 실행되면 메모리 삽입, 공격자 인프라로의 콜백, 공격자에게 셸 전달과 같은 악의적인 작업을 수행하는 데 필요한 모든 기능을 갖추게 됩니다.
아래 예제는 Windows 실행 파일로서의 스테이리스 미터프리터 리버스 tcp 페이로드를 보여줍니다.

악성 캠페인의 일부로 사용할 페이로드 유형을 결정하는 것을 해당 위협 행위자에 대한 “운영 보안 고려 사항”이라고 합니다.악성 캠페인을 지원하는 해당 공격자 인프라의 유형은 이러한 고려 사항의 영향을 부분적으로 받습니다.
스테이징된 페이로드와 스테이지리스 페이로드
메타스플로잇 스테이징 페이로드에는 Meterpreter라는 단어 뒤에 포워드 슬래시 기호 (/) 가 있습니다.아래 스크린샷은 Windows에서 스테이징한 미터프리터 페이로드의 예를 보여줍니다.

스테이지리스 페이로드에는 Meterpreter라는 단어 뒤에 밑줄 기호 (_) 가 사용됩니다.아래 스크린샷은 Windows Meterpreter 스테이지리스 페이로드의 예를 보여줍니다.

아래 예시는 페이로드의 두 범주를 모두 보여줍니다.

스테이지리스 페이로드는 독립적이므로 맬웨어가 공격자 인프라에 콜백한 후 대상 시스템에 단계 (기본 페이로드) 를 보내는 추가 단계가 필요하지 않습니다.아래 스크린샷을 보면 역방향 TCP 핸들러가 시작된 후 다음 단계는 스테이지와 같은 추가 페이로드를 전송할 필요 없이 대상 시스템에 직접 Meterpreter 원격 셸 세션을 여는 것입니다.

아래 스크린샷에서 스테이저가 공격자 인프라에 콜백을 한 후 스테이지를 전송하는 추가 단계가 있음을 알 수 있습니다. “스테이지 (175174) 를 203.0.113.1로 전송”입니다.

스테이징과 스테이지리스 간의 또 다른 차이점은 페이로드의 크기입니다.아래 스크린샷에서 스테이지리스 페이로드 (meeting_update_stageless.exe) 는 73KB의 스테이징된 초기 페이로드 (web1_meeting_update.exe) 에 비해 245KB로 훨씬 더 큽니다.

셸 코드란 무엇입니까?
셸코드는 컴퓨터 메모리에서 실행 중인 프로그램의 정상적인 흐름을 가로채려는 악성 코드입니다.그런 다음 흐름을 리디렉션하여 악성 코드가 일반 프로그램 대신 실행되도록 하여 공격자에게 셸 또는 직접 액세스 권한을 부여합니다.이들은 주로 저수준 프로그래밍 코드 형태의 비콘 또는 페이로드이거나 익스플로잇과 결합된 기계 코드입니다.익스플로잇은 취약점을 성공적으로 악용하는 저수준 코드 또는 네이티브 코드의 일부입니다.
공격자가 정상적인 프로그램 흐름을 리디렉션하기 위해 할당된 메모리를 오버런하는 애플리케이션 메모리의 버퍼 오버플로우가 악용되는 경우가 많습니다.악용에 성공하면 페이로드 (멀웨어) 가 실행될 수 있습니다.
가장 순수한 형태의 셸코드는 메모리 관련 익스플로잇에 일반적으로 사용되는 네이티브 코드 또는 어셈블리 코드입니다.
아래 예제는 파워쉘 (ps1) 셸 코드를 보여줍니다.

이 특정 예에서는 a를 사용합니다. 윈도우 다이내믹 링크 라이브러리 (DLL) 리플렉티브 로더를 통해 메모리에 주입되었습니다.셸 코드는 영숫자 형식으로 생성됩니다.성공적으로 실행되면 메타스플로잇 프레임워크에서 생성된 역방향 DNS TCP 세션을 통해 공격자에게 다시 연결할 수 있습니다.
전달 메커니즘의 선택, 공격 유형, 취약한 대상 시스템 모두에 따라 공격과 관련된 비콘 또는 페이로드의 선택이 결정됩니다.익스플로잇은 기본 운영 체제에 액세스하기 전에 취약한 애플리케이션을 이용하는 데 사용됩니다.이러한 경우 해당 응용 프로그램의 특정 코드 (예: 웹 서버 프런트 엔드 응용 프로그램의 경우 PHP 또는 ASP) 를 사용할 수 있습니다.
셸코드 특성
성공적인 셸코드 실행을 보장하고 높은 운영 보안을 유지하기 위한 몇 가지 중요한 고려 사항 및 특성이 있습니다.
코드는 다음과 같아야 합니다.
- 크기는 비교적 작지만 원하는 셸을 실행하는 데 필요한 모든 지침을 준비하십시오.
- 메모리에서 “위치 독립적”이어야 합니다. 대상 취약한 프로세스의 메모리에서 로드될 위치를 미리 알 수 없는 경우가 많기 때문에 이는 매우 중요합니다.
- 예를 들어, null 문자 (0x00) 로 인해 잠재적 오류를 일으키거나 전체 프로세스를 중단시킬 수 있는 내용이 포함되어 있지 않습니다.
- 코드 또는 리플렉션 인젝션과 같은 일부 인젝션 기술을 사용하여 기존 메모리 할당에 편승할 수 있어야 합니다.
이 시점부터 공격자는 대상 시스템에서 실행할 적절한 공격 후 실행 파일 유형 (예: Windows의 경우 EXE 또는 DLL, Linux의 경우 ELF, Android용 APK) 을 선택해야 합니다.다시 말씀드리지만, 운영 보안을 강화하기 위해서는 메모리만 사용하는 사후 공격 기법을 사용하는 것이 좋습니다.
코드 인젝션과 DLL 인젝션이란 무엇입니까?
DLL 인젝션은 다른 프로세스의 컨텍스트에서 코드 (DLL) 를 실행하는 프로세스입니다.미터프리터 페이로드는 스텔스 및 회피 메커니즘을 위한 DLL 인젝션 기법을 사용합니다.
Windows에서 동적 링크 라이브러리 또는 DLL (Linux에서는 “공유 라이브러리”) 은 공유 라이브러리 파일로 저장된 코드 조각입니다.즉, 다양한 컴퓨터 프로그램에서 필요할 때 사용할 수 있습니다.운영 체제 (이 경우 Windows) 는 런타임에 라이브러리 쓰기 및 로드를 처리합니다.프로그램은 필요한 DLL 파일을 단순히 호출하거나 참조하여 포함된 코드를 사용할 수 있습니다.
이는 프로그래머에게 유용합니다. 코드를 한 번만 작성하고 컴파일하여 공유 라이브러리 또는 DLL로 저장한 다음 필요할 때마다 여러 프로그램에서 사용하기 때문입니다.
DLL과 EXE 파일의 주요 차이점은 DLL을 독립적으로 실행할 수 없다는 것입니다.호출하거나 참조한 다음 실행하려면 EXE와 같은 프로그램이 필요합니다.다음 예제에서는 Windows 운영 체제의 DLL 파일을 보여 줍니다. 이 파일은 일반적으로 C:\Windows\ WinSxS 폴더에 저장됩니다 (WinSxs는 Windows를 사이드바이사이드의 약자).

DLL 기능은 위협 행위자에게도 매우 유용합니다.기본 수준의 코드 삽입에는 한 프로세스 (악성) 가 원격 프로세스 (피해자 프로세스) 에 연결 (또는 핸들 획득) 을 시도하는 것이 포함됩니다.그런 다음 대상 프로세스에 충분한 메모리를 할당하거나 페이지 권한을 변경하여 DLL과 같은 새 코드를 실행합니다. 그런 다음 DLL 악성 코드를 새 프로세스나 이미 실행 중인 대상 프로세스의 메모리 공간에 복사 (삽입) 합니다.
그런 다음 프로세스가 특정 작업을 실행하는 방법을 나타내는 새 스레드가 대상 프로세스에서 시작되어 주입된 코드 또는 DLL에 포함된 명령을 실행합니다.
스레드는 스레드를 시작한 프로세스와 동일한 메모리 공간을 공유하는 반면, 프로세스마다 고유한 메모리 공간이 할당됩니다. 특히 변수를 공유하지 않는 경우에는 더욱 그렇습니다.이는 운영 체제에 의해 적용됩니다.그러나 운영 체제는 필요에 따라 파이프 (명명되거나 익명), 소켓, 세마포어, 공유 메모리 및 메시지 대기열과 같은 IPC (프로세스 간 통신) 를 사용하여 프로세스가 통신할 수 있는 메커니즘을 제공합니다.
Windows 운영 체제에서 코드 삽입에는 악의적인 목적으로 합법적인 Windows API 및 함수를 사용하는 것이 포함됩니다.예를 들면 다음과 같습니다.
- 프로세스 열기 프로세스를 처리하는 데 사용됩니다.
- VirtualAlloceX 그러면 해당 원격 프로세스에 충분한 메모리를 쉽게 할당할 수 있습니다.
- 버추얼 프로텍트 X 메모리 (페이지) 권한을 재정의하는 데 사용할 수 있습니다.
- 쓰기 프로세스 메모리 DLL과 같은 악성 코드를 피해자 프로세스에 기록합니다.
- 원격 스레드 생성, RTL 사용자 스레드 생성 또는 NT 스레드 생성 새 스레드 (프로세스가 특정 작업을 실행하는 방법) 를 생성하고 자격 증명 도용 또는 랜섬웨어 실행과 같은 악성 기능을 실행하는 데 사용됩니다.
윈도우에서 DLL을 로드하려면 libloaderapi.h의 일부인 LoadLibrarya나 LoadLibraryExa 함수를 호출해야 합니다. 마이크로소프트가 설명했듯이 이러한 함수는 “호출 프로세스의 주소 공간에 지정된 모듈을 로드합니다.”LoadLibrary를 사용하여 DLL을 로드한다는 것은 DLL을 디스크에서 로드해야 한다는 의미입니다.
하지만 리플렉티브 DLL 인젝션 기술을 사용하면 메모리에서 직접 DLL을 로드할 수 있는데, 이는 현재 LoadLibrary에서 제공하지 않는 기능입니다.위협 행위자는 디스크의 기본 Windows 로더를 호출할 필요 없이 반사형 DLL 삽입을 사용하여 악성 코드 전체를 메모리에 자체 로드할 수 있습니다.여기서는 Windows LoadLibrary 대신 사용자 지정 로더를 사용합니다.
공격자는 다음과 같은 다른 주입 및 프로세스 조작 기술을 사용할 수도 있습니다.
- 프로세스 할로잉 — 맬웨어가 일시 중단된 상태에서 공격 대상 프로세스를 시작하는 곳입니다. 그런 다음 새 코드를 위한 공간을 만들기 위해 메모리를 비우고, 페이지 권한을 변경하고, 악성 코드를 주입하고, 주입된 악성 코드를 실행하는 프로세스를 재개합니다.
- DLL 사이드 로딩 — 합법적이고 종종 오래된 취약한 Windows 프로그램 (피해자 프로세스) 이 악성 DLL을 강제로 로드하도록 하는 경우. 이 DLL은 피해자가 예상한 것과 동일한 이름을 의도적으로 지정하고 취약한 프로그램과 동일한 디렉토리 (나란히) 에 배치합니다.피해 프로그램의 프로세스는 먼저 해당 폴더에서 이름이 바뀐 (사칭된) 악성 DLL을 찾습니다.이 방법은 Windows 로더가 성공하기 위해 사용하는 DLL 검색 순서를 활용합니다.
이러한 기법은 악의적인 활동을 합법적인 것처럼 보이게 하여 탐지를 회피하여 손상된 시스템에서 지속되도록 합니다.
에서 설명한 프로세스 조작 기법에서 이 시리즈의 1부, 아래에서 원본 악성 web1_meeting_update.exe 마이그레이션에 일부 코드 삽입이 포함되었음을 알 수 있습니다.
이 예시에서는 악성 페이로드가 코드 삽입을 원하는 공격 프로세스로 완전히 새로운 notepad.exe 프로세스를 시작 (생성) 했습니다.그런 다음 원래의 악성 프로세스 (PID 2472) 가 새로운 notepad.exe 피해자 프로세스 (PID 1768) 에 주입되거나 마이그레이션됩니다.

Notepad.exe 는 신뢰할 수 있는 Microsoft 프로세스이므로 공격자는 원래의 악의적인 프로세스를 더 신뢰할 수 있는 프로세스로 위장할 수 있습니다.Notepad.exe 는 네트워크 연결 (이 예에서는 악성 프로세스 실행) 에 필요한 Windows API, 함수 또는 DLL을 호출 (참조) 할 필요가 없는 기본 Windows 텍스트 편집기입니다.
메모리에서 발생하는 주입을 감지하려면 동적 분석이 필요합니다. 애플리케이션 종속성 매핑 또한 텍스트 편집기 (이 경우 notepad.exe 프로세스) 의 의심스러운 네트워크 통신을 탐지하여 네트워크에 연결하는 데 필요합니다.
결론
에서 팔로우 중 첫 번째 부분 이 블로그 시리즈에서는 위협 행위자가 사용할 수 있는 페이로드의 몇 가지 범주와 유형, 그리고 위협 행위자가 다른 유형보다 한 유형을 사용하기로 결정하는 이유를 살펴보았습니다.
대부분의 위협 공격자는 성공적인 초기 침입, 지속성 유지, 탐지를 피하기 위해 많은 노력을 기울입니다.지금까지 살펴본 바로는 도구, 기법 및 절차를 조합한다는 것은 성공적인 공격을 방지하기 위해 보안 도구와 절차의 동등한 조합이 필요하거나 그럴 가능성이 높다는 것을 의미한다는 것을 알 수 있었습니다. 위반을 가정하다 초기 사이버 사고가 중대한 침해로 이어지지 않도록 방지할 수 있습니다.
이 시리즈의 마지막 부분에서는 몇 가지 기술과 기능에 대해 더 알아보고, 가장 중요한 것은 분석과 완화에 대해 살펴보겠습니다.