打造定制化的Metasploit—认识Ruby

君子藏器于身待时而动,安全不露圭角覆盂之安。

——AnonySec

https://payloads.cn

前言

Ruby编程语言可以说是Metasploit框架的核心,想要学习好Metasploit模块编写必须要会Ruby。不过Ruby到底是什么呢?根据Ruby官方网站的说法:”Ruby一门开源的动态编程语言,注重简洁和效率。Ruby 的句法优雅,读起来自然,写起来舒适。”(引自Ruby中文官网
简单来说,Ruby是一种简单快捷的面向对象(面向对象程序设计)脚本语言。ruby 另以”红宝石”命名。

本文只讲解涉及编写Metasploit模块所必需的Ruby知识,如需更多介绍可以查阅Ruby教程,进行学习。

创建第一个ruby程序

如需了解Ruby的安装过程,可自行百度,本文不进行讲解。

下载Ruby

Ruby的交互式命令行

这里直接使用Kali系统自带的Ruby环境,跟Python等语言一样,ruby也有命令交互的,输入irb即可进入到命令行交互操作。

下面做个 计算 与 赋值 的简单操作:

d0e5005b0a3630ed9e9fac558ea72cf2

命令行中定义方法

方法或函数是一组语句,当强调它们时就会执行。在使用Metasploit模块时,Ruby的方法是一个很重要的部分。语法格式:

1
2
3
def method_name [( [arg [= default]]...[, * arg [, &expr ]])]
expr..
end

首先已def开始,end声明放在最后来结束对方法的定义,arg指的是方法所接收的参数,expr指的是用来接受并计算的表达式。

下面定义一个函数方法:

661d6798fa2eab097f5ac10db4550f82

可以看到,函数通过运算打印出了正确的结果。Ruby语言提供了puts和print这两种输出打印函数。当涉及Metasploit时,将使用print_line函数。

下面分别使用print_lineprint_goodprint_errorprint_warningprint_status、与print_blank_line语句来表示行、成功执行、错误执行、警告、状态与换行:

1
2
3
4
5
6
7
8
def run
print_line("---")
print_good("successful")
print_error("error")
print_warning("warning")
print_status("status")
print_blank_line
end

0cbb3edadf41d7de7762f9d606e7b252

Ruby中的变量和数据类型

变量是指一个值可以随时改变的占位符。Ruby语言支持众多的数据类型,但只讲解与Metasploit相关的数据类型。

字符串处理

使用Ruby语言编写Metasploit模块时,尽量使用双引号标记,因为单引号可能会产生问题:

c6860100f8e147d878d0489cb0902ced

字符串连接

将两个不同结果连接成一个字符串,使用+运算符实现字符串的连接;当需要一个变量后面追加数据的时候,可以使用<<运算符:

829ca24b4e9f67409be47d56c5c082dd

子字符串substring函数

b62ed3487889f5e8e032ed589800a2f2

split函数

14887422f9c8b81014f288e7e3672c30

Ruby中的数字和转换

在处理用户输入是,可以用to_i函数将字符串类型的输入转换成数字;另外,可以用to_s函数将一个数字转换成字符串。

5dc3b615a6c56e19c06d9b38eadf3850

数制转换

  • 16进制到10进制的转换

ef91384bc8c2da9d67d86d2b547067aa

  • 10进制到16进制的转换

a269368acb02b2e53c2fc2f3e1c7b9b9

范围

范围(range)是一个很重要的内容,广泛应用在Metasploit的辅助模块中。例如auxiliary

a4de900112e5b1d0f5cc903bf05785cb

一个范围的对象提供多种操作:搜索、查找最小值与最大值、显示范围中的所有数据。这里include?函数可以检查范围中是否包含某一个特定的值。此外,minmax分别显示范围中的最小值和最大值。

Ruby中的循环

迭代语句被称为循环。Ruby的语法和其他编程语言的不同之处:

1
2
3
4
5
6
def for1(a)
for i in 0..a
print ("This number is #{i}\n")
end
end
for1 (10)

51a1a383dd47584b10b146b397749688

这里使用#{i}去打印输出的变量i的值,关键字\n指定开始新的一行。

而迭代循环是通过each实现的,在Metasploit模块中被广泛使用。

1
2
3
4
5
6
7
8
def each_example(a)
a.each do |i|
print i.to_s + "\t"
end
end
a=Array.new(5)
a=[5,10,15,20,25]
each_example(a)

8a06c10214079ef19c84f6c55212c84e

定义一个方法,并接收数组a,再用each循环打印出来。


References