如何阻止 SipVicious(“友好扫描程序”)淹没我的 SIP 服务器?

a1k*_*kmm 7 security sip

我运行一个 SIP 服务器,它侦听 UDP 端口 5060,并且需要接受来自公共 Internet 的经过身份验证的请求。

问题是它偶尔会被扫描 SIP 服务器的人发现并利用,然后他们整天坐在那里试图对服务器进行暴力破解。我使用的凭据足够长,以至于这种攻击永远不会可行,但它很烦人,因为它占用了大量带宽。

我已经尝试设置 fail2ban 来读取 Asterisk 日志并禁止使用 iptables 执行此操作的 IP,这会阻止 Asterisk 在 10 次尝试失败后看到传入的 SIP REGISTER 尝试(这发生在不到一秒的攻击速度下)看到)。然而,SipVicious 派生脚本在获得 ICMP 目标主机无法访问后不会立即停止发送 - 它们会继续使用数据包敲击连接。他们停止的时间是可配置的,但不幸的是,似乎攻击者进行这些类型的蛮力攻击通常将超时设置得非常高(在 fail2ban 阻止他们获得任何 SIP 响应后,攻击继续以高速率持续数小时一旦他们看到 SIP 服务器的初始确认)。

有没有办法让它停止在我的连接上发送数据包?

a1k*_*kmm 11

如果收到没有 From: 行的无效 SIP 响应,许多攻击者使用的公开可用的 SipVicious 脚本会立即停止攻击。您可以识别 SipVicious,因为它将 SIP 请求中的用户代理设置为友好扫描程序。

使用这种技术对抗现实世界的攻击者,我已经能够立即阻止数据包的泛滥。您可以使用简单的脚本发送这样的数据包。例如:

cat >UnfriendlyScannerStopper.scala <<END
import java.net._

object UnfriendlyScannerStopper {
  def main(args : Array[String]) : Unit = {
    if (args.length < 2) {
      System.out.println("Usage: FriendlyScannerStopper ipAddr port")
      return
    }

    val udpSocket : DatagramSocket = new DatagramSocket();
    val packetContents : String = "SIP/2.0 400 Go Away!!!\r\n\r\n"
    udpSocket.send(new DatagramPacket(packetContents.getBytes("utf-8"), packetContents.size,
      InetAddress.getByName(args(0)), Integer.parseInt(args(1))))
  }
}
END
scala UnfriendlyScannerStopper.scala 188.138.107.179 5102
Run Code Online (Sandbox Code Playgroud)

您需要将 188.138.107.179 和 5102 替换为您在攻击中发送的 SIP 数据包的 Via 标头中的地址和端口。

  • 如果您将其编写为可以回复任何内容的服务,您可以告诉 fail2ban 设置 iptables 规则以转发到该服务。 (2认同)