0x00 参考

《内网安全攻防》笔记。

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

概述

隧道是指一种绕过端口屏蔽的通信方式。

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

常见的隧道如下:

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

判断内网连通性

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

常见的内网连通性判断方法如下。

ICMP协议

1
ping <IP地址或域名>

TCP协议

NetCat是使用TCP/UDP协议进行网络连接读写数据的工具,可以使用其进行扫描判断:

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

在Windows中下载nc程序运行也是可以的:

HTTP协议

可以使用curl命令来探测内网连通性。如果远程主机开启了相应的端口,会输出相应的端口信息;如果未开启,则没有任何提示。

1
curl 192.168.1.3:80

在Windows中下载curl程序运行也是可以的:

DNS协议

一般的,使用nslookup和dig命令来进行DNS连通性检测。

nslookup是Windows自带的DNS探测命令,用法如下:

1
nslookup domain [dns-server]

在没有指定DNS服务器,就采用系统默认的DNS服务器,即nslookup会从系统网络的TCP/IP属性中读取DNS服务器的地址。

一般的使用方法是输入nslookup命令,再输入help命令。

dig是Linux默认自带的DNS探测命令,用法如下:

1
dig @[dns-server] www.baidu.com

在没有指定DNS服务器时,dig会到/etc/resolv.conf文件中读取系统配置的DNS服务器的地址。如果DNS服务器为192.168.43.1,将解析百度网的IP地址,说明目前DNS协议是连通的。

具体使用方法可通过dig -h命令来获取。

内网流量不能直接流出

还存在一种情况就是内网的流量不能直接流出,需要在内网中设置代理服务器,常见于通过企业办公网段上网的场景。

这种场景常用的内网连通性判断方法如下:

  1. 查看网络连接,判断是否存在与其他机器的8080(非绝对)等端口的连接(可尝试运行ping -n 1 -a ip命令);

  2. 查看内网中是否有主机名类似于”proxy”的机器;

  3. 查看IE浏览器的直接代理;

  4. 根据pac文件的路径(可能是本地路径,也可能是远程路径),将其下载下来并查看;

  5. 执行如下命令,利用curl工具进行确认:

    1
    2
    3
    4
    // 不通
    curl www.baidu.com
    // 通
    curl -x proxy-ip:port www.baidu.com

0x02 网络层隧道技术

在网络层中,常用的隧道协议是IPv6和ICMP。

IPv6隧道

IPv6(Internet Protocol Version 6)是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址。

目前,由于IPv4资源几乎耗尽,IPv6开始进入过渡阶段。

IPv6隧道技术简介

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

IPv6隧道的工作过程如图:

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

由于现阶段的边界设备、防火墙以及入侵检测系统还无法识别IPv6的通信数据,而大多数的操作系统是支持IPv6的,所以需要进行人工配置。如下:

攻击者有时会通过恶意软件来配置允许进行IPv6通信的设备,以避开防火墙和入侵检测系统。注意,即使设备支持IPv6,但也可能无法正确解析封装了IPv6报文的IPv4数据包。

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

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

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

防御IPv6隧道攻击的方法

针对IPv6隧道攻击,最好的防御方法就是:了解IPv6的具体漏洞,结合其他协议,通过防火墙和深度防御系统过滤IPv6通信,提高主机和应用程序的安全性。

ICMP隧道

ICMP隧道简单实用。在一般的通信协议中,如果两台设备要进行通信,则必须开放端口,但在ICMP协议下就不需要。

最常见的ICMP消息为ping命令的回复,攻击者可以利用命令行得到比回复更多的ICMP请求。在通常情况下,每个ping命令都有相对应的回复和请求。

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

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

icmpsh

icmpsh工具使用简单且易于跨平台,运行时不需要管理员权限。

使用Git Clone命令下载icmpsh:https://github.com/inquisb/icmpsh.git

安装Python的impacket类库,以便于TCP、UDP、ICMP、IGMP、ARP、IPv4、IPv6、SMB、MSRPC、NTLM、Kerberos、WMI、LDAP等协议进行访问。