?

Sep 03 2016

Hack Redis via Python urllib HTTP Header Injection

首頁 » 漏洞收集 » Hack Redis via Python urllib HTTP Header Injection   

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公鑰(需要清空緩存數據) 

1.jpg

 

2、通過寫計劃任務來反彈shell(不需要清空緩存數據) 2.jpg


0x02 Attack Redis


通過在服務器上直接執行redis命令和通過跨協議來操作redis有些許不同,下面開始進行測試,python測試腳本代碼如下,保存為urllibi.py文件:

3.jpg

 

 

測試一下通過http頭注入來向redis寫入普通的文本: 

 

17.jpg

 

 

從運行結果可以看出相當于執行了set a aaa的redis命令:


4.jpg

通常在實際測試時,要求不能清空服務器的緩存數據,所以此處使用寫計劃任務來反彈shell,在利用過程中會遇到沒法寫入空格的問題,而寫入crontab的字符串又必須要有空格
嘗試set a 11%2011:

5.jpg

 

嘗試set a "11%2011",set a '11%2011':

6.jpg

 

無論是編碼空格為%20還是兩端加單雙引號,發現都不會成功。


解決辦法:通過Redis的通訊協議來突破空格的限制:
首先Redis是以行來劃分,每行以\r\n行結束。每一行都有一個消息頭:

8.jpg

下面來試一下如何執行set a “like you”:

9.jpg

轉換為實際的每個字節的形式字符串為:

10.jpg

 

從執行結果可以看出,空格成功插入:

11.jpg

 

接下來嘗試將計劃任務的命令字符串寫入redis:

12.jpg

 

這里的\n需要使用%0a才行,不然直接寫\n反斜杠會被過濾掉:

13.jpg

 

 

0x03 POC


將四個步驟合為一個url搞定: 

14.jpg

 

執行效果如下:

15.jpg

 

在192.168.53.1上監聽12345端口,shell就這樣彈了過來:16.jpg

 

 


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 


 

如果您喜歡本博客,歡迎點擊圖片定訂閱到郵箱填寫您的郵件地址,訂閱我們的精彩內容:

正文部分到此結束

文章標簽: python urllib HTTP

版權聲明:若無特殊注明,本文皆為( mOon )原創,轉載請保留文章出處。

也許喜歡: «Squid遠程拒絕服務漏洞分析 | phpMyAdmin SQL注入漏洞(CVE-2016-5703)分析»

你腫么看?

你還可以輸入 250/250 個字

? 微笑 大笑 拽 大哭 親親 流汗 噴血 奸笑 囧 不爽 暈 示愛 害羞 吃驚 驚嘆 愛你 嚇死了 呵呵

評論信息框

這篇文章還沒有收到評論,趕緊來搶沙發吧~

?
?
河北11选5开奖