数字8-800を攻撃するときのアスタリスク保護

この記事を読んだ後私たちはそのような攻撃から保護されていないことを恐怖で実感しました。 そして、私たちは簡単に1日1万から2万ルーブルに達することができます。 この問題を修正することにしました。 私は膝に保護スクリプトを投げました-多分誰かが役に立つでしょう...



システムの準備

スクリプトはphpで記述されており、sqlite3を使用してphp-cliとphp5-sqlite3をインストールする必要があることに関する情報を保存します。

私の場合、システムはubuntで発生するため、このように配置されます



sudo apt-get install php5-cli php5-sqlite
      
      







スクリプト自体。

仕事の原理はこれです。 スクリプトは、発信者の電話番号を受け取ります。 データベースに番号を入力し、すでに呼び出した回数をチェックし、これをルールと照合します(スクリプトの最初の行で設定されます)。 制限を超えている場合-「停止」という単語を返し、そうでない場合は「継続」を返します



 <?php $rules = array( 60 => 2, //   2    ( 60  ) 3600 => 10 //   10    ( 3600  ) ); if (!$argv[1] ) die("please use: '" . $argv[0] . " phone_number' \nfor example: ".$argv[0]." 88121234567\n"); //     $db = new SQLite3('/tmp/sqlite.db'); $db->exec('CREATE TABLE IF NOT EXISTS logs (phone bigint(12), datetime int(12))'); //        $phone = preg_replace('/[^0-9]/','', $argv[1]); $db->exec("INSERT INTO logs (phone, datetime) VALUES ( '".$phone."','".time()."' )"); foreach( $rules as $secs => $limit ) { $res = $db->query( "SELECT count(*) as `c` FROM logs WHERE `phone` = '".$phone."' AND `datetime` >= " .( time() - $secs ) ); $row = $res->fetchArray(); //    if ( $row['c'] > $limit ) { die('stop'); //  stop     } } //   -   ,     $max_period = max(array_keys($rules) ); $db->exec("DELETE FROM logs WHERE `datetime` < " .( time() - $max_period )); //  continue die('continue'); ?>
      
      







アスタリスクへの接続

Answer()コマンドまたは「removes」行を開く他のコマンドを呼び出す前に、最初の行でスクリプトを実行することが重要です。



 exten => 8800XXXXXXX,1,Set(resp=${SHELL(php /home/scripts/antiddos.php ${CALLERID(num)})}); exten => 8800XXXXXXX,2,Gosubif($[${resp}==stop]?${EXTEN},${MATH(${PRIORITY}+1),int}:${EXTEN},${MATH(${PRIORITY}+2),int}); exten => 8800XXXXXXX,3,HangUp(); exten => 8800XXXXXXX,4,Answer(); ...
      
      







行に従ってダイヤルプランを分析しましょう:

1)Set(resp = $ {SHELL(php /home/scripts/antiddos.php $ {CALLERID(num)})});

スクリプトを呼び出して、スクリプトにコンソールに出力された値に対応する変数を割り当てます

2)Gosubif($ [$ {resp} == stop]?$ {EXTEN}、$ {MATH($ {PRIORITY} +1)、int}:$ {EXTEN}、$ {MATH($ {PRIORITY} +2 )、int});

値が「停止」の場合は、現在のダイヤルプランの次の指示に進みます。HangUp()チームは、

それ以外の場合は、回線を通過してダイヤルプランを続行します。



最終的に何が起こるか。

制限を超えていない場合、次のSIPセッションが取得されます。

 sip provider me invite => <= trying <= OK ack =>
      
      





それですべてが大丈夫、充電が開始されました



HandUp()を実行すると、SIPセッションは次のようになります。

 sip provider me invite => <= trying <= DECLINE ack =>
      
      







拒否とは、呼び出されたユーザーが着信を拒否したことを意味します。 課金を開始しないでください、なぜなら 会話はなく、セッションは終了しました。



UPD:

匿名の番号から攻撃する場合、スクリプトを少し変更して、anti-AONによって閉じられた番号に制限を設定できます...



All Articles