请求带外攻击(OOB)域名告警,常发生的场景是主机上进程向一个特定的域名进行请求,请求的域名经常被用于带外攻击外传数据。攻击者常常会使用在payload中指定漏洞利用成功后请求目标域名,然后通过观察特定的域名是否被请求来判断攻击是否成功。
1、原因分析
漏洞发生时,第一时间在安全组出方向对异常域名ip进行限制,拒绝跳到对应的网站。其次,对现有安全组进行分析,发现安全组配置不合理,通过服务器ip+端口方式访问到服务,公网ip暴露情况下,有较大的风险。
可以对安全组进行优化,尽量开放和暴露最少的端口。开放80/443端口,Nginx作为流量入口,所有服务均通过 Nginx 代理,在Nginx侧对URL进行校验限制。实现对入方向的安全把控。
2、解决方案
2.1、关闭对外暴露的端口
生产通用安全组:
存放生产机器共有的安全组规则,在这里限制只允许生产机器内外网ip访问,拒绝其它所有ip,需要特殊开放的在对应实例安全组中添加。
开发测试通用安全组:
存放开发、测试机器共有的安全组规则,在这里限制只允许开发、测试机器内外网ip访问,拒绝其它所有ip,需要特殊开放的在对应实例安全组中添加。
以上两个安全组,同时做到了生产环境与开发测试环境的隔离。
堡垒机端口:
Nginx http(s) 80/443端口;
中间件端口:
MySQL 端口;
Redis 端口;
MongoDB 端口;
Rabbitmq 端口;
一般只将这部分端口开放给公司ip,或开放给特定的ip临时使用。
附件:(打开防火墙,并开放对外暴露的端口,端口打开后必须重启防火墙)
CentOS7 端口的开放关闭查看都是用防火墙来控制的,具体命令如下:
一、打开/关闭某个端口
查看防火墙状态:(active (running) 即是开启状态)
# systemctl status firewalld
查看已开放端口:(8080和3306 即是已开放端口)
# firewall-cmd --list-all
防火墙开放端口:(以3306为例)
# firewall-cmd --zone=public --add-port=3306/tcp --permanent
关闭8080端口
# firewall-cmd --permanent --zone=public --remove-port=8080/tcp
重启防火墙:
# systemctl restart firewalld.service
更新防火墙规则(关闭防火墙时必须重启防火墙):
firewall-cmd --reload
命令含义:
–zone #作用域
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
firewall-cmd --reload 并不中断用户连接,即不丢失状态信息
firewalld的基本使用
二、常用操作命令
#启动:
systemctl start firewalld
#关闭:
systemctl stop firewalld
#查看状态:
systemctl status firewalld
#开机禁用 :
systemctl disable firewalld
#开机启用 :
systemctl enable firewalld
※systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。
#启动一个服务:
systemctl start firewalld.service
#关闭一个服务:
systemctl stop firewalld.service
#重启一个服务:
systemctl restart firewalld.service
#显示一个服务的状态:
systemctl status firewalld.service
#在开机时启用一个服务:
systemctl enable firewalld.service
#在开机时禁用一个服务:
systemctl disable firewalld.service
#查看服务是否开机启动:
systemctl is-enabled firewalld.service
#查看已启动的服务列表:
systemctl list-unit-files|grep enabled
#查看启动失败的服务列表:
systemctl --failed
#配置
firewalld-cmd
#查看版本:
firewall-cmd --version
#查看帮助:
firewall-cmd --help
#显示状态:
firewall-cmd --state
#查看所有打开的端口:
firewall-cmd --zone=public --list-ports
#查看区域信息:
firewall-cmd --get-active-zones
#查看指定接口所属区域:
firewall-cmd --get-zone-of-interface=eth0
#拒绝所有包:
firewall-cmd --panic-on
#取消拒绝状态:
firewall-cmd --panic-off
# 查看是否拒绝:
firewall-cmd --query-panic
#查看所有端口
firewall-cmd --list-all
2.2、 Nginx 拒绝字符串请求
在对应域名的规则里面,对含有‘/proxy.stream’字符串的请求进行拒绝。
location /proxy.stream {
deny all;
}
出了在Nginx层做拦截,还能在Linux防火墙处理。Linux的防火墙是一个非常重要的组件,可以帮助保护计算机网络免受恶意攻击。iptables是Linux中最常用的防火墙程序之一,它提供了一种基于规则的策略,可以过滤网络流量并控制网络连接。
iptables的规则由若干条规则链(Rule Chain)组成,每个规则链包含若干规则(Rule)。当网络数据包到达Linux主机时,iptables会将其与规则链中的每个规则进行匹配,如果匹配成功,iptables将执行该规则指定的操作。
对于特定字符串的过滤,iptables提供了一种字符串匹配模块(string match module),使用这个模块可以实现对网络数据包中携带的数据进行字符串匹配,并根据匹配结果进行过滤。
添加防火墙规则:
# 查看当前防火墙规则
iptables -L
# 添加新的防火墙规则,拒绝所有包含“proxy.stream”字符串的请求:
iptables -A INPUT -m string --string "proxy.stream" --algo bm -j DROP
# 再次执行以下命令,查看当前防火墙规则
iptables -L
*注意,如果您使用的是使用命令添加的规则,则必须使用相同的命令删除规则。如果使用了不同的命令添加规则,删除规则可能会失败或不起作用。所以需要删除刚新增的带有proxy.stream字符串的规则,需要使用相同的命令,不同是将-A替换成-D即可:
iptables -D INPUT -m string --string "proxy.stream" --algo bm -j DROP