snoopy初探

snoopy是什么?刚了解这货的时候,是公司服务器上有snoopy的so无法加载的错误,然后是系统日志里面一堆日志,导致机器空间不足。官方说明是:
Snoopy is designed to aid a sysadmin by providing a log of commands executed.也就是说这货会监控服务器上的命令执行,并记录到syslog。

首先来看下这个功能是怎么被完成的。首先会发现,服务器上的/etc/ld.so.preload这个文件被修改,强制可执行程序加载之前加载snoopy的so:
[cce]
#cat /etc/ld.so.preload
/usr/local/snoopy/lib/snoopy.so
[/cce]
关于ld.so.preload和LD_PRELOAD,可以参考man ld.so:

LD_PRELOAD

A whitespace-separated list of additional, user-specified, ELF shared libraries to be loaded before all others. This can be used to selectively override functions in other shared libraries. For set-user-ID/set-group-ID ELF binaries, only libraries in the standard search directories that are also set-user-ID will be loaded.

/etc/ld.so.preload

File containing a whitespace separated list of ELF shared libraries to be loaded before the program.

也就是说,snoopy.so会在所有ELF文件加载之前预加载,确保将一些系统调用被这货劫持。

如果在机器上执行
[cce lang=”bash”]
ls /notfound
[/cce]
会在系统日志中记录类似:

snoopy[25505]: [uid:0 sid:9701 tty:/dev/pts/15 cwd:/root filename:/bin/ls]: ls /notfound

这样的内容。通过ldd,可以看下一个命令加载的动态链接库:
[cce lang=”bash”]
#ldd /bin/ls
linux-vdso.so.1 => (0x00007fff99fff000)
/usr/local/snoopy/lib/snoopy.so (0x00007fc407938000)
librt.so.1 => /lib64/librt.so.1 (0x0000003e4f600000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003e50200000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003e4fa00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003e4e200000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003e4e600000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003e4ea00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003e4de00000)
libattr.so.1 => /lib64/libattr.so.1 (0x0000003e4f200000)
libsepol.so.1 => /lib64/libsepol.so.1 (0x0000003e4fe00000)
[/cce]
果然snoopy被最早加载了。

那么如果想不要snoopy加载,又有什么办法呢?

搜索了半天,没有看见Linux中有什么办法能够将设置在ld.so.preload中预先加载的so给卸载掉,但是有一个值得注意的是:LD_PRELOAD加载的优先级高于ld.so.preload。
我们能不能通过更早的加载被劫持的系统调用,来避免被劫持呢?答案是肯定的。

首先,我们可以猜测出来这货是不会劫持太多的系统调用,通过nm命令看下snoopy的符号表:
[cce lang=”bash”]
#nm /usr/local/snoopy/lib/snoopy.so

0000000000000890 T execv
0000000000000b00 T execve

[/cce]
这两个系统调用应该是非常熟悉的,函数定义在unistd.h中,主要用于创建新的进程,并加载另一个可执行程序。只要截获了这几个系统调用,就能知道要执行什么命令了。
我们还可以再用bash来验证下:
[cce lang=”bash”]
#strace bash -c “ls /abc”

connect(3, {sa_family=AF_FILE, path=”/dev/log”…}, 110) = 0
sendto(3, “<86>Sep 23 04:34:56 snoopy[28052″…, 104, MSG_NOSIGNAL, NULL, 0) = 104
execve(“/bin/ls”, [“ls”, “/abc”], [/* 29 vars */]) = 0

[/cce]
从这里可以看出两个地方,首先bash在执行ls的时候,的确是通过execve这个系统调用的;其次,这个系统调用已经被snoopy劫持了(向日志设备发送了数据)。

最后,通过代码也验证了这个猜想:代码在这里
[cce lang=”c”]
int execv (const char *filename, char *const argv[]) {
static int (*func)(const char *, char **);

FN(func,int,”execv”,(const char *, char **const));
snoopy_log_syscall_execv(filename, argv);

return (*func) (filename, (char **) argv);
}
int execve (const char *filename, char *const argv[], char *const envp[])
{
static int (*func)(const char *, char **, char **);

FN(func,int,”execve”,(const char *, char **const, char **const));
snoopy_log_syscall_execve(filename, argv, envp);

return (*func) (filename, (char**) argv, (char **) envp);
}
[/cce]
知道了原理,想到绕开,就很简单了。首先,找到execve真实的提供者:从之前ls命令的动态链接库就可以看见大部分系统的系统调用,都在/lib64/libc.so.6中,用nm命令验证下:
[cce lang=”bash”]
#nm /lib64/libc.so.6 | grep execv
0000003e4e29acf0 t __GI_execvp
0000003e4e29a880 t __execve
0000003e4e29a980 T execv
0000003e4e29a880 W execve
0000003e4e29acf0 T execvp
0000003e4e29a8b0 T fexecve
[/cce]
因此,然后尝试执行:
[cce lang=”bash”]
LD_PRELOAD=”/lib64/libc.so.6″ bash -c “ls /abc”
[/cce]
再去查看系统日志,会发现只记录了bash -c “ls /abc”这个命令,真正执行的ls /abc这个命令没有记录。
通过strace也可以看见,在执行ls之前,没有了和系统日志交互的连接了。

stat(“/bin/ls”, {stmode=SIFREG|0755, st_size=91272, …}) = 0

access(“/bin/ls”, X_OK) = 0

access(“/bin/ls”, R_OK) = 0

rtsigaction(SIGINT, {SIGDFL, [], SARESTORER, 0x3e4e2302d0}, {SIGDFL, [], SA_RESTORER, 0x3e4e2302d0}, 8) = 0

rtsigaction(SIGQUIT, {SIGDFL, [], SARESTORER, 0x3e4e2302d0}, {0x1, [], SARESTORER, 0x3e4e2302d0}, 8) = 0

rtsigaction(SIGCHLD, {SIGDFL, [], SARESTORER, 0x3e4e2302d0}, {0x436360, [], SARESTORER, 0x3e4e2302d0}, 8) = 0

execve(“/bin/ls”, [“ls”, “/abc”], [/* 30 vars */]) = 0

也就是说,如果你登陆服务器之后,执行了:
[cce lang=”bash”]
LD_PRELOAD=”/lib64/libc.so.6″ bash
[/cce]
用当前被snoopy劫持的bash再创建一个没有被snoopy劫持的bash,之后执行的所有命令,都不会再被记录。

转载自:https://coolex.info/blog/445.html

时间: 2024-09-10 09:38:30

snoopy初探的相关文章

graphviz dot初探

graphviz dot初探 简介 现在文档都用markdown保存到github.gitlab这种代码仓库.markdown遇到最大的问题就是对图片的引用, 直接用工具绘制的图片可以引用,但是这样没法像md文件那样在git仓库中进行版本管理,而且既然文档用了描述语言, 引用图片源文件能用描述语言就更好了. dot是graphviz的一种描述语言,可以通过graphviz提供的命令行工具生成图片文件. 安装 用gentoo(prefix)安装graphviz直接emerge即可,除了默认的选项,

把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另一个vector,也是将一个vector 的元素逐个赋值给另一vector 的对应元素: //将一个vector 赋值给另一vector,使用迭代器访问vector 中的元素 vector<int> ivec(10, 20); vector<int> ivec1; for (vecto

PHP采集类Snoopy.class.php介绍以及下载

Snoopy 是一个非常强大的PHP类,可以利用该类模拟浏览器来完成获取网页内容和发送表单的任务.下面是详细介绍Snoopy.class.php 的特点和一些常见的用法. 官方网站:http://snoopy.sourceforge.net/ (不能打开国外网站的可使用天行浏览器) 下载地址:http://sourceforge.net/projects/snoopy/ 本站下载地址:PHP采集库Snoopy.class.php下载 下面是Snoopy的一些特点: 1.抓取网页的内容 fetch

php snoopy采集类介绍

Snoopy是一个用来模拟浏览器的一些简单功能的php类,可以获取网页内容,发送表单等操作.Snoopy正确运行需要你的服务器的PHP版本在4以上,并且支持PCRE(Perl Compatible Regular Expressions),基本的LAMP服务都支持.由于它本身是php一个类,无需扩支持,因此在服务器不支持curl的时候是最好的选择. Snoopy的特点: 1.抓取网页的内容 fetch 2.抓取网页的文本内容 (去除HTML标签) fetchtext 3.抓取网页的链接,表单 f

PHP采集利器 Snoopy 试用心得

Snoopy是什么? (下载snoopy) Snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务. Snoopy的一些特点: * 方便抓取网页的内容 * 方便抓取网页的文本内容 (去除HTML标签) * 方便抓取网页的链接 * 支持代理主机 * 支持基本的用户名/密码验证 * 支持设置 user_agent, referer(来路), cookies 和 header content(头文件) * 支持浏览器转向,并能控制转向深度 * 能把网页中的链接扩展

snoopy 强大的PHP采集类使用实例代码

下载地址: http://www.jb51.net/codes/33397.html Snoopy的一些特点: 1抓取网页的内容 fetch 2 抓取网页的文本内容 (去除HTML标签) fetchtext 3抓取网页的链接,表单 fetchlinks fetchform 4 支持代理主机 5支持基本的用户名/密码验证 6 支持设置 user_agent, referer(来路), cookies 和 header content(头文件) 7支持浏览器重定向,并能控制重定向深度 8能把网页中的

snoopy——PHP版的网络客户端

客户端|网络 magpierss中就用到了snoopy,这让我有点兴趣去研究下这个咚咚.再SF上,找到了这个源代码.居然就是一个类,但不要笑看哦,功能可是很强大的.      官方的简介,我翻译了下(汗...最近老是充当翻译的角色)       snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务.    下面是它的一些特征:1.方便抓取网页的内容2.方便抓取网页的文字(去掉HTML代码)3.方便抓取网页的链接4.支持代理主机5.支持基本的用户/密码认证模

ASP.NET ViewState 初探 (1)

ASP.NET ViewState 初探 Susan WarrenMicrosoft Corporation 2001 年 11 月 27 日 与刚接触 ASP.NET 页面的开发人员交谈时,他们通常向我提出的第一个问题就是:"那个 ViewState 到底是什么?"他们的语气中流露出的那种感觉,就象我来到一家异国情调的餐馆,侍者端上一道我从未见过的菜肴时的那种感觉 - 既疑惑不解,又充满好奇.但肯定有人认为它不错,否则就不会提供了.所以,我会先尝一尝,或许会喜欢上它,尽管它看上去的确

于EYE candy滤镜应用于补间实例初探

滤镜 在刚接触EYE candy滤镜时,我就曾经对几个常用滤镜进行实例讲解,在讲解fire(火)滤镜的时候,用到的实例就是燃烧火焰字的动画,当时是用逐帧制作来实现效果的.后来在写<FW网页设计专家门诊>的时候,也沿用了这一方法,重点是介绍fire滤镜,而不是动画的制作过程. 在看到文字颜色渐变动画的相关帖子时,忽然想起来其实eye candy也可以和FW的内置效果一样,用补间实例来实现动画效果,比逐帧改滤镜参数要容易的多. 就拿制作燃烧火焰字的例子来看: 1.输入文字,设置渐变修饰一下,按F8