Jo *_*Kin 7 ext4 malware debugfs
我在删除空目录时遇到问题,strace 显示错误:
rmdir("empty_dir") = -1 ENOTEMPTY (Directory not empty)
Run Code Online (Sandbox Code Playgroud)
并且ls -la empty_dir
什么都不显示。所以我用 debugfs 连接到 fs (ext4) 并看到这个目录中的隐藏文件:
# ls -lia empty_dir/
total 8
44574010 drwxr-xr-x 2 2686 2681 4096 Jan 13 17:59 .
44573990 drwxr-xr-x 3 2686 2681 4096 Jan 13 18:36 ..
debugfs: ls empty_dir
44574010 (12) . 44573990 (316) ..
26808797 (3768) _-----------------------------------------------------------.jpg
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?有没有机会在不卸载和全面检查 fs 的情况下解决这个问题?
附加信息:
“隐藏”文件只是一个普通的 jpg 文件,可以通过图像查看器打开:
debugfs: dump empty_dir/_-----------------------------------------------------------.jpg /root/hidden_file
# file /root/hidden_file
/root/hidden_file: JPEG image data, JFIF standard 1.02
Run Code Online (Sandbox Code Playgroud)
rm -rf empty_dir
没有遇到相同的错误:
unlinkat(AT_FDCWD, "empty_dir", AT_REMOVEDIR) = -1 ENOTEMPTY (Directory not empty)
Run Code Online (Sandbox Code Playgroud)
find empty_dir/ -inum 26808797
什么都不显示。
我进行了跟踪ls
并获得了更多信息来挖掘(剥离了不重要的系统调用):
open("empty_dir", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 3 entries */, 32768) = 80
write(1, ".\n", 2.) = 2
write(1, "..\n", 3..) = 3
Run Code Online (Sandbox Code Playgroud)
嗯,我们看到系统调用getdents
工作正常并返回了所有 3 个条目('.'、'..' 和 '-----*'),但ls
只写入了 '.' 和 '..'。getdents
这意味着coreutils 使用的包装器存在一些问题。coreutils 使用readdir
glibc 包装器来处理getdents
. getdents
还要证明我从 getdents 手册页的示例部分测试了小程序没有问题。该程序显示了所有文件。
也许我们刚刚发现了 glibc 的一个错误?所以我将 glibc 包更新到发行版中的最新版本,但没有得到任何好的结果。另外我在bugzilla中没有找到任何相关信息。
那么让我们更深入地了解一下:
# gdb ls
(gdb) break readdir
(gdb) run
Breakpoint 1, 0x00007ffff7dfa820 in readdir () from /lib64/libncom.so.4.0.1
(gdb) info symbol readdir
readdir in section .text of /lib64/libncom.so.4.0.1
Run Code Online (Sandbox Code Playgroud)
等等,什么?libncom.so.4.0.1?不是libc?是的,我们只是看到一个带有 libc 函数的恶意共享库,用于隐藏恶意活动:
# LD_PRELOAD=/lib64/libc.so.6 find / > good_find
# find / > injected_find
# diff good_find injected_find
10310d10305
< /lib64/libncom.so.4.0.1
73306d73300
< /usr/bin/_-config
73508d73501
< /usr/bin/_-pud
73714d73706
< /usr/bin/_-minerd
86854d86845
< /etc/ld.so.preload
Run Code Online (Sandbox Code Playgroud)
删除rootkit文件,检查所有包的文件(rpm -Va
在我的例子中),自动启动脚本,预加载/预链接配置,系统文件(find /
+rpm -qf
在我的例子中),更改受影响的密码,查找并杀死rootkit的进程:
# for i in /proc/[1-9]*; do name=$(</proc/${i##*/}/comm); ps -p ${i##*/} > /dev/null || echo $name; done
_-minerd
Run Code Online (Sandbox Code Playgroud)
最后完整系统更新,重新启动并解决问题。成功入侵的原因:ipmi 接口具有非常旧的固件,突然可以从公共网络获得。
归档时间: |
|
查看次数: |
1850 次 |
最近记录: |