ZZ0R0/Stardust-POC
GitHub: ZZ0R0/Stardust-POC
基于 Stardust 方法论的概念验证项目,探索用 C 语言编写位置无关代码并编译为 shellcode,通过自定义函数解析器动态加载外部库。
Stars: 0 | Forks: 0
# Stardust-POC
一个探索 **[Stardust](https://5pider.net/blog/2024/01/27/modern-shellcode-implant-design/)** 方法的概念验证——使用 C 语言编写位置无关代码,并将其编译为干净的 shellcode。
在这里,我构建了一个函数解析器,用于连接 `STARDUST_INSTANCE` 并从外部库中引入函数(例如:使用 OpenSSL 的 `libcrypto` 实现一个小型 AES 例程)。
[]()
[]()
[]()
[](LICENSE)
我实现了一个解析器,它将设置 STARDUST_INSTANCE 以从外部库加载所有函数。
以 OpenSSL 的 libcrypto 实现简单 AES 为例:
```
#include
#include
#include
#pragma comment(lib, "libcrypto.lib") // Only libcrypto is needed for AES operations
FUNC VOID Import()
{
STARDUST_INSTANCE
// resolve kernel32.dll related functions
if ((Instance()->Modules.Kernel32 = LdrModulePeb(H_MODULE_KERNEL32)))
{
if (!(Instance()->Win32.LoadLibraryW = LdrFunction(Instance()->Modules.Kernel32, HASH_STR("LoadLibraryW"))))
{
return;
}
}
// Function to hash a string
if ((Instance()->Modules.User32 = Instance()->Win32.LoadLibraryW(L"User32")))
{
if (!(Instance()->Win32.MessageBoxA = LdrFunction(Instance()->Modules.User32, HASH_STR("MessageBoxA"))))
{
return;
}
}
// Loading AES related functions from libcrypto
if ((Instance()->Modules.libcrypto = Instance()->Win32.LoadLibraryW(L"libcrypto")))
{
if (!(Instance()->Win32.AES_set_encrypt_key = LdrFunction(Instance()->Modules.libcrypto, HASH_STR("AES_set_encrypt_key"))) ||
!(Instance()->Win32.AES_set_decrypt_key = LdrFunction(Instance()->Modules.libcrypto, HASH_STR("AES_set_decrypt_key"))) ||
!(Instance()->Win32.AES_cbc_encrypt = LdrFunction(Instance()->Modules.libcrypto, HASH_STR("AES_cbc_encrypt"))) ||
!(Instance()->Win32.RAND_bytes = LdrFunction(Instance()->Modules.libcrypto, HASH_STR("RAND_bytes"))))
{
return; // Handle function loading failure
}
}
}
```
一旦函数在实例内部被解析,我们就可以在相关文件中使用实例标识符调用它们:
```
#include "aes.h"
#include
#include
#include
#include
#include
// Function to generate a random AES key and IV
FUNC bool generateAESKey(unsigned char *key, unsigned char *iv)
{
STARDUST_INSTANCE
if (!Instance()->Win32.RAND_bytes(key, AES_BLOCK_SIZE) || !Instance()->Win32.RAND_bytes(iv, AES_BLOCK_SIZE))
{
return false; // Failed to generate random bytes
}
return true;
}
// Function to encrypt a message using AES
FUNC std::string encryptMessage(const std::string &message, const unsigned char *key, const unsigned char *iv)
{
STARDUST_INSTANCE
AES_KEY encryptKey;
Instance()->Win32.AES_set_encrypt_key(key, 128, &encryptKey);
// Padding to ensure block size compatibility
std::string paddedMessage = message;
while (paddedMessage.size() % AES_BLOCK_SIZE != 0)
{
paddedMessage += ' ';
}
std::vector encryptedMessage(paddedMessage.size());
for (size_t i = 0; i < paddedMessage.size(); i += AES_BLOCK_SIZE)
{
Instance()->Win32.AES_cbc_encrypt(reinterpret_cast(&paddedMessage[i]),
&encryptedMessage[i], AES_BLOCK_SIZE, &encryptKey, const_cast(iv), AES_ENCRYPT);
}
return std::string(encryptedMessage.begin(), encryptedMessage.end());
}
// Function to decrypt a message using AES
FUNC std::string decryptMessage(const std::string &encryptedMessage, const unsigned char *key, const unsigned char *iv)
{
STARDUST_INSTANCE
AES_KEY decryptKey;
Instance()->Win32.AES_set_decrypt_key(key, 128, &decryptKey);
std::vector decryptedMessage(encryptedMessage.size());
for (size_t i = 0; i < encryptedMessage.size(); i += AES_BLOCK_SIZE)
{
Instance()->Win32.AES_cbc_encrypt(reinterpret_cast(&encryptedMessage[i]),
&decryptedMessage[i], AES_BLOCK_SIZE, &decryptKey, const_cast(iv), AES_DECRYPT);
}
// Remove padding
std::string result = std::string(decryptedMessage.begin(), decryptedMessage.end());
result.erase(result.find_last_not_of(" ") + 1); // Trim spaces from padding
return result;
}
```
目前我还没有实现该框架的大部分逻辑。
例如,我不知道如何将外部库的类型(例如 "AES_KEY")加载到实例中。
我也不确定是否可以在不经过实例的情况下调用项目的函数。
最后但同样重要的是,我不知道能否在 stardust 框架中使用外部的 cpp ...
大部分工作仍有待完成!
原文 [博客文章](https://5pider.net/blog/2024/01/27/modern-shellcode-implant-design/) 由 C5pider 发布。
标签:AES, DNS 反向解析, Fail2ban, libcrypto, OpenSSL, PEB解析, PIC, PoC, Raspberry Pi, Shellcode, 中高交互蜜罐, 位置无关代码, 内存执行, 函数解析器, 加密算法, 动态API解析, 安全测试工具, 客户端加密, 快速连接, 恶意软件开发, 技术调研, 攻击载荷, 数据展示, 暴力破解, 概念验证, 汇编语言, 端点可见性, 红队, 红队基础设施, 网络安全, 自动回退, 远程线程注入, 隐私保护