2022-2023-2 《网络攻防实践》第7次作业
1.实验内容
1.1 Linux系统结构
1.1.1 系统概述
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如下图所示。
1.1.2 Linux内核
内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图:
1.1.3 内存管理
对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
1.1.4 进程管理
进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序。
进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。
通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。 为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。
1.1.5 文件系统
和 DOS 等操作系统不同,Linux 操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如 A: 或 C: 等)来标识的。相反,和 UNIX 操作系统一样,Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux 将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。Linux 操作系统的一个重要特点是它支持许多不同类型的文件系统。Linux 中最普遍使用的文件系统是 Ext2,它也是 Linux 土生土长的文件系统。但 Linux 也能够支持 FAT、VFAT、FAT32、MINIX 等不同类型的文件系统,从而可以方便地和其它操作系统交换数据。由于 Linux 支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统。
虚拟文件系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。即VFS 在用户和文件系统之间提供了一个交换层。
1.1.6 设备驱动程序
设备驱动程序是 Linux 内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。
设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是 SCSI 硬盘,则需要使用 SCSI 驱动程序,而不是 IDE 驱动程序。
1.1.7 网络接口(NET)
Linux提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。
Linux 的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
1.2 Linux操作系统安全机制
1.2.1 防火墙
防火墙是在被保护网络和因特网之间,或者在其他网络之间限制访问的一种部件或一系列部件。
Linux防火墙系统提供了如下功能:
● 访问控制,可以执行基于地址(源和目标)、用户和时间的访问控制策略,从而可以杜绝非授权的访问,同时保护内部用户的合法访问不受影响。
● 审计,对通过它的网络访问进行记录,建立完备的日志、审计和追踪网络访问记录,并可以根据需要产生报表。
● 抗攻击,防火墙系统直接暴露在非信任网络中,对外界来说,受到防火墙保护的内部网络如同一个点,所有的攻击都是直接针对它的,该点称为堡垒机,因此要求堡垒机具有高度的安全性和抵御各种攻击的能力。
● 其他附属功能,如与审计相关的报警和入侵检测,与访问控制相关的身份验证、加密和认证,甚至VPN等
iptables和firewall防火墙区别?
-iptables用于过滤数据包,属于网络层防火墙.
-firewall能够允许哪些服务可用,那些端口可用… 属于更高一层的防火墙。
-firewall的底层是使用iptables进行数据过滤,建立在iptables之上。
-在设置iptables后需要重启iptables,会重新加载防火墙模块,而模块的装载将会破坏状态防火墙和确立的连接。会破坏已经对外提供数据链接的程序。可能需要重启程序。
-firewall是动态防火墙,使用了D-BUS方式,修改配置不会破坏已有的数据链接。
1.2.2 PAM机制
PAM(Pluggable Authentication Modules)是一套共享库,其目的是提供一个框架和一套编程接口,将认证工作由程序员交给管理员,PAM允许管理员在多种认证方法之间作出选择,它能够改变本地认证方法而不需要重新编译与认证相关的应用程序。
PAM的功能包括:
● 加密口令(包括DES以外的算法);
● 对用户进行资源限制,防止DOS攻击;
● 允许随意Shadow口令;
● 限制特定用户在指定时间从指定地点登录;
1.2.3 入侵检测系统
入侵检测技术是一项相对比较新的技术,很少有操作系统安装了入侵检测工具,事实上,标准的Linux发布版本也是最近才配备了这种工具。尽管入侵检测系统的历史很短,但发展却很快,目前比较流行的入侵检测系统有Snort、Portsentry、 Lids等。
1.2.4 安全审计
即使系统管理员十分精明地采取了各种安全措施,但还会不幸地发现一些新漏洞。攻击者在漏洞被修补之前会迅速抓住机会攻破尽可能多的机器。虽然Linux不能预测何时主机会受到攻击,但是它可以记录攻击者的行踪。 Linux还可以进行检测、记录时间信息和网络连接情况。这些信息将被重定向到日志中备查。 日志是Linux安全结构中的一个重要内容,它是提供攻击发生的唯一真实证据。因为现在的攻击方法多种多样,所以Linux提供网络、主机和用户级的日志信息。
1.2.5 强制访问控制
强制访问控制(MAC,Mandatory Access Control)是一种由系统管理员从全系统的角度定义和实施的访问控制,它通过标记系统中的主客体,强制性地限制信息的共享和流动,使不同的用户只能访问到与其有关的、指定范围的信息,从根本上防止信息的失泄密和访问混乱的现象。
1.3 Linux远程攻防技术
1.3.1 口令猜测
使用类似跑字典的方法来猜测弱口令
防护措施:
- 为每个用户设立独立的账户和密码,统一实施管理
- 对于特权用户应避免允许远程登录权限
- 提升账户口令复杂度,包含大小写字母,数字和字符
- 对多次身份认证失败进行拒绝认证请求
- 不定期更换账户口令
1.3.2 Linux网络服务远程渗透攻击
- 缓冲区溢出攻击
·往一个缓冲区(内存中任意变量)中放置超出原始分配空间的数据,造成越界覆盖
·黑客通过精巧构造传入数据可覆盖影响程序逻辑的关键内容,通过执行注入代码或非预期代码,达到访问目标系统的目的 - 格式化字符串攻击
·通过传递精心编制的含有格式化指令的文本字符串,通过利用格式化字符串漏洞,以使目标系统执行任意命令 - 输入验证
·输入验证漏洞: 程序对输入没有检查或检查不充分 (语法不正确输入、无关输入、模块没能处理遗漏输入字段、字段-值相关性错误)
·输入验证攻击: 利用程序输入验证漏洞,获取访问权 - 整数溢出
·整数溢出编程错误: 不同整数类型容纳数值大小有限,超出限度的数值就会引起溢出,导致“不可预料” 的结果。
·大部分编译器会忽略这种整数类型不安全转换或赋值的错误
·有些语句涉及运行时刻从输入数据计算后赋值,编译时刻无法检查
防护措施: - 禁用所有不必要的网络服务
- 尽量选择更安全的网络协议与服务软件,并使用最佳安全实践进行部署
- 及时更新网络服务版本
- 使用xinetd、防火墙为Linux网络服务添加网络访问控制机制
- 建立入侵检测与应急响应计划流程
1.4 Linux本地安全攻防技术
1.4.1 Linux本地特权提升
- 获取用户口令字
·/etc/passwd文件
·Shadow文件: /etc/shadow - 口令字破解过程
·Linux使用DES/MD5算法作为口令加密算法
·弱口令字典攻击,蛮力攻击 - Linux口令字破解工具
·Crack
·John the Ripper
1.4.2 本地缓冲区溢出攻击
- 本地缓冲区溢出攻击
本地SUID root程序如存在缓冲区溢出漏洞
渗透攻击代码可构造精巧输入数据,溢出该程序获得Root帐户访问权限 - 本地缓冲区溢出攻击案例
Shadow Penguin Security, 1999年5月, libc系统函数库中缓冲区溢出漏洞
漏洞存在位置: 动态链接至libc, 用到LC_MESSAGES环境变量的SUID程序
渗透攻击代码ex_lobc, 本地缓冲区溢出后以root特权执行/bin/sh
1.4.3 符号链接攻击
- 符号连接攻击
SUID root属性程序创建临时文件
通过符号连接将临时文件符号链接至攻击目标文件 - 实例: Solaris dtappgather程序
执行时创建某TMPFILE临时文件, chmod->0666,chown->执行该程序用户UID
攻击者创建符号链接: ln -s /etc/passwdTMPFILE_PATH
执行dtappgather后,该SUID root程序将提升至root特权,并将通过符号链接至TMPFILE_PATH的/etc/passwd属性修改为0666, 属主设置为执行用户ID
2. 实验过程
2.1 使用Metasploit进行Linux远程渗透攻击
使用 Metasploit 工具进行Linux远程渗透攻击,攻击机IP:192.168.11.165,靶机IP:192.168.11.253。
在攻击机中当中打开msfconsole,输入命令:use exploit/multi/samba/usermap_script,使用usermap_script渗透攻击模块。
设置攻击的PAYLOAD为cmd/unix/reverse。
设置攻击LHOST为攻击机地址192.168.200.2,设置RHOST为靶机地址192.168.200.125。
通过run开始攻击。
渗透攻击结果如下图所示
2.2 实践作业:攻防对抗实践
攻击方和防守方的信息如下
渗透攻击过程同上,直接放截图
接着分析wireshark捕包情况(这里使用的是攻击机的),首先是arp包。
接着分析后两个TCP包,192.168.200.2向192.168.200.125发起的TCP连接请求,下面的详情里是正式发起攻击的时间。攻击者IP:192.168.200.2,目标IP:192.168.200.165,源端口:43655,目标端口:139。
接着在此追踪TCP数据流,可以看到所使用shellcode。
- 命令的内涵:后台运行进程并将标准输出和标准错误流重定向到linux的空设备。nohup就是no hangup,不要挂断,忽略hup信号。标准输出内容会输出到当前目录的nohup.out日志文件中而不终端显示。sh -c…让 bash 将一个字串作为完整的命令来执行。&>中间没有空格。linux中的文件号,1是标准输出流,2是错误输出流,此处&>的意思是合并 标准输出和错误输出并重定向。/dev/null是linux的一个空设备,放入这里的数据立即清除,所以只能写,读不出来什么。最后面&就是后台运行的意思 。
继续向下翻,可以找到攻击成功后执行的命令以及回应
3. 学习中遇到的问题及解决
Q1:运行渗透攻击时报错Exceptions::NoReply The SMB server did not reply to our request
A1:将攻击机和靶机都改为桥接模式后就成功了
Q2:设置LHOST之后,show options中没有显示
A2:实际上已经设置成功了
4. 学习感想和体会
跟上次的实验比较相似,这次学习使用了新的漏洞。另外show payloads的时候列出的一大堆属实让我大为震撼。