君子藏器于身待时而动,安全不露圭角覆盂之安。
——AnonySec
项目地址:Metasploit Modules
前言
在进行内网渗透时,有时会遇到SQL Server数据库,当获取到正确口令信息时,经常会用到SQLTOOLS
一类的渗透工具,但依赖xp_cmdshell
需要开启,才能执行系统命令。这里就联想到实战中的需求,也正是本文要讲述的方法:**利用Metasploit,通过正确的SQL Server口令信息,可启用xp_cmdshell
,并获取目标系统session
**。
参数
msftidy
使用Metasploit中名为msftidy
的内置工具,检查开发的模块语法是否正确。
loadpath
Metasploit每次更新,所有模块都会被删除,创建外部目录不被删除(虚拟分支): 外部目录要与msf目录结构相同,之后在msf中使用loadpath 绝对路径/Metasploit/
载入。
当前msf适用,退出后需要重新加载loadpath
reload
在不关闭metasploit的情况下使用reload命令重新载入编辑过的模块。
内置模块测试
Metasploit中内置了mssql_payload
模块,但攻击效果不是很好,session弹不回来。
编写mssql_powershell模块
mssql_powershell
是在mssql_payload
基础上进行修改的。
接下来进行分解讲述:
代码头部
1 | ## |
基本选项
- Boolean 布尔选项类型 https://rapid7.github.io/metasploit-framework/api/Msf/OptBool.html
- Required (参数是否为必填项) “false”
- Current Setting (当前的设置) “true” 即默认使用 PowerShell
1 | register_options( |
检查目标是否存在漏洞可被利用
1 | def check |
启用xpcmdshell
先以SQLTOOLS
工具尝试
回到代码中,引用mssql.rb
中的mssql_xpcmdshell
方法
1 | def run |
定义主体代码
定义upload_powershell_exec
主要函数,exe
是从下面Msf::Util::EXE.to_win32pe(framework,payload.encoded)
发过来的二进制文件
1 | def upload_powershell_exec(exe, debug=false) |
调试状态下debug=true
的输出
十六进制转换,创建随机文件名,输出状态
1 | # 十六进制转换,“H:打开二进制格式的文件,以十六进制转换“ |
通过powershell创建一个从十六进制至二进制的转换:$s
变量中的`r
与 `n
替换空字符,去除回车换行符,由于MSSQL存在一个字符长度限制,需要将十六进制的payload分成500字节分块,payload被分到多个请求中,传到目标系统中就会被添加回车换行符。如不去除,生成的二进制文件将损坏,就不能执行;通过[Convert]::ToByte 让powershell
将十六进制的文件写入到 #{var_payload}.exe
二进制程序中
1 | h2b = "$s = gc 'C:\\Windows\\Temp\\#{var_payload}';$s = [string]::Join('', $s);$s = $s.Replace('`r',''); $s = $s.Replace('`n','');$b = new-object byte[] $($s.Length/2);0..$($b.Length-1) | %{$b[$_] = [Convert]::ToByte($s.Substring($($_*2),2),16)};[IO.File]::WriteAllBytes('C:\\Windows\\Temp\\#{var_payload}.exe',$b)" |
转换编码,输出状态
1 | # 将h2b字符串转换为Unicode编码 |
计数器idx
每次增长cnt
(500)个字节。简单说:读取500字节,发送,再读取,再发送,直到读到文件末尾。
1 | # 基础计数器idx最初位置为0,标识文件末尾 |
利用PowerShell EncodedCommand
命令转换payload,之后执行,输出相关状态
1 | print_status("Converting the payload utilizing PowerShell EncodedCommand...") |
攻击模块的主体代码使用
1 | def exploit |
处理与目标系统间的连接
1 | handler |
完整载入运行
1 | msf5 > loadpath /Users/anonysec/Desktop/Metasploit/ |
注:调试状态下debug=true
小结
只要对Metasploit框架有兴趣,并已经查看了现有代码是如何工作的,就可以充分利用现有代码,拿过来改改,并增加一些原创代码这样的流程。在大多数情况下,没必要完全从零开始来编写自己的模块代码。这就是代码重用的能量。
References
- Metasploit API
- Metasploit WIKI
- 《Metasploit: The Penetration Tester’s Guide》