编程语言
首页 > 编程语言> > Ruby-Metasploit的核心

Ruby-Metasploit的核心

作者:互联网

Ruby-Metasploit的核心

Ruby编程语言可以说是Metasploit框架的核心。

根据Ruby官方网站介绍,Ruby编程语言简单而又强大,面向对象,为解释性语言,执行速度快,项目开发周期短,可以构建自动化类来重用代码是Ruby语言的一个特点,而这个特点正好满足了Metasploit的需求。

日本的松本行弘在1995年设计并实现了Ruby语言。后来它被进一步定义为功能类似与Perl语言的、具有动态特性和反射机制的、通用的面向对象(OOP)的程序设计语言。

可以从http://Rubyinstaller.org/downloads/网站下载Windows/Linux版本的Ruby。
也可通过http://tryruby.org/levels/1/challenges网站获得优秀的Ruby资源。

Ruby语言的基础知识

Ruby的交互式命令行

Ruby语言提供了一个可以进行交互的命令行。在交互式命令行上进行工作可以让我们更清楚理解Ruby的基础知识。

在CMD命令行或者终端窗口输入命令irb来启动Ruby的交互式命令行。

输入数字2:
irb(main):001:0> 2
=> 2

进行加法运算:
irb(main):002:0> 2 + 3
=> 5

对字符串操作:
irb(main):008:0> a = “Ruby”
=> “Ruby”
irb(main):009:0> b =“Metasploit”
=> “Metasploit”
irb(main):010:0> a + b
=> “Ruby Metasploit”

在命令行定义方法:

方法或者函数是一组语句,当我们调用它们时会开始执行。可以简单地在Ruby交互命令行声明一个方法,也可以在脚本里对它们进行声明。在使用Metasploit模块时,Ruby的方法是一个很重要的部分。

它的语法格式:
def method_name [([arg [= default]] … [, * arg [, &expr]])]
expr
end

要定义一个方法,首先以def开始,之后随其后的是方法的名称,然后是包含在括号内的参数和表达式。我们还将一个end声明放在表达式的最后来结束对方法的定义。这里,arg指的是方法所接收的参数,expr指的是方法接收并计算的表达式。

例如:
irb(main):002:0> def xorops(a,b)
irb(main):003:0> res = a ^ b
irb(main):004:0> return res
irb(main):005:0> end
=> :xorops

定义一个名为xoropos的方法,它接收a和b两个参数。接着对接收到的参数进行异或运算,并将结果保存到一个名为res的新变量里。最后用return语句返回结果。

Ruby的输出

Ruby语言提供了puts和print两类输出形式,可以用print_good、print_status、print_error语句来表示成功执行、状态和错误。
例如:
print_good(“Example of Print Good”)
print_error(“Example of Print Error”)
print_status(“Example of Print Status”)

当在Metasploit模块下运行这些命令时会产生如下输出,+符号并绿色显示表示正常,*符号并蓝色显示表示状态信息,-符号并红色显示表示错误信息。
[ + ]Example of Print Good
[ - ]Example of Print Error
[ * ]Example of Print Status

字符串追加

当需要在一个变量后面追加数据的时候,可以用<<运算符。

例如
irb(main):001:0> a = “Ruby”
=> “Ruby”
irb(main):002:0> a << “Metasploit”
=> “Ruby Metasploit”

子字符串函数

在Ruby里可以轻松输入substring函数来获取子字符串——只需要指明子字符串在字符串内的起始位置和长度,就可以获得它。

例如:
irb(main):001:0> a = “123678”
=> “123678”
irb(main):002:0> a[0,2]
=> “12”
irb(main):001:0> a[2,2]
=> “36”

split函数

可以输入split函数将一个字符串类型的值分割为一个变量数组。

例如:
irb(main):001:0> a = “mastering,metasploit”
=> “mastering,metasploit”
irb(main):002:0> b = a.split(",")
=> [“mastering”,“metasploit”]
irb(main):008:0> b[0]
=> “mastering”
irb(main):009:0> b[1]
=> “metasploit”

可以看到,现在已经将字符串转换成了一个新的数组b,这个数组b包括b[0]和b[1]两个元素,分别为“mastering”和“metasploit”。

Ruby的数字和转换

可以直接在算术运算里采用数字。在处理用户的输入时,可以用to_i函数将字符串类型的输入转换成整数。另一方面,也可以采用to_s将一个整数转换成字符串。

例如:
irb(main):001:0> a = “23”
=> “23”
irb(main):002:0>a.to_i + 10
=> 33

irb(main):006:0> am = 29
=> 29
irb(main):007:0> aa = “hello”
=> “hello”
irb(main):008:0> am.to_s + aa
=> “29hello”

Ruby的数值转换

在采用渗透模块和其他模块时,都将利用到各个转换机制。

16进制到10进制的转换:
例如:
irb(main):001:0> a = “10”
=> “10”
irb(main):002:0> a.hex
=> 16

10进制到16进制的转换:
例如:
和上例相反的操作可以采用to_s来实现:
irb(main):003:0> 16.to_s(16)
=> “10”

Ruby的范围

范围(range)是一个很重要的内容,广泛应用在Metasploit的辅助模块里,例如扫描模块和测试模块。

定义一个范围,并且查看一下可以对此数据类型进行哪些操作:
irb(main):002:0> zero_to_nine= 0…9
=> 0…9
irb(main):003:0> zero_to_nine.include?(4)
=>true
irb(main):004:0> zero_to_nine.include?(11)
=> false
irb(main):005:0> zero_to_nine.each{|zero_to_nine| print(zero_to_nine)}
0123456789=> 0…9
irb(main):006:0> zero_to_nine.min
=> 0
irb(main):007:0> zero_to_nine.max
=> 9

可以看到一个范围对象提供的操作,例如搜索、查找最小值和最大值,以及显示范围内的所有数据。这里的include?函数可以检查范围内是否包括某个特定的值。此外,min和max函数可以显示出范围内的最小值和最大值。

Ruby的数组

可以简单地将数组定义为一系列元素的集合。

例如:
irb(main):001:0> name = [“Ruby”,“metasploit”]
=> [“Ruby”,“metasploit”]
irb(main):002:0> name[0]
=> “Ruby”
irb(main):003:0> name[1]
=>“metasploijt”

学到这里,已经介绍了所有编写的Metasploit模块必需的变量和数据类型的相关知识。

有关变量的数据类型的更多信息,请访问:http://www.tutorialspoint.com/ruby/
有关利用Ruby编程的速查表,请参考https://github.com/savini/cheatsheets/raw/master/ruby/,再点击RubyCheat.pdf
若你现在正从别的语言向Ruby语言过渡,这有一份推荐材料:http://hyperpolyglot.org/scripting

Ruby的方法

方法为函数的另一个说法。除了Ruby程序员以外,其他背景的程序员可能经常使用这两类叫法。方法就是指能执行特定操作的子程序。方法的使用实现了代码的重用,大大缩短了程序的长度。定义一个方法很容易,在定义开始的地方使用def关键字,在结束的地方使用end关键字。

例如:
打印出50个空格:
def print_data(part1)
square = par1 * par1
return square
end
answer = print_data(50)
print(answer)

这里的print_data方法接收主函数发送过来的参数,然后让其乘以自身,再使用return将结果返回。这个程序将返回的值放到了一个名为answer的变量内,随后输出流这个值。

决策运算符

与其他任何编程语言一样,决策在Ruby里也是一个简单的概念:

例如:
irb(main):001:0> 1 > 2
=> false
同样,再来查看一个字符串数据的例子:
irb(main):005:0> “Ruby” == “ruby”
=> false
irb(main):006:0> “Ruby” == “Ruby”
=>true

来看一个利用决策运算符的简单程序:
def find_match(a)
if a =~ /Metasploit/
return true
else
return false
end
end
#主函数从这里开始
a = “128924983Metasploitduidsamerican”
bool_b=find_matcch(a)
print bool_b.to_s

在上面的这个程序里,利用了一个包含有“Metasploit” 的字符串,这个字符串里的“Metasploit”前后都添加了一些无用字符。然后将这个字符串赋值给变量a。接下来,将该变量传递给函数find_match(),这个函数的作用是检查该变量是否可以匹配正则表达式/Metasploit/。若这个变量里包含了“Metasploit”,函数的返回值就是true,否则就将false赋值给bool_b变量。

运行上面这个方法将会产生一个true,这是因为按照决策运算符=~的计算,这两个值是匹配的。
前面的程序在Windows系统环境下执行完成后,输出的结果如下:
C:\Ruby23-x64\bin>ruby.exe a.rb
true

Ruby的循环

迭代语句被称为循环。

例如:
def forl(a)
for i in 0…a
print(“Number #{i}n”)
end
end
forl(10)
上面的代码按照定义的范围从0遍历到10,实现了循环打印输出当前的值。在这里我们利用#{i}去打印输出变量i的值。关键字n指定开始了新的一行。因此,每一次打印输出变量时,都会自动占用新的一行。

迭代循环是通过each事先的。这是十分常见的做法,在Metasploit模块里被广泛采用。

例如:
def each_example(a)
a.each do |i|
print i.to_s + “t”
end
end
#主函数从这里开始
a = Array.new(5)
a = [10,20,50,90,111]
each_example(a)
在上面的代码里,定义了一个方法,这个方法接收一个数组a,然后将数组a的所有元素用each循环打印出来。利用each方法完成会将数组a里的元素临时保存到i里,一直到下一个循环时再重写这个变量的值。输出语句里的.t表示一个制表位(tab)。

有关循环的更多信息,请访问:http://www.tutorialspoint.com/Ruby/Ruby_loops.htm

正则表达式

正则表达式用来匹配一个字符串或者获取字符串在一组给定的字符串或一个句子里出现的次数。在Metasploit里,正则表达式十分关键。在编写漏洞检查工具和扫描工具以及分析某个给定端口的响应时,总会需要利用正则表达式。

看一个例子,这里的程序演示了正则表达式的使用。
有一个变量,它的值为Hello world,需要为它设计一个正则表达式。代码如下:
irb(main):001:0> n = “Hello world”
=> “Hello world”
irb(main):002:0> r = /world/
=> /world/
irb(main):003:0> r.match n
=> #<MatchData “world”>
irb(main):004:0> n =~ r
=> 6

创建另一个名为r的变量,并把正则表达式内容——/world/保存在其内。在下一行,我们用MatchData类的match对象将这个字符和正则表达式进行匹配。命令行返回了一个匹配成功的信息MatchData “world”。接下来利用另一个运算符=~来完成字符串的匹配操作,返回匹配的具体位置。例如:

irb(main):001:0> r = /^world/
=> /^world/
irb(main):002:0> n =~ r
=> nil
irb(main):003:0> r = /^Hello/
=> /^Hello/
irb(main):004:0> n =~ r
=> 0
irb(main):005:0> r = / world $/
=> / world $/
irb(main):006:0> n =~ r
=> 6

分配一个新的值/^world/给r,这里 ^运算符表示要匹配字符串的开始位置。我们得到了输出nil,这说明并没有匹配成功。我们修改这个表达式以匹配单词hello开始的字符串。这一次,系统的输出为数字0,这意味着在最开始的位置匹配成功。下一步,将正则表达式修改为/world $/,这意味着只有一个以单词world结尾的字符串才会匹配。

有关Ruby正则表达式的更多信息,请访问:http://www.tutorialspoint.com/Ruby/Ruby_regular_expressions.htm
下方的链接提供了Ruby编程语言速查卡,可以让你的编程更高效:
https://github.com/savini/cheatsheets/raw/master/Ruby/RubyCheat.pdf
http://hyperpolyglot.org/scripting

有关如何构建正确的正则表达式的更多信息:请访问:http://rubular.com

Ruby基础知识小结

可以从下面的网址获得极为优秀的Ruby编程资源:

一个丰富的Ruby语言教程资源库:
http://tutorialspoint.com/Ruby/

可以帮助你提高Ruby语言编程效率的速查表的链接:
https://github.com/savini/cheatsheets/raw/master/Ruby/RubyCheat.pdf
http://hyperpolyglot.org/scripting

有关Ruby的更多信息,请访问:http://en.wikibooks.org/wiki/Ruby_Programming

标签:Metasploit,核心,print,字符串,irb,main,Ruby
来源: https://blog.csdn.net/am_03/article/details/112136205