本篇文章带来的是python低版本的urllib 头部注入,攻击目标为局域网内的Redis,结合着一道CTF实例,演示整个攻击过程
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
主机 | ip | 配置 |
---|---|---|
本机 | 172.17.0.1 | Ubuntu:16.04 |
docker1 | 172.17.0.2 | Ubuntu:16.04 python2.7.6(源码编译) |
docker2 | 172.17.0.4 | centos:6 redis2.4.3 |
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 sys
import urllib2
url = sys.argv[1]
info = urllib2.urlopen(url)
通过发送请求 达到恶意数据被执行
python a.py http://172.17.0.3%0d%0aset%20a%2012345%0d%0a:8888/