惡意軟件常用的感染技術。通過“橫向運動”,惡意軟件可以進一步擴大其戰果:從原始受感染設備傳播到同一網絡內的其他設備。
最近,勒索軟件已經開始使用這種傳播方式:包括CryptoWall [1]、CryptoFortess [2]、DMA-Locker [3]和CryptoLuck [4]在內的許多著名的勒索軟件家族,不僅對受害者機器上的文件進行加密,而且對已經映射和未映射的文件共享進行了"橫向運動", 對這些共享中的文件進行加密,從而造成更大的危害。當然,對于許多針對性和非針對性攻擊中使用的惡意軟件來說,也有許多會進行"橫向運動"的。
本文將為讀者深入介紹惡意軟件最常見的傳播技術,其中包括網絡內部傳播技術和網絡間傳播技術。
橫向運動至未映射的驅動器
通過映射驅動器,軟件就能讀寫可通過該驅動器訪問的共享存儲區中的文件了。映射驅動器通常分配一個盤符,可以像操作本機的其它硬盤驅動器一樣使用它。要訪問未映射的驅動器,需要執行以下步驟:首先,必須枚舉網絡以獲取文件共享的列表,然后,在獲得文件共享的訪問憑證后,需要使用其用戶名和密碼來裝載未映射的驅動器。一旦安裝了驅動器,就可以訪問來自未映射驅動器的文件了。
圖1顯示了用于訪問未映射驅動器的代碼,并且它已經被勒索軟件(例如DMA-Locker,Locky和CryptoLuck)廣泛用于訪問未映射的文件共享中的文件了。該代碼首先會調用WNetOpenEnumW [5]函數,并以無符號整數2('2u')和1('1u')作為其前兩個參數。參數“2u”能夠確保網絡中的所有連接都在范圍內,而“1u”則確保只打開磁盤資源進行枚舉。
圖1:用于演示向未映射驅動器橫向運動的代碼
一旦連接打開,將不斷調用WNetEnumResourceW以枚舉這些資源。
函數WNetOpenEnumW的第四個參數是變量NetResource,它用來接收NetResource結構數組形式的枚舉結果。該結構的格式如圖2所示。
typedef struct _NETRESOURCE {
DWORD dwScope;
DWORD dwType;
DWORD dwDisplayType;
DWORD dwUsage;
LPTSTR lpLocalName;
LPTSTR lpRemoteName;
LPTSTR lpComment;
LPTSTR lpProvider;
} NETRESOURCE;
一旦枚舉完網絡,該代碼就會調用指令'if(NetResource.dWUsage&2)',它用來檢查該資源是否為容器資源[6]。如果是,則該函數在后續指令“sub_407919(a1,&NetResource)”中遞歸調用自身,以確保將lpRemoteName成員指向的名稱傳遞給WNetOpenEnumW函數,來繼續枚舉容器中的資源。
如果資源是可連接的,那么就會調用函數WNetAddConnection2W,該函數可以用來建立到該網絡資源的連接,同時還可以將本地設備重定向到網絡文件共享。傳遞給函數WNetAddConnection2W的第二個和第三個參數分別是用戶名和密碼。如圖1中的代碼所示,如果第二和第三參數的值都是0,那么,它就會使用默認的密碼和用戶名。在WNetAddConnection2W函數之后的指令“if(NetResource.dwType)== 1”用于檢查資源是否為磁盤資源。如果是的話,在下一個指令中,共享資源的名稱NetResoure.lpRemoteName就會被傳遞給函數a1,然后生成一個線程來加密共享驅動器中的文件。
USB驅動器&映射驅動器
除了訪問未映射的文件共享,惡意軟件還能訪問連接到受感染機器的可移動驅動器以加密這些驅動器中的文件。圖3中的代碼展示了如何使用GetDriveTypeW來確定驅動器的類型,隨后的表達式“result == 3”可以檢查驅動器是否為固定類型的,而“result == 2”用來檢查驅動器是否是可移動的,最后, 'result == 6'表示它是一個RAM磁盤。對于這些類型的驅動器,只要找到其中的任何一個,就會調用“sub_402CFB”例程,然后生成一個線程來加密這些驅動器中的文件。
GetDriveTypeW函數也可用于訪問遠程映射網絡驅動器。如果函數GetDriveTypeW返回的值為4,則表示這是一個遠程映射驅動器。
圖3:利用GetDriveType函數進行橫向運動的代碼
基于電子郵件的橫向運動
電子郵件早已成為惡意軟件廣泛使用的傳播手段了。圖3展示的VBA代碼,就是由蠕蟲病毒通過Outlook進行傳播的。如圖4所示,指令'loc_00402FB0'調用了CreateObject函數,以便作為對象訪問Outlook應用程序。在創建對象之后,指令'loc_00403021'會調用AddressLists函數,從該對象中獲得地址列表,隨后指令'loc_004030CC'調用了AddressEntries函數,這樣就能訪問該列表中的內容了。在訪問所有列表項之后,指令'loc_005032D2'會調用AddressEntry.Address來提取確切的電子郵件地址。一旦提取了電子郵件地址,指令“loc_004032BA”會調用Application.CreateItem函數來創建新的電子郵件。之后,指令'loc_0040345B'將惡意文件作為附件添加到電子郵件中,并通過指令'loc_0040353D'來發送電子郵件。當受害者收到電子郵件并打開附件時,就會被感染。
圖4:使用電子郵件作為傳播手段
使用文件感染器作為傳播手段
除了使用SMB、電子郵件和驅動器之外,攻擊者還可以通過感染機器上的其他文件進行橫向運動。圖5顯示了HTML文件被感染后由Ramnit插入的代碼。被感染的HTML文件含有一個VBScript代碼,它會創建一個名為svchost.exe的文件。該代碼首先會調用CreateObject(“Scripting.FileSystemObject”),它在變量FSO中返回一個TextStream對象,該對象可以進行讀取或寫入操作。然后,對象FSO會調用CreateTextFile方法,創建一個文件,并在其中寫入變量WriteData的內容,即惡意代碼。然后,會調用Close方法來刷新緩沖區并關閉該惡意文件。文件關閉后,該函數會調用WSHshell.Run來執行惡意文件。
圖5:使用文件感染器作為傳播手段
結束語
一旦惡意軟件繞過了邊界或內聯設備,它就可以通過各種方法滲入到內部系統。其中,未映射的驅動器、映射驅動器、電子郵件和感染其他文件是最常用的手段。檢測惡意軟件的確很重要,與此同時,防止惡意軟件的擴散以限制其破壞范圍同樣也很重要。