Hack Redis via Python urllib HTTP Header Injection

  • A+
所属分类:moonsec_com
摘要

在今年6月BLINDSPOT披露了Python urllib http头注入漏洞:http://blog.blindspotsecurity.com/2016/06/advisory-http-header-injection -in.html
通过这个漏洞,如果使用了Python的urllib 库,并且请求的url为用户可控,那么就可能存在内网被探测的风险,如果本机或内网服务器中装有未授权访问的redis,那么服务器则有被getshell的风险。

本文主要讲述通过Python urllib http头注入 来实现对内网未授权redis服务进行getshell 的实践。

0x00 Introduction

在今年6月BLINDSPOT披露了Python urllib http头注入漏洞:http://blog.blindspotsecurity.com/2016/06/advisory-http-header-injection-in.html
通过这个漏洞,如果使用了Python的urllib库,并且请求的url为用户可控,那么就可能存在内网被探测的风险,如果本机或内网服务器中装有未授权访问的redis,那么服务器则有被getshell的风险。

本文主要讲述通过Python urllib http头注入来实现对内网未授权redis服务进行getshell的实践。

0x01 Redis Vulnerability

首先介绍一下之前外界已经公布通过未授权访问的redis获取服务器shell的两种方式:
1、 写入ssh公钥(需要清空缓存数据) 

Hack Redis via Python urllib HTTP Header Injection

 

2、通过写计划任务来反弹shell(不需要清空缓存数据) Hack Redis via Python urllib HTTP Header Injection

0x02 Attack Redis


通过在服务器上直接执行redis命令和通过跨协议来操作redis有些许不同,下面开始进行测试,python测试脚本代码如下,保存为urllibi.py文件:

Hack Redis via Python urllib HTTP Header Injection

 

 

测试一下通过http头注入来向redis写入普通的文本: 

 

Hack Redis via Python urllib HTTP Header Injection

 

 

从运行结果可以看出相当于执行了set a aaa的redis命令:

Hack Redis via Python urllib HTTP Header Injection

通常在实际测试时,要求不能清空服务器的缓存数据,所以此处使用写计划任务来反弹shell,在利用过程中会遇到没法写入空格的问题,而写入crontab的字符串又必须要有空格
尝试set a 11%2011:

Hack Redis via Python urllib HTTP Header Injection

 

尝试set a "11%2011",set a '11%2011':

Hack Redis via Python urllib HTTP Header Injection

 

无论是编码空格为%20还是两端加单双引号,发现都不会成功。

解决办法:通过Redis的通讯协议来突破空格的限制:
首先Redis是以行来划分,每行以/r/n行结束。每一行都有一个消息头:

Hack Redis via Python urllib HTTP Header Injection

下面来试一下如何执行set a “like you”:

Hack Redis via Python urllib HTTP Header Injection

转换为实际的每个字节的形式字符串为:

Hack Redis via Python urllib HTTP Header Injection

 

从执行结果可以看出,空格成功插入:

Hack Redis via Python urllib HTTP Header Injection

 

接下来尝试将计划任务的命令字符串写入redis:

Hack Redis via Python urllib HTTP Header Injection

 

这里的/n需要使用%0a才行,不然直接写/n反斜杠会被过滤掉:

Hack Redis via Python urllib HTTP Header Injection

 

 

0x03 POC

将四个步骤合为一个url搞定: 

Hack Redis via Python urllib HTTP Header Injection

 

执行效果如下:

Hack Redis via Python urllib HTTP Header Injection

 

在192.168.53.1上监听12345端口,shell就这样弹了过来:Hack Redis via Python urllib HTTP Header Injection

 

 


0x04 References

http://blog.blindspotsecurity.com/2016/06/advisory-http-header-injection-in.html
http://drops.wooyun.org/papers/16905
http://blog.csdn.net/qqyanchong/article/details/8686685
http://www.freebuf.com/vuls/85188.html
http://zone.wooyun.org/content/23858 

 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: