渗透基础——端口转发与代理

Track-SSG   ·   发表于 2018-11-11 10:19:42   ·   漏洞文章

0x00 前言


在渗透测试中,经常会使用到端口转发和代理。

端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为。

实际应用中需要考虑两种情况:

  • Client->Transit server->Server:Client能够正向连接Transit server。Transit server直接转发即可
  • Client<-Transit server->Server:Client无法正向连接Transit server,但Transit server能够反向连接Client。
  • 如果Client要对Server的多个端口进行扫描(或是多个Server的多个端口),逐个配置转发规则很不现实。

    为了提高效率,这里可以使用代理,配置一次规则即可。

    本文将对常用方法和工具进行整理总结,分门别类,区分正向和反向连接,区分转发和代理,分析其中的联系和区别,并给出应用场景,以作参考。

    0x01 简介


    本文将要介绍以下内容:

  • 针对Windows系统和Linux系统(Ubuntu和CentOS)下的方法
  • 端口转发——正向连接的方法
  • 端口转发——反向连接的方法
  • 正向代理的方法
  • 反向代理的方法
  • 以上方法的应用场景
  • 注:

    Go语言支持跨平台编译,所以本文更侧重于介绍Go语言实现的工具

    0x02 端口转发——正向连接


    0、应用场景

    1.流量转发的跳板

    用于隐藏真实的服务器地址

    CIA Hive Beacon Infrastructure中端口转发使用的是Linux的iptables

    如下图中的(2)

    Alt text

    注:

    中转服务器的搭建可参考之前的文章《CIA Hive Beacon Infrastructure复现1——使用Apache mod_rewrite实现http流量分发》和《CIA Hive Beacon Infrastructure复现2——使用Apache mod_rewrite实现https流量分发》

    2.建立通道

    连接内网服务器的指定端口

    Client能够正向连接到Transit server

    1、测试环境

    Client: 192.168.111.136

    Server: 192.168.111.103

    网络连接如下图

    Alt text

    使用nc测试网络连接

    Server:

    nc -lvp 4444

    Client:

    nc -vv 192.168.111.103 4444

    Client连接成功,如下图

    Alt text

    2、Windows系统下的端口转发方法

    Transit server: 192.168.111.132

    网络连接如下图

    Alt text

    1、使用netsh实现端口转发(需要管理员权限)

    (1)添加转发规则

    netsh interface portproxy add v4tov4 listenaddress=192.168.111.132 listenport=7777 
    connectaddress=192.168.111.103  connectport=4444

    (2)添加防火墙入站规则

    netsh advfirewall firewall add rule name="transit test" protocol=TCP dir=in localport=7777 action=allow

    注:

    默认配置允许出站并阻挡入站通信,所以此处仅需要添加入站规则

    测试网络连接:

    Server:

    nc -lvp 4444

    Client:

    nc -vv 192.168.111.132 7777

    Client连接成功

    (3)查看端口转发规则

    netsh interface portproxy show all

    (4)清除端口转发规则

    netsh interface portproxy delete v4tov4 listenaddress=192.168.111.132 listenport=7777

    (5)清除防火墙规则

    netsh advfirewall firewall delete rule name="transit test"

    2、使用rinetd实现端口转发

    下载地址:

    https://boutell.com/rinetd/http/rinetd.zip

    仅需要压缩包中的rinetd.exe

    (1)为rinetd.exe添加防火墙规则(管理员权限)

    netsh advfirewall firewall add rule name="transit test2" dir=in program="c:\test\rinetd.exe" action=allow

    (2)编写转发规则

    echo 0.0.0.0 7777 192.168.111.103 4444 > conf.txt

    (3)启动

    rinetd.exe -c c:\test\conf.txt

    (4)清除防火墙规则(管理员权限)

    netsh advfirewall firewall delete rule name="transit test2" dir=in program="c:\test\rinetd.exe"

    3、使用HTran实现端口转发

    注:

    lcx同其功能类似

    源码来源于互联网,我在github做了备份,备份地址:

    https://raw.githubusercontent.com/3gstudent/test/master/HTran.cpp

    (1)为HTran.exe添加防火墙规则(管理员权限)

    netsh advfirewall firewall add rule name="transit test3" dir=in program="c:\test\HTran.exe" action=allow

    (2)开启转发功能

    HTran.exe -tran 7777 192.168.111.103 4444

    (3)清除防火墙规则(管理员权限)

    netsh advfirewall firewall delete rule name="transit test3" dir=in program="c:\test\HTran.exe"

    4、使用EarthWorm实现端口转发

    下载地址:

    https://github.com/rootkiter/EarthWorm

    (1)为ew_for_win_32.exe添加防火墙规则(管理员权限)

    netsh advfirewall firewall add rule name="transit test4" dir=in program="c:\test\ew_for_win_32.exe" action=allow

    (2)开启转发功能

    ew_for_win_32.exe -s lcx_tran -l 7777 -f 192.168.111.103 -g 4444

    (3)清除防火墙规则(管理员权限)

    netsh advfirewall firewall delete rule name="transit test4" dir=in program="c:\test\ew_for_win_32.exe"

    3、Linux系统(Ubuntu)下的常用端口转发方法

    Transit server: 192.168.111.102

    网络连接如下图

    Alt text

    1、使用iptables实现端口转发

    (1)开启转发功能

    echo 1 >/proc/sys/net/ipv4/ip_forward

    注:

    该命令立即生效,重启失效

    (2)添加转发规则

    iptables -t nat -A PREROUTING -p tcp -d 192.168.111.102 --dport 8888 -j DNAT --to-destination 192.168.111.103:4444
    iptables -t nat -A POSTROUTING -p tcp -d 192.168.111.103 --dport 4444 -j SNAT --to-source 192.168.111.102

    (3)查看转发规则

    iptables -L -t nat --line-number

    如下图

    Alt text

    测试网络连接:

    Server:

    nc -lvp 4444

    Client:

    nc -vv 192.168.111.102 8888

    Client连接成功

    (4)清除规则

    iptables -F -t nat

    (5)保存规则

    iptables-save > /etc/iptables.up.rules

    (6)恢复规则

    iptables-restore < /etc/iptables.up.rules

    2、使用rinetd实现端口转发

    (1)编译安装

    wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
    tar zxvf rinetd.tar.gz
    cd rinetd
    make

    (2)编写转发规则

    echo 0.0.0.0 8888 192.168.111.103 4444 > /etc/rinetd.conf

    (3)启动

    ./rinetd.exe

    (4)结束进程

    pkill -9 rinetd

    3、使用HTran实现端口转发

    Linux版HTran(lcx)的源码参考如下地址:

    https://github.com/windworst/LCX

    需要使用gcc重新编译

    (1)开启转发功能

    ./lcx -tran 8888 192.168.111.103 4444

    注:

    go语言编写的HTran(lcx),优点是跨平台,支持Windows和Linux

    下载地址:

    https://github.com/cw1997/NATBypass

    4、使用EarthWorm实现端口转发

    下载地址:

    https://github.com/rootkiter/EarthWorm

    未开源

    (1)开启转发功能

    ./ew_for_linux -s lcx_tran -l 8888 -f 192.168.111.103 -g 4444

    4、Linux系统(CentOS)下的常用端口转发方法

    Transit server: 192.168.111.105

    网络连接如下图

    Alt text

    1、使用iptables实现端口转发

    (1)开启转发功能

    echo 1 >/proc/sys/net/ipv4/ip_forward

    注:

    该命令立即生效,系统重启失效

    (2)安装iptables

    systemctl stop firewalld  
    systemctl mask firewalld  
    yum install iptables-services
    systemctl enable iptables

    (3)添加转发规则

    iptables -t nat -A PREROUTING -p tcp -d 192.168.111.105 --dport 8888 -j DNAT --to-destination 192.168.111.103:4444
    iptables -t nat -A POSTROUTING -p tcp -d 192.168.111.103 --dport 4444 -j SNAT --to-source 192.168.111.105
    service iptables save
    service iptables restart
    service iptables status

    (4)查看转发规则

    iptables -L -t nat --line-number

    如下图

    Alt text

    测试网络连接:

    Server:

    nc -lvp 4444

    Client:

    nc -vv 192.168.111.105 8888

    Client连接成功

    (4)清除规则

    iptables -F -t nat

    2、使用rinetd实现端口转发

    同Ubuntu,此处省略

    3、使用HTran实现端口转发

    同Ubuntu,此处省略

    4、使用EarthWorm实现端口转发

    同Ubuntu,此处省略

    0x03 端口转发——反向连接


    0、应用场景

    1.建立通道

    连接内网服务器的指定端口

    测试环境如下图

    Alt text

    已有Transit server权限,想要访问Server的3389端口

    Client无法正向连接到Transit server,但Transit server能够反向连接到Client

    iptables和rinetd不再适用

    1、使用HTran

    支持Windows和Linux

    Client:

    HTran -listen 1111 2222

    Transit server:

    HTran -slave 1.1.1.1 1111 10.0.0.2 3389

    Client:

    nc -vv 127.0.0.1 2222

    2、使用EarthWorm

    支持Windows和Linux

    Client:

    ew -s lcx_listen -l 2222 -e 1111

    Transit server:

    ew -s lcx_slave -d 1.1.1.1 -e 1111 -f 10.0.0.2 -g 3389

    Client:

    nc -vv 127.0.0.1 2222

    0x04 正向代理


    0、应用场景

    1.内网扫描

    对内网的多个端口进行扫描

    Client能够正向连接到Transit server

    测试环境如下图

    Alt text

    要对Server1、Server2和Server3的端口进行扫描

    Socks4代理只支持TCP协议,而Socks5代理支持TCP协议和UDP协议,更加全面,所以本文只介绍实现Socks5代理的方法

    1、使用HTran

    网上流传HTran2.4支持Socks5代理,但我未找到开源代码,此处作一个标记

    2、使用EarthWorm

    Transit server:

    ew –s ssocksd –l 8888

    Client使用代理工具连接Transit server的8888端口

    3、使用goproxy

    go实现的高性能http,https,websocket,tcp,udp,socks5,ss代理服务器,支持正向代理、反向代理、透明代理、内网穿透、TCP/UDP端口映射、SSH中转

    下载地址:

    https://github.com/snail007/goproxy/

    Transit server:

    proxy socks -t tcp -p "0.0.0.0:8888"

    Client使用代理工具连接Transit server的8888端口

    4、自己使用go实现

    Windows系统安装Go:

    https://golang.org/dl/

    安装git:

    http://git-scm.com/downloads

    安装go-socks5:

    go get github.com/armon/go-socks5
    go build

    test.go:

    package mainimport socks5 "github.com/armon/go-socks5"func main() {
            conf := &socks5.Config{}
            server, err := socks5.New(conf)
            if err != nil {          
               panic(err)
            }
            if err := server.ListenAndServe("tcp", "0.0.0.0:8888"); err != nil {
                      panic(err)
            }}

    编译

    go build test.go

    Client使用代理工具连接Transit server的8888端口

    5、使用reGeorg

    下载地址:

    https://github.com/NoneNotNull/reGeorg

    针对web服务器,支持(aspxashxjspphp)

    注:

    Windows下连接socks代理的工具可使用sockscap64

    Linux下连接socks代理的工具可使用proxychains

    0x05 反向代理


    0、应用场景

    1.内网扫描

    对内网的多个端口进行扫描

    测试环境如下图

    Alt text

    Client无法正向连接到Transit server,但Transit server能够反向连接到Client

    要对Server1、Server2和Server3的端口进行扫描

    1、使用EarthWorm

    Client:

    ew -s rcsocks -l 2222 -e 1111

    Transit server:

    ew -s rssocks -d 1.1.1.1 -e 1111

    使用代理工具连接Client的2222端口

    2、使用rsocks

    下载地址:

    https://github.com/brimstone/rsocks

    Go语言编写,支持Windows和Linux

    Client:

    rsocks -listen :1111 -socks 127.0.0.1:2222

    Transit server:

    rsocks -connect 1.1.1.1:1111

    使用代理工具连接Client的2222端口


    0x06 小结


    本文对端口转发和代理的常用工具和方法进行整理总结,划分正向和反向连接两个类别,分别介绍了应用场景和常用工具,可作为实际应用的参考。


    打赏我,让我更有动力~

    0 条回复   |  直到 2018-11-11 | 1464 次浏览
    登录后才可发表内容
    返回顶部 投诉反馈

    © 2016 - 2024 掌控者 All Rights Reserved.