Автор Тема: Arpwatch-db  (Прочетена 5810 пъти)

edmon

  • Гост
Arpwatch-db
« -: Apr 12, 2008, 13:17 »
дали тук се намират хора който би ги заинтригувала идеята arpwatch да събира даните си в DB вместо да ги изпраща с морално остарялата email технология '<img'>(кажи не на email, откажи спама '<img'> '<img'> '<img'> '<img'> )
дали някой с познания по програмиране може да преправи кода за репорт от изпращане на мейл към запис в база(sqlite, db4) ??

това е кода(който и сами може да намерите, но за да не съм голословен):

Примерен код

/*
 * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000
 *   The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that: (1) source code distributions
 * retain the above copyright notice and this paragraph in its entirety, (2)
 * distributions including binary code include the above copyright notice and
 * this paragraph in its entirety in the documentation or other materials
 * provided with the distribution, and (3) all advertising materials mentioning
 * features or use of this software display the following acknowledgement:
 * ``This product includes software developed by the University of California,
 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
 * the University nor the names of its contributors may be used to endorse
 * or promote products derived from this software without specific prior
 * written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */
#ifndef lint
static const char rcsid[] =
    "@(#) $Id: report.c,v 1.46 2000/09/30 23:41:04 leres Exp $ (LBL)";
#endif

/*
 * report - arpwatch report generating routines
 */

#include <sys/param.h>
#include <sys/types.h>            /* concession to AIX */
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/wait.h>

#if
struct mbuf;
struct rtentry;
#endif
#include <net/if.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <ctype.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#ifdef TIME_WITH_SYS_TIME
#include <time.h>
#endif
#include <unistd.h>

#include "gnuc.h"
#ifdef HAVE_OS_PROTO_H
#include "os-proto.h"
#endif

#include "addresses.h"
#include "arpwatch.h"
#include "dns.h"
#include "ec.h"
#include "report.h"
#include "setsignal.h"
#include "util.h"

#define PLURAL(n) ((n) == 1 || (n) == -1 ? "" : "s")

static int cdepth;   /* number of outstanding children */

static char *fmtdate(time_t);
static char *fmtdelta(time_t);
RETSIGTYPE reaper(int);
static int32_t gmt2local(void);

static char *
fmtdelta(register time_t t)
{
   register char *cp;
   register int minus;
   static char buf[132];

   minus = 0;
   if (t < 0) {
      t = -t;
      ++minus;
   }
   if (t < 60) {
      cp = "second";
   } else if (t < 60 * 60) {
      t /= 60;
      cp = "minute";
   } else if (t < 24 * 60 * 60) {
      t /= (60 * 60);
      cp = "hour";
   } else {
      t /= (24 * 60 * 60);
      cp = "day";
   }
   if (minus)
      t = -t;
   (void)sprintf(buf, "%u %s%s", (u_int32_t)t, cp, PLURAL(t));
   return(buf);
}

static char *dow[7] = {
   "Sunday",
   "Monday",
   "Tuesday",
   "Wednesday",
   "Thursday",
   "Friday",
   "Saturday"
};

static char *moy[12] = {
   "January",
   "February",
   "March",
   "April",
   "May",
   "June",
   "July",
   "August",
   "September",
   "October",
   "November",
   "December"
};

#define DOW(d) ((d) < 0 || (d) >= 7 ? "?" : dow[d])
#define MOY(m) ((m) < 0 || (m) >= 12 ? "?" : moy[(m)])

static char *
fmtdate(time_t t)
{
   register struct tm *tm;
   register int32_t mw;
   register char ch;
   static int init = 0;
   static char zone[32], buf[132];

   if (t == 0)
      return("<no date>");

   if (!init) {
      mw = gmt2local() / 60;
      if (mw < 0) {
         ch = '-';
         mw = -mw;
      } else {
         ch = '+';
      }
      (void)sprintf(zone, "%c%02d%02d", ch, mw / 60, mw % 60);
   }

   tm = localtime(&t);
   (void)sprintf(buf, "%s, %s %d, %d %d:%02d:%02d %s",
       DOW(tm->tm_wday),
       MOY(tm->tm_mon),
       tm->tm_mday,
       tm->tm_year + 1900,
       tm->tm_hour,
       tm->tm_min,
       tm->tm_sec,
       zone);
   return(buf);
}

/*
 * Returns the difference between gmt and local time in seconds.
 * Use gmtime() and localtime() to keep things simple.
 */
static int32_t
gmt2local(void)
{
   register int dt, dir;
   register struct tm *gmt, *loc;
   time_t t;
   struct tm sgmt;

   t = time(NULL);
   gmt = &sgmt;
   *gmt = *gmtime(&t);
   loc = localtime(&t);
   dt = (loc->tm_hour - gmt->tm_hour) * 60 * 60 +
       (loc->tm_min - gmt->tm_min) * 60;

   /*
    * If the year or julian day is different, we span 00:00 GMT
    * and must add or subtract a day. Check the year first to
    * avoid problems when the julian day wraps.
    */
   dir = loc->tm_year - gmt->tm_year;
   if (dir == 0)
      dir = loc->tm_yday - gmt->tm_yday;
   dt += dir * 24 * 60 * 60;

   return (dt);
}

RETSIGTYPE
reaper(int signo)
{
   register pid_t pid;
   DECLWAITSTATUS status;

   for (;;) {
      pid = waitpid((pid_t)0, &status, WNOHANG);
      if ((int)pid < 0) {
         /* ptrace foo */
         if (errno == EINTR)
            continue;
         /* ECHILD means no one left */
         if (errno != ECHILD)
            syslog(LOG_ERR, "reaper: %m");
         break;
      }
      /* Already got everyone who was done */
      if (pid == 0)
         break;
      --cdepth;
      if (WEXITSTATUS(status))
         syslog(LOG_DEBUG, "reaper: pid %d, exit status %d",
             pid, WEXITSTATUS(status));
   }
   return RETSIGVAL;
}

void
report(register char *title, register u_int32_t a, register u_char *e1,
    register u_char *e2, register time_t *t1p, register time_t *t2p)
{
   register char *cp, *hn;
   register int fd, pid;
   register FILE *f;
   char tempfile[64], cpu[64], os[64];
   char *fmt = "%20s: %s\n";
   char *watcher = WATCHER;
   char *watchee = WATCHEE;
   char *sendmail = PATH_SENDMAIL;
   char *unknown = "<unknown>";
   char buf[132];
   static int init = 0;

   /* No report until we're initialized */
   if (initializing)
      return;

   if (debug) {
      if (debug > 1) {
         dosyslog(LOG_NOTICE, title, a, e1, e2);
         return;
      }
      f = stdout;
      (void)putc('\n', f);
   } else {
      /* Setup child reaper if we haven't already */
      if (!init) {
         (void)setsignal(SIGCHLD, reaper);
         ++init;
      }
      while (cdepth >= 3) {
         syslog(LOG_ERR, "report: pausing (cdepth %d)", cdepth);
         pause();
      }

      /* Syslog this event too */
      dosyslog(LOG_NOTICE, title, a, e1, e2);

      /* Update child depth */
      ++cdepth;

      /* Fork off child to send mail */
      pid = fork();
      if (pid) {
         /* Parent */
         if (pid < 0)
            syslog(LOG_ERR, "report: fork() 1: %m");
         return;
      }

      /* Child */
      closelog();
      (void)strcpy(tempfile, "/tmp/arpwatch.XXXXXX");
      if ((fd = mkstemp(tempfile)) < 0) {
         syslog(LOG_ERR, "mkstemp(%s) %m", tempfile);
         exit(1);
      }
      if ((f = fdopen(fd, "w+")) == NULL) {
         syslog(LOG_ERR, "child fdopen(%s): %m", tempfile);
         exit(1);
      }
      /* Cheap delete-on-close */
      if (unlink(tempfile) < 0)
         syslog(LOG_ERR, "unlink(%s): %m", tempfile);
   }

   (void)fprintf(f, "From: %s\n", watchee);
   (void)fprintf(f, "To: %s\n", watcher);
   hn = gethname(a);
   if (!isdigit(*hn))
      (void)fprintf(f, "Subject: %s (%s)\n", title, hn);
   else {
      (void)fprintf(f, "Subject: %s\n", title);
      hn = unknown;
   }
   (void)putc('\n', f);
   (void)fprintf(f, fmt, "hostname", hn);
   (void)fprintf(f, fmt, "ip address", intoa(a));
   (void)fprintf(f, fmt, "ethernet address", e2str(e1));
   if ((cp = ec_find(e1)) == NULL)
      cp = unknown;
   (void)fprintf(f, fmt, "ethernet vendor", cp);
   if (hn != unknown && gethinfo(hn, cpu, sizeof(cpu), os, sizeof(os))) {
      (void)sprintf(buf, "%s %s", cpu, os);
      (void)fprintf(f, fmt, "dns cpu & os", buf);
   }
   if (e2) {
      (void)fprintf(f, fmt, "old ethernet address", e2str(e2));
      if ((cp = ec_find(e2)) == NULL)
         cp = unknown;
      (void)fprintf(f, fmt, "old ethernet vendor", cp);
   }
   if (t1p)
      (void)fprintf(f, fmt, "timestamp", fmtdate(*t1p));
   if (t2p)
      (void)fprintf(f, fmt, "previous timestamp", fmtdate(*t2p));
   if (t1p && t2p && *t1p && *t2p)
      (void)fprintf(f, fmt, "delta", fmtdelta(*t1p - *t2p));

   if (debug) {
      fflush(f);
      return;
   }

   (void)rewind(f);
   if (dup2(fileno(f), fileno(stdin)) < 0) {
      syslog(LOG_ERR, "dup2: %m");
      exit(1);
   }
   /* XXX Need to freopen()? */
   /* Always Deliver interactively (pause when child depth gets large) */
   execl(sendmail, "sendmail", "-odi", watcher, NULL);
   syslog(LOG_ERR, "execl: %s: %m", sendmail);
   exit(1);
}


нямам представа дали е възможно....



'<img'>
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Arpwatch-db
« Отговор #1 -: Apr 13, 2008, 22:32 »
http://www.thtech.net/article/12 ?
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

edmon

  • Гост
Arpwatch-db
« Отговор #2 -: Apr 14, 2008, 09:22 »
мда това сигурно е много хубаво, но става едно та друго та трето...
а на мен идеята ми беше ако е възможно, да се преправи сорса
на репорт.с вмето да пише файл и да го майлва(кажи не на емаила, откажи спама) да използва примерно sqlite, който не се нуждае от сървър и тн.
големият проблем, е че не разбирам нищо от C иначе да го бях натракал и сам'<img'>
Активен

teleport

  • Напреднали
  • *****
  • Публикации: 134
    • Профил
Arpwatch-db
« Отговор #3 -: Apr 14, 2008, 10:31 »
Вместо да се преправя толкова сорса, защо не си изведеш връзката с базата данни във външен скрипт, примерно php?

примерно накрая на сорса вместо:

execl(sendmail, "sendmail", "-odi", watcher, NULL);

напиши:

execl("/usr/bin", "php", "-q /usr/bin/myscript.php", watcher, NULL);

Във php скрипта можеш да направиш каквото ти хрумне с информацията. Ако няма инсталиран php и не искаш да го има ползвай bash, perl, python или направо викай sqlite3 с подходящ синтаксис.
Активен

edmon

  • Гост
Arpwatch-db
« Отговор #4 -: Apr 14, 2008, 10:51 »
ии тва вече мога да го изтрещя '<img'>
мерси !
'<img'>
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Arpwatch-db
« Отговор #5 -: Apr 14, 2008, 14:49 »
Абе не че нещо ама ми се струва малко брутално това и от стремеж да осигуряваш секюритито, рискуваш да те DoS-нат лошо.

Заради един INSERT в една база да exec-ваш цял php интерпретатор, който от своя страна да тъпче в базата е грубо. Някой майтапчия в локалната мрежа може да си напише един тъп скрипт, който flood-ва със случаен src mac адрес и да ти гледа сеира '<img'>

..при което ще се форк-нат за нула време няколкостотин/хиляди (зависи от ulimits) php процеса, които ще се опитат да insert-ват в базата. Моето шесто чувство казва, че машината ще се тръшне (тя не че няма вероятност да се тръшне ако се вика sendmail, но там е по-трудно поради ред причини).

Освен което гледайки следното:

Цитат

-rwxrwxr-x 1 root root 3086552 2006-11-22 23:51 /usr/bin/php4
-rwxr-xr-x 1 root root 77708 2008-02-18 01:12 /usr/bin/mysql


ми идва наум че е по-добре директно да се вика mysql, отколкото php.

Например така:

Примерен код

int MAXSIZE=1024; // stupid
char query[MAXSIZE];
char dbname[9]="arpwatch";
sprintf(query,"-e \"INSERT INTO tablename (hostname,ip,ether,oldether,timestamp) VALUES ('%s', '%s', '%s', '%s', '%s');\"", hn, intoa(a), e2str(e1), e2str(e2), fmtdate(*t2p));
execl("/usr/bin/mysql","mysql",dbname,query,NULL);


И съответно трябва да има база arpwatch, с таблица tablename с varchar  полета hostname, ip, ether, oldether, timestamp.

Но и това не е решение, въпреки че е по-бързо отколкото с php. В идеалният случай биха се ползвали функциите от mysql клиентската библиотека, но пък там става по-сложно и трябва да се чете - имал съм малко вземане-даване колкото да се отвратя, голяма мешаница от типове данни и функции за превръщането им е.



Активен

"Knowledge is power" - France is Bacon

edmon

  • Гост
Arpwatch-db
« Отговор #6 -: Apr 14, 2008, 19:44 »
да прав си сигурно.
а проблемите с такива майтапчии обикновенно ги решаваме много коректно...
изкл. на кабелчето от суича и да ходи да се прави на интересен другаде'<img'> доживотно!!!

....
а тогава щом е възможно да си вкарам автогол, няма ли да е подобре, да ги трупа  работите в файлче и на пет минутки да го  чета и записвам в базата като същевременно го изчиствам?
мисля че в файлче колкото и да ме флоодват толкова ще може да го преглътне...
....
така може ли да се промени...
не че нещо ама го направих с пхп-то и гледам, няколко пъти арпуоча се е зомбирал
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Arpwatch-db
« Отговор #7 -: Apr 14, 2008, 20:06 »
Това със зомбирането е интересно. Ако сложиш накрая на скрипта exit(0) дали ще се зомбира (интересно ми е) ?

А иначе може да пише във файл, обаче ще трябва да промениш малко програмата, няма никакъв смисъл да форк-ваш нов процес, който да пише във файла. Не че не може да стане и така (отворените файлови дескриптори трябва да се споделят между процеса-родител и "детето"), но като гледам няма кой да види сметката на форк-натия процес след това. Ако ще го правиш във файл, дефинирай глобална променлива FILE *logfile; в началото на програмата го отвори за запис ( logfile=fopen("filename","a+"); ), сглоби си един стринг със sprintf() и го изписваш където трябва с fputs. И евентуално ще трябват проверки, защото ако не си успял да отвориш файла (logfile==NULL) поради някаква причина, опитите да пишеш вътре сигурно ще доведат до крашване на програмата.

Опааа имало кой да се погрижи за форкнатия процес:
pid = waitpid((pid_t)0, &status, WNOHANG);

Е, не знам '<img'>



Активен

"Knowledge is power" - France is Bacon

teleport

  • Напреднали
  • *****
  • Публикации: 134
    • Профил
Arpwatch-db
« Отговор #8 -: Apr 14, 2008, 20:37 »
Цитат
..при което ще се форк-нат за нула време няколкостотин/хиляди (зависи от ulimits) php процеса, които ще се опитат да insert-ват в базата. Моето шесто чувство казва, че машината ще се тръшне (тя не че няма вероятност да се тръшне ако се вика sendmail, но там е по-трудно поради ред причини).
Гледайки кода:

while (cdepth >= 3) {
syslog(LOG_ERR, "report: pausing (cdepth %d)", cdepth);
pause();
}

ми се струва малко трудно да се стартират повече от 2 едновременни php процеса... Малко е далечко от идеята за DoS. Не съм си правил труд да преглеждам целия код, но според мене докато тече тоя while се игнорират пристигащите arp пакети, така че няма опастност. Пък и след първото изпъление на php-то то ще остане кеширано в паметта.
« Последна редакция: Dec 01, 2008, 11:49 от neter »
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Arpwatch-db
« Отговор #9 -: Apr 14, 2008, 20:52 »
Ммм, да, прав си, няма да се репорт-ват повече, значи нямаме вероятност от форкбомби. За кеширането - ще се кешира, но нямах предвид това че ще има голямо I/O - ще има голям memory footprint. Въпреки че не знам - те поне .text сегментите май се мапват от едно и също място във адресното пространство на php процесите?
Активен

"Knowledge is power" - France is Bacon

teleport

  • Напреднали
  • *****
  • Публикации: 134
    • Профил
Arpwatch-db
« Отговор #10 -: Apr 14, 2008, 21:14 »
Честно казано никога не съм се замислял. Според мене вкарването на лан картата в promisc mode от arpwatch е достатъчно голямо натоварване за да се мисли чак толкова и за userspace процеси. Паметта е евтина, отделно ако човека е сериозен и все пак държи на php ( което беше просто пример ) спокойно може да си компилира едно php само с вграден sqlite и да деактивира всичките му екстри и модули. После го го слага в /usr/local/bin примерно и готово.

Отделно е силно невероятно някой след това да се логва в рутера и да си разглежда тая sqlite база с sqlite3... Много по-вероятно е да да се появи ( ако вече няма ) apache+phpsqliteadmin и натоварването от aprwatch+php вече е силно несъществено.



Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Arpwatch-db
« Отговор #11 -: Apr 14, 2008, 21:39 »
За това не съм съгласен - вкарването на картата в promisc режим само по себе си не е такъв проблем - ще се вдигат малко повече прекъсвания, но така или иначе в switched среда и с драйвер, който подържа NAPI проблемът не е особено голям.

Проблемът идва оттам, че юзърспейския процес, дали чрез libpcap, дали чрез отваряне на някакъв по-специален raw сокет, успява да тормози достатъчно много процесора, занимавайки се със всеки пристигнал пакет. В случаят с arpwatch нямам идея как се подхожда към проблема, признавам си, не съм гледал особено много сорса, не откривам обаче никакви pcap или сокет функции и предполагам че е изнесена в отделен C файл тази функционалност.
Активен

"Knowledge is power" - France is Bacon

smelkomar

  • Напреднали
  • *****
  • Публикации: 429
    • Профил
Arpwatch-db
« Отговор #12 -: Apr 14, 2008, 21:53 »
Тук се вижда, че разбирате. Я споделете това ще работили успешно с/у рутера? Чисто любителски питам '<img'>

http://www.authsecu.com/arpflood/arpflood.php

Иначе в един доставчик преди време случайно мернах една конзола с това:
http://freequaos.host.sk/arpwatch/
Активен

Ползвам т'ва, к'вот ме кефи

edmon

  • Гост
Arpwatch-db
« Отговор #13 -: Apr 14, 2008, 23:15 »
боже божеееее боже...
малко ви подведох, несъзнателно.....
сорри, че ви занимавах с глупости '<img'>
то т'ва чудо си имало текстов файл в който си записвало нещата...
както винаги за мен - опит за преоткриване на топлата вода...

абе знам си аз, ако нещо не го пише в гугъл значи или е много лесно и тъпо или си измислям глупости!!!!



Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Arpwatch-db
« Отговор #14 -: Apr 14, 2008, 23:42 »
'<img'>

Едно време ползвах това:

http://sisms.no-ip.com/software/arpwatch2html/

(с леки модифкации '<img'> )
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
arpwatch
Хардуерни и софтуерни проблеми
VladSun 8 2717 Последна публикация May 18, 2005, 10:46
от kolio_kolev
arpwatch
Настройка на програми
h7d8 4 1910 Последна публикация Dec 01, 2008, 11:38
от VladSun