
레드 팀 작전을 위한 Rust 무기화.
임플란트 개발 및 일반적인 공격 작업을 위해 Rust를 무기화하는 실험입니다.
mingw 툴체인만 설치하면 되지만, 특정 라이브러리는 다른 OS에서 성공적으로 컴파일되지 않을 수 있습니다.이 저장소는 바이너리를 제공하지 않습니다. 직접 컴파일해야 합니다.
Rust 설치
간단히 바이너리를 다운로드하여 설치하세요.
이 저장소는 Windows 10에서 컴파일되었으므로 Windows 10을 사용하는 것이 좋습니다. 언급한 대로 OpenSSL 바이너리는 OpenSSL과 perl 설치가 필요한 의존성 문제가 있습니다.
TCP SSL 클라이언트/서버의 경우, 실행할 호스트의 의존성 때문에 정적 빌드를 권장합니다.
프로젝트를 생성하려면 다음을 실행하세요:
cargo new <name>
그러면 다음과 같은 구조의 프로젝트 폴더가 자동으로 생성됩니다:```bash
project
├── Cargo.toml
└── src
└── main.rs
Cargo.toml은 의존성과 컴파일 구성을 포함하는 파일입니다.
main.rs는 잠재적인 라이브러리 디렉토리와 함께 컴파일될 메인 파일입니다.
프로젝트를 컴파일하려면 프로젝트 디렉토리로 이동하여 다음을 실행하십시오:
`cargo build`
이것은 기본 도구 체인을 사용합니다.
최종 "릴리스" 버전을 빌드하려면 다음을 실행하십시오:
`cargo build --release`
정적 바이너리의 경우, 빌드 명령 전에 터미널에서 다음을 실행하십시오:
`"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"`
`set RUSTFLAGS=-C target-feature=+crt-static`
코드가 작성된 방식대로 읽기 어렵다면,
프로젝트 디렉토리 내에서 아래 명령을 사용하여 더 나은 방식으로 포맷할 수도 있습니다.
`cargo fmt`
일부 예제는 최신 기능을 갖춘 Rust의 nightly 빌드가 필요하여 컴파일되지 않고 오류가 발생할 수 있습니다.
설치하려면 다음을 실행하십시오:
`rustup default nightly`
의존성 또는 [Crates](https://crates.io/)라고 불리는 것들을 찾을 수 있는 가장 쉬운 장소입니다.
## 크로스 컴파일
크로스 컴파일을 하려면 [여기](https://rust-lang.github.io/rustup/cross-compilation.html)의 지침을 따라야 합니다.
다른 도구 체인을 설치하면 아래 명령으로 크로스 컴파일할 수 있습니다.
`cargo build --target <toolchain>`
시스템에 설치된 도구 체인을 확인하려면 다음을 실행하십시오:
`rustup toolchain list`
시스템에 설치할 수 있는 모든 도구 체인을 확인하려면 다음을 실행하십시오:
`rustup target list`
새로운 도구 체인을 설치하려면 다음을 실행하십시오:
`rustup target add <toolchain_name>`
## 실행 파일 크기 최적화
이 [리포지토리](https://github.com/johnthagen/min-sized-rust)에는 파일 크기를 줄이기 위한 많은 구성 옵션과 아이디어가 포함되어 있습니다.
정적 바이너리는 일반적으로 상당히 큽니다.
## 제가 빠졌던 함정들
\0 바이트에 주의하십시오. 메모리의 문자열에 대해 이를 잊지 마십시오. 많은 시간을 소비했지만 windbg가 항상 해결하는 데 도움이 되었습니다.
## 흥미로운 Rust 라이브러리
- WINAPI
- [WINAPI2](https://github.com/MauriceKayser/rs-winapi2)
- Windows - Microsoft의 공식 라이브러리로, 저는 많이 사용해보지 못했습니다.
## OPSEC
- Rust가 좋은 장점을 가지고 있음에도 불구하고, 익숙해지기가 상당히 어렵고 직관적이지 않습니다.
- LLVM으로 인해 셸코드 생성도 또 다른 문제입니다. 이 문제를 해결할 몇 가지 방법을 찾았습니다.
[Donut](https://github.com/TheWover/donut)은 때때로 작동하는 셸코드를 생성하지만, 프로젝트가 어떻게 만들어졌는지에 따라 작동하지 않을 수도 있습니다.
일반적으로 셸코드 생성을 위해 만들어진 도구는 모든 코드를 .text 세그먼트에 호스팅하도록 제작되어야 하며,
이는 이 놀라운 [리포지토리](https://github.com/b1tg/rust-windows-shellcode)로 이어집니다.
이 프로젝트에는 성공적인 셸코드 생성을 위해 코드를 구조화하는 방법을 보여주는 셸코드 샘플이 있습니다.
또한 이 프로젝트에는 바이너리의 .text 세그먼트를 가져와 일부 패치를 실행한 후 셸코드를 덤프하는 셸코드 생성기도 있습니다.
이 프로젝트는 특정 위치에서 바이너리를 가져오므로, 바이너리 경로를 인수로 받는 포크를 만들었습니다 [여기](https://github.com/trickster0/rust-windows-shellcode-custom).
- 모든 디버그 심볼을 제거하더라도 Rust는 여전히 바이너리에 홈 디렉토리 참조를 유지할 수 있습니다. 이를 제거하기 위해 찾은 유일한 방법은 다음 플래그를 전달하는 것입니다: `--remap-path-prefix {홈 디렉토리}={임의 식별자}`. bash 변수를 사용하여 홈 디렉토리를 가져오고 무작위 자리 표시자를 생성할 수 있습니다: `--remap-path-prefix "$HOME"="$RANDOM"`. ([Yamakadi](https://github.com/yamakadi) 제공)
- 위 사항에 대해 홈 디렉토리 정보를 제거하는 또 다른 방법은 Cargo.toml 상단에 다음을 추가하는 것입니다:
`cargo-features = ["strip"]` .
Rust는 기본적으로 바이너리에 많은 것을 문자열로 남겨두기 때문에, 저는 주로 이 [cargo.toml](../master/cargo.toml)을 사용하여 이를 방지하고 크기도 줄입니다.
빌드 명령은 다음과 같습니다:
`cargo build --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target x86_64-pc-windows-msvc`
- [Yamakadi]는 또한 가져온 라이브러리에 따라 스트리핑이 홈 디렉토리를 숨기는 데 항상 일관적이지 않다고 지적했습니다. 따라서 그의 경로 재매핑 솔루션과 위의 cargo를 조합하여 사용하는 것이 가장 좋습니다. 잠재적으로 제대로 스트립되지 않은 문자열이 있는지, 작업에 실행하기 전에 바이너리를 확인하고 주의하십시오.
## Rust로 만든 다른 프로젝트들
- [UDPlant](https://github.com/trickster0/UDPlant) - 기본적으로 UDP 리버스 셸
- [EDR Detector](https://github.com/trickster0/EDR_Detector) - 설치된 .sys 파일에 따라 시스템의 EDR을 감지합니다.
- [Lenum](https://github.com/trickster0/Lenum) - 간단한 유닉스 열거 도구
## 도움이 될 수 있는 Rust 프로젝트
- [houdini](https://github.com/yamakadi/houdini) - 실행 파일이 자체 삭제되도록 도와줍니다.
| 파일 | 설명 |
|---|
| Allocate_With_Syscalls | ntapi 라이브러리를 사용하여 NTDLL 함수를 직접 호출합니다. |
| Create_DLL | DLL을 만들고 메시지 상자를 띄웁니다. Rust가 이를 완전히 지원하지는 않으므로, Rust DLL에는 main 함수가 없어 약간 문제가 생길 수 있습니다. |
| DeviceIoControl | 드라이버 핸들을 열고 DeviceIoControl을 실행합니다. |
| EnableDebugPrivileges | 현재 프로세스에서 SeDebugPrivilege를 활성화합니다. |
| Shellcode_Local_inject | 포인터를 캐스팅하여 로컬 프로세스에서 직접 셸코드를 실행합니다. |
| Execute_With_CMD | Rust를 통해 명령어를 전달하여 cmd를 실행합니다. |
| ImportedFunctionCall | dbghelp에서 minidump를 가져와 실행합니다. |
| Kernel_Driver_Exploit | 간단한 버퍼 오버플로우를 위한 커널 드라이버 익스플로잇입니다. |
| Named_Pipe_Client | 명명된 파이프 클라이언트입니다. |
| Named_Pipe_Server | 명명된 파이프 서버입니다. |
| PEB_Walk | Windows API를 동적으로 해석하고 호출합니다. |
| Process_Injection_CreateThread | CreateThread로 실행 중인 프로세스에 프로세스 인젝션을 수행합니다. |
| Process_Injection_CreateRemoteThread | CreateRemoteThread로 원격 프로세스에 프로세스 인젝션을 수행합니다. |
| Process_Injection_Self_EnumSystemGeoID | EnumSystemsGeoID API 호출을 사용하여 셸코드를 실행하는 셀프 인젝터입니다. |
| Unhooking | 후킹 해제 호출입니다. |
| asm_syscall | 어셈블리를 통해 PEB 주소를 획득합니다. |
| base64_system_enum | Base64 인코딩/디코딩 문자열입니다. |
| http-https-requests | 인증서 검사를 무시하고 GET/POST를 위한 HTTP/S 요청입니다. |
| patch_etw | ETW 패치입니다. |
| ppid_spoof | 생성된 프로세스의 부모 프로세스를 스푸핑합니다. |
| tcp_ssl_client | 인증서 검사를 무시하는 SSL을 사용한 TCP 클라이언트입니다. (컴파일을 위해 openssl과 perl 설치 필요) |
| tcp_ssl_server | 포트 매개변수가 있는 TCP 서버입니다. (컴파일을 위해 openssl과 perl 설치 필요) |
| wmi_execute | 호스트의 AV/EDR을 얻기 위해 WMI 쿼리를 실행합니다. |
| Windows.h+ Bindings | 이 파일은 Windows.h 구조체와 Microsoft에서 공식적으로 문서화되지 않은 완전한 맞춤형 LDR, PEB 등을 포함합니다. 파일 상단에 include!("../bindings.rs");를 추가하십시오. |
| UUID_Shellcode_Execution | UUID 배열에서 힙 공간으로 셸코드를 심고 EnumSystemLocalesA 콜백을 사용하여 셸코드를 실행합니다. |
| AMSI Bypass | 로컬 프로세스에서 AMSI 우회 |
| Injection_AES_Loader | AES 복호화와 함께 NtTestAlert 인젝션 |
| Litcrypt_String_Encryption | Litcrypt 크레이트를 사용하여 리터럴 문자열을 저장 및 메모리에서 암호화하여 정적 AV를 차단합니다. |
| Api Hooking | detour 라이브러리를 사용한 API 후킹 |
| memfd_create | memfd_create 기법을 사용하여 메모리에서 페이로드 실행 (Linux용) |
| RC4_Encryption | RC4 복호화된 셸코드 |
| Steal Token | 프로세스에서 토큰 탈취 |
| Keyboard Hooking | SetWindowsHookEx로 키보드 후킹을 통한 키로깅 |
| memN0ps arsenal: shellcode_runner_classic-rs | ntapi를 사용한 클래식 셸코드 실행기/인젝터 |
| memN0ps arsenal: dll_injector_classic-rs | windows-sys를 사용한 클래식 DLL 인젝션 |
| memN0ps arsenal: module_stomping-rs | windows-sys를 사용한 모듈 스톰핑 / 모듈 오버로딩 / DLL 할로잉 |
| memN0ps arsenal: obfuscate_shellcode-rs | 간단한 셸코드 XOR 및 AES 난독화 도구 |
| memN0ps arsenal: process_hollowing-rs | ntapi를 사용한 프로세스 할로잉 |
| memN0ps arsenal: rdi-rs | windows-sys를 사용한 리플렉티브 DLL 인젝션 |
| memN0ps: eagle-rs | Rusty Rootkit: winapi 및 ntapi를 사용한 Red Teamer용 Windows 커널 드라이버 (Rust) |
| memN0ps: psyscalls-rs | winapi를 사용한 Rusty 병렬 시스템 콜 라이브러리 |
| memN0ps: mmapper-rs | winapi를 사용한 Rusty 수동 매퍼 |
| memN0ps: srdi-rs | windows-sys를 사용한 Rusty 셸코드 리플렉티브 DLL 인젝션 |
| memN0ps: mordor-rs - freshycalls_syswhispers | windows-sys를 사용한 Rusty FreshyCalls / SysWhispers1 / SysWhispers2 / SysWhispers3 라이브러리 |
| memN0ps: mordor-rs - hells_halos_tartarus_gate | windows-sys를 사용한 Rusty Hell's Gate / Halo's Gate / Tartarus' Gate 라이브러리 |
| memN0ps: pemadness-rs | windows-sys를 사용한 Rusty Portable Executable 파싱 라이브러리 (PE 파싱 라이브러리) |
| memN0ps: mimiRust | @ThottySploit가 Rust로 만든 Mimikatz. 원저자가 GitHub 계정을 삭제하여 커뮤니티 사용을 위해 업로드되었습니다. |
| memN0ps and trickster0: ekko-rs | Rusty Ekko - windows-sys를 사용한 Rust의 Sleep 난독화. |