.NET内网实战:反射实现Rundll32绕过防护

news/2025/1/15 17:18:20/

01阅读须知

此文所节选自小报童《.NET 内网实战攻防》专栏,主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧。

02基本介绍

本文内容部分节选自小报童《.NET 通过反射技术实现Rundll32功能绕过安全防护》,目前已有280+位朋友抢先预定,我们会长期更新!

03原理分析

在攻防对抗中,攻击者常利用 .NET 提供的反射技术,通过动态加载外部 DLL 并调用其中的任意方法,实现灵活且隐蔽的恶意代码执行。这种技术无需提前绑定目标代码,能够有效规避静态检测,同时模仿类似 rundll32.exe 的行为,进一步提高攻击链的隐匿性。比如通过加载 Sharp4Library.dll 的组件并动态调用其方法,攻击者可以轻松实现任意指令执行,为渗透测试和实际攻击提供强大的支持。

3.1 rundll32

rundll32.exe 是一个位于 Windows 系统 C:\Windows\System32 目录中的可执行文件。主要功能是通过加载C或C++编译的动态链接库中指定的函数来执行某些特定任务。在实际使用中, 以下是 rundll32.exe 基本的用法:

rundll32.exe <DLL路径>,<函数名> [参数]

比如,调用 Shell32.dll 中的 Control_RunDLL 函数打开 Windows控制面板,具体命令如下所示。

rundll32.exe shell32.dll,Control_RunDLL desk.cpl

因此,系统管理员可以通过 rundll32.exe 在脚本中执行系统相关任务,如批量管理控制面板功能。

图片

3.2 .NET反射技术

反射是 .NET 提供的一种强大功能,可以在运行时动态获取类型信息(类、方法、属性、字段等),并进行实例化、调用方法或修改字段值。.NET 中反射的核心类都位于 System.Reflection 命名空间。

.NET反射一般有以下几个步骤,首先通过 Assembly 类加载程序集,通常需要提供一个绝对的物理路径,并且使用LoadFrom或者LoadFile载入,具体代码如下所示。

using System.Reflection;
Assembly assembly = Assembly.LoadFrom("Sharp4Library.dll");
Assembly assembly = Assembly.LoadFile(@"C:\Path\To\Sharp4Library.dll");

接着,通过GetMethod、Invoke 方法进行调用,代码如下所示

MethodInfo method = type.GetMethod("Run");
method.Invoke(null, new object[] { arg1, arg2 });
object result = method.Invoke(instance, new object[] { arg1, arg2 });

3.3 实现rundll32功能

通过 .NET 的反射机制,主要实现动态加载指定路径的 DLL 文件,调用 DLL 中的指定命名空间、类和方法,并传递自定义参数,实现复杂的功能调用,具体代码如下所示。

using System;
using System.IO;
using System.Linq;
using System.Reflection;class Program
{public static void Main(string[] args){string fullPath = args[0];string namespaceName = args[1];string className = args[2];string methodName = args[3];string[] methodArgs = args.Length > 4 ? args.Skip(4).ToArray() : new string[0];StdLoad(fullPath, namespaceName, className, methodName, methodArgs);}
}

上述代码中,通过从加载的 Assembly 对象中提取所有类型的命名空间,并去重后转换为数组 var namespaces。接着,再利用反射机制调用指定类型的指定方法。

图片

通过以下命令调用上述 DLL 的功能, 执行后将弹出计算器,具体命令如下所示

 Sharp4Rundll32.exe Sharp4Library.dll Sharp4Library Class1 Run cmd.exe /c calc

图片

综上,通过 .NET 的 Assembly.LoadFile 和反射机制,可以实现动态加载和调用 DLL 的功能。这种技术不仅能够满足动态扩展和模块化开发的需求,还能在特定场景下替代 rundll32.exe 的功能。

04.NET 电子报刊

我们的小报童电子报刊【.NET内网安全攻防】也开始运营,引入小报童也是为了弥补知识星球对于轻量级阅读支持的不足,为用户读者提供更佳的阅读体验。如果您对阅读体验的需求比较高,那么可以订阅这个专栏。

本次电子报刊《.NET 内网安全攻防》专栏,内容主要有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,可细分为以下8个方向。

1) .NET 安全防御绕过
2) .NET 本地权限提升
3) .NET 内网信息收集
4) .NET 内网代理通道
5) .NET 内网横向移动
6) .NET 目标权限维持
7) .NET 数据传输外发
8) .NET 目标痕迹清理

原价899,现在限时只需59元,永久买断!目前已有280+位朋友抢先预定,我们会长期更新,初步计划保持每周更新1-2篇新内容,对.NET内网安全的朋友们请尽快订阅该报刊!

图片

 想要了解完整或者更多的内网安全方向的文章,可以移步订阅小报童《.NET 内网实战攻防》电子报刊,报刊地址:小报童 


http://www.ppmy.cn/news/1563376.html

相关文章

matlab使用 BP 神经网络进行数据预测的完整流程,包括数据读取、数据预处理等等

%% 初始化程序 warning off % 关闭报警信息 close all % 关闭所有图窗 clear % 清空变量 clc % 清空命令行 setdemorandstream(172) %设置随机种子为1%% 读取数据 data xlsread(Y.xlsx); %% 划分训练集…

前端网页开发学习(HTML+CSS+JS)有这一篇就够!

目录 HTML教程 ▐ 概述 ▐ 基础语法 ▐ 文本标签 ▐ 列表标签 ▐ 表格标签 ▐ 表单标签 CSS教程 ▐ 概述 ▐ 基础语法 ▐ 选择器 ▐ 修饰文本 ▐ 修饰背景 ▐ 透明度 ▐ 伪类 ▐ 盒子模型 ▐ 浮动 ▐ 定位 JavaScript教程 ▐ 概述 ▐ 基础语法 ▐ 函数 …

Java配置log4j日志打印

1. 引入依赖 <dependencies><!-- Log4j 2依赖 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>1.2.14</version> <!-- 可以根据需要修改版本 --></…

[大模型]本地离线运行openwebui+ollama容器化部署

本地离线运行Openweb-ui ollama容器化部署 说明安装internet操作内网操作 问题线程启动错误最终命令 总结 说明 最近公司有一个在内网部署一个离线大模型的需求&#xff0c;网络是离线状态&#xff0c;服务器有A100GPU&#xff0c;一开始是想折腾开源chatGML4大模型&#xff0…

Trimble自动化激光监测支持历史遗产实现可持续发展【沪敖3D】

故事桥&#xff08;Story Bridge&#xff09;位于澳大利亚布里斯班&#xff0c;建造于1940年&#xff0c;全长777米&#xff0c;横跨布里斯班河&#xff0c;可载汽车、自行车和行人往返于布里斯班的北部和南部郊区。故事桥是澳大利亚最长的悬臂桥&#xff0c;是全世界两座手工建…

SpringBoot 基础学习

对于SpringBoot的了解&#xff0c;在初学者的角度看来&#xff0c;它是一种工具&#xff0c;用于简化一个Spring项目的初始搭建和开发过程。 1 入门案例 1.1 项目的创建 有四种方法创建&#xff0c;可以通过idea快捷创建&#xff0c;Spring的官网创建&#xff0c;阿里云创建&am…

在 Rider 中使用 C# 创建 Windows 窗体应用 Winforms

1&#xff0c;创建项目 new solution 创建一个解决方案 2&#xff0c;打开设计器 在 Form1.cs 上右键打开设计器 认识一下 Rider 的界面 参考微软官方的例子&#xff0c;添加如下属性&#xff1a;注&#xff1a;这里 Listbox 的大小设置成 120, 94 失败&#xff0c;默认的是 12…

PySpark用sort-merge join解决数据倾斜的完整案例

假设有两个大表 table1 和 table2 &#xff0c;并通过 sort-merge join 来解决可能的数据倾斜问题。 from pyspark.sql import SparkSession from pyspark.sql.functions import col# 初始化SparkSession spark SparkSession.builder.appName("SortMergeJoinExample&quo…