记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

使用NETSHELL执行恶意DLLs实现主机持久化控制

2016-09-28 21:05

前言

同样是一个无聊空虚的夜晚看到一篇国外的文章 USING NETSHELL TO EXECUTE EVIL DLLS AND PERSIST ON A HOST….

Each Netsh helper DLL provides an extensive set of features called a context, which is a group of commands specific to a networking component

简单的说,就是你可以加载一个dll,作为netsh的扩展,从而实现主机持久化控制。

加载DLL

我在电脑面前打开cmd,进入netsh并输入“?”接下来我们,看到的是一串长长的列表:

1

在这串列表中,其中“add”这个命令引起了我的注意,这个“add”可以增加什么呢?我再继续输入“add”:

2

此处输出了“安装一个帮助者DLL”,嗯?安装DLL?

感觉这里会有点什么东西。

我去找了一个DLL文件,这个文件运行之后可以弹出计算器,是不是安装上这个东西就能够弹出计算器呢?

3

但是,很遗憾,并没有成功,这里提示在需要安装的DLL文件中没有找到“inithelperdll”这个功能。

inithelperdll

what inithelperdll?

我们在msdn中找到了答案:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms708327(v=vs.85).aspx

4

本人的英语水平就像我的光速QA水平一样差,翻译出来的东西大概是这个意思:

该inithelperdll功能被netshell调用的时候执行一个辅助的初始加载。

这个所谓的“辅助”又是什么呢,还是在msdn这里找到了答案:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms708347(v=vs.85).aspx

5

DWORD WINAPI InitHelperDll(
 _In_ DWORD dwNetshVersion,
 PVOID pReserved
);


Parameters
 dwNetshVersion [in]
 The dwNetshVersionion of NetShell.

pReserved
 Reserved for future use.

这里解释:NetShell的辅助是一个提供了上下文功能的DLL文件,附加的辅助扩展了NetShell的网络任务管理脚本扩展功能,该辅助文件通常为网络服务、工具或协议提供了配置支持、监听支持的功能。(请再次忽略我的翻译水准…)

到这里,我向大表哥伸出了求助之手,作为一个样样都精通的蓝人,在几分钟之后,我们就有了这样的一个poc:

dllDemo.cpp:

// dllDemo.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "dllHead.h"
#include "Netsh.h"
#include <iostream>
using namespace std;

BOOL APIENTRY DllMain(HMODULE hModule,
 DWORD ul_reason_for_call,
 LPVOID lpReserved
 )
{
 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
 cout << "DLL_PROCESS_ATTACH" << endl;
 break;
 case DLL_THREAD_ATTACH:
 cout << "DLL_THREAD_ATTACH" << endl;
 break;
 case DLL_PROCESS_DETACH:
 cout << "DLL_PROCESS_DETACH" << endl;
 break;
 case DLL_THREAD_DETACH:
 cout << "DLL_THREAD_DETACH" << endl;
 break;
 }
 return TRUE;
}


DWORD WINAPI InitHelperDll(
DWORD dwNetshVersion,
PVOID pReserved
)
{


 WinExec("calc.exe", SW_SHOW);

return NO_ERROR;
}

SHIT?代码里的尖括号怎么被wordpress转义了。好吧

详细的代码如图:

9

dllHead.h:

#ifdef CALC_EXPORTS
#define CALC_EXPORT _declspec( dllexport )
#else
#define CALC_EXPORT _declspec(dllimport)
#endif

extern "C" CALC_EXPORT DWORD WINAPI InitHelperDll(DWORD dwNetshVersion, PVOID pReserved);

还有个其他安全研究员公布的POC:https://github.com/outflankbv/NetshHelperBeacon

然后编译成x64(注:netsh是x64)

6-1

thumbnail-300x300

到这里,添加成功。然后安装成功之后应该怎么做呢?好像没有什么不妥,然后我想重新打开netsh去删除了之前添加的poc,奇迹出现了:

6-2

From Admin To System?

当我们再次进入netsh的时候,之前嵌入的poc被执行,这是不是说明了并不像红蓝buff是暂时性的,而是永久的?这个问题纠结了好久

然后原文作者继续翻msdn,看到有这样一段话:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms708320(v=vs.85).aspx

Helpers are DLL files that implement a NetShell context and zero or more of its subcontexts, and are registered with Windows through the system registry.

在座的各位,请注意上面提到的一句话“registered with Windows through the system registry”,

through the system registry

through the system registry

through the system registry

through the system registry

through the system registry

重要的事情多说几遍。

好,那我们打开注册表看一下是不是真的像上面所说的已经注册在Windows里面:

 

7

这个入口是在HKEK_LOCAL_MACHINE\SOFTWARE\Microsoft\Netsh,但其他所有的DLL文件都位于系统文件夹中,这并不是执行自定义DLL文件的前提,它会从任何地方运行。我的建议是将这个东西放到一个任何用户都能执行得到的地方,比如:system或者AppData。执行这一步的时候需要管理员权限。

唯一的提醒是在执行嵌入的DLL文件时需要先执行netsh.exe,netsh在默认的情况下是不自动启动的,但是可以将其设置为计划任务让它启动服务。 powershell、runonce等都是常见的方法。

其实并不是说任意账户下都能提到SYSTEM,除非遇到权限划分很细的系统,否则非Admin用户是不能直接操作注册表的.

原作者给出了几种实际的利用方案:

  • 计划任务
  • 添加服务
  • ……

人品爆炸的时候目标恰好用vpn啊,powershell啊来invoke netsh.并给出一张理想状态的图:

8

任何用户的自动运行的默认视图都不会出现与之相关的信息:

10

你需要取消选中“隐藏的Windows条目”选项才能看到它:

11

PS:能不能过杀软请自行测试。

至于Powershell添加计划任务被360拦截嘛。我猜测是监控进程的调用序列,这不难绕过,可以测试下远程线程注入来绕过

防范

至于对这个东西的防守呢,可以使用一些实时监测进程的工具,如:sysmon,可以通过这个工具查找netsh.exe的任何子进程:

12

除此之外,还有其他的方法对这种攻击进行监测:

  • 对HKLM\SOFTWARE\MICROSOFT\NETSH中的任何新条目进行扫描
  • 对通过cmd、powershell、注册表或WMI做出的系统改变做出检查
  • DLL白名单

未经允许不得转载: » 使用NETSHELL执行恶意DLLs实现主机持久化控制

知识来源: www.mottoin.com/89905.html
想收藏或者和大家分享这篇好文章→复制链接地址

“使用NETSHELL执行恶意DLLs实现主机持久化控制”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云