• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

一文打尽端口复用 VS Haproxy端口复用

其他 Ms08067安全实验室 2748次浏览 0个评论

出品|MS08067实验室(www.ms08067.com)

本文作者:Spark(Ms08067内网安全小组成员)

1.概述

  Haproxy是一个使用c语言开发的高性能负载均衡代理软件,提供tcp和http的应用程序代理,免费、快速且可靠。
  类似frp,使用一个配置文件+一个server就可以运行。

优点:

  • 大型业务领域应用广泛
  • 支持四层代理(传输层)以及七层代理(应用层)
  • 支持acl(访问控制列表),可灵活配置路由
  • windows使用cygwin编译后可运行(可跨平台)

  访问控制列表(Access Control Lists,ACL)是应用在路由器接口的指令列表,这些指令列表用来告诉路由器哪些数据包可以接受,哪些数据包需要拒绝。

2.配置

  官方配置手册:
  https://cbonte.github.io/haproxy-dconv/2.2/configuration.html
  配置文件由全局配置和代理配置组成:

全局配置(global):

  • 定义haproxy进程管理安全及性能相关的参数

代理设定(proxies):

  • defaults
    • 为其他配置段提供默认参数,默认配置参数可由下一个”defaults”重新设定
  • frontend
    • 定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接
  • backend
    • 定义”后端”服务器,前端代理服务器将会把哭护短的请求调度至这些服务器
  • listen
    • 定义监听的套接字和后端的服务器,类似于将frontend和backend段放在一起

示例:

global
defaults
  log global
  mode tcp
  option dontlognull
  timeout connect 5000
  timeout client 50000
  timeout server 50000

frontend main
  mode tcp
  bind *:8888
  option forwardfor except 127.0.0.1
  option forwardfor header X‐Real‐IP

# 配置acl规则
  acl is‐proxy‐now urlp_reg(proxy) ^(http|https|socks5)$
# 分发到对应的backend
  use_backend socks5 if is‐proxy‐now
  use_backend http
backend socks5
  mode tcp
  timeout server 1h
  server ss 127.0.0.1:50000
backend http
  mode tcp
  server http 127.0.0.1:80

  重点关注frontend和backend。
  Frontend中需要编写acl规则,配置转发。比如,当http流量来的时候,转发给web服务;当rdp流量来的时候,转发给rdp服务。
  Backend中需要编写具体的操作,就是转达到哪个目标的哪个端口。

3.思路

(1) 思路一(通用)

  编写acl规则,在四层(传输层)进行负载,根据协议类型进行分发,例如:遇到http流量发送给http服务,遇到rdp发送给rdp服务等。

(2) 思路二

  编写acl规则,在七层(应用层)进行负载,判断应用类型进行分发,例如,遇到http分发到http服务,否则发送到xxx服务。

4.步骤

以思路一为例:

  1. 通过wireshark捕获tpkt(应用层数据传输协议)信息
  2. 编写acl规则路由进行流量分发
  3. 添加后端server
  4. 原始接口接管
  5. 完成

4.1 捕获tpkt

  关于tpkt可百度或查看参考链接
  三次握手后,开始应用层数据传输。
  使用wireshark抓包:
ssh协议:

一文打尽端口复用 VS Haproxy端口复用

  前三个包为三次握手,第四个包的起始三位,便是我们需要的tpkt,例如ssh为535348。
rdp协议:030000

一文打尽端口复用 VS Haproxy端口复用

速查:

协议 TPKT
SSH 535348
RDP 030000
HTTP(GET) 474554
HTTP(POS) 504f53
HTTP(PUT) 505554
HTTP(DEL) 44454c
HTTP(OPT) 4f5054
HTTP(HEA) 484541
HTTP(CON) 434f4e
HTTP(TRA) 545241
HTTPS 160301

4.2 编写acl规则

global
defaults
  timeout connect 5000
  timeout client 50000
  timeout server 50000
frontend main
  mode tcp
  bind *:8888
# 重点:编写acl规则进行转发
  tcp‐request inspect‐delay 3s
  acl is_http req.payload(0,3) ‐m bin 474554 504f53 505554 44454c 4f5054 484541 434f4e 545241
  acl is_ssh req.payload(0,3) ‐m bin 535348
  acl is_rdp req.payload(0,3) ‐m bin 030000
# 设置四层允许通过
  tcp‐request content accept if is_http
  tcp‐request content accept if is_ssh
  tcp‐request content accept if is_rdp
  tcp‐request content accept
# 分发到对应的backend
  use_backend http if is_http
  use_backend ssh if is_ssh
  use_backend rdp if is_rdp
  use_backend socks5
backend socks5
  mode tcp
  timeout server 1h
  server ss 127.0.0.1:50000
backend http
  mode tcp
  server http 127.0.0.1:80
backend ssh
  mode tcp
  server ssh 127.0.0.1:22
backend rdp
  mode tcp
  server rdp 192.168.213.129:3389

  该配置文件的功能是监听8888端口,将http流量(速查表中http协议的8种tpkt)转发到本地的80上,将ssh流量转发到本地的22端口上,将rdp流量转发到另一主机的3389上。

5.实验

  • Target1:Ubuntu 16.04 x64
  • IP:192.168.213.128
  • 开启22端口、80端口

一文打尽端口复用 VS Haproxy端口复用
一文打尽端口复用 VS Haproxy端口复用

  • Target2:Win7 x64
  • IP:192.168.213.129
  • 开启3389端口

一文打尽端口复用 VS Haproxy端口复用

  启动haproxy,-f 指定配置文件,开启8888端口表示启动成功。-d:调试模式,可不加。

一文打尽端口复用 VS Haproxy端口复用

  HTTP协议:访问靶机的8888端口,流量被haproxy分发至本机的80。

一文打尽端口复用 VS Haproxy端口复用

  RDP协议:访问靶机的8888端口,流量被haproxy分发至192.168.213.129的3389。

一文打尽端口复用 VS Haproxy端口复用

  SSH协议:访问靶机的8888端口,流量被haproxy分发至本机的22。

一文打尽端口复用 VS Haproxy端口复用

  haproxy日志:

一文打尽端口复用 VS Haproxy端口复用

6.端口重定向

  为了不影响正常的80端口的访问,将过来的80端口流量转发到8888端口上。这样用户正常访问80端口时,流量会先转发到8888端口上,再由haproxy转发回80端口。

  • Linux:iptables(不需要重启服务)
iptables ‐t nat ‐A PREROUTING ‐i eth0 ‐p tcp ‐‐dport 80 ‐j REDIRECT ‐‐to‐port 8888

  访问80可以正常访问:

一文打尽端口复用 VS Haproxy端口复用

  Haproxy日志有记录,说明流量由80先到8888,再回到80。

一文打尽端口复用 VS Haproxy端口复用

  Windows:netsh(需要重启web服务)

netsh interface portproxy add v4tov4 listenport=80 connectport=8888 connectaddress=127.0.0.1

注意:如果在windows下启用端口重定向,需要在端口启动前添加netsh端口转发规则。

7.参考链接

  • https://www.cnblogs.com/readygood/p/9776403.html
  • https://blog.csdn.net/qq_28710983/article/details/82194404
  • https://wenku.baidu.com/view/9f509844e2bd960591c67723.html?fr=search-1-wk_seaincome

转载请联系作者并注明出处!

Ms08067安全实验室专注于网络安全知识的普及和培训。团队已出版《Web安全攻防:渗透测试实战指南》,《内网安全攻防:渗透测试实战指南》,《Python安全攻防:渗透测试实战指南》,《Java代码安全审计(入门篇)》等书籍。
团队公众号定期分享关于CTF靶场、内网渗透、APT方面技术干货,从零开始、以实战落地为主,致力于做一个实用的干货分享型公众号。
官方网站:https://www.ms08067.com/

扫描下方二维码加入实验室VIP社区
加入后邀请加入内部VIP群,内部微信群永久有效!

一文打尽端口复用 VS Haproxy端口复用一文打尽端口复用 VS Haproxy端口复用一文打尽端口复用 VS Haproxy端口复用

一文打尽端口复用 VS Haproxy端口复用一文打尽端口复用 VS Haproxy端口复用一文打尽端口复用 VS Haproxy端口复用


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明一文打尽端口复用 VS Haproxy端口复用
喜欢 (0)

您必须 登录 才能发表评论!

加载中……