20199125 2019-2020-2 《网络攻防实践》第八周作业
一.概况
本次作业属于哪门课 | 网络攻防实践 |
---|---|
作业要求 | Linux操作系统攻防 |
收获 | 对于Linux上的一些漏洞和攻击方式有了深刻的理解,掌握如何利用metasploit进行攻击,同时也知道该如何防御 |
二、知识点总结
1.Linux系统结构
1.1.系统概述
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如下图所示。
1.2.Linux内核
内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图:
1.3.内存管理
对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
1.4.进程管理
进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序。
进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。
通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。 为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。
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.6.设备驱动程序
设备驱动程序是 Linux 内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。
设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是 SCSI 硬盘,则需要使用 SCSI 驱动程序,而不是 IDE 驱动程序。
1.7.网络接口(NET)
Linux提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。
Linux 的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
2.Linux操作系统安全机制
2.1.防火墙
防火墙是在被保护网络和因特网之间,或者在其他网络之间限制访问的一种部件或一系列部件。
Linux防火墙系统提供了如下功能:
● 访问控制,可以执行基于地址(源和目标)、用户和时间的访问控制策略,从而可以杜绝非授权的访问,同时保护内部用户的合法访问不受影响。
● 审计,对通过它的网络访问进行记录,建立完备的日志、审计和追踪网络访问记录,并可以根据需要产生报表。
● 抗攻击,防火墙系统直接暴露在非信任网络中,对外界来说,受到防火墙保护的内部网络如同一个点,所有的攻击都是直接针对它的,该点称为堡垒机,因此要求堡垒机具有高度的安全性和抵御各种攻击的能力。
● 其他附属功能,如与审计相关的报警和入侵检测,与访问控制相关的身份验证、加密和认证,甚至VPN等
iptables和firewall防火墙区别?
- iptables用于过滤数据包,属于网络层防火墙.
- firewall能够允许哪些服务可用,那些端口可用.... 属于更高一层的防火墙。
- firewall的底层是使用iptables进行数据过滤,建立在iptables之上。
- 在设置iptables后需要重启iptables,会重新加载防火墙模块,而模块的装载将会破坏状态防火墙和确立的连接。会破坏已经对外提供数据链接的程序。可能需要重启程序。
- firewall是动态防火墙,使用了D-BUS方式,修改配置不会破坏已有的数据链接。
2.2.PAM机制
PAM(Pluggable Authentication Modules)是一套共享库,其目的是提供一个框架和一套编程接口,将认证工作由程序员交给管理员,PAM允许管理员在多种认证方法之间作出选择,它能够改变本地认证方法而不需要重新编译与认证相关的应用程序。
PAM的功能包括:
● 加密口令(包括DES以外的算法);
● 对用户进行资源限制,防止DOS攻击;
● 允许随意Shadow口令;
● 限制特定用户在指定时间从指定地点登录;
2.3.入侵检测系统
入侵检测技术是一项相对比较新的技术,很少有操作系统安装了入侵检测工具,事实上,标准的Linux发布版本也是最近才配备了这种工具。尽管入侵检测系统的历史很短,但发展却很快,目前比较流行的入侵检测系统有Snort、Portsentry、 Lids等。
2.4.安全审计
即使系统管理员十分精明地采取了各种安全措施,但还会不幸地发现一些新漏洞。攻击者在漏洞被修补之前会迅速抓住机会攻破尽可能多的机器。虽然Linux不能预测何时主机会受到攻击,但是它可以记录攻击者的行踪。 Linux还可以进行检测、记录时间信息和网络连接情况。这些信息将被重定向到日志中备查。 日志是Linux安全结构中的一个重要内容,它是提供攻击发生的唯一真实证据。因为现在的攻击方法多种多样,所以Linux提供网络、主机和用户级的日志信息。
2.5.强制访问控制
强制访问控制(MAC,Mandatory Access Control)是一种由系统管理员从全系统的角度定义和实施的访问控制,它通过标记系统中的主客体,强制性地限制信息的共享和流动,使不同的用户只能访问到与其有关的、指定范围的信息,从根本上防止信息的失泄密和访问混乱的现象。
3.Linux远程攻防技术
3.1.口令猜测
使用类似跑字典的方法来猜测弱口令
防护措施:
- 为每个用户设立独立的账户和密码,统一实施管理
- 对于特权用户应避免允许远程登录权限
- 提升账户口令复杂度,包含大小写字母,数字和字符
- 对多次身份认证失败进行拒绝认证请求
- 不定期更换账户口令
3.2.Linux网络服务远程渗透攻击
- 缓冲区溢出攻击
- 往一个缓冲区(内存中任意变量)中放置超出原始分配空间的数据,造成越界覆盖
- 黑客通过精巧构造传入数据可覆盖影响程序逻辑的关键内容,通过执行注入代码或非预期代码,达到访问目标系统的目的
- 格式化字符串攻击
- 通过传递精心编制的含有格式化指令的文本字符串,通过利用格式化字符串漏洞,以使目标系统执行任意命令
- 输入验证
- 输入验证漏洞: 程序对输入没有检查或检查不充分 (语法不正确输入、无关输入、模块没能处理遗漏输入字段、字段-值相关性错误)
- 输入验证攻击: 利用程序输入验证漏洞,获取访问权
- 整数溢出
- 整数溢出编程错误: 不同整数类型容纳数值大小有限,超出限度的数值就会引起溢出,导致“不可预料” 的结果。
- 大部分编译器会忽略这种整数类型不安全转换或赋值的错误
- 有些语句涉及运行时刻从输入数据计算后赋值,编译时刻无法检查
防护措施:
- 禁用所有不必要的网络服务
- 尽量选择更安全的网络协议与服务软件,并使用最佳安全实践进行部署
- 及时更新网络服务版本
- 使用xinetd、防火墙为Linux网络服务添加网络访问控制机制
- 建立入侵检测与应急响应计划流程
4.Linux本地安全攻防技术
4.1.Linux本地特权提升
- 获取用户口令字
- /etc/passwd文件
- Shadow文件: /etc/shadow
- 口令字破解过程
- Linux使用DES/MD5算法作为口令加密算法
- 弱口令字典攻击,蛮力攻击
- Linux口令字破解工具
- Crack
- John the Ripper
4.2.本地缓冲区溢出攻击
- 本地缓冲区溢出攻击
- 本地SUID root程序如存在缓冲区溢出漏洞
- 渗透攻击代码可构造精巧输入数据,溢出该程序获得Root帐户访问权限
- 本地缓冲区溢出攻击案例
- Shadow Penguin Security, 1999年5月, libc系统函数库中缓冲区溢出漏洞
- 漏洞存在位置: 动态链接至libc, 用到LC_MESSAGES环境变量的SUID程序
- 渗透攻击代码ex_lobc, 本地缓冲区溢出后以root特权执行/bin/sh
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
二、实践内容
1.使用Metasploit进行远程渗透攻击实验
原理:Samba是一套实现SMB(Server Messages Block)协议、跨平台进行文件共享和打印共享服务的程序。Samba服务对应的端口有139和445等,只要开启这些端口后,主机就可能存在Samba服务远程溢出漏洞。
实践步骤:
- 首先启动攻击机上的Metasploit工具,在攻击机上执行命令
msfconsole
来启动该工具
- 执行命令使用
exploit/multi/samba/usermap_script
渗透攻击模块
- 然后是查看载荷,执行命令
show payloads
来查看可使用的攻击载荷,然后我们选择下图中那个,即使用netcat工具在渗透攻击成功后执行shell并通过netcat绑定在一个监听端口上
- 然后是设置远程ip和本地监听ip,通过
set rhost
和set lhost
分别设置远程地址为靶机ip,本地ip为攻击机ip,然后执行攻击
- 如下图,当出现如下会话连接时表示攻击成功,然后我们执行指令
who am i
来获取root权限
- 成功侵入靶机shell以后,我们执行指令在靶机上创建了一个账户
防范措施:可以采用其他文件传输协议如SFTP协议待替代;以及部署防火墙阻断白名单以外ip访问,及时打补丁。
2.攻防对抗实践
原理:通过字典攻击来爆破ssh登录口令。
实践步骤:
1.首先用nessus来扫描ubuntu靶机,来查看漏洞信息,具体操作流程不详细展开,但是值得注意的一点是,nessus我之前安装过,由于后台运行太吃资源,我就禁用了服务,结果再启动就出问题了,一直扫描不到主机。后来我又卸载了重装,然后又出现新的问题。无法初始化下载插件,经过查询,得知要在nessus的安装目录下执行命令nessuscli update
更新插件。
经过扫描发现这个靶机上有很多漏洞,我选取了危险系数最高的那个
2.分析这个漏洞是关于openSSH的高危漏洞,于是我们打开metasploit工具,执行命令search ssh_login
来搜寻使用这一漏洞的一些模块。
使用搜索之后发现有两个攻击模块,我们首先使用第一个来试一下,执行命令use auxiliary/scanner/ssh/ssh_login
来使用第一个模块
3.然后我们使用show options
命令来查看使用该攻击模块的一些参数,除了日常需要设置的靶机ip,端口之外,这里还多个几个参数,我不知道该怎么设置,经过查询对该漏洞的攻击利用说明得知,这里的USERNAME
参数即为要攻击的靶机的账户名,USERPASS_FILE
即为密码字典文件,这下懂了该漏洞的攻击原理,原来是通过跑密码字典来爆破靶机上的账户,于是我把USERNAME
参数设置为root,即攻击靶机上的管理员账户;由于我没有密码字典,于是在github上下载了很多密码字典文件,并通过ftp发送到我们攻击机上,并使用了其中一个,然后我们启动攻击。
4.在启动攻击的同时也在靶机上执行命令tcpdump -i eth0 -w scan.pcap
,来抓取数据,其中-i表示网卡设备,-w表示抓取的数据存储路径
5.执行攻击以后,我们观察发现攻击机已经同靶机建立了一个会话连接,然后我们执行命令sessions
,查看会话连接,发现攻击机已经通过密码字典攻破了靶机上的root账户,root账户的登录口令root
已经以明文的形式显示出来
6.然后我们执行命令sessions 1
来选中这个会话连接,就获取了靶机的root权限,我们对靶机进行了一些指令操作
7.最后我们在靶机里结束抓取数据包,使用ctrl+c即可终止,由于靶机上没有图形界面,我们使用ftp将抓取的数据包提取到宿主机电脑上进行分析
8.一打开抓包文件,发现里面有大量的数据连接,因为我是在宿主机上使用xshell来连接攻击机和靶机进行操作的,所以tcpdump把同宿主机的连接数据也给抓取了,在这里我们使用过滤规则,设置过滤规则为ip.src == 192.168.2.14 and ip.dst == 192.168.2.8
,即筛选源地址为攻击机,目的地址为靶机的所有数据流。
9.然后发现还是有大量的数据流,我简单分析了一下,发现从攻击机发送给靶机的数据流中多次出现了Client:New Keys
等内容,于是我猜想这应该是攻击者使用密码字典在对靶机进行字典攻击的数据流,为了筛选出这些数据流,我又设定了更详细的筛选规则,使用查找分组,然后筛选数据流内容中出现Client:New Keys
的所有数据,经过统计,出现这个内容的数据一共有13条,也就是说可能攻击机只尝试了13次密码字典就破解了靶机的root账户,我同时打开了预设的密码字典文件,发现第13个密码正好是root
,证实了我的猜想,上面的数据流确实是攻击机尝试字典攻击产生的
10.然后我又筛选了从靶机发送到攻击机上的数据流,找到了其中一个密钥交换算法Diffie-Hellman,这个是SSH2使用的密钥交换算法。
11.最后本来想分析一下攻击者攻破靶机root账户后执行的操作,使用最终数据流,才发现只有一大堆看不懂的乱码数据,没有找到攻击机执行过的指令,只能分析出攻击者的操作系统和使用了SSH2进行连接,并且加密算法是RSA
。
防范措施:对于SSH的攻击主要是通过跑密码字典来实现的,所以我们首先要把账户密码设置的足够复杂,其次,可以在系统中设置为不允许ssh进行root登录。