447b или попытка защитить Asterisk

Обсуждаем, спрашиваем, помогаем в настройке VoIP

447b или попытка защитить Asterisk

Сообщение dimondack » 28 авг 2018, 22:56

Всем привет
предлагаю свой вариант программы,
которая заносит ip адреса в таблицу IPFW,
00024 507 329262 reject ip from table(24) to me 5060
00025 2722 1263108 allow udp from any to any 5060 via bge0

с которых пытаются безуспешно зарегистрироваться.

Все кто прошёл правило 00025 :) :) без билета
попадёт в таблицу ipfw table 24 list


Пока анализирует файл /var/log/asterisk/security
на наличие этих слов
"ChallengeResponseFailed",
"InvalidPassword",
"Wrong password",
"FailedACL"

:D можно и пополнить словарный запас :D

После запуска остаётся в процессах.
таймер sleep(180сек);



Анализирует сообщения с начала последней 10-ти минутки.

Создаётся директория /var/log/447b
куда пишутся отчёты.



Конечно совершенству нет предела...
Планирую добиться того, чтобы перед тем как добавлять ip адрес в таблицу,
проводить проверку , а нет ли уже в таблице такого адреса.
Что бы не дёргать ipfw безтолку.



Да, все это опробовал на Asterisk 15.5.0


Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <syslog.h>
#include <time.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netdb.h>

#define COUNT_BUFFER 1024
#define SBUF 1024
#define WORK_DIR "/var/log/447b"
#define LOG_FILE "/var/log/447b/447b.log"
#define PID_FILE "/var/log/447b/pid"

#define ASTERISK_WORK_DIR "/var/log/asterisk"
#define ASTERISK_LOGFILE "/var/log/asterisk/security"
#define TABLE_IPFW_ADD "ipfw table 24 add ";
#define TABLE_IPFW_LIST "ipfw table 24 list";


////////// IPFW
//00024   507   329262 reject ip from table(24) to me 5060
//00025  2722  1263108 allow udp from any to any 5060 via bge0   


//ipfw table 24 add 1.1.1.1
//char *flogin ="ChallengeResponseFailed";
//char *fpasswd ="InvalidPassword";
//char

int count_buffer;
FILE *list;
int  ulist;
int z = 0;
int w = 1;
char *impact_list[1024];
static char *atbl = TABLE_IPFW_ADD;
static char *ltbl = TABLE_IPFW_LIST;
long int pos_file;
char *failers[4] ={"ChallengeResponseFailed","InvalidPassword","Wrong password","FailedACL"};
char **temp;


char spl_str[1024][1024];
void err(char *str);
char* getTime();
char* get1hTime();
int writeLog(char msg[256]);
void SetPidFile(char * path_file);
char* g_cmd(char command[128]);
int de();
int cmp_s(char *s1, char *s2);


void err(char *str)
{
    perror(str);
    exit(1);
}

char* getTime()
 {
    time_t now;
    struct tm *ptr;
    static char tbuf[64];
    bzero(tbuf,64);
    time(&now);
    ptr = localtime(&now);
    strftime(tbuf,64, "%Y-%m-%e %H:%M:%S", ptr);
//  strftime(tbuf,64, "%b %d %H", ptr);
    return tbuf;
}


char* get1hTime()
 {
int ln =0;
static char temp[64];
    time_t now;
    struct tm *ptr;
    static char tbuf[64];
    bzero(tbuf,64);
    time(&now);
    ptr = localtime(&now);
//      strftime(tbuf,64, "%Y-%m-%e %H:%M:%S", ptr);
     strftime(tbuf,64, "%b %d %H:%M", ptr);
ln = strlen(tbuf);
bzero(temp,64);
for(int i =0;i<ln-1;i++){temp[i] = tbuf[i];  }
    return temp;
//return tbuf;

}


int writeLog(char msg[512])
 {
    FILE * pLog;
    pLog = fopen(LOG_FILE, "a+");
    if(pLog == NULL) {
        return 1;
    }
    char str[512];
    bzero(str, 512);
//    strcpy(str, getTime());
//    strcat(str, " ==========================\n");
//    strcat(str, msg);
//    strcat(str, "\n");
//char cmd[128];
//char *t = TABLE_IPFW;
snprintf(str,sizeof str,"%s\t%s\n",getTime(),msg);


    fputs(str, pLog);
    //fwrite(msg, 1, sizeof(msg), pLog);
     fclose(pLog);
     return 0;
}

void SetPidFile(char *path_file){

 FILE* f;

//char *path_file = PID_FILE;
    f = fopen(path_file, "w+");
    if (f)
    {
        fprintf(f, "%u", getpid());
        fclose(f);
    }

}


char* g_cmd(char command[128])
{
FILE *pcm;
static char bf[SBUF];
int lastchar;
 
//** delete "cd "  and run chdir()
char *istr = strstr(command,"cd ");
if(istr != NULL){
int sln= strlen(command);
int nsln=sln-3;
char *cmd; cmd=(char *)malloc(nsln);
for(int j=3;j<sln;j++){cmd[j-3]=command[j];}
cmd[nsln]='\0';chdir(cmd);free(cmd);return "0";
};
//**

pcm=popen(command,"r");
if(pcm== NULL){writeLog("Error Command"); return "1";}
bzero(bf,SBUF);
lastchar = fread(bf,1,SBUF,pcm);
bf[lastchar]='\0';
pclose(pcm);
return bf;
}



int cmp_s(char *s1, char *s2)
{
//char ts1[] = "Call1234567890   FailedACL";
//char ts2[] = "FailedACL";
int t;
int c;
c =0;
int ln1;
ln1=strlen(s1);
int ln2;
ln2=strlen(s2);
//intf("%d\t%d\n",ln1,ln2);
//puts(s1);
//puts(s2);

for(int i=0;i<ln1;i++){
for(int j=0;j<ln2;j++){
if(s2[j]==s1[j+i]){
//printf("%c=%c\n",s2[j],s1[j+i]); 
c=c+1;
//getchar();
//printf("%d\n",j+i);
}
}
if(c==ln2){return 0;}
c=0;t=ln2+i;
if(t>ln1){ return 1;}
}
//puts("We Here");
return 1;
}


int furgon(char *path_file, char **what_find_sstr, int count_elements){
char sbuf[1024], *t, *hs, one_h[32];
char cmd[128];
int m;
FILE *f;
//FILE *lst = fopen(LIST_LOG, "a+");
f = fopen(path_file, "r");
if (f == NULL){perror("sender: message "); }
bzero(one_h,32);
//snprintf(one_h, sizeof one_h,"%s",get1hTime());
strcpy(one_h,get1hTime() );
//count_buffer=0;
//puts(one_h);
while(fgets(sbuf,1024,f) != NULL)
{//begin Read file
hs=strstr(sbuf,one_h);
if(!hs){continue;}
for(int i=0;i<count_elements;i++){
m=cmp_s(sbuf,what_find_sstr[i]);
//printf("%d",m);
if(m == 0){
/////////////////////////////split ok
int lb = strlen(sbuf);
///////Begin Split String
int cspl = 0;
int elm =0;
char ch ='/';
for(int i=0;i<lb;i++){
if(sbuf[i] == ch ){spl_str[cspl][elm]='\0';i=i+1;
//printf("%s\n\r",spl_str[cspl]);
cspl = cspl + 1;elm = 0;}
spl_str[cspl][elm] = sbuf[i];
elm = elm +1;
}

bzero(cmd,128);
//fprintf(lst,"%s\n",spl_str[5]);
snprintf(cmd,sizeof cmd,"%s%s%s",atbl,spl_str[5],"\0");
writeLog(g_cmd(cmd));
       }
}
}// End Read File
fclose(f);
//fclose(lst);
return 0;
}

////////////////Process_File
int de(){

//chdir("/var/log/asterisk/");
while(1){
int u  = furgon(ASTERISK_LOGFILE,failers,4);
//int f = furgon(LOG_FILE,failers,4);
sleep(180);
}

return 0;
}

////////////////


int main(int argc, char* argv[]) {
int status;
int pid;




struct stat st = {0};
if(stat(WORK_DIR,&st ) == -1){
mkdir(WORK_DIR,0700);}

/*
if(argc !=2){
fprintf(stderr," usage:  Please Enter IP_addres or hostname remote client across 'probel'\n ");
exit(1);
}
*/

////hand start
//int u  = furgon(ASTERISK_LOGFILE,failers,4);

/////////////////////////////////////////////////TEMP
/**/
    pid_t parpid, sid;
    parpid = fork();
    if(parpid < 0) {
        exit(1);
    } else if(parpid != 0) {

        exit(0);
    }

SetPidFile(PID_FILE);

    umask(0);
    sid = setsid();
    if(sid < 0) {
        exit(1);
    }
    if((chdir("/var/log")) < 0) {
        exit(1);
    }
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

//    return de(argv[1]);
 
 
 return de();
/**/
//////////////////////////////////////////////TEMP
//fclose(list);
}



Вложения
447b.zip
447b
(2.4 Кб) Скачиваний: 2014
Нас определяет то, что мы делаем.
Аватара пользователя
dimondack
посетитель
 
Сообщения: 104
Зарегистрирован: 21 янв 2015, 13:00

Re: 447b или попытка защитить Asterisk

Сообщение root » 29 авг 2018, 08:53

Пытаешься сделать очередной Fail2ban ?
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1894
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia

Re: 447b или попытка защитить Asterisk

Сообщение dimondack » 29 авг 2018, 09:02

Получается так.
Своё интереснее.
Нас определяет то, что мы делаем.
Аватара пользователя
dimondack
посетитель
 
Сообщения: 104
Зарегистрирован: 21 янв 2015, 13:00

447а

Сообщение dimondack » 05 сен 2018, 14:12

Поправил функцию get1hTime
Также добавил анализ на предмет повторов
если размер файла security будет более 20M, запускаю ротацию.
В отличие от скрипта
http://subnets.ru/files/protect_aster.txt
анализирую текущий.
Хорошо это или плохо....

сутки работы все в норме.


447а
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <syslog.h>
#include <time.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netdb.h>


#define LIMIT 20000000
#define ROTATE "/usr/local/sbin/asterisk -rx 'logger rotate'"
#define COUNT_BUFFER 1024
#define SBUF 1024
#define WORK_DIR "/var/log/447"
#define LOG_FILE "/var/log/447/list.log"
#define ERR_FILE "/var/log/447/error.log"
#define PID_FILE "/var/log/447/pid"

#define ASTERISK_WORK_DIR "/var/log/asterisk"
#define ASTERISK_LOGFILE "/var/log/asterisk/security"
#define TABLE_IPFW_ADD "ipfw table 24 add ";
#define TABLE_IPFW_LIST "ipfw table 24 list";
#define COUNT_FAILERS 3

////////// IPFW
//00024   507   329262 reject ip from table(24) to me 5060
//00025  2722  1263108 allow udp from any to any 5060 via bge0   


//ipfw table 24 add 1.1.1.1
//char *flogin ="ChallengeResponseFailed";
//char *fpasswd ="InvalidPassword";
//char

//int count_buffer;
FILE *list;
unsigned long len=0;
//int  ulist;
//int z = 0;
//int w = 1;
//char *t_list[1024];
static char *atbl = TABLE_IPFW_ADD;
static char *ltbl = TABLE_IPFW_LIST;
//int cnt;
//long int pos_file;
char *failers[COUNT_FAILERS] ={"ChallengeResponseFailed","InvalidPassword","FailedACL"};
char **temp;

unsigned int  cnt;
//char *unicom_name[1024000];
char nicom_name[1024][64];
char lines[512][512];
char spl_str[512][512];
void err(char *str);
char* getTime();
char* get1hTime();
int writeLog(char msg[128]);
void SetPidFile(char * path_file);
char* g_cmd(char command[128]);
int de();
int cmp_s(char *s1, char *s2);
//int unisort( char **a, long cnt_arr);


void err(char *str)
{
    perror(str);
    exit(1);
}

char* getTime()
 {
    time_t now;
    struct tm *ptr;
    static char tbuf[64];
    bzero(tbuf,64);
    time(&now);
    ptr = localtime(&now);
    strftime(tbuf,64, "%Y-%m-%e %H:%M:%S", ptr);
//  strftime(tbuf,64, "%b %d %H", ptr);
    return tbuf;
}


char* get1hTime()
 {
 
//struct tm m_time;
/*
struct tm
{
  int tm_sec;     
  int tm_min;     
  int tm_hour;   
  int tm_mday;   
   int tm_mon;     
  int tm_year;   
  int tm_wday;   
  int tm_yday;   
  int tm_isdst;   
};
 */
 char *mon;
 int ln =0;
static char temp[64];
    time_t now;
    struct tm *ptr;
    static char tbuf[64];
    bzero(tbuf,64);
    time(&now);
    ptr = localtime(&now);
/*
puts("=====================");
printf("Month :%d\n",ptr->tm_mon);   
printf("Mday  :%d\n",ptr->tm_mday);   
printf("Hour  :%d\n",ptr->tm_hour);   
printf("Min   :%d\n",ptr->tm_min);
puts("=====================");
switch(ptr->tm_mon)
{
case 0: mon="Jan"; break;
case 1: mon="Feb"; break;
case 2: mon="Mar"; break;
case 3: mon="Apr"; break;
case 4: mon="May"; break;
case 5: mon="Jun"; break;
case 6: mon="Jul"; break;
case 7: mon="Aug"; break;
case 8: mon="Sep"; break;
case 9: mon="Oct"; break;
case 10: mon="Nov"; break;
case 11: mon="Dec"; break;
}
puts(mon);
*/
//printf("%d\n",ptr->tm_hour);
//      strftime(tbuf,64, "%Y-%m-%e %H:%M:%S", ptr);
//     strftime(tbuf,64, "%b %d %H:%M", ptr);

strftime(tbuf,64, "%c", ptr);
ln = strlen(tbuf);
bzero(temp,64);
for(int i =4;i<ln-9;i++){temp[i-4] = tbuf[i];}
//snprintf(temp,64,"%s%s%d\n",mon," ",ptr->tm_mday);

//strcpy(temp,"\0");
//int kl = strlen(temp);
//printf("%d\n",kl);
//puts(temp);
    return temp;
//return tbuf;

}


int writeLog(char msg[512])
 {
    FILE * pLog;
    pLog = fopen(LOG_FILE, "a+");
    if(pLog == NULL) {
        return 1;
    }
    char str[512];
    bzero(str, 512);
//    strcpy(str, getTime());
//    strcat(str, " ==========================\n");
//    strcat(str, msg);
//    strcat(str, "\n");
//char cmd[128];
//char *t = TABLE_IPFW;
snprintf(str,sizeof str,"%s\t%s\n",getTime(),msg);


    fputs(str, pLog);
    //fwrite(msg, 1, sizeof(msg), pLog);
     fclose(pLog);
     return 0;
}

void SetPidFile(char *path_file){

 FILE* f;

//char *path_file = PID_FILE;
    f = fopen(path_file, "w+");
    if (f)
    {
        fprintf(f, "%u", getpid());
        fclose(f);
    }

}


char* g_cmd(char command[128])
{
FILE *pcm, *log;

static char bf[SBUF];
int lastchar;
 
//** delete "cd "  and run chdir()
char *istr = strstr(command,"cd ");
if(istr != NULL){
int sln= strlen(command);
int nsln=sln-3;
char *cmd; cmd=(char *)malloc(nsln);
for(int j=3;j<sln;j++){cmd[j-3]=command[j];}
cmd[nsln]='\0';chdir(cmd);free(cmd);return "0";
};
//**

pcm=popen(command,"r");
//if(pcm== NULL){writeLog("Error Command"); return "1";}
if(pcm== NULL){log = fopen(ERR_FILE, "a+"); writeLog("Error run command");fclose(log); return "1";}
bzero(bf,SBUF);
lastchar = fread(bf,1,SBUF,pcm);
bf[lastchar]='\0';
pclose(pcm);
return bf;
}



int cmp_s(char *s1, char *s2)
{
//char ts1[] = "Call1234567890   FailedACL";
//char ts2[] = "FailedACL";
int t;
int c;
c =0;
int ln1;
ln1=strlen(s1);
int ln2;
ln2=strlen(s2);
//intf("%d\t%d\n",ln1,ln2);
//puts(s1);
//puts(s2);

for(int i=0;i<ln1;i++){
for(int j=0;j<ln2;j++){
if(s2[j]==s1[j+i]){
//printf("%c=%c\n",s2[j],s1[j+i]); 
c=c+1;
//getchar();
//printf("%d\n",j+i);
}
}
if(c==ln2){return 0;}
c=0;t=ln2+i;
if(t>ln1){ return 1;}
}
//puts("We Here");
return 1;
}


int furgon(char *path_file, char **what_find_sstr, int count_elements){
char sbuf[512], *t, *hs, one_h[32];
char cmd[128];
//char *t_list;
//puts(one_h);
int m, k, h, x, ind;
FILE *f;
//FILE *lst = fopen(LIST_LOG, "a+");
f = fopen(path_file, "r");
if (f == NULL){perror("sender: message "); }
bzero(one_h,32);
//puts("We Here");
////////list_table
bzero(cmd,128);
snprintf(cmd,sizeof cmd,"%s%s",ltbl,"\0");
//fprintf(lst,"%s\n",spl_str[5]);
char *t_list=g_cmd(cmd);
////////list_table
snprintf(one_h,32,"%s",get1hTime());
//strcpy(one_h,get1hTime() );
//count_buffer=0;
//puts(one_h);
cnt =0;
while(fgets(sbuf,512,f) != NULL)
{//begin Read file
//puts(sbuf);
//puts(one_h);

hs=strstr(sbuf,one_h);
if(!hs){continue;puts("Test"); }

for(int i=0;i<count_elements;i++){
//puts(one_h);
m=cmp_s(sbuf,what_find_sstr[i]);
//printf("%d",m);
//puts("We Here");

if(m == 0){
/////////////////////////////split ok
int lb = strlen(sbuf);
///////Begin Split String
int cspl = 0;
int elm =0;
char ch ='/';
for(int i=0;i<lb;i++){
if(sbuf[i] == ch ){spl_str[cspl][elm]='\0';i=i+1;
//printf("%s\n\r",spl_str[cspl]);
cspl = cspl + 1;elm = 0;}
spl_str[cspl][elm] = sbuf[i];
elm = elm +1;
}
//////////////////////split
//////////////////////////////////
x=0;
ind=0;
for(int i =0;i<cnt;i++){
//printf("%s\t%s\n",spl_str[5],nicom_name[cnt]);
x=cmp_s(nicom_name[i],spl_str[5]);
if(x==0){ind=ind+1;}
}
if(ind==0){strcpy(nicom_name[cnt],spl_str[5]); cnt=cnt+1; }

//puts(nicom_name[i]);
//nicom_name[cnt]=spl_str[5];
//cnt=cnt+1;
//printf("%lu\t%s\n",cnt,nicom_name[cnt]);
//cnt=cnt+1;

}
}
}// End Read File
//fseek(f, 0, SEEK_END);
//x=0;
//puts(t_list);
//int e = unisort(nicom_name,cnt);
//for(int i =0;i<cnt;i++){puts(nicom_name[i]);}
//printf("%lu\t%s\n",cnt,nicom_name[cnt]);

for(int i =0;i<cnt;i++){
x=cmp_s(t_list,nicom_name[i]);
if(x==0){continue;}
bzero(cmd,128);
//fprintf(lst,"%s\n",nicom_name[i]);
snprintf(cmd,128,"%s%s%s",atbl,nicom_name[i],"\0");
//strcpy(cmd);
//nicoom[]
writeLog(g_cmd(cmd));
//puts(nicom_name[i]);
}

//printf("%lu\n",cnt);
len = (unsigned long)ftell(f);
if(len>LIMIT){bzero(cmd,128); snprintf(cmd,sizeof cmd,"%s%s",ROTATE,"\0");writeLog(g_cmd(cmd));sleep(3);}
//printf("%lu", len );
fclose(f);
//fclose(lst);
return 0;
}

////////////////Process_File
int de(){

//chdir("/var/log/asterisk/");
while(1){
int u  = furgon(ASTERISK_LOGFILE,failers,COUNT_FAILERS);
//int f = furgon(LOG_FILE,failers,4);
sleep(180);
}

return 0;
}

////////////////


int main(int argc, char* argv[]) {
int status;
int pid;
cnt =0;



struct stat st = {0};
if(stat(WORK_DIR,&st ) == -1){
mkdir(WORK_DIR,0700);}

/*
if(argc !=2){
fprintf(stderr," usage:  Please Enter IP_addres or hostname remote client across 'probel'\n ");
exit(1);
}
*/

////hand start
//int u  = furgon(ASTERISK_LOGFILE,failers,COUNT_FAILERS);

/////////////////////////////////////////////////TEMP

    pid_t parpid, sid;
    parpid = fork();
    if(parpid < 0) {
        exit(1);
    } else if(parpid != 0) {

        exit(0);
    }

SetPidFile(PID_FILE);

    umask(0);
    sid = setsid();
    if(sid < 0) {
        exit(1);
    }
    if((chdir("/var/log")) < 0) {
        exit(1);
    }
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

//    return de(argv[1]);


 return de();

//////////////////////////////////////////////TEMP
//fclose(list);
}






что с этим делать

Код: Выделить всё
on-critical invite transaction.
[Sep  5 13:57:27] WARNING[100202]: chan_sip.c:4131 int retrans_pkt(const void *): Timeout on 538181909-2134988960-2130227532 on non-critical invite transaction.
[Sep  5 13:57:37] WARNING[100202]: chan_sip.c:4131 int retrans_pkt(const void *): Timeout on 1325899764-1271462142-1146207659 on non-critical invite transaction.
[Sep  5 13:57:41] WARNING[100202]: chan_sip.c:4131 int retrans_pkt(const void *): Timeout on 1048686363-186310987-418476308 on non-critical invite transaction.
[Sep  5 13:57:55] WARNING[100202]: chan_sip.c:4131 int retrans_pkt(const void *): Timeout on 1323026975-1811597542-668263511 on non-critical invite transaction.
[Sep  5 13:58:00] WARNING[100202]: chan_sip.c:4131 int retrans_pkt(const void *): Timeout on 1125894899-1269575020-1136389138 on non-critical invite transaction.
[Sep  5 13:58:10] WARNING[100202]: chan_sip.c:4131 int retrans_pkt(const void *): Timeout on 2046420257-1623226169-742124060 on non-critical invite transaction.
[Sep  5 13:58:16] WARNING[100202]: chan_sip.c:4131 int retrans_pkt(const void *): Timeout on 270624762-2021602962-2039982538 on non-critical invite transaction.
[Sep  5 13:58:26] WARNING[100202]: chan_sip.c:4131 int retrans_pkt(const void *): Timeout on 1168467517-317114530-1224326152 on non-critical invite transaction.


Летят незнакомые инвайты, а мы отвечаем 401 Unauhtorized
.....
И пусть себе летят ??


Интересно было бы критику услышать
Нас определяет то, что мы делаем.
Аватара пользователя
dimondack
посетитель
 
Сообщения: 104
Зарегистрирован: 21 янв 2015, 13:00


Вернуться в Настройка VoIP железа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1