这篇文章给大家聊聊关于内网渗透工具原理及实战开发,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
在我国,由于互联网用户数量众多,运营商无法保证为每个宽带用户提供全球唯一的公共IPv4地址。因此,很多用户会发现通过路由器查看到的WAN侧IP与通过百度“IP”关键字得到的IP不一致,而前者的IP是私有IP。
在某些情况下,公共IP 相对昂贵。虽然企业本身拥有少量独立的公网IP,但由于成本限制,或者内部网络未连通,无法为企业内的每一台主机提供一个公网IP。并不是所有的服务都需要暴露到公网来访问,因此企业可能会利用NAT技术,将大量的内网IP通过一定的规则映射到公网IP。最常见的技术之一是NAPT,也称为“网络端口地址转换”。因为一般服务都是通过端口来提供的,这样就可以通过特定的规则对少量的公网IP开放特定的服务。
问题
但有时我们个人宽带用户也希望将他们的服务发布到公共IP地址。例如,我们制作了一个漂亮的网站,想发布到互联网上供大家访问。如果没有公共IP,我们如何实现这一目标?
有时我们在对企业进行渗透测试时,发现企业的某台公网服务器只向公网开放了常用的80端口,而我们提权时需要使用的3389端口等端口却没有开放到公共网络。这时候我们该怎么办呢?
解决这些问题的方法就是穿透内网。
NAPT原理
具体原理我在网上找了一张图:
从这里我们可以看出,NAPT只解决了内网主机如何在没有公网IP的情况下访问公网主机的问题,但并没有解决公网主机如何主动向内网主机发起请求的问题。
私人地址
早期的RFC 1918 文档中描述了私有地址。
互联网号码分配机构(IANA) 为专用网络保留以下三个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类地址块有1个,B类地址块有32个,C类地址块有256个。大多数主流家用路由器都采用C类私有地址作为路由器LAN侧的IP地址,因此我们可以看到路由器设置页面上的IP地址一般都是以192.168开头。
原因
先说一下家庭宽带的情况。如果家庭宽带没有公网IP,则意味着你在本机上监控的任何端口都只能在本地网卡所在的网络上访问。该网络通常是路由器LAN侧所在的网络。如果没有特定的映射规则,连接到路由器WAN侧的网络将无法正常访问主机提供的服务。
如果这种情况下你想使用WAN侧(如果运营商给你分配了公网IP,那么WAN侧连接的网络通常就是公网),那么你需要在路由器上做端口映射。例如,路由器的LAN IP为192.168.1.1,WAN IP为23.23.23.23,我希望内网192.168.1.2主机的80端口提供的HTTP服务器可以从公网通过http://23.23直接访问.23.23,那么我需要将192.168.1.2:80映射到23.23.23.23:80。
但通常情况下,运营商不会将公网IP地址提供给普通用户。如果你使用这种映射方式,在公网上仍然无法访问,因为你的路由器的WAN侧连接到了运营商更高级别的路由器的LAN侧。更严重的,甚至可能是一层层连接起来,最后才到达公网。这种行为称为流量渗透。国内某电力公司的宽带中此类行为较多。通过流量渗透提供的宽带服务看似廉价,但实际上影响很大。由于大家共用一个IP,可能会导致很多网站的反SPAM政策伤害无辜者,或者可能会利用内部缓存来节省带宽,导致一些不应该缓存的敏感、安全页面被缓存,甚至导致部分网站的缓存失效,根本无法打开。
有些人发现即使拥有公网IP,仍然无法通过常规方法搭建服务器。到底是怎么回事?这是为了防止个人随意开启各种非法服务,防止黑客通过扫描器抓到。机合批量扫描屏蔽了一些常用端口。比如我们。。电信就封掉了80、8080等端口。虽然这样的禁令在一定程度上保证了我们的网络安全,比如前段时间的勒索病毒,正是因为大多数国内用户没有独立的公网IP,而一些操作系统最容易出现漏洞。 135、139等端口被封锁。运营商的禁令使得国内个人家用电脑被感染的概率小了很多;但这样一来,即使有公网IP,普通端口也无法对外网提供服务,只能改为其他端口。这有什么问题吗?一个典型的问题是WEB网站默认使用80端口,所以在输入URL时不需要包含端口号,这样看起来更美观。
解决方案
如果我们遇到以上的情况,我们应该如何解决呢?
如果我们没有公网服务器,我们可以使用国内著名的“花生壳”、“nat123”等服务来实现,但是它们背后的原理是什么呢?
如果我们有一个公网IP服务器,我们就可以利用这个公网IP服务器来提供服务。以及具体怎么做呢?
解决方案实施
首先假设我们有一台公网服务器,它的IP是45.45.45.45。我们还有另一台内网服务器,IP地址为23.23.23.23。我们现在要开放23.23.23.23:80,即内网服务器上的HTTP服务到45.45.45.45。
最简单粗暴的方式就是我们可以直接在公网服务器上重建整个内网服务器环境。
但这是非常麻烦的。有时我们不想这样做。我们只是想简单的利用公共服务器网络来发布一个内网服务。
穿透防火墙

出于安全原因,通常会在网络中添加防火墙。防火墙有入站规则和出站规则。如果没有非常严格的安全控制,通常不设置出站规则,但一般会设置入站规则。例如,外界可以通过80端口通过内网WEB服务器访问网页,但无法通过3389端口登录。内网远程桌面。
在内网穿透过程中遇到这种情况时,我们也可以使用上面传统的内网方法来实现穿透防火墙的入站规则。因为防火墙通常只拦截入站流量,而不会拦截出站流量,所以我们可以让内网服务器主动出站(主动连接黑客的服务器),与黑客自己的服务器打开隧道,最终绕过防火墙连接到3389远程桌面。
另一种情况是我们已经拿掉了内网的一台没有任何防火墙规则的白名单服务器,但是我们想要连接内网的另一台有入站规则的目标服务器,那么我们可以让这台白名单服务器来服务作为跳板,允许它首先监听自己的任何端口。那么任何用户连接到这个端口后,白名单服务器就会主动连接内网的目标服务器,然后利用这个白名单服务器来打通黑客。到目标服务器的连接隧道。
这就是黑客工具中著名的lcx的原理。前者由lcx的listen和slave命令实现,后者由lcx的tran命令实现。
代码实现
知道了原理之后,具体如何实现呢?
我选择使用Go语言编程来实现这样一个内网渗透工具。
Golang本身提供了很多网络库,并且Golang内置的Goroutine可以轻松处理网络编程中的异步IO,而且最重要的是,Golang开发的程序可以跨平台运行,这意味着编写的代码可以在任何平台上编译和使用操作系统。
https://github.com/cw1997/NATBypass
初次运行时,会根据情况输出欢迎信息,并有语法提示(这里需要注意的是,在printWelcome 函数最后调用了time.Sleep 来阻塞一秒。这是因为输出fmt包不是线程安全的,而log包下的输出是线程安全的,所以为了防止后续执行流程中的日志中出现提示信息,使用该函数休息一秒。 )。
然后判断传入的参数是否正确,通过正则表达式等方法验证IP和端口范围的合法性。
在port2host 操作中实现了跳板中继。
主动连接开放隧道的功能是在host2host中实现的。
看代码就可以知道,Golang中对socket操作的net封装比C语言中的socket.h操作要简单很多。
然后启动两个Goroutine分别处理连接1到连接2的IO数据包拷贝和连接2到连接1的IO数据包拷贝。因为需要保证两个端口之间的通信是全双工的,即双方必须能够同时互相交换数据,所以使用Goroutine来实现这两个操作的并发。
复制IO数据包的核心代码在connCopy函数中。根据是否记录流量日志来判断是否使用多路写入数据流函数io.MultiWriter。
如果日志文件的文件流打开成功,则通过io.MultiWriter函数生成多路写入流。这里这个多路写流的变量名是w。写入写入流w 的任何数据都将同时写入。输入之前执行多路写流创建函数io.MultiWriter时涉及到的参数。这里的参数是conn1和logFile,分别是端口1和日志文件流。
然后调用io.Copy将第二个参数的读流中读取的数据不断复制到第一个参数的写流中。
这里需要注意的是,io.Copy函数是同步阻塞的,也就是说只要连接不断开,程序执行流程就会一直卡在这个函数里。如果复制出错,io.Copy函数就会返回,这意味着执行它下面的代码。复制错误意味着连接可能已经断开,所以首先断开写入流连接。
这里需要注意的是为什么断开的是写入流而不是所有的读写流。因为我们之前已经启动了两个Goroutine,如果我们盲目地将它们全部断开,会导致另一个Goroutine中尚未写入的数据丢失。具体可以根据TCP的四波来分析。
实际执行
如果没有Golang环境,可以直接下载编译好的可执行文件,下载地址:https://github.com/cw1997/NATBypass/releases
我们先看一下编译后代码的实际运行情况。上图左侧是虚拟机上运行的内网服务器。它已经制定了入站规则。通过直接连接192.168.2.112:3389是无法连接远程桌面的。
此时右图开始通过listen命令监听7777和9999端口。
然后内网服务器通过slave命令启动与黑客主机(右图中192.168.2.101:7777)和本地127.0.0.1:3389的双向连接。
然后黑客主机连接本地另一个监听端口127.0.0.1:9999,连接内网服务器的远程桌面。
根据netstat -an的结果和控制台日志输出可以全面了解这个过程。
写在最后
天下数据是国内为数不多的拥有多个海外自建机房的新型IDC服务商之一,被业界公认为“。。IDC行业首选品牌”。
除了提供传统的IDC产品外,天下数据的主要职责是为大中型企业提供更加完善、安全、定制化的满足个性化需求的服务器解决方案,特别是在直销、金融、。。、流媒体、游戏等领域。电子商务。区块链、快消品、物联网、大数据等众多行业,我们可以解决客户在服务器租赁中遇到的各种问题。
标题:内网渗透工具原理及实战开发
链接:https://www.ltthb.com/news/rj/140788.html
版权:文章转载自网络,如有侵权,请联系删除!
用户评论
终于看到一篇讲内网穿透工具原理的博客了!以前只是简单用着,现在终于明白它的原理是怎样运作的了。太棒了!要学习一下自己动手开发一个试试!
有13位网友表示赞同!
作为一名IT爱好者,对内网穿透一直很感兴趣。这篇博文讲解得非常清楚,特别是对各种协议的解释,很有帮助。希望能看到更多类似的文章分享。
有16位网友表示赞同!
感觉文章写的有点专业,我这种菜鸟看了一半就晕headed了! 可能需要找个专门的教程一步一步来学才更容易理解吧...
有19位网友表示赞同!
这篇文章讲得很深入,让我对内网穿透有了更系统的认识。开发实战部分也很实用,想尝试跟着文章步骤自己写一个。不过,感觉有点复杂,需要花点时间去研究。
有14位网友表示赞同!
看了标题以为是简单介绍几种常用的工具,结果居然有原理讲解和实战代码!太强大了!我还在琢磨如何安全使用内网穿透工具,这篇文章很有帮助。
有14位网友表示赞同!
我一直用的某些开源的内网穿透工具,但对它们的原理不太了解。这篇博文解释得详细,让我明白了这些工具背后是如何运作的。非常感谢作者分享。
有17位网友表示赞同!
文章写的真好!终于有人把内网穿透原理讲明白啦!我现在更清楚各种协议的特点了,感觉以后可以用不同的方法搭建自己的内网穿透服务。太刺激了!
有9位网友表示赞同!
这个标题是不是有点耸人听闻? 感觉内网穿透工具主要是用来安全访问内网资源的,难道还有别的用途吗?我需要进一步了解一下...
有13位网友表示赞同!
这篇文章对零基础的人来说可能太抽象了。应该先从一些简单的例子开始讲解,一步步引出原理和开发实战的内容,这样才更容易理解。
有9位网友表示赞同!
作为一名安全爱好者,我对内网穿透的安全性一直很关注。这篇博文提到了一些安全方面的隐患,让我更谨慎地使用这些工具。
有7位网友表示赞同!
文章讲了太多的技术细节,我有些看不懂啊!感觉作者可以把内容分成几个部分,分别讲解原理、不同类型的工具和开发实战,更容易消化吸收。
有11位网友表示赞同!
内网穿透工具的原理其实很简单,就是通过建立一个隧道连接来实现内部网络资源的可访问性。这种技术非常强大,可以让我们的项目更加便捷高效。
有6位网友表示赞同!
这个博文写的很专业!对各个协议和算法都有详细的介绍。我之前只知道一些比较常用的内网穿透工具,现在终于明白了它们的原理工作机制,受益匪浅!
有12位网友表示赞同!
我觉得这篇博文有点过于理论化了,实用性不太强。希望作者能够在后续文章中分享更多具体的案例和应用场景,这样更加贴近实际需求。
有19位网友表示赞同!
一直想学习一下内网穿透的开发,结果看了这篇文章,感觉好像需要先学点编程基础知识才能下手!不过没关系,我会努力加油学习的!
有19位网友表示赞同!
真的对内网穿透工具的原理一知半解,这篇博文很好的解答了我的疑惑, 代码示例也很详细易懂。以后遇到问题可以参考这篇文章直接解决!
有18位网友表示赞同!
虽然文章内容讲解很详细,但我还是觉得有些地方不是很懂。也许我可以去搜一些学习资源或者。。, 希望能更深入地理解内网穿透的原理和开发实战。
有7位网友表示赞同!
我一直在想如何利用内网穿透技术搭建一个简单的。。游戏服务器,这篇博文正好点明了我的方向! 我会仔细阅读文章内容,按照步驟进行实践。
有20位网友表示赞同!