内网穿透工具的原理及实战开发

智聪说说网
智聪说说网
智聪说说网
34752
文章
0
评论
2023-01-1112:26:53 评论 2

前言

在中国,由于网民众多,运营商无法保证为每个宽带用户提供世界上唯一的公共网络IPv4地址。因此,许多用户会通过路由器端找到它WAN端IP与百度“IP关键词得到的IP前者不一致IP为一个私有IP。

在某些情况下,公网IP虽然相对昂贵,但企业本身也持有少量独立的公网IP,但由于成本限制,企业内的每个主机都无法提供公网IP,或者内网并非所有服务都需要暴露在公网上进行访问,因此企业可能会使用它NAT技术会有大量的内网IP通过一定的规则映射到公网IP上。最常见的技术之一是NAPT,又称网络端口地址转换。由于一般服务是通过端口提供的,因此通过这种方式,特定的服务可以通过特定的规则向少量的公共网络开放IP上。

问题

但有时我们的个人宽带用户也想在公共网站上发布他们的服务IP上。比如我们做了一个漂亮的网站,想发布到互联网上供大家参观。没有公网IP如何实现这种情况?

此外,当我们对企业进行渗透测试时,我们发现企业的公共网络服务器只对公共网络开放了普通的80个端口,而我们提高权利时需要使用的3389等端口不对公共网络开放。现在我们该怎么办?

解决这些问题的方法是穿透内网。

NAPT原理

简单地说,在NAT网关上会有映射表,记录哪个内网到公网。IP与端口发起请求,然后如果内网主机向公网设备发起请求,内网主机的请求数据包就会传输到NAT网关上,那么NAT网关将修改数据包的源IP地址和源端口为NAT网关自身的IP地址和任何不冲突的未使用端口,并将此修改记录在映射表上。最后,将修改后的数据包发送到请求的目标主机。目标主机发回响应包后,根据响应包中的目的IP地址和目的端口到映射表中找到转发给哪个内网主机。最后,将修改后的数据包发送到请求的目标主机。目标主机发回响应包后,根据响应包中的目的IP地址和目的端口去映射表,找出转发给哪个内网主机。这样,内网主机就没有公网了。IP通过NAPT借助路由器唯一的公网技术IP访问公网设备。

我在网上找到了一张照片:

从这里我们可以看到,NAPT只解决内网主机没有公网的问题IP如何访问公网主机的问题,但并不能解决公网主机如何主动向内网主机提出请求的问题。

私有地址

早些时候 RFC 1918 私有地址在文档中有相关说明。

因特网域名分配组织IANA组织(Internet Assigned Numbers Authority)保留了以下三个IP私有网络使用地址块。

10.0.0.0 - 10.255.255.255 (10/8比特前缀)

172.16.0.0 - 172.31.255.255 (172.16/12比特前缀)

192.168.0.0 - 192.168.255.255 (192.168/16比特前缀)

我们可以看到一个A类地址块,B类地址块32个,C类地址块256个。主流家用路由器使用C类私人地址作为路由器LAN端的IP有很多地址,所以我们可以看到路由器设置页面IP一般从192.168开始。主流家用路由器使用C类私人地址作为路由器LAN端的IP有很多地址,所以我们可以看到路由器设置页面IP一般从192.168开始。

原因

先说家庭宽带。如果没有公网,如果没有家庭宽带IP,这意味着您在本机上监控的任何端口都只能访问本机网卡所在的网络。这个网络通常是路由器LAN端所在的网络。没有具体的映射规则,路由器WAN连接到端的网络将无法正常访问主机提供的服务。

如果在这种情况下想要的话WAN(如果运营商为您分配了公网IP,那么WAN端所连接的网络通常是公网),因此需要在路由器上进行端口映射。比如路由器LAN IP为192.168.1.1,WAN IP为23.23.23.我想让内网1923.168.1.2提供主机80端口HTTP服务器可以直接在公网上通过http://23.23.23.如果访问23,将是1923.168.1.2:80映射到23.23.23.23:80上。

但一般情况下,运营商不会给普通用户公网IP的。因为你的路由器,用这种方法映射在公网上仍然是不可访问的WAN端连接是运营商更上一级的路由器LAN端,严重一点,甚至是层层连接最后才到公网,这种行为称作流量穿透。国内某电,某动宽带有很多这样的行为。宽带服务通过流量穿透提供,看似便宜,但实际上影响很大,因为每个人都使用一个IP,它可能会导致许多网站的反SPAM策略伤及无辜,或者内部为了节省带宽,使用缓存,导致一些不该缓存的敏感安全页面被缓存起来,甚至导致部分网站缓存失效完全打不开。

有人发现,即使他们有公网,IP,但是服务器还是不能通过常规方法架设。怎么回事?这是为了防止运营商随意提供各种非法服务,也防止黑客通过扫描仪捕捉鸡和批量扫描,禁止一些常见的端口,如中国电信禁止80、8080等端口。虽然这种禁令在一定程度上保证了我们的网络安全,例如,一段时间前的勒索病毒,因为大多数国内用户没有独立的公共网络IP,此外,操作系统最容易爆发漏洞。135、139等端口被运营商禁止,使得国内个人家庭电脑招聘的概率要小得多;但即使有公共网络IP,不能使用常用端口为外网提供服务,只能更换到其他端口。有什么不好?典型的问题是WEB默认情况下,网站使用80端口,所以在输入网站时不需要带上端口号,看起来更漂亮。

解决方案

如果遇到上述情况,应该如何解决?

假如我们没有公网服务器,我们可以使用国内著名的花生壳nat实现123等服务,但背后的原则是什么?

如果我们自己有一个公共网络IP在服务器的帮助下,我们可以使用这个公共网络IP服务器提供服务。具体怎么操作?

解决方案的实现

假设我们有自己的公共网络服务器,他IP为45.45.45.45。我们还有另一个内网服务器IP为23.23.23.现在我们想把23..23.23.23:80,即内网服务器HTTP服务开放到45.45.45.45上。

最简单粗暴的方法就是直接在公网服务器上重建整个内网服务器环境。

但这很麻烦。有时我们不想这样做。我们只是想借助公共网络服务器的网络发布内部网络服务。

我们在前面通过NAPT原理得知:NAPT内网主机在没有公网的情况下实现了IP访问公网主机。所以我们可以这样做:假设公网IP为23.23.23.23,内网IP为192.168.1.2。公网主机首先监控80端口,监控这个端口是为了向外部提供一个HTTP服务,80是WEB默认端口的服务器。同时,任何其他端口(这里我们假设是777)都是用来监控内网服务器主动连接打开隧道的。然后内网主动向公网主机777发起请求,使内网成功与公网主机建立连接通道。然后,当任何客户主动连接公共网络的80端口时,公共网络在收到连接请求后,立即通过以前建立的隧道将连接请求转发给内网主机。内网主机接收隧道数据包后,主动连接内网主机本身的80端口。连接成功后,将数据包转发到80端口,等待HTTP处理完这个数据包后,服务器程序,回复报告后,原路转发回去,最后到达公网80端口,然后返回最初要求公网服务器80端口的客户端。

看起来更绕吗?

它看起来更绕吗?事实上,著名的花生壳内网版和nat123等内网穿透工具的原理基本上是这样的,但并非完全如此。因为运输层端口只能同时提供一种服务,但我们会发现花生壳的内网穿透服务是在公共网络的帮助下提供的IP同时,它为许多用户提供了服务,因为花生壳并没有像我之前说的那样完整地转发报纸,而是在转发前添加了一些控制协议,以指转发到哪个花生壳客户端的内部网络主机。前者通常被称为透明传输或透明代理。

穿透防火墙

为了安全起见,防火墙通常添加到网络中,防火墙有进出规则。如果安全控制不是很严格,通常不会设置出站规则,但一般会设置入站规则。例如,内网可以通过80端口传输到外部WEB服务器访问网页,但内网远程桌面不能通过3389端口登录。

在内网渗透的过程中遇到这种情况,我们也可以借助上述传统的内网穿透防火墙的入口规则。因为防火墙通常只拦截车站,没有拦截车站,所以我们可以让内网服务器主动离开车站(主动连接到黑客服务器),与黑客自己的服务器通过隧道,最后绕过防火墙连接到3389远程桌面。

另一种情况是,我们赢得了一个没有任何防火墙规则的何防火墙规则,但我们想连接另一个目标服务器,所以我们可以让白名单服务器作为跳板,让他监控任何端口,然后任何用户连接端口,白名单服务器主动连接到内部网络的目标服务器,然后通过黑客与目标服务器的连接隧道。

在黑客工具中很有名lcx原则是这样的,前者的实现是lcx的listen和slave后者的实现是命令lcx的tran命令。

在黑客工具中很有名lcx原则是这样的,前者的实现是lcx的listen和slave后者的实现是命令lcx的tran命令。

代码实现

了解原理后,如何实现?

我这里选择了使用Go语言编程实现了这样的内网穿透工具。

Golang它本身提供了很多网络库,而且Golang本身内置的Goroutine网络编程中的异步处理非常方便IO,最重要的是,Golang开发的程序是可以跨平台运行的,意味着写了一份代码,我们可以在任何一个操作系统上编译并使用。

https://github.com/cw1997/NATBypass

初始运行时,根据情况输出欢迎信息已经是语法提示(这里要注意printWelcome函数末尾调用time.Sleep因为fmt包输出是非线程安全的,而log包下的输出是线程安全的,所以用这个函数休息一秒钟,以防止后面执行流中打的日志穿插到提示信息中。

首先,通过判断传入参数来决定当前使用的转发策略。

首先,通过判断传入参数来决定当前使用的转发策略。

然后通过正则表达式验证判断传入参数是否正确IP合法性和端口范围。

通过port2port函数实现了两个端口同时监控双向和转发数据。

在port2host跳板中转是在操作中实现的。

在host2host主动连接开通隧道。

看代码就知道了,在Golang中进行socket操作的net包要比C语言中的socket.h操 作简单很多。

{n}{n}

  

{n}{n}

  转发功能的核心就在于forward函数部分。

{n}{n}

  

{n}{n}

  先输出一个日志说明是对哪两个连接进行双向转发,然后通过sync包下

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时候联系我们修改或删除,多谢。

标签:内网穿透工具的原理及实战开发

智聪说说网
  • 本文由 发表于 2023-01-1112:26:53
  • 转载请务必保留本文链接:https://www.zhicongwang.com/89710.html