比特幣惡意軟體分析指南
犯罪分子正在使用比特幣和其他加密貨幣作為銷售被盜資料、黑客服務(如ofollow,noindex" target="_blank">DDoS )和勒索軟體支付付款渠道。如果你想更多的瞭解這個黑產,你需要深入瞭解比特幣以及懂得如何分析交易。
跟隨上犯罪分子使用的技術的腳步是非常重要的,這樣你就能更好的瞭解新的變化和發展趨勢。此外,隨著越來越多的人在分析比特幣和區塊鏈,因此也有更多的機會開發出新的工具和技術來防禦犯罪分子。
犯罪分子歷來是最早使用新技術的人,因為創新的東西往往被人們傾向於首先用在有衝突且有動機的方面。犯罪分子是最早發現汽車 (相同時期大多數警察使用的是自行車或馬匹)、手機和蜂鳴器 的創造性用途的一部分人。現如今,他們已成為攻擊網際網路、利用洋蔥網路、使用加密和現在流行的比特幣的先鋒人群。如果犯罪首先採用了某種技術,那些試圖瞭解和挫敗罪犯的人,應該需要深入瞭解犯罪分子所使用的技術。
比特幣術語介紹
在談到比特幣惡意軟體分析之前,我想確保你熟悉比特幣中的一些術語和基本概念。如果你已熟悉常見的資訊保安概念(如公鑰加密和雜湊),那麼理解比特幣就非常容易了。本節僅僅是個概述。如果你想要更深刻的理解這方面的只是,我鼓勵你閱讀原始的比特幣論文 (論文只有9頁!)。
比特幣本質上是一個公共分類賬。分類帳本身稱為區塊鏈。區塊鏈很特殊,因為與公開共享的電子表格不同,如果你遵守規則,則只能新增區塊鏈。這些規則是在對遊戲理論的理解的基礎上建立的,這些理論通過數學嚴格執行來確保公平性。此外,它是分散的,意味著沒有中央機構控制網路,並且不可能通過強制單個實體來破壞網路。區塊鏈使用公鑰的雜湊而不是人名來記錄所有權。通過這種方式,儘管存在關聯地址的方法以及將地址對映到實際身份的一些有限方式,但它依舊是匿名的。
挖礦
新比特幣的產生被稱為“挖礦”。這往往是一個最有趣也最神祕的過程。畢竟,通過挖掘區塊,礦工將獲得25比特幣獎勵。按照目前的市場價格 ,這個價值超過25,000美元。這個價格通常會引起人們的廣泛關注。
塊是比特幣交易的集合(傳送比特幣的人的記錄),前一個塊的雜湊,以及隨機數(隨機數),當進行雜湊時會產生一個以0 bit初始化的值。例如,假設你有一個看起來像下面這樣的塊:
caleb sends joe 1.2 btc udi sends joe 0.3 btc joe sends aidan 1.5 btc nonce: 0
如果要將其儲存到檔案中(最後沒有換行符)然後計算SHA256雜湊值,則雜湊值為:b5b6ee30fae42aa131a84f705e5d7cf59133b3954e53c79b05c13a328b8d6f8a。你可以使用shasum -a 256 block.txt在自己的電腦上(在Mac上)檢查一下。這個示例塊的第一個位元組是0xb5二進位制的0b10110101。這具有零個前導0位。如果將nonce遞增到4,則塊的雜湊變為:01bdf748aeb6443595d1d29fc348418f4b4b2bbe5287c53e892735f467702308並且第一個位元組00000001具有7個前導0位。
如果0位數非常高,比如說50位,那麼你是沒有辦法知道隨機數是多少!你必須使用遞增的隨機數將很多很多塊進行雜湊,直到你找到前導0位數是50位的隨機數。當比特幣的礦工們產生了一個有效的塊(雜湊有足夠多的前導0位)時,他們就會向網路宣佈這個塊,由此也證明了礦工們在非常努力的挖礦。這就是為什麼挖礦被稱為使用“工作驗證”的原因,因為找到一個有效的塊需要大量的雜湊,如果你有一個有效的雜湊,那麼就證明了你做了一些工作。
一旦交易包含在有效塊中,它就成為區塊鏈的一部分。在任何特定時刻,都有成千上萬的未經確認的交易等待包含在新挖掘到的區塊中。你可以在此處檢視此列表:未確認的交易 。比特幣協議會自動調整目標難度,平均每10分鐘可以產生一個新的區塊。
如果你想自己體驗一下挖礦的過程,這裡有一個模擬挖礦的Python指令碼。你可以通過增加TARGET值來調整挖礦的難度。
#!/usr/bin/env python import sys import hashlib # Difficulty target (number of leading 0 bits) TARGET = 16 def generate_blocks(transactions): block_base = '\n'.join(transactions) nonce = 0 while nonce < sys.maxint: yield '{}\nnonce: {}'.format(block_base, nonce) nonce += 1 def hash_block(block): h = hashlib.sha256() h.update(block) return h.digest() def digest_to_binstr(digest): return ''.join(map(lambda o: format(o, '08b'), map(ord, digest))) transactions = [ 'caleb sends joe 1.2 btc', 'udi sends joe 0.3 btc', 'joe sends aidan 1.5 btc', ] target_str = '0' * TARGET attempts = 0 for block in generate_blocks(transactions): attempts += 1 digest = hash_block(block) binstr = digest_to_binstr(digest) if binstr[0:TARGET] == target_str: print("Mined block with {} difficulty after {} attempts!\n{}\nHash: {}".format(TARGET, attempts, block, binstr, binstr)) break
執行後的輸出內容如下:
$ ./fake-mine.py Successfully mined block with 16 difficulty after 78169 attempts! caleb sends joe 1.2 btc udi sends joe 0.3 btc joe sends aidan 1.5 btc nonce: 78168 Hash: 0000000000000000000100011000110010001011110101011000101000011000101000101101001000100010110110000011010001000110101101110111110100110001100100011001000111001011111100111110111100101110010001110101100000000110001101101111101001101110011000000001101100110000
在目標難度係數為16的情況下,在發現指定了nonce後產生有效區塊之前,已經嘗試了78,000次。
交易
比特幣全部歸屬於公鑰地址 。傳送比特幣實際上只是意味著將它們重新分配給另一個公鑰,這是通過交易廣播完成的。交易包括目標公鑰和你所擁有的一個或多個比特幣(前一個交易)的雜湊。這兩項會使用你的私鑰簽名加密,證明你擁有這些比特幣。
安全研究人員需要注意的一個重要細節是交易通過網際網路進行廣播。如果你想將身份對映到公共金鑰消費虛擬貨幣,擁有傳送虛擬貨幣的客戶端的IP地址可以提供非常豐富的資訊。像Blockchain.info 這樣的站點就包括了在對等網路中中繼交易的IP地址,但這只是實際客戶端IP的粗略的代理地址,甚至可能與客戶端所在的國家或地區無關。有關實際獲取IP地址的研究,請檢視比特幣P2P網路中客戶端的匿名化 。
挖礦池
針對比特幣進行單獨挖礦是很困難的,因為除非你在裝置上投入了大量資金,否則你可能永遠都不會挖到比特幣,而你所做的所有努力都會被浪費掉。挖礦池 已經發展到將較小的分散的礦工們的雜湊能力結合起來。如果挖到了一個區塊,通常會按每個礦工貢獻的比例分配比特幣來作為獎勵。通過記錄每個礦工解決比比特幣更小的目標難度 的區塊的次數來計算每個礦工的貢獻。
挖掘比特幣的惡意軟體通常通過為挖礦池提供資金來實現攻擊。然而,挖掘比特幣遠比挖掘其他一些加密貨幣(如Monero )更少見,因為比特幣挖掘太難大並且難以盈利。此外,Monero的優勢在於它比比特幣更具匿名性。
如果惡意軟體連線到挖礦池,你應該能夠識別挖礦池的Web地址和worker憑據。挖礦池使用worker憑證來了解哪個地址應該接收支出。每個挖礦池都有一點不同,但有些會使用worker的使用者名稱作為支付地址。 。如果可能的話,你應該獲取惡意軟體正在使用的地址,因為針對地址你可以進行一些額外的分析。
分析比特幣地址
如果你可以獲得與惡意軟體活動相關聯的比特幣地址,則可以觀看其中的活動。如果惡意軟體有新的活動,那你就知道還有機器被感染了。如果地址長時間沒有活動然後再次開始活動,則意味著惡意軟體又有了新的活動,你應該開始根據資源尋找新的樣本。地址的活動量還可以讓你瞭解惡意軟體攻擊成功的程度以及受感染的計算機數量。
在我們的CryptXXX:New CryptXXX Variant Discovered 分析報告中,描述了一個與勒索軟體相關的地址的真實案例。勒索軟體的付款地址是18e372GNwjGG5SYeHucuD1yLEWh7a6dWf1 。根據惡意軟體的贖金記錄,付款必須是1.2比特幣或是1.2的倍數,具體取決於受害者支付的時間。通過了解這一點,我們可以檢視贖金地址的交易,並檢視該地址的付款數量和金額。如果我們一直監控交易的IP地址,我們也可以瞭解受害者的地理位置分佈情況,這可以讓你深入瞭解目標物件。通過更好的瞭解攻擊者的目標和原因,然後配置和部署蜜罐會更容易收集到新樣本。
由於此地址的所有付款記錄都是在大約兩個月內發生的,因此可以假設該地址適用於單個攻擊活動,並且一定還存在與本次攻擊活動之前和之後相關聯的其他地址。如果你監控區塊鏈並且聚類關聯的地址,你可能會在找到樣本之前就找到新的付款地址。這將有助於你縮小搜尋範圍然後收集新樣本進行分析並確保檢測範圍。目前沒有任何免費的地址聚類工具,但這應該會成為一個活躍的研究領域。有關更多資訊,請檢視地址聚合的不合理有效性 和BitSniffer 。
通過使用tumblers 跟蹤比特幣的流動變得更加困難。這些服務從許多使用者那裡獲取比特幣,將它們多次放到許多不同的地址上,然後將它們重新分配給原始的所有者。同樣,目前沒有解決由 tumblers 所造成的混亂的相關工具,不過已經有了關於該主題的一些研究。有關更多資訊,請閱讀比特幣混合服務調查:追蹤匿名比特幣 。
我個人發現了一些有趣的與比特幣相關的惡意軟體,只需搜尋看起來像挖礦地址或挖礦池連線字串的關鍵字。當這些型別的搜尋結果與其他型別的靜態分析相結合時,其結果就可以成為潛在惡意軟體的來源。這個簡報提供了一些很好的搜尋比特幣相關字串和特徵的例子,甚至還有Yara規則:跟蹤磁碟和記憶體中的比特幣 。
總結
希望在閱讀本文之後,你可以更好的瞭解比特幣的工作原理,並且你可以使用一些新的分析技術來處理你發現的下一個勒索軟體或加密貨幣相關的惡意軟體。我也希望這篇文章能激發你創造一些新的分析工具和技術,幫助業內人士跟上犯罪分子的節奏。