Orust Mimikatz Bypass Kaspersky

混淆版rust mimikatz bypass卡巴斯基 rust = rust + LLVM orust = rust + OLLVM rust后端使用LLVM, 所以可以使用OLLVM做混淆, 我之前在思考怎样把OLLVM用到rust上, 前几天看到已经有相关文章了, 感谢@ny0c 不过文章中有几处地方可能是作者故意留坑, 我将告知大家正确的流程: 编译LLVM 编译LLVM时, 不要编译动态库, 编译动态库后生成的lib文件后缀将是.dll.a, 导致后续编译rust时缺少库文件, 正确的编译命令如下 cmake -G "Ninja" -S ./llvm-project/llvm -B ./build_dyn_x64 -DCMAKE_INSTALL_PREFIX=./llvm_x64 -DCMAKE_CXX_STANDARD=17 -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;lld;" -DLLVM_TARGETS_TO_BUILD="X86" -DLLVM_INSTALL_UTILS=ON -DLLVM_INCLUDE_TESTS=OFF -DLLVM_BUILD_TESTS=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_BUILD_BENCHMARKS=OFF 这样编译后也无需修改src/bootstrap/compile.rs 自定义toolchain 自定义toolchain时有一些细节没提到, 编译出来的stage1-tools-bin文件夹中cargo.exe, 要放到stage1/bin目录下, 其他文件放到stage1/libexec目录下, 这样才是一个比较完整的toolchain 还有一些细节我想提出来: 打包toolchain的细节 编译好了toolchain, 怎么打包存放或者分发呢? 先按照上面将完整toolchain配置好, 然后复制stage1文件夹出去, 然后删除rust文件夹下的build目录, 再删除stage1/lib/rustlib/src/rust文件, 这个文件是个链接, 随后复制整个rust文件夹到stage1/lib/rustlib/src. 因为stage1目录下引用了rust目录, rust目录下又存在stage1目录, 导致循环引用, 我在使用WinRAR时是无法打包的 编译的库路径问题 大家都知道, rust默认编译后会将一些敏感目录打包进二进制文件, rust的库也存在类似的问题. 一般的解决方案是使用--remap-path-prefix去映射, 但是在编译rust的本身的库的时候, 是无法完全控制的, 为什么说无法完全控制呢?...

April 16, 2023 · b1n

Customized Network Layer Protocol C2

0x9bc2 Raw Socket留下的坑, 自定义网络层协议实现木马通信 实现细节 server和agent都需要高权限运行, 因为使用了原始套接字(raw socket) server使用原始套接字监听监听0x9bIP协议号 agent发送协议号为0x9b的原始IP数据包 我们将使用socket2和etherparsecrate实现核心功能 server核心代码 // 创建0x9b协议号的原始套接字 let sock = Socket::new(Domain::IPV4, Type::RAW, Some(Protocol::from(155)))?; // 创建堆区缓冲区 let mut data = Box::new([MaybeUninit::new(0u8); 65535]); // 接收数据, 并得到agent的SockAddr结构 let (n, agent) = sock.recv_from(&mut *data)?; // 切片数据 let data = &self[..n]; // 创建迭代器, 过滤出所有有效数据, 并收集成Vec<u8> let data: Vec<u8> = data .iter() .filter_map(|r| Some(unsafe { r.assume_init() })) .collect(); // 提取出IPv4协议下的数据 let (_, data) = Ipv4Header::from_slice(data.as_slice())?; agent核心代码 // 创建stdlib net下的SocketAddrV4, 指向服务器IP let server = SocketAddrV4::new("127....

April 1, 2023 · b1n

Aya Basic Tutorial

aya1基础教程 开发环境 安装rust, 并使用nightly版本(nightly版本可选) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup default nightly 在linux x86_64上安装bpf-linker cargo install bpf-linker 如果是其他架构的linux或者macos则需要先安装LLVM15, 然后安装连接器 cargo install --no-default-features --features system-llvm bpf-linker 安装cargo-generate用于生成项目模板 cargo install cargo-generate 安装bpftool用于生成BTF Ubuntu发行版(推荐Ubuntu 20.04 LTS (Focal))使用以下命令安装 sudo apt install linux-tools-$(uname -r) export PATH=/usr/lib/linux-tools/$(uname -r):$PATH 创建项目 使用cargo-generate创建新项目 cargo generate https://github.com/aya-rs/aya-template 输入项目名: do-sys-open 选择eBPF程序类型: kprobe 输入挂载点: do_sys_open 框架分析 创建的新项目应该有以下结构 $ ls Cargo.lock Cargo.toml do-sys-open do-sys-open-common do-sys-open-ebpf README.md xtask do-sys-open: 与项目名同名的是用户态程序, 用于加载eBPF程序...

March 25, 2023 · b1n

Rust Shellcode

I made a repository of Windows Shellcode runners: rust-shellcode. Here are some introductions: rust-shellcode asm create_fiber create_remote_thread create_remote_thread_native create_thread create_thread_native etwp_create_etw_thread nt_queue_apc_thread_ex_local rtl_create_user_thread asm shellcode execute locally. link shellcode to .text section inline asm using asm! macro call shellcode create_fiber shellcode execute locally. convert current thread to fiber using ConvertThreadToFiber alloc memory using VirtualAlloc copy shellcode to allocated memory using std::ptr::copy create a fiber using CreateFiber jump shellcode using SwitchToFiber jump back create_remote_thread shellcode execute remotely....

March 23, 2023 · b1n

Raw Socket

Linux raw socket的总结 介绍相关结构体和常量, 最后实现ICMP接收和响应 创建套接字 int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 创建一个IPV4 ICMP原始套接字(IPV4 ICMP raw socket) AF_INET: 代表IPV4协议 SOCK_RAW: 代表原始套接字 IPPROTO_ICMP: 代表ICMP协议 禁用内核自动附加IP头 int on = 1; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)); 启用IP_HDRINCL选项, 数据包含IP数据头, 发送数据时需要自己构建IP数据头, 内核不再生成 接收数据 char* buf = calloc(1, IPPROTO_MAX); struct sockaddr in; socklen_t in_len = sizeof(in); recvfrom(sock, buf, IPPROTO_MAX, 0, &in, &in_len); 将数据写入buf, 发送方地址将保存在in变量 解析数据段 struct iphdr *ip = (struct iphdr*)buf; struct icmphdr *icmp = (struct icmphdr*)((char*)ip + 4 * ip->ihl); printf("data: %s\n", (char*)icmp + 8); iphdr是ip header的缩写, 表示一个IP数据头结构 IHL(Internet Header Length): IP数据头是不定长的, 所以需要IHL记录IP数据头大小, 以4字节为单位, 所以IP数据头大小等于4 * IHL bytes...

March 8, 2023 · b1n