
악성코드 개발에 관한 워크숍
EDR 시대에, 레드팀 운영자는 더 이상 사전 컴파일된 페이로드를 사용하여 빠져나갈 수 없습니다. 따라서 멀웨어 개발은 모든 운영자에게 필수적인 기술이 되고 있습니다. 멀웨어 개발을 시작하는 것이 어렵게 보일 수 있지만, 실제로는 매우 쉽습니다. 이 워크숍은 시작하는 데 필요한 모든 것을 보여줍니다!
이 저장소에는 Hack in Paris 2022 및 X33fcon 2023에서 진행되었거나 진행될 'MalDev for Dummies' 워크숍의 슬라이드와 함께 제공되는 실습 자료가 포함되어 있습니다. 슬라이드는 '대면'으로 발표되도록 설계되었지만, 자료와 실습은 여기에서 계속 제공되어 자신의 속도에 맞춰 완료할 수 있습니다. 학습 과정은 결코 서두르면 안 됩니다! 질문이나 제안이 있으면 이 저장소에 이슈와 풀 리퀘스트를 보내주세요.
⚠ 면책 조항: 멀웨어 개발은 (공격적) 보안 분야를 발전시키고 방어 체계를 날카롭게 유지하기 위해 좋은 목적으로 사용될 수 있고 사용되어야 하는 기술입니다. 만약 이 기술을 사용하여 허가받지 않은 활동을 수행한다면, 이 워크숍이 대상으로 하는 '바보'보다 더 큰 바보이며, 여기서 나가십시오.
안티바이러스(AV) 및 엔터프라이즈 탐지 및 대응(EDR) 도구가 점점 더 성숙해짐에 따라, 레드팀은 앞서 나가야 할 필요성을 느끼고 있습니다. execute-assembly와 수정되지 않은 페이로드를 디스크에 저장하는 시대는 지나갔습니다. 운영 기간을 일주일 이상 유지하려면 페이로드 생성 및 멀웨어 개발 수준을 높여야 합니다. 그러나 이 분야에서 시작하는 것은 어려울 수 있으며, 적절한 리소스를 찾는 것이 항상 쉬운 것은 아닙니다.
이 워크숍은 이 분야의 초보자를 대상으로 하며, 멀웨어 개발자로서의 첫 걸음을 안내합니다. 주로 공격적 실무자를 대상으로 하지만, 방어적 실무자도 참여하여 기술을 넓힐 수 있습니다.
워크숍 동안 이론을 다룬 후, 실습 환경을 설정할 것입니다. 현재 기술 수준과 주제에 대한 편안함에 따라 완료할 수 있는 다양한 실습이 있습니다. 그러나 워크숍의 목표는 학습하는 것이며, 명시적으로 모든 실습을 완료하는 것이 아닙니다. 멀웨어 개발을 위해 선호하는 프로그래밍 언어를 자유롭게 선택할 수 있지만, 워크숍 중 지원은 주로 C# 및 Nim 프로그래밍 언어에 제공됩니다.
워크숍에서는 자체 멀웨어 구축을 시작하는 데 필요한 주요 주제를 논의할 것입니다. 여기에는 다음이 포함되지만 이에 국한되지는 않습니다:
멀웨어 개발을 시작하려면 호스트 머신에서 실행 중인 방어 도구의 방해를 받지 않도록 개발 머신이 필요합니다. 저는 개발에 Windows를 선호하지만, Linux나 MacOS도 괜찮습니다. 원하는 편집기/IDE를 설치하고(I는 C#을 제외한 거의 모든 것에 VS Code를 사용하며, C#에는 Visual Studio를 사용합니다), 선택한 MalDev 언어에 필요한 도구 체인을 설치하세요:
열심히 작업한 결과가 격리되지 않도록 Windows Defender를 비활성화하거나 적절한 제외 항목을 추가하는 것을 잊지 마세요! 나중에 AV와 같은 방어 제어가 활성화된 별도 머신에서 테스트할 수 있습니다.
ℹ 참고: 종종 apt와 같은 패키지 관리자나 Chocolatey 또는 Winget(이제 기본 내장!)과 같은 소프트웨어 관리 도구를 사용하여 종속성 설치 및 관리를 편리하고 반복 가능한 방식으로 자동화할 수 있습니다. 그러나 패키지 관리자의 버전은 실제 버전보다 몇 버전 뒤쳐질 수 있다는 점에 유의하세요! 아래는 언급된 도구를 한 번에 설치하는 예제 명령입니다.
choco install -y nim choosenim go rust vscode visualstudio2019community dotnetfx
이 워크숍에서 논의할 언어는 컴파일 언어입니다. 즉, 컴파일러를 사용하여 소스 코드를 선택한 형식의 바이너리 실행 파일로 변환합니다. 컴파일 과정은 언어마다 다릅니다.
C# 코드(.cs 파일)는 직접(csc 유틸리티 사용) 또는 Visual Studio 자체를 통해 컴파일할 수 있습니다. 이 저장소의 대부분의 소스 코드(보너스 실습 3의 솔루션 제외)는 다음과 같이 컴파일할 수 있습니다.
ℹ 참고: 아래 명령을 "Visual Studio 개발자 명령 프롬프트"에서 실행하여
csc의 위치를 알 수 있도록 하세요. Visual Studio 버전에 맞는 "x64 네이티브 도구 명령 프롬프트"를 사용하는 것이 좋습니다./unsafe플래그는 저수준 기능에 직접 접근하는 대부분의 스크립트에서 필요합니다.
csc filename.exe
/optimize 플래그로 컴파일 시간 최적화를 활성화할 수 있습니다. /target:winexe를 추가하여 콘솔 창을 숨기거나 /target:library로 DLL로 컴파일할 수 있습니다(단, 코드 구조가 이에 적합한지 확인하세요).
Nim 코드(.nim 파일)는 nim c 명령으로 컴파일됩니다. 이 저장소의 소스 코드는 다음과 같이 컴파일할 수 있습니다.
nim c filename.nim
빌드 크기를 최적화하고 디버그 정보를 제거하려면(opsec에 훨씬 좋습니다!) 다음 플래그를 추가할 수 있습니다.
nim c -d:release -d:strip --opt:size filename.nim
선택적으로 --app:gui를 추가하여 콘솔 창을 숨길 수도 있습니다.
Golang 코드(.go 파일)는 go build 명령으로 컴파일됩니다. 이 저장소의 소스 코드는 다음과 같이 컴파일할 수 있습니다.
GOOS=windows go build
빌드 크기를 최적화하고 디버그 정보를 제거하려면(opsec에 훨씬 좋습니다!) 다음 플래그를 추가할 수 있습니다.
GOOS=windows go build -ldflags "-s -w"
Rust 코드(.rs 파일)는 cargo 명령을 통해 컴파일됩니다. Cargo를 사용하여 종속성을 관리하고 프로젝트를 빌드할 수 있습니다. 이 저장소의 소스 코드는 프로젝트 폴더로 이동하여 다음 명령을 실행하여 컴파일할 수 있습니다.
cargo build
빌드 크기를 최적화하고 디버그 정보를 제거하려면 다음 플래그를 추가할 수 있습니다. 컴파일 시간 opsec 옵션은 각 Cargo.toml 파일의 [profile.release] 섹션도 참조하세요.
cargo build --release
대부분의 솔루션은 종속성 없이 컴파일할 수 있습니다. 종속성이 필요한 경우 적절한 NuGet 패키지에 연결된 Visual Studio 프로젝트가 제공됩니다.
대부분의 Nim 프로그램은 Windows API와 상호 작용하기 위해 "Winim"이라는 라이브러리에 의존합니다. Nim을 설치한 후 Nimble 패키지 관리자로 라이브러리를 설치할 수 있습니다:
nimble install winim
이 저장소의 소스 코드에서 일부 종속성이 사용됩니다. Go를 설치한 후 다음과 같이 설치할 수 있습니다:
go mod tidy
일부 예제는 Windows API를 호출하기 위해 windows-sys 크레이트에 의존합니다. Cargo를 사용하고 있으므로 테스트 또는 릴리스 빌드를 컴파일할 때 패키지가 자동으로 관리됩니다.
워크숍 슬라이드는 시작하는 데 사용할 수 있는 몇 가지 리소스를 참조합니다. 관련 블로그나 코드 조각과 같은 추가 리소스는 각 실습의 README.md 파일에 나열되어 있습니다!