linux二进制污染
linux二进制污染
攻击者通过替换、劫持、篡改、伪造系统二进制文件或其加载流程,使程序执行恶意代码
path污染
PATH 是一个非常核心的环境变量。它指定了系统在执行命令时去哪些目录中寻找对应的可执行程序。
path污染是添加一个path路径,改变命令的执行的二进制文件,指定一个恶意的二进制文件

.bashrc 或 .bash_profile(当前用户生效) /etc/profile 或 /etc/environment(所有用户生效)
添加一个恶意的二进制文件:
1 | cat /tmp/ls |
在.bashrc添加一行:
1 | export PATH=/tmp:$PATH |

使.bashrc配置文件生效,验证:
1 | [root@localhost ~]# source .bashrc |
二进制替换
二进制替换是替换或更改系统原有的二进制文件
1 | [root@localhost ~]# mv /usr/bin/ls /usr/bin/ls.bak |
验证:
1 | [root@localhost ~]# ls |
RPM 完整性校验:安装rpm包时,系统会把文件信息(文件大小,MD5,权限,属主,属组,修改时间等)保存到:/var/lib/rpm/数据库中。之后:RPM 可以重新计算当前文件状态,与安装时记录对比。
RPM 包(全称 Red Hat Package Manager)是 Linux 系统的标准软件包格式(文件扩展名 .rpm),主要用于 Red Hat、CentOS、Fedora 等发行版。它将软件的应用程序、配置文件和依赖信息打包在一起,方便用户进行安装、升级和管理。类似于Windows 的 .exe 安装程序
rpm check
1 | rpm -Vf /usr/bin/ls |
1 | S 文件大小是否改变 |
动态库污染
静态链接:对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下,所以这些函数库被成为静态库(static libaray),通常文件名为“libxxx.a”的形式。
动态链接:把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是动态链接库(dynamic link library)技术,动态链接库文件名为“libxxxx.so”的形式。(so有可能是shared object的缩写)
动态链污染就是劫持:程序内部函数
动态链接过程:
1 | ELF程序 |
ELF 是 Executable and Linking Format 的缩写,它是 Linux 平台上通用的二进制文件格式
LD_PRELOAD 劫持
LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。
实例:隐藏malware文件
首先在tmp目录下创建一个malware文件

编写一个恶意库:
1 | #define _GNU_SOURCE |
编译:
1 | gcc -shared -fPIC evil.c -o evil.so -ldl |
添加环境变量:
1 | export LD_PRELOAD=./evil.so |
执行ls:

执行过程:
1 | ls |
LD_LIBRARY_PATH 污染
LD_LIBRARY_PATH 是 Linux 动态链接器里的一个核心环境变量。**作用:**指定动态库(.so)搜索路径。
Linux 动态库加载顺序通常:LD_PRELOAD-->LD_LIBRARY_PATH-->RPATH / RUNPATH-->ld.so.cache-->系统默认目录
实例,隐藏一个进程:
创建一个进程:
1 | sleep 1000 & |

编写恶意 libcHook
1 | #define _GNU_SOURCE |
编译:
1 | gcc -shared -fPIC evil.c -o /tmp/evil/libc.so.6 -ldl |

1 | [root@localhost ~]# echo "export LD_LIBRARY_PATH=/tmp/evil" >> .bashrc |
验证:
1 | ps aux |grep sleep |
当然没成功。编写的libc.so.6只是一个 Hook so,并不完整。
RPATH/RUNPATH 污染
与LD_LIBRARY_PATH 污染类似
参考:
