Human oriented IDS

cdp_xe

Well-Known Member
Hallo,

ich hab in den letzten Tagen ein neues IDS entwickelt. Es basiert auf meinem alten FUPIDS Projekt und nennt sich fupids2. fupids2 erstellt aus netzwerkweiten Informationen Verhaltensmuster einzelner Benutzer (z.B. zu welchen Zeiten ein Nutzer eingeloggt ist und ob er gerne am Fenster sitzt, in welchem Haus er eingeloggt ist, welche Räume er benutzt und welche Programme). Weicht das Verhalten eines Benutzers mal sehr davon ab, kann fupids2 einen entsprechend hohen "attacker level" protokollieren und den Admin darüber in Kenntnis setzen.

Ich hab ein Paper und eine erste Beta-Version auf http://cdp.doomed-reality.org/fupids2/ hochgeladen.

Jedenfalls konnte ich das Tool bisher nur unter OpenBSD 3.6 x86 und Slackware 10.1 x86 testen, weil mir keine anderen Systeme zur Verfügung stehen. Es wäre toll, wenn der eine oder andere unter euch das unter anderen Systemen testen würde. (Mich würde speziell interessieren, ob es unter NetBSD, FreeBSD, anderen Linux-Distributionen und Solaris kompiliert und auch, ob es beim kompilieren irgendwelche Warnmeldungen gibt).

Ausserdem bin ich natürlich an Verbesserungsvorschlägen und Meinungen interessiert.

cdp.
 
Hallo,

laeuft ohne Problem unter OpenBSD 3.8. Werde es demnaechst wenn ich Zeit habe, unter Crux Linux unte unter NetBSD testen. Fuer Rueckfragen kannst du mich gerne per PN oder e-mail kontaktieren.

mfg dct.c
 
Hallo,

habe das ganze jetzt mal unter NetBSD 3.0 RC5 und unter NetBSD 2.0.2 getestet, und leider zweimal die gleiche Fehlermeldung. Habe dir mal den relevanten Teil raus kopiert und hier als *.txt datei angehaengt.

mfg dct.c
 

Anhänge

  • netbsd_fupids_error.txt
    409 Bytes · Aufrufe: 349
Code:
../../../../kern/kern_exec.c: In function `sys_execve`:
../../../../kern/kern_exec.c:718 warning: passing arg 2 of
`upid_userfind` makes integer from pointer without cast
*** Error Code 1

Hmm... upid_userfind() Dass ist ne Kernelfunktion von FUPIDS, nicht von fupids2 :-)
Du hast den FUPIDS-1 Code runtergeladen (dass ist OpenBSD Kernelcode den ich für
OpenBSD-3.1 entwickelt hatte). fupids2 ist ein Userspace tool dass du hier findest:

http://cdp.doomed-reality.org/fupids2/

:) :)

Aber ich find es faszinierend, dass FUPIDS1 noch unter Version 3.8 kompiliert. Wow! Ich bin begeistert :-)
 
cdp_xe schrieb:
Code:
../../../../kern/kern_exec.c: In function `sys_execve`:
../../../../kern/kern_exec.c:718 warning: passing arg 2 of
`upid_userfind` makes integer from pointer without cast
*** Error Code 1


Du hast den FUPIDS-1 Code runtergeladen (dass ist OpenBSD Kernelcode den ich für
OpenBSD-3.1 entwickelt hatte). fupids2 ist ein Userspace tool dass du hier findest:

http://cdp.doomed-reality.org/fupids2/

:) :)

Aber ich find es faszinierend, dass FUPIDS1 noch unter Version 3.8 kompiliert. Wow! Ich bin begeistert :-)

Hmm...das kann nicht sein. Da ich es auf 3 speraten Kisten getestet habe. Ich glaub nicht das ich 3 mal das falsche fupids gedownloadet habe. :)

Code:
xenon% wget http://freshmeat.net/redir/fupids2/61975/url_tgz/fupids2-0.3beta.tgz
--22:34:02--  http://freshmeat.net/redir/fupids2/61975/url_tgz/fupids2-0.3beta.tgz
           => `fupids2-0.3beta.tgz'
Resolving freshmeat.net... 66.35.250.168
Connecting to freshmeat.net|66.35.250.168|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://cdp.doomed-reality.org/fupids2/fupids2-0.3beta.tgz [following]
--22:34:03--  http://cdp.doomed-reality.org/fupids2/fupids2-0.3beta.tgz
           => `fupids2-0.3beta.tgz'
Resolving cdp.doomed-reality.org... 195.137.212.23
Connecting to cdp.doomed-reality.org|195.137.212.23|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 60,190 (59K) [application/x-tar]

100%[============================================>] 60,190       118.61K/s             

22:34:04 (118.47 KB/s) - `fupids2-0.3beta.tgz' saved [60190/60190]

xenon% tar xvfz fupids2-0.3beta.tgz                                          ~ (pts/12)
fupids
fupids/sys
fupids/sys/net
fupids/sys/net/if.c
fupids/sys/net/mypatch
fupids/sys/net/if.c.orig
fupids/sys/kern
fupids/sys/kern/fupids.c
fupids/sys/kern/init_main.c
fupids/sys/kern/kern_exec.c
fupids/sys/kern/uipc_socket.c
fupids/sys/sys
fupids/sys/sys/fupids.h
fupids/sys/conf
fupids/sys/conf/files
fupids/fupids
fupids/fupids/sys
fupids/fupids/sys/kern
fupids/fupids/sys/kern/fupids.c
fupids/fupids/sys/sys
fupids/fupids/sys/sys/fupids.h
fupids/fupids/INSTALL
fupids/fupids/p_nif
fupids/fupids/p_kuipdsock
fupids/fupids/p_kexec
fupids/backup.sh
fupids/fupids.tgz
fupids/EYGO
xenon% cd fupids                                                             ~ (pts/12)
xenon% cd fupids                                                      ~/fupids (pts/12)
xenon% l                                                       ~/fupids/fupids (pts/12)
INSTALL  p_kexec  p_kuipdsock  p_nif  sys/
xenon% cat p_kexec                                             ~/fupids/fupids (pts/12)
--- kern/kern_exec.c    Fri Dec  5 17:12:22 2003
+++ /home/cdp_xe/projekte/fupids/sys/kern/kern_exec.c   Fri Dec  5 17:14:50 2003
@@ -1,7 +1,7 @@
 /*     $OpenBSD: kern_exec.c,v 1.82 2003/09/01 18:06:03 henning Exp $  */
 /*     $NetBSD: kern_exec.c,v 1.75 1996/02/09 18:59:28 christos Exp $  */
 
-/*-
+/* Copyright (c) 2003 Steffen Wendzel. <cdp@doomed-reality.org>
  * Copyright (C) 1993, 1994 Christopher G. Demetriou
  * Copyright (C) 1992 Wolfgang Solfrank.
  * Copyright (C) 1992 TooLs GmbH.
@@ -65,6 +65,9 @@
 
 #include <dev/rndvar.h>
 
+#ifdef FUPIDS
+       #include <sys/fupids.h>
+#endif
 /*
  * Map the shared signal code.
  */
@@ -436,6 +439,11 @@
        VREF(pack.ep_vp);
        p->p_textvp = pack.ep_vp;
 
+#ifdef FUPIDS
+       if(curproc->p_cred->p_ruid >= 1000)
+               upid_userfind(curproc->p_cred->p_ruid, NULL);
+#endif
+
        p->p_flag |= P_EXEC;
        if (p->p_flag & P_PPWAIT) {
                p->p_flag &= ~P_PPWAIT;
@@ -620,6 +628,7 @@
                ktremul(p, p->p_emul->e_name);
 #endif
        p->p_flag &= ~P_INEXEC;
+
        return (0);
 
 bad:
xenon%

Ist da irgend wie etwas drucheinander gekommen. :)

mfg dct.c
 
Oh my god!

Ich hab das falsche Verzeichnis ausgewählt :-(
Ich hatte doch tatsächlich das fupids Verzeichnis in das tar-Archiv eingepackt und die letzten 100 Downloads wurden mit der entsprechenden Version "beglückt". So ein Mist.

Jetzt ist jedenfalls die richtige Version online. Ziehmliche Miesere...

cdp
 
PS. Danke! Sonst hätt ich das evtl. erst in einer Ewigkeit mitbekommen. Hab gleich mal die News-Einträge und freshmeat updated.

Das erklärt so vieles. Die ganzen komischen Reaktionen a la "Das gibts doch schon" zum Beispiel.
 
Dumme Frage: würde das Teil denn auch unter Windows oder Cygwin laufen? Weil dann wäre es unter Umständen eine Spitzensache für die Firma, wo leider Windows am Arbeitsplatz im Einsatz ist.


- scip
 
theoretisch müsste das laufen. ich weiß nicht, was windows mit den pfaden macht. die sind im unix-format. hmm... kompilieren könnte es schon wenn du den gcc und w und die bash usw. hast.

du müsstest dann noch das script für den client anpassen. hmm... es gibt ja auch ne freie ssh-clientimplementierung. also weißt du.. das einfachste wäre:

windows clients+unix-server.

ja genau.

wenn du das shellskript unter windows zum laufen bekommst und irgendwie via putty oder so die erzeugten logdateien auf den unix-server kopieren kannst und auf dem dann der serverprozess läuft, wärs kein problem.

cdp
 
cdp_xe schrieb:
PS. Danke! Sonst hätt ich das evtl. erst in einer Ewigkeit mitbekommen. Hab gleich mal die News-Einträge und freshmeat updated.

Das erklärt so vieles. Die ganzen komischen Reaktionen a la "Das gibts doch schon" zum Beispiel.

Kein Problem, sowas kann vorkommen :). Werde mich bei gelegeneheit wieder ans testen machen.

mfg dct.c
 
Ok, hervorragend. Ich habs gleich mal angepasst. Mit 0.4beta sollte es auch unter MacOSX dann prima funktionieren. Dann werd ich mich jetzt mal an das neuronale Netz setzen.
 
So, wie versprochen, der Cygwin Test.

'make' bleibt beim strip hängen, compiliert hat er aber:
Code:
iz00468@IZN16032: $ make
g++  -Wall -Wshadow -c -Isrc/include src/server.cpp
g++  -Wall -Wshadow -c -Isrc/include src/directory.cpp
g++  -Wall -Wshadow -c -Isrc/include src/workstations.cpp
g++  -Wall -Wshadow -c -Isrc/include src/users.cpp
g++  -Wall -Wshadow -c -Isrc/include src/misc.cpp
g++  -Wall -Wshadow -c -Isrc/include src/log.cpp
g++  -O -o fupids2 server.o directory.o workstations.o users.o misc.o log.o
strip --strip-debug --strip-unneeded fupids2
strip: fupids2: No such file or directory
make: *** [fupids2] Error 1

Ursache: das binary heisst halt fupids2.exe :)

'make install' läuft gar nicht, das Verzeichnis /usr/local/sbin gabs hier nicht und der Installer hat auch nicht versucht, es zu erzeugen, das sollte er IMHO aber tun. Nachdem ich es manuell erzeugt hatte, ging das aber trotzdem noch net, weil er halt 'fupids2' kopieren will, nicht 'fupids2.exe'.

Ausserdem ist in der Datei INSTALL ein Fehler, dort steht, man solle nach der Installation '/usr/local/sbin/fupids' ausführen, es müsste aber '/usr/local/sbin/fupids2' sein, resp. '/usr/local/sbin/fupids2.exe' unter Cygwin.

Jedenfalls startet der Server:

Code:
iz00468@IZN16032: $ /usr/local/sbin/fupids2.exe
unable to open userfile /var/fupids2/fupids2.userdb, seems to be the first start of fupids2.
[loading base-config]
                ------initializing host IZN16032, building HOME, et 0, room 2, m,f... [ok]


Allerdings hab ich das Client/Server System noch nicht ganz verstanden. Muss auf jedem Client auch der "Server" laufen? Und woher weiss der Server nun, wenn ich mich an nem anderen Rechner einlogge? Bzw. wie kann ich das simulieren, da ich im Moment per Telearbeit daheim nur einen Rechner hab.


Gruss, scip
 
Also ich hab das in der INSTALL-Datei mal angepasst. Ausserdem prüft jetzt die Makefile ob /usr/local/sbin existiert und erzeugt das ganze ggf. Ausserdem wird bei allem, was mit der fupids2-Datei gemacht wird geprüft, ob es nicht eine fupids2.exe ist, um die es sich handelt.

Die neue tgz gibts allerdings noch nicht. Ich werd die in den nächsten Tagen hochladen.

Aber jetzt zu deiner eigentlichen Frage:

>Allerdings hab ich das Client/Server System noch nicht ganz verstanden. Muss auf jedem Client auch der "Server" laufen? Und woher weiss der Server nun, wenn ich mich an nem anderen Rechner einlogge? Bzw. wie kann ich das simulieren, da ich im Moment per Telearbeit daheim nur einen Rechner hab.<

Also es gibt nur einen einzigen Server im Netzwerk (naja, man kann auch pro Subnetzwerk einen machen, aber generell gibts eigentlich nur einen). Die Clients übertragen die Daten dann auf einem Weg, der einem frei steht zum Server.

Also unter Windows... hmm... wenn Server und Client unter Windows laufen... hmm... du müsstest auf jedem Client cgywin laufen haben und dort via cronjob (geht das unter windows?) periodisch das client.sh-script ausführen. Das ssh-Zeug kommentierst du dann einfach aus und sagst dem Skript, es soll die Datei mit dem Namen
Code:
$TARGETFILE
z.B. via Windows-Filesharings auf den Server kopieren.

Also sagen wir mal das Laufwerk Q: auf den Clients ist ein Netzlaufwerk vom System auf dem der fupids-Server läuft, dann würde das client.sh-skript meinetwegen alle 30 minuten auf Laufwerk Q: eine Datei erzeugen die den Namen $TARGETFILE trägt. Der Server kann dann auf die Datei zugreifen.

Allerdings muss das Verzeichnis, was für die Clients Q: ist beim Serverprozess unter /var/fupids2/reports zu finden sein.

Wenn du das hinbekommst, müsste es laufen!

Mir fällt grad ein, dass die evtl. kommende Tcl/Tk-GUI auch unter Win laufen müsste. Ich teste grad wish unter Windows 2000 und es läuft prima. Aber die GUI ist momentan noch in weiter Ferne.

Also hier ist mal ein mögliches client-Skritp für Win32:

Code:
#!/bin/bash
# Kraeht der Hahn auf dem Mist, aendert sichs Wetter, oder es bleibt, wie es ist.

umask 077
TARGETFILE=/`hostname`  # change this path to your public fileshare directory
                        # that your win32 client mounts from your win-server

ps auxw|awk 'BEGIN{p=0;} {
        if($1=="USER" && $11=="COMMAND" && p==0) {
                p=1;
        } else {
                print $1 " " $11
        }
}' | sort | uniq >fupids2.log
mv fupids2.log $TARGETFILE
exit 0

PS: Es ist wichtig, dass der Dateiname dem Hostname entspricht (daher auch die `hostname` Kommandosubstitution).
 
Zuletzt bearbeitet:
Also - hab soeben versucht das ganze auf Solaris Express, Nevada Build 21 (SPARC) zu kompilieren:

Code:
bash-3.00$ make
g++  -Wall -Wshadow src/server.cpp
src/server.cpp:21:21: fupids2.h: Datei oder Verzeichnis nicht gefunden
src/server.cpp:23: error: `Users' does not name a type
src/server.cpp: In function `void sig_handler(int)':
src/server.cpp:28: error: `SYSL_NOTICE' undeclared (first use this function)
src/server.cpp:28: error: (Each undeclared identifier is reported only once for each function it appears in.)
src/server.cpp:28: error: `syslog' undeclared (first use this function)
src/server.cpp:29: error: `USRS' undeclared (first use this function)
src/server.cpp:33: error: `exit' undeclared (first use this function)
src/server.cpp: In function `int main(int, char**)':
src/server.cpp:48: error: `FILE' undeclared (first use this function)
src/server.cpp:48: error: `hostfile' undeclared (first use this function)
src/server.cpp:49: error: `Directory' undeclared (first use this function)
src/server.cpp:49: error: expected `;' before "REPDIR"
src/server.cpp:50: error: `Workstations' undeclared (first use this function)
src/server.cpp:50: error: expected `;' before "WS"
src/server.cpp:51: error: `Log' undeclared (first use this function)
src/server.cpp:51: error: expected `;' before "LOG"
src/server.cpp:52: error: `pid_t' undeclared (first use this function)
src/server.cpp:52: error: expected `;' before "pid"
src/server.cpp:57: error: `INCOMING_DIR' undeclared (first use this function)
src/server.cpp:57: error: `chdir' undeclared (first use this function)
src/server.cpp:58: error: expected `)' before "INCOMING_DIR"
src/server.cpp:58: error: `perror' undeclared (first use this function)
src/server.cpp:59: error: `stderr' undeclared (first use this function)
src/server.cpp:59: error: expected `)' before "INCOMING_DIR"
src/server.cpp:59: error: `fprintf' undeclared (first use this function)
src/server.cpp:60: error: `fflush' undeclared (first use this function)
src/server.cpp:61: error: `exit' undeclared (first use this function)
src/server.cpp:64: error: `SIGINT' undeclared (first use this function)
src/server.cpp:64: error: `signal' undeclared (first use this function)
src/server.cpp:64: error: `SIG_ERR' undeclared (first use this function)
src/server.cpp:68: error: `SIGTERM' undeclared (first use this function)
src/server.cpp:74: error: expected `)' before "FUPIDS_VERSION"
src/server.cpp:74: error: `printf' undeclared (first use this function)
src/server.cpp:76: error: `pid' undeclared (first use this function)
src/server.cpp:76: error: `fork' undeclared (first use this function)
src/server.cpp:82: error: `setsid' undeclared (first use this function)
src/server.cpp:83: error: `umask' undeclared (first use this function)
src/server.cpp:84: error: `SYSL_NOTICE' undeclared (first use this function)
src/server.cpp:84: error: expected `)' before "FUPIDS_VERSION"
src/server.cpp:84: error: `syslog' undeclared (first use this function)
src/server.cpp:88: error: `REPDIR' undeclared (first use this function)
src/server.cpp:89: error: `fopen' undeclared (first use this function)
src/server.cpp:89: error: `NULL' undeclared (first use this function)
src/server.cpp:90: error: `SYSL_ERR' undeclared (first use this function)
src/server.cpp:93: error: `WS' undeclared (first use this function)
src/server.cpp:96: error: `fscanf' undeclared (first use this function)
src/server.cpp:96: error: `EOF' undeclared (first use this function)
src/server.cpp:97: error: `USRS' undeclared (first use this function)
src/server.cpp:105: error: `LOG' undeclared (first use this function)
src/server.cpp:109: error: `stdout' undeclared (first use this function)
src/server.cpp:113: error: `fclose' undeclared (first use this function)
src/server.cpp:114: error: `unlink' undeclared (first use this function)
src/server.cpp:117: error: `sleep' undeclared (first use this function)
*** Error code 1
make: Fatal error: Command failed for target `fupids2'
bash-3.00$

Ich habe danach in src/server.cpp das Include angepasst -
Code:
#include "include/fupids2.h"

Ein neuerliches make führt dann zu folgendem:
Code:
bash-3.00$ make
g++  -Wall -Wshadow src/server.cpp
Undefiniertes                   erstmals referenziert
 Symbol                             in Datei
Log::writeline(char*, float)        /var/tmp//ccCvySoc.o 
Users::lookup_user(char*)           /var/tmp//ccCvySoc.o 
Log::~Log()                         /var/tmp//ccCvySoc.o 
Log::Log()                          /var/tmp//ccCvySoc.o 
Users::lookup_tool(char*)           /var/tmp//ccCvySoc.o 
Workstations::Workstations()        /var/tmp//ccCvySoc.o 
Users::Users()                      /var/tmp//ccCvySoc.o 
Users::calc_atklvl(ws_info*)        /var/tmp//ccCvySoc.o 
Users::save_user_config()           /var/tmp//ccCvySoc.o 
Workstations::search_ws(char*)      /var/tmp//ccCvySoc.o 
Directory::next_element()           /var/tmp//ccCvySoc.o 
Directory::Directory()              /var/tmp//ccCvySoc.o 
ld: Schwerer Fehler: Symbolreferenzierungsfehler. Keine Ausgabe in a.out geschrieben
collect2: ld returned 1 exit status
*** Error code 1
make: Fatal error: Command failed for target `fupids2'
bash-3.00$

sofern ich übers Wochenende Zeit habe schau ich mir das genauer an...

PS: auf FreeBSD 5.4 (x86) kompilierts ohne Probleme
 
Hmm.. das liegt daran, dass die Makefile nicht richtig verarbeitet wird. Und zwar scheint dein make mit

CFLAGS+=-c -Isrc/include

nicht klar zu kommen. Würde dass einbezogen werden, würde alles kompilieren. Du bräuchtest also nur die beiden Zeilen
CFLAGS=-Wall -Wshadow
CFLAGS+=-c -Isrc/include

Durch die Folgende ersetzen:

CFLAGS=-Wall -Wshadow -c -Isrc/include

Ich hab das in der Makefile auch gleich mal geändert für die nächste Version. Kann ja sein, dass noch andere make-Implementierungen damit nicht klar kommen...
 
Das ist bisher ziehmlich klasse. Hätte nicht gedacht, dass es so portabel ist.

Mich würde mal interessieren (von denen, die fupids2 tatsächlich am laufen haben), wie zufrieden ihr mit der Detektion seit. Sind es zuviele Logmeldungen? Zu wenige? Sollte man erst bei höheren Attacker-Leveln protokollieren?

Ich überlege, ob ich in der nächsten Version eben neben dem neuronalen Netz als Auswertungsbasis auch den Betrieb mit der jetzigen Fuzzy-Logic als Alternative für den Admin anbieten soll.
 
Zurück
Oben