Ms08067安全实验室

Ms08067安全实验室

出品|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协议:

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

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

速查:

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端口复用-LMLPHP
  • Target2:Win7 x64
  • IP:192.168.213.129
  • 开启3389端口
一文打尽端口复用 VS Haproxy端口复用-LMLPHP

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

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

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

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

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

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

  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端口复用-LMLPHP

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

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

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

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

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

7.参考链接

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

02-01 16:04