Μοντελοστρεφής ανάπτυξη λογισμικού για IoT συσκευές πραγματικού χρόνου και χα...
projectRATdoc
1. ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ
ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ
ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΩΡΙΑΚΩΝ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΚΩΝ
ΣΥΣΤΗΜΑΤΩΝ
Project για το μάθημα “Ασφάλεια Κινητών και Ασύρματων Δικτύων
Επικοινωνιών”
MOBILE BOTNET
Λοΐσιος Ιωάννης 321/2007067
Παπαθανασίου Αθανάσιος 321/2008106
3. ΕΙΣΑΓΩΓΗ
Σαν ομάδα επιλέξαμε εξ αρχής διαφορετικό θέμα main project από τα
διαθέσιμα. Ο σκοπός όμως ήταν από την αρχή αυτός αφού είχαμε
καταλήξει σε αυτή την εφαρμογή πριν καν ξεκινήσουμε τα μαθήματα με τον
κ. Καμπουράκη. Ο λόγος είναι το ερευνητικό ενδιαφέρον που
παρουσιάζουν τέτοιου είδους malware καθώς και η επιθυμία μας να
εξερευνήσουμε τον κόσμο του android όχι από την κλασική οπτική των
games και applications αλλά από τη σκοπιά της ασφάλειας και των
ευπαθιών του.
Ταυτόχρονα η υλοποίηση αυτού του project ήταν μία μεγάλη
πρόκληση και για εμάς, αφού ήταν ουσιαστικά η πρώτη μας επαφή με το
περιβάλλον του android και με τον προγραμματισμό συνολικά σε αυτό το
επίπεδο.
Υπήρχαν διάφορες αντικειμενικές δυσκολίες στην εκπόνηση του
project οι οποίες θα γίνουν αντιληπτές και στη συνέχεια του
documentation. Κομβικής σημασίας όμως ήταν οι υποχρεώσεις και με τα
υπόλοιπα μαθήματα της σχολής (λόγω του ότι είμαστε επί πτυχίω φοιτητές)
καθώς και ο υλικοτεχνικός εξοπλισμός (μία συσκευή Android με μέτρια
προς κακή απόδοση).
Χωρίς να θέλουμε να μας δώσουμε “ελαφρυντικά” οι παραπάνω και
μόνο δυσκολίες ήταν αρκετές ώστε ορισμένες στιγμές να αναθεωρούμε την
επιλογή μας για το μάθημα και το project. Παρόλα αυτά, λόγω και της
επικείμενης βοήθειας – διευκόλυνσης από τον κ. Καμπουράκη και τους
ερευνητές του, δεν τα παρατήσαμε και υλοποιήσαμε το project μέχρι το
στάδιο που είχαμε εξ' αρχής σχεδιάσει, με πλήρης λειτουργικότητα.
Στη συνέχεια του documentation παρουσιάζουμε αναλυτικά τα
βήματα υλοποίησης, ιεραρχικά και ανά κομμάτι του malware. Στον κώδικα
έχουμε γράψει αρκετά επεξηγηματικά σχόλια ώστε να είναι ευανάγνωστος.
4. MOBILE BONET
Το Mobile Botnet είναι ένα είδος botnet το οποίο στοχεύει κινητές
συσκευές με σκοπό να διαχειριστεί κάποιες λειτουργίες του, ή και το ίδιο το
κινητό. Οι τρόποι με τους οποίους μπορεί να διοχετευθεί στις συσκευές
ποικίλουν. Μπορεί να είναι backend μίας εφαρμογής να εγκαθίσταται στο
κινητό μαζί της και μετά να τρέχει ανεξάρτητα από αυτήν (και μετά την
πιθανή διαγραφή της λοιπόν). Μπορεί να μολύνει τη συσκευή μέσω ενός
mail, ή text-message (Περισσότερα εδώ).
Το mobile botnet που υλοποιήσαμε ακολουθεί τα βασικά
χαρακτηριστικά λειτουργίας που αναφέραμε ώστε να δουλεύει σαν
malware. Τρέχει σαν service στο κινητό του χρήστη, είναι transparent που
σημαίνει ότι ενεργοποιείται κατά το άνοιγμα της εφαρμογής και λόγω του
eλεύθερου που δίνει η google με το android (μπορεί να χαρακτηριστεί ως
κενό; είναι σκόπιμο;) δεν ζητάει δικαιώματα χρήστη παρά μόνο κατά το
screenshot.
Περιοριστήκαμε σε rooted android συσκευή SONY xperia sola για τη
διευκόλυνση της υλοποίησης, αν και όπως προαναφέραμε δεν χρειάζεται
να είναι “σπασμένο” το κινητό ώστε να λειτουργήσει το malware.
5. ΒΑΣΙΚΗ ΔΟΜΗ
Ο βασικός σχεδιασμός του main project ακολούθησε τον παρακάτω
σχεδιασμό, αφενός ώστε να εξυπηρετηθούν οι εκάστοτε ανάγκες του
mobile botnet (ασφάλεια, διασύνδεση κλπ) και αφετέρου ώστε να γίνει και
ο κατάλληλος καταμερισμός εργασίας μεταξύ μας.
(Σχεδιαστικό περιβάλλον για network : dia – ubuntu)
Το παραπάνω σχέδιο περιέχει :
Τον master
Υλοποιεί το control των bots, δηλαδή ακούει στα bots και τα ενεργοποιεί
μέσω ενός GUI ελέγχου για τις βασικές τους λειτουργίες.
6. Τον proxy
Υλοποιεί το τη μεταγωγή πακέτων από και προς τον master και τα bots,
υλοποιεί τα βασικά threads για τη διαχείριση της κίνησης δικτύου.
Τα bots
Tα τερματικά χρήστη, δηλαδή τα κινητά τηλέφωνα στα οποία έχει
εγκατασταθεί το malware. Τρέχει τις βασικές κλάσεις – λειτουργίες του bot,
όπως καταγραφή κλήσης, screenshot κτλ.
Όλο το δίκτυο στήνεται πάνω σε SSL επικοινωνία, με δικής μας κατασκευής
κλειδιά και CA.
Η επικοινωνία proxy – bots προφανώς και απαιτεί ενεργοποίηση δεδομένων
από τον χρήστη – bot.
Στη συνέχεια αναλύουμε τα επιμέρους αυτά σημεία.
10. BOT
Η εφαρμογή του bot υλοποιήθηκε σε Java με χρήση του Eclipse IDE +
Android plugin και δοκιμάστηκε στο Sony Xperia Sola. Σκοπός της
εφαρμογής είναι η απομακρυσμένη κλήση λειτουργειών του κινητού
(screenshot, microphone recording, call recording) χωρίς αυτό να γίνει
αντιληπτό από το χρήστη.
Το πρώτο βήμα ήταν η δημιουργία ενός Service (RatService.java) αφού
θέλουμε η εφαρμογή να τρέχει στο background με ένα βασικό UI το οποίο
ήταν μια λευκή οθόνη.
Η Main Activity (MainActivity.java) περιέχει μόνο την έναρξη του Service
και τρέχει μόνο την πρώτη φορά.
11. Μετά αναλαμβάνει ένας Broadcast Receiver (autostart.java) που τρέχει το
Service κάθε φορά που ανοίγει το κινητό.
Το Service στην έναρξη τρέχει τη μέθοδο onStartCommand() σε αυτή ελέγχει
αν υπάρχει το directory .hidden και αν δεν υπάρχει το δημιούργει.
Το .hidden directory είναι ένας κρυφός φάκελος (η “.” στην αρχή του
ονόματος ενός Unix file ή directory δηλώνει ότι είναι κρυφό) στην κάρτα SD.
Επιλέχτηκε αυτή η τοποθεσία διότι η εφαρμογή μπορεί εύκολα να έχει
πρόσβαση. Αφού δημιουργηθεί το directory η onStartCommand μέθοδος
καλεί ένα καινούριο Broadcast Receiver και τρέχει το Service με την επιλογή
START_STICKY που δηλώνει στο σύστημα πως αν το Service για τον
12. οποιοδήποτε λόγο σταματήσει, θα πρέπει να ξανακινήσει αμέσως. Με αυτό
τον τρόπο έχουμε καλύψει όλα τα σενάρια έναρξης της εφαρμογής και
διακοπής της εφαρμογής.
Ο Broadcast Receiver που ξεκινάει η μέθοδος onStartCommand()
παρακολουθεί αν το κινητό είναι συνδεδεμένο στο Internet (Από τη στιγμή
που η εφαρμογή ελέγχεται απομακρυσμένα δεν χρειάζεται να τρέχουν
λειτουργείες τις αν το κινητό δεν είναι συνδεδεμένο). Με το που συνδεθεί
τρέχει τη μέθοδο connect().
13. Η μέθοδος connect() καλεί τον Connection Manager
(ConnectionManager.java) που είναι υπεύθυνος για τη δημιουργία SSL
σύνδεσης με τον proxy. Μετά την εγκαθίδρυση ασφαλής σύνδεσης σε ένα
καινούριο thread τρέχει μία επανάληψη που στην ουσία περιμένει τις
14. εντολές του Master και καλεί τις κατάλληλες μεθόδους.
To ScreenShot είναι περίεργη υπόθεση στο Android,
ενώ υπάρχουν Built in εντολές στο Android API που
επιτρέπουν τη λήψη screenshot, έχουν δικαίωμα να το
κάνουν μόνο στο γραφικό περιβάλλον της
εφαρμογής. Εμάς δεν μας ενδιαφέρει κάτι τέτοιο αφού
η εφαρμογή δεν έχει περιβάλλον και θέλουμε η λήψη
να γίνεται σε οποιαδήποτε κατάσταση και να είναι το
τηλέφωνο. Για την απόκτηση δικαιωμάτων λήψης
screenshot εκτός περιβάλλοντος εφαρμογής με τη
χρήση του API χρειάζεται η εφαρμογή να είναι
υπογεγραμμένη από τη google.
Το πρόβλημα το λύσαμε χρησιμοποιώντας εντολές
συστήματος. Το κάθε screenshot όπως και όλα τα
αρχεία που παράγει η εφαρμογή περιέχει στο όνομα
του ένα μοναδικό, ως προς τη συσκευή, ID και
timestamp, με αυτόν τον τρόπο αποκλείει την
πιθανότητα να λάβει ο Master δύο αρχεία με το ίδιο
15. ακριβώς όνομα
(π.χ.screenshot_352264054375437_1410861266.png)
Η μέθοδος startVoiceRecord αρχοκοποιέι αντικείμενο της κλάσης
RecordVoice (RecordVoice.java), με παράμετρο τη τοποθεσία
αποθήκευσης των αρχείων (.hidden) και το μοναδικό id, και καλεί τη μέθοδο
startRecording().
Η startRecording() χρησιμοποιεί την κλάση MediaRecorder από το Android
API και το παραμετροποιεί ορίζοντας την πηγή του ήχου, σε αυτήν την
περίπτωση το μικρόφωνο, τη μορφή συμπίεσης σε mpeg-4, τη τοποθεσία
αποθήκευσης του αρχείου από την παράμετρο του costractor, και τον
encoder ως ACC. Το όνομα του αρχείου, παρόμοια με το screenshot
περιέχει το μοναδικό ID και timestamp. Τέλος ξεκινάει την ηχογράφηση.
(π.χ.voicerecord_352264054375437_1404965524.mp4)
16. Η μέθοδος stopVoiceRecord() αντίστοιχα
καλεί τη μέθοδο stopRecording() της
RecordVoice που σταματάει την
ηχογράφηση.
Η μέθοδος startCallRecord() καλεί ένα Broadcast Receiver που
παρακολουθεί την κατάσταση των κλήσεων και τον αρχικοποιεί με την
τοποθεσία αποθήκευσης. Αυτός υλοποιείτε στην κλάση CallRecorder
(CallRecorder.java)
Στη μέθοδο onReceive() του Broadcast Receiver δημιουρφήτε και ξεκινάει
ένας phone state Listener που παρακολουθεί την κατάσταση της κλήσης.
Όταν η κατάσταση είναι OFFHOOK (γίνεται κλήση) ξεκινάει την ηχογράφηση
όπως στο voice record με μόνη διάφορα την πηγή της ηχογράφησης που
17. αυτή τη φορά είναι το VOICE_CALL, δηλαδή το uplink και downlink της
κλήσης. Όταν η κατάσταση είναι IDLE σταματάει τον recorder. Με αυτόν τον
τρόπο επιτυγχάνεται η ηχογράφηση της κλήσης και μόνο.
Αντίστοιχα η μέθοδος stopCallRecord σταματάει τον Broadcast Receiver
και μαζί του την ηχογράφηση των κλήσεων. Εδώ θα ήθελα να σημειωθεί η
ευκολία της ηχογράφησης του περιβάλλοντος και των κλήσεων. Τα Android
δικαιώματα που χρειάζονται είναι αυτά της πρόσβασης του χώρου
αποθήκευσης , της ηχογράφησης και της κατάστασης του τηλεφώνου.
Δικαιώματα που είναι κοινά σε πάρα πολλές εφαρμογές πολλές εφαρμογές
του Android Market και ο χρήστης, ακόμα και αν τα κοιτάξει, θα τα δεχτεί ως
φυσιολογικά. Αυτό από μόνο του δημιουργεί κενό ασφαλείας αφού δίνει τη
δυνατότητα στον οποιοδήποτε να κάνει ηχογράφηση χωρίς τη γνώση του
18. χρήστη του περιβάλλοντος και των κλήσεων.
Η αποστολή των αρχείων γίνεται μαζικά. Όταν ο Master ζητήσει τα αρχεία,
καλείται η μέθοδος sendAllData() της κλάσης SendFiles (SendFiles.java).
H μέθοδος sendAllData() καλεί τη μέθοδο listFiles() διαβάζει αναδρομικά τα
περιεχόμενα του .hidden
directory και αποθηκεύει σε
μία λίστα τα απόλυτα
μονοπάτια (absolute path)
των αρχείων. Αν η listFiles()
επιστρέψει κενή λίστα
σημαίνει πως δεν υπάρχουν
αρχεία για αποστολή και
στέλνει “0” στο Master ,
αλλιώς στέλνει τον αριθμό
των αρχείων (μέγεθος της
19. λίστας).
Έπειτα καλεί για κάθε αρχείο τη sendFile() που στέλνει το αρχείο, αφού
πρώτα το περάσει από την encodeFile(), σε μορφή BASE64 στο Master και
το διαγράφει από τη μνήμη του κινητού.
20. Το manifest περιγράφει στο λειτουργικό ότι χρειάζεται να ξέρει για την
εφαρμογή.
Τα δικαιώματα που απαιτεί η συγκεκριμένη εφαρμογή είναι
INTERNET : για πρόσβαση στο internet
ACCESS_NETWORK_STATE : για τον έλεγχο διαθεσιμότητας του δικτύου
RECORD_AUDIO : άδεια ηχογράφησης
READ_PHONE_STATE : παρακολούθηση της κατάστασης του τηλεφώνου
WRITE_EXTERNAL_STORAGE : δικαίωμα εγγραφής δεδομένων στην κάρτα SD
RECEIVE_BOOT_COMPLETED : στέλνει μήνυμα όταν ανοίξει η συσκευή
Ενημερώνει το λειτουργικό πιά κλάση θα τρέξει μόλις τελειώσει το Boot
και πώς η εφαρμογή, ακόμα και αν είναι στο foreground είναι διάφανη
και τέλος πως το Service είναι δικό
του proccess, που χρειάζεται για τη
χρήση internet.
21. SSL
Ξεκινήσαμε με τη δημιουργία self-signed CA με τη χρήση του εργαλείου
openssl, και στη συνέχεια δημιουργήσαμε certificates για κάθε ένα από τα
τρία μέρη του συστήματος και τα υπογράψαμε με τη CA. Για την ευκολότερη
χρήση τους τα πακετάραμε το καθένα ξεχωριστά με τo κλειδί του και τη CA
σε αρχεία PKCS12 και τη CA σε ένα αρχείο JKS για τον Proxy του keytool της
Java διότι εξαιτίας ενός bug στις βιβλιοθήκες της Java δεν το ξεχώριζε στα
PKCS και σε BKS πακέτο (Bouncy Castle format Java Keystore) για το bot
αφού δεν αναγνωρίζει τα JKS πακέτα.
22. Η δημιουργία της SSL σύνδεσης από εκεί και πέρα είναι κοινή για τον Master
και το Bot που συνδέονται σαν clients στον proxy. Δημιουργείται ένα
TrustStore με τα πακέτα JKS και BKS αντίστοιχα, ένα KeyStore με τα PKCS και
το SSL socket με αυτά τα πιστοποιητικά. Αντίστοιχα στον Proxy δημιουργείται
SSL Server Socket.
23. Στο Android η τα πακέτα των πιστποιητικών
μπορούν να ανοιχτούν μόνο μεσα από το φάκελο
raw με την εντολή
load(aplicationContext.getResources() .openRawResource(R.raw.rootca
).
Αυτή η διαδικασία δεν αναγνωρίζει τα JKS πακέτα, και PKCS διαβάζονται
λάθος όταν περιέχουν μόνο τη CA από bug της JAVA.
24. Εργαλεία που χρησημοποιήθηκαν
Τα εργαλεία που χρησιμοποιήσαμε είναι : Eclipse με Android sdk για τη
δημιουργία του bot, NetBeans για τη δημιουργία του master και proxy.
Χρησημοποιήσαμε Arch Linux PC για την ανάπτυξη του android και
Windows PC για τον Proxy και τον Master.
Στην αρχή της ανάπτυξης της εφαρμογής παρουσιάστηκαν αρκετά
προβλήματα λειτουργίας στο Windows PC τα οποία και είχαν επισημανθεί
και στον κ. Καμπουράκη. Το κύριο πρόβλημα ήταν η επικοινωνία με το Git
και το ανέβασμα του κώδικα από τον Παπαθανασίου Θανάση. Το
πρόβλημα λύθηκε.
Επίσης το ένα κινητό του εξοπλισμού μας δεν βοήθησε ώστε να
τεστάρουμε το malware σε περισσότερες από μία συσκευές. Είχαμε να
αντιμετωπίσουμε διάφορα προβλήματα κυρίως λόγω καθυστέρησης
επεξεργασίας πράγμα που σημαίνει ότι το botnet δουλεύει καλύτερα σε
κινητά με καλύτερα τεχνικά χαρακτηριστικά από του έχοντος.
Επίλογος
Με επιτυχία ολοκληρώθηκαν τα βήματα – λειτουργίες που
περιγράψαμε παραπάνω και όπως αποτυπώνονται στα screenshots αλλά
και η live παρουσίαση της εφαρμογής στο γραφείο της εξέτασης, ο τελικός
σκοπός επιτεύχθηκε με μία πλήρως λειτουργική εφαρμογή που όμως
“παίρνει” αρκετή βελτίωση. Μπορούν να προστεθούν και άλλες λειτουργίες
για τα bot όπως κάμερα, remote άνοιγμα και κλείσιμο εφαρμογών καθώς
και streaming λειτουργία της. Η έλλειψη χρόνου και το έτος φοίτησης ήταν
καθοριστικοί παράγοντες που μας καθυστέρησαν από την περεταίρω
ενασχόληση.