基础知识

概述

下面所说的隧道,就是一种绕过端口屏蔽的通信方式,其实也就是使用不同协议的通信,以达到绕过防火墙的目的。常见的隧道如下:

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

判断内网连通性

判断内网是否能出网,需要综合判断各种协议和端口。 常用的内网连通性的判断方法如下:

IMCP协议(网络层)

ping命令就是基于ICMP来工作的,所以我们可以使用ping来判断IMCP协议的连通性,例如如下命令:

ping www.baidu.com
# linux下需要指定-c选项,否则会一直ping,例如:
ping -c 3 www.baidu.com

TCP协议(传输层)

nc是基于TCP/UDP协议来进行通信的,所以我们可以使用nc工具来判断TCP协议的连通性,例如如下命令:

# -z选择是关闭IO,仅做扫描
nc -vz 49.234.105.98 22

演示如下:

nc探测出网情况

HTTP协议(应用层)

测试HTTP协议的连通性,可以使用curl工具,linux下自带此工具,但是windows需要下载才能使用,例如如下命令:

curl探测HTTP协议

DNS协议(应用层)

在进行DNS连通性检测时,通常使用nslookup和dig命令,nslookup是windows下自带的工具,而dig是linux下自带的命令。两个工具都可以指定DNS服务器进行解析。如下所示:

DNS探测:nslookup

DNS探测:dig

网络层隧道技术

网络层最常用ICMP和IPv6两个协议进行隧道传输。

IPv6隧道

  • IPv6是用来设计为了替代IPv4的一种新协议。
  • IPv6隧道技术,就是将Ipv4作为隧道载体,将Ipv6报文整体封装在IPv4数据报文中

一个示意图如下所示:

IPv6隧道示意图

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

ICMP隧道

ICMP协议比较特殊,通信双方不需要开放端口。如果攻击者上层隧道失败了,那么可以尝试使用ping建立ICMP隧道,将TCP/UDP数据封装到ICMP的ping数据包中,从而绕过防火墙,实现不受限制的网络访问。

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

icmpsh

使用此工具不需要管理员权限,且跨平台。但是slave只能是windows平台。我这里在linux上将icmpsh-m.c编译成master.out运行作为master,然后windows运行icmpsh.exe来连接master,将shell反弹给master,具体操作如下:

首先在攻击机上关闭本机的ICMP应答,防止shell不稳定:

# 设置为0就是开启
sysctl -w net.ipv4.icmp_echo_ignore_all=1

然后linux开启master监听如下:

icmpsh开启master

然后windows反弹shell连接master如下:

icmpsh反弹shell

过一会,就会发现linux已经反弹得到了windows的shell:

icmpsh反弹成功

此工具的一些参数说明如下:

-t host            host ip address to send ping requests to. This option is mandatory!

-r                 send a single test icmp request containing the string "Test1234" and then quit. 
                   This is for testing the connection.

-d milliseconds    delay between requests in milliseconds 

-o milliseconds    timeout of responses in milliseconds. If a response has not received in time, 
                   the slave will increase a counter of blanks. If that counter reaches a limit, the slave will quit.
                   The counter is set back to 0 if a response was received.

-b num             limit of blanks (unanswered icmp requests before quitting

-s bytes           maximal data buffer size in bytes

PingTunnel

PingTunnel也是一个常用的ICMP隧道工具,可以跨平台使用,且可以设置密码,也支持socke5、tcp/udp隧道。

如果内网的机器A不能直接访问机器B,但是机器A可以ping通机器B,此时可以尝试将机器A与外网建立ICMP隧道,将机器A作为跳板与机器B利用ICMP通信。例如如下图示:

PingTunnel图示

详情可以查看链接:PingTunnel工具

传输层隧道协议

传输层包括TCP隧道、UDP隧道和常规端口转发等。

lcx端口转发

端口转发最经典的工具,是一个基于socket套接字实现的端口转发工具。有windows和linux两个版本,windows版本为lcx.exe,linux版本为portmap,一个正常的socket隧道必须具备两端:一端服务端,监听一个端口,等待客户端的链接;一段作为客户端,通过服务端的ip和端口与服务器主动进行连接。

内网端口转发

可以使用内网端口转发实现内网穿透,将内网机器的端口转发到公网vps,然后通过公网vps就可以连接内网的端口了。

例如将内网的22端口抓发到公网:

内网端口转发到公网

然后公网vps启动监听:

公网vps端口转发监听

然后我们访问公网vps的33579端口就可以和内网的被转发机器的22端口通信了:

内网通信

本地端口映射

如果目标服务器的某些端口无法通过防火墙,可以将目标服务器相应端口的数据传到防火墙允许的其他端口。在靶机上执行如下命令,就可以通过连接目标的80端口转发到22端口:

本地端口转发

netcat

netcat也就是大家常用的nc,俗称网络界的瑞士军刀,基于TCP/UDP协议。一些常用参数如下:

-d:后台模式。
-e:程序重定向,正向shell用。
-l:使用监听模式,管理和控制传入的数据。
-n:直接使用ip地址,不通过域名服务器解析。
-o <输出文件>:指定文件名,把往来传输的数据转换为16进制字节码保存在该文件中。
-p <端口>:设置本地主机通信端口。
-u:使用UDP传输协议。
-v:详细输出。
-z:将输入/输出功能关闭,仅在用于扫描通信端口时使用。

Banner抓取

命令如下:

Banner抓取

连接远程主机

也就是正向的nc连接,例如靶机先开启监听,重定向/bash/sh,如下所示:

靶机正向nc-shell

然后nc正向连接shell,如下所示:

nc正向连接shell

端口扫描

如果只是想查看目标某个端口是否打开,可以使用nc的 -v 选项即可。如果想批量扫描端口段,可以使用nc的 -z 选项:

nc端口扫描

文件传输

使用nc还可以传输文件呦!例如在本地输入如下命令:

例如机器A上存在一个test.txt文件,想传输到机器B上,那么可以先在机器B上输入如下命令:

nc传输文件

机器A上输入如下命令将本机上的test.txt传输过去:

nc传输文件

获取shell

nc用的最多的就是获取shell,分为正向和反向。一般反弹shell用的多。正向连接shell举个linux下的例子如下:

攻击机开启监听,如下:

nc正向连接shell

靶机正向连接攻击机转发shell:

nc正向连接shell

然后攻击机就获取靶机的shell了:

nc正向连接shell

反弹shell的时候,一般靶机没有nc,所以一般需要依赖其他方式反弹shell。常用的有bash、php、python、perl等方式。

内网代理

假设存在机器A、B、C。机器A是公网VPS、机器B和C是内网机器、机器B可以出网,但是C不能出网且无法从公网访问。现在想获取机器C的shell:

首先机器A上开启nc监听:

nc内网代理

在机器C上开启正向nc监听:

nc内网代理

然后在机器B上开启转发,将机器C的shell转发到机器A上:

nc内网代理

于是机器A就反弹到了机器C的shell,如下所示:

nc内网代理

powercat

powercat是nc的powershell版本。用法和nc差不多,但是 可以返回powershell。

应用层隧道技术

常用的隧道协议有SSH、HTTP、HTTPS和DNS。

SSH协议

SSH协议一般是可以通过防火墙的,而且很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。

常用参数如下:

-C:压缩传输,提高传输速度。
-f:将SSH传输转入后台执行,不占用当前shell。
-N:建立静默连接(建立了连接,但是看不到具体会话)。
-g:允许远程主机连接本地用于转发的端口。
-L:本地端口转发。
-R:远程端口转发.
-D:动态转发(SOCKS代理)。
-P:指定SSH端口。

本地转发

例如,存在机器A、B、C。机器A为公网VPS,机器B、C内网服务器。现在想通过机器B(机器B有公网IP)作为跳板访问机器C的3389端口。可以如下操作:

在机器A上输入如下命令后,就可以机器A的本地访问1152端口连接机器C的3389端口了:

ssh本地端口转发

远程转发

例如,存在机器A、B、C。机器A为公网VPS,机器B、C内网服务器。现在想通过机器B(机器B没有公网IP,但是能出网)作为跳板访问机器C的3389端口。可以如下操作:

在机器B上输入如下命令后,就可以在公网机器A的1152端口连接机器的3389端口了:

ssg远程转发

由于我公网VPS无法连接桌面,所以我把公网VPS的1152端口转发到了1153端口,这样我们在本地连接公网VPS的1153端口就会转发到1152端口,从而与机器C的3389端口通信,如下所示:

ssh远程转发

动态转发

例如,存在机器A、B、C。机器A为公网VPS,机器B、C内网服务器。现在想通过机器B(机器B有公网IP)作为socket4/5跳板漫游内网。可以如下操作:

在机器A公网VPS上输入如下命令,建立一个动态的socket4/5隧道,需要输入机器B的密码:

动态转发

然后浏览器设置socket代理就可以访问内网的应用了:

动态转发

HTTP/HTTPS协议

HTTPService代理用于将所有流量转发到内网。常见的代理工具有reGeorg、meterpreter、tunna等。下面演示使用reGeorg:

先将tunnel(我这里是http.jsp)上传到web服务器:

reGeorg通道

然后本机攻击机启动py脚本,如下所示:

reGeorg通道

然后浏览器挂上代理,或者攻击机挂上全局代理,就可以访问内网应用啦:

reGeorg通道

DNS协议

现在DNS、ICMP、HTTP/HTTPS等难以被禁用的协议已成为攻击者控制隧道的主流。

查看DNS的连通性

需要测试DNS的连通性,也就是能否通过内部DNS解析外部域名。输入如下命令查看内部域名和IP地址:

cat /etc/resolv.conf|grep -v "#"

如图所示:

DNS内部域名和ip

然后使用dig或者nslookup测试能否解析外部域名:

测试DNS联通性

dnscat2

dnscat2的客户端是C编写的,服务端是Ruby编写的。有如下特点:

  • 支持直连和中继模式。
  • 支持多个会话。
  • 使用密钥防止MiTM攻击。
  • 在内存中直接执行PowerShell脚本。
  • 隐蔽通信。

(1)配置域名解析:

要使用dnscat2首先需要配置域名解析,以下是我的配置:

域名解析

Notice: 如果直接访问ns1.pinger.fun,因为此域名对应A记录,所以可以直接得到IP,不需要再请求域名解析。所以我们如果采用中继模式建立DNS隧道,那么应该再配置一个NS记录,指向ns1.pinger.fun,让ns1.pinger.fun对应ip的服务器给出域名解析结果。

此时我们直接ping以下ns1.pinger.fun,就可以查看A类解析是否生效:

判断A解析是否生效

然后在攻击机,也就是ns1.pinger.fun对应IP的服务器上开启抓包,此时dig一下www.pinger.fun,可以在攻击机上看到有域名解析请求,也就代表NS解析配置生效了:

判断NS解析是否生效

(2)安装dnscat2服务端:

dnscat2的服务端是ruby编写的,需要安装一些库。安装好后,启动服务端的命令如下(采用的中继模式):

dnscat2-server

Notice: -c选择设置密钥预防中间人攻击;-e指定安全级别,open表示服务端允许客户端不进行加密;–no-cache表示禁止缓存,务必要添加此选项,防止兼容问题。

(3)在目标机上安装客户端

windows下需要使用编译打包好的exe文件,在dnscat2进行下载。linux下直接进入client目录运行 make 即可安装。

首先需要测试能否与服务端通信,输入如下命令进行测试(注意选项带两个横杠):

dnscat-client-ping

保证能通信后,就可以与服务端进行连接了,在客户端靶机上输入如下所示命令:

dnscat-client-link

然后攻击机就能控制靶机啦~有点和msf类似的使用方式,但是感觉这shell不咋友好:

dnscat-server-attack

如果想直连,不用中继,那么可以使用如下参数开启Server(Client怎么连,会给出提示):

直连模式

Socket代理

  • Socket是一种代理服务,可以将一端系统连接另一端。
  • Socket4只支持TCP协议;Socket5不仅支持TCP/UDP协议,还支持各种身份验证机制等,其标准端口为1080.

前面其实已经用过一个Socket代理工具了,就是reGeorg,其利用webshell建立一个Socket代理进行内网穿透。然后其他常用的工具有:EarthWorm和SocketCap64、ProxyChains等。