.NET 技术 | 调用系统API创建Windows服务

news2024/12/20 23:47:49

01阅读须知

此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他方面

02SCM函数基本介绍

在Windows操作系统中,Services服务是以后台进程的形式运行的,通常以高权限启动并运行。因此,红队经常利用.NET框架,通过创建和管理Windows服务来实现权限维持。

2.1 SCM函数原型

OpenSCManager是Windows API中的一个核心函数,用于打开服务控制管理器 (Service Control Manager, SCM) 数据库。服务控制管理器是Windows操作系统中管理服务的组件。通过这个函数,我们可以获取一个句柄,用于后续操作(如创建、查询、启动或停止服务)。函数原型如下所示。

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);

OpenSCManager函数需要提供三个参数,machineName: 指定目标计算机名称,databaseName: 指定要打开的数据库名称。dwAccess: 指定所需的访问权限,例如SC_MANAGER_CREATE_SERVICE (值为2U),允许创建系统服务,详细的权限说明如下所示。

图片

当成功时,返回一个非零值 (IntPtr),表示服务控制管理器数据库的句柄,如果遇到失败:返回IntPtr.Zero,可以通过调用Marshal.GetLastWin32Error获取详细的错误信息。

2.2 使用SCM函数

以下是一个使用OpenSCManager函数打开本地服务控制管理器并创建服务的完整示例,具体代码如下所示。

using System;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);

    const uint SC_MANAGER_CREATE_SERVICE = 0x2;

    static void Main()
    {
        // 打开服务控制管理器
        IntPtr scmHandle = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE);

        // 检查返回值是否为零
        if (scmHandle == IntPtr.Zero)
        {
            int errorCode = Marshal.GetLastWin32Error();
            Console.WriteLine($"Failed to open SCM. Error Code: {errorCode}");
            return;
        }

        Console.WriteLine("Successfully opened the Service Control Manager.");
        
        // 后续逻辑:创建服务、启动服务等
        // ...
        
        // 记得关闭句柄(如果需要)
    }
}

上述代码,通过P/Invoke调用OpenSCManager函数,打开服务管理器的句柄,OpenSCManager是服务管理的起点,其返回的句柄直接影响后续操作的成功与否。使用时需注意提供正确的权限和参数,避免运行时错误。

03CreateService基本介绍

成功获取SCM句柄后,可以通过调用CreateService函数创建一个新的系统服务,函数的原型如下所示。

[DllImport("Advapi32.dll")]
public static extern IntPtr CreateService(
    IntPtr serviceControlManagerHandle,
    string lpSvcName,
    string lpDisplayName,
    Program.SERVICE_ACCESS dwDesiredAccess,
    uint dwServiceType,
    uint dwStartType,
    uint dwErrorControl,
    string lpPathName,
    string lpLoadOrderGroup,
    IntPtr lpdwTagId,
    string lpDependencies,
    string lpServiceStartName,
    string lpPassword);

通常,创建服务时,需要提供服务的名称、显示名称、启动类型和服务路径等关键信息,详细参数列表如下所示。

图片

以下代码演示如何创建服务,服务创建失败,会返回IntPtr.Zero,需要处理错误,具体代码如下所示。

string serviceName = "MyService";
string serviceDisplayName = "My Custom Service";
string binPath = @"C:\Path\To\YourService.exe";

IntPtr serviceHandle = Program.CreateService(
    scmHandle,
    serviceName,
    serviceDisplayName,
    SERVICE_ACCESS.SERVICE_ALL_ACCESS,
    16U, 
    2U,  
    1U,  
    binPath,
    null,
    IntPtr.Zero,
    null,
    null,
    null);

if (serviceHandle == IntPtr.Zero)
{
    throw new Exception("Failed to create service.");
}

04工具实现

攻击者通过 Sharp4Stay.exe 工具,利用 OpenSCManager 和 CreateService 函数打开服务控制管理器数据库、创建系统服务以及启动服务等这些步骤,实现目标权限维持。

因为图片过长,不便于文章展示,因此通过隐藏部分用法达到缩短图片长度,不便之处请读者朋友们谅解。

05.NET安全星球

dot.Net安全矩阵星球已成为中国.NET安全领域最知名、最活跃的技术知识库之一,从.NET Framework到.NET Core,从Web应用到PC端软件应用,无论您是初学者还是经验丰富的开发人员,都能在这里找到对应的安全指南和最佳实践。

星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。

图片

图片

图片

星球文化始终认为授人以鱼不如授人以渔!加入星球后可以跟星主和嘉宾们一对一提问交流,20+个专题栏目涵盖了点、线、面、体等知识面,助力师傅们快速成长!其中主题包括.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库等等。

图片

    我们倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。

.NET 免杀WebShell
.NET 反序列化漏洞
.NET 安全防御绕过
.NET 内网信息收集
.NET 本地权限提升
.NET 内网横向移动
.NET 目标权限维持
.NET 数据外发传输

这些阶段所涉及的工具集不仅代表了当前.NET安全领域的最前沿技术,更是每一位网络安全爱好者不可或缺的实战利器。

文章涉及的工具已打包,请加/入/后下/载:https://wx.zsxq.com/group/51121224455454

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2262970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024告别培训班 数通、安全、云计算、云服务、存储、软考等1000G资源分享

大类有:软考初级 软考中级 软考高级 华为认证 华三认证: 软考初级: 信息处理技术员 程序员 网络管理员 软考中级: 信息安全工程师 信息系统监理师 信息系统管理工程师 嵌入式系统设计时 数据库系统工程师 电子商务设…

Java设计模式 —— 【结构型模式】适配器模式(类的适配器、对象适配器、接口适配器)详解

文章目录 基本介绍一、类的适配器二、对象适配器三、接口适配器总结 基本介绍 生活中有很多例子: 不同国家的插座接口不同,需要转换器;家用电源220V,手机只接受5V充电,需要转换器;读卡器,拓展…

游泳溺水识别数据集,对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上

游泳溺水识别数据集: 对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上 ,可识别泳池或者水库中是否有人溺水。 数据集分割 训练组98% 9818图片 有效集%…

满足更多业务需求:HZERO平台可视化大屏功能升级

前言 报表平台 报表平台是一款全面的数据可视化和报表生成工具,该平台支持多种数据源类型,包括Oracle、MySQL、HIVE等主流数据库及非关系型数据库,通过标准SQL、脚本SQL、API等多种方式灵活配置数据集,满足复杂数据结构需求。还…

Linux下部署MySQL8.0集群 - 主从复制(一主两从)

目录 一、部署前准备 1、查看系统信息 # 查看系统版本 cat /etc/red* # 查看系统位数 getconf LONG_BIT[rootlocalhost ~]# cat /etc/red* CentOS Linux release 7.5.1804 (Core) [rootlocalhost ~]# getconf LONG_BIT 642、下载对应安装包 进入MySQL官网:https:…

web3跨链桥协议-Nomad

项目介绍 Nomad是一个乐观跨链互操作协议。通过Nomad协议,Dapp能够在不同区块链间发送数据(包括rollups),Dapp通过Nomad的合约和链下的代理对跨链数据、消息进行验证、传输。其安全通过乐观验证机制和欺诈证明制约验证者实现&…

【CSS in Depth 2 精译_080】 13.1:CSS 渐变效果(中)——不同色彩空间的颜色插值算法在 CSS 渐变中的应用

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 13 章 渐变、阴影与混合模式】 ✔️ 13.1 渐变 ✔️ 13.1.1 使用多个颜色节点(上)13.1.2 颜色插值方法(中) ✔️13.1…

讯飞智文丨一键生成WordPPT

在当今数字化办公的浪潮中,Word和PPT已经成为职场人士日常工作的标配工具。然而,面对繁琐的内容编辑和格式调整任务,如何提升效率成了每个人的追求。而讯飞智文,一款结合人工智能技术的文字处理与演示文稿工具,正逐渐成…

Android Studio的笔记--BusyBox相关

BusyBox 相关 BusyBoxandroid上安装busybox和使用示例一、下载二、移动三、安装和设置环境变量四、使用 busybox源码下载和查看 BusyBox BUSYBOX BUSYBOX链接https://busybox.net/ 点击链接后如图 点击左边菜单栏的Get BusyBix中的Download Source 跳转到busybox 的下载源码…

【机器学习】机器学习的基本分类-强化学习(Reinforcement Learning, RL)

强化学习(Reinforcement Learning, RL)是一种基于试错的方法,旨在通过智能体与环境的交互,学习能够最大化累积奖励的策略。以下是强化学习的详细介绍。 强化学习的核心概念 智能体(Agent) 执行动作并与环境…

博世智驾新动力:Apache DolphinScheduler如何征服数据处理挑战

视频及PPT等相关资料:点击查看 讲师介绍 陶超权,博世智驾(中国)后端工程师,负责数据处理和数据调度方面工作,在智能驾驶数据处理领域具有丰富的实践经验。在2024年12月Apache DolphinScheduler社区线上交流…

令牌(token)+加密(加盐)

目录 一,令牌技术 1,不使用session的原因: 2,有两种解决方案: (1)服务器层面的 (2)客户端层面的(JWT令牌) 生成签名: 生成jwt令牌: 验证令牌是否合法: (3)令牌实际运用 二,加密加盐: 进行加密: 进行验证: 一,令牌技术 1,不使用session的原因: 登录页面,用户会将密…

Flask入门:打造简易投票系统

目录 准备工作 创建项目结构 编写HTML模板 编写Flask应用 代码解读 进一步优化 结语 Flask,这个轻量级的Python Web框架,因其简洁和易用性,成为很多开发者入门Web开发的首选。今天,我们就用Flask来做一个简单的投票系统,让你快速上手Web开发,同时理解Flask的核心概…

阿里巴巴前端面试经验

阿里巴巴面经(新零售事业群-CBU技术部) 笔试 /*** 1. 查找落单的数字* 描述:给定一个非空的数字数组,数组有且只有一个非重复项,实现一个方法获取落单项* 示例:* getSingleNumber([1, 2, 1, 2, 0]); // 0* getSingle…

指针的深入讲解

本章重点: 字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数 我们在指针的初阶的时候主要讲了: 1.指针就是变量,用来存放地址,地址唯一标识一块内存空间 2.指针的大小是固定4个…

网络多层的协议详述

网络层 1)地址管理:制定一系列的规则,通过地址,在网络上描述出一个设备的位置 2)路由选择:网络环境比较复杂,从一个节点到另一个节点,存在很多条不同的路径,需要规划出…

Zabbix6.0升级为6.4

为了体验一些新的功能,比如 Webhook 和问题抑制等,升级个小版本。 一、环境信息 1. 版本要求 一定要事先查看官方文档,确认组件要求的版本,否则版本过高或者过低都会出现问题。 2. 升级前后信息 环境升级前升级后操作系统CentOS…

UML复习题

用例与用户的4种关系对象图和类图有什么关系:对象图是类图某一时刻的快照组件图,体现的是静态图部署图,涉及到硬件的结点,实线链接 以上都是静态图 时序图,消息先后协作图 ,谁和谁交互,对象之间的交互某一…

【MFC】多工具栏如何保存状态

MFC中的工具栏本来只有一个,如果想增加几个工具栏是比较简单,但现在一个重要的问题是,状态无法保存,导致每次打开,工具栏就会出现问题,要么偏移位置要么显示不出。 经过研究,发现是MFC框架中的…

Buck开关电源闭环控制的仿真研究15V/5V[Matlab/simulink源码+Word文档]

课题设计要求 ⑴输入直流电压(VIN):15V ⑵输出电压(VO):5.0V ⑶负载电阻:R2欧 ⑷输出电压纹波峰-峰值 Vpp≤50mV ,电感电流脉动:输出电流的10% ⑸开关频率(fs):100kHz ⑹BUCK主电路二极管的通态压降VD0.5V…