macOS .Net Applications Injection
Αυτό είναι ένα σύνοψη του άρθρου https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Ελέγξτε το για περισσότερες λεπτομέρειες!
Αποσφαλμάτωση .NET Core
Δημιουργία μιας συνεδρίας αποσφαλμάτωσης
Η διαχείριση της επικοινωνίας μεταξύ αποσφαλματωτή και αποσφαλματούμενου στο .NET γίνεται από το dbgtransportsession.cpp. Αυτό το στοιχείο δημιουργεί δύο ονομασμένα αγωγούς ανά .NET διεργασία, όπως φαίνεται στο dbgtransportsession.cpp#L127, οι οποίοι εκκινούν μέσω του twowaypipe.cpp#L27. Αυτοί οι αγωγοί έχουν ως επίθεμα τα -in
και -out
.
Επισκεπτόμενοι το $TMPDIR
του χρήστη, μπορεί κανείς να βρει τους αγωγούς αποσφαλμάτωσης που είναι διαθέσιμοι για την αποσφαλμάτωση εφαρμογών .Net.
Ο DbgTransportSession::TransportWorker είναι υπεύθυνος για τη διαχείριση της επικοινωνίας από έναν αποσφαλματωτή. Για να ξεκινήσει μια νέα συνεδρία αποσφαλμάτωσης, ένας αποσφαλματωτής πρέπει να στείλει ένα μήνυμα μέσω του αγωγού out
που ξεκινά με μια δομή MessageHeader
, η οποία περιγράφεται λεπτομερώς στον πηγαίο κώδικα του .NET:
Για να ζητηθεί μια νέα συνεδρία, αυτή η δομή συμπληρώνεται ως εξής, ορίζοντας τον τύπο μηνύματος σε MT_SessionRequest
και την έκδοση πρωτοκόλλου στην τρέχουσα έκδοση:
Αυτή η κεφαλίδα στέλνεται στον στόχο χρησιμοποιώντας την κλήση συστήματος write
, ακολουθούμενη από τη δομή sessionRequestData
που περιέχει ένα GUID για τη συνεδρία:
Μια λειτουργία ανάγνωσης στο αγωγό out
επιβεβαιώνει την επιτυχία ή την αποτυχία της διαδικασίας αποσφαλμάτωσης:
Ανάγνωση Μνήμης
Μόλις έχει δημιουργηθεί μια συνεδρία αποσφαλμάτωσης, η μνήμη μπορεί να διαβαστεί χρησιμοποιώντας τον τύπο μηνύματος MT_ReadMemory
. Η συνάρτηση readMemory είναι λεπτομερής, εκτελώντας τα απαραίτητα βήματα για να στείλει ένα αίτημα ανάγνωσης και να ανακτήσει την απόκριση:
Η πλήρης απόδειξη του concept (POC) είναι διαθέσιμη εδώ.
Εγγραφή Μνήμης
Αντίστοιχα, η μνήμη μπορεί να εγγραφεί χρησιμοποιώντας τη συνάρτηση writeMemory
. Η διαδικασία περιλαμβάνει την ρύθμιση του τύπου μηνύματος σε MT_WriteMemory
, τον καθορισμό της διεύθυνσης και του μήκους των δεδομένων, και στη συνέχεια την αποστολή των δεδομένων:
Το σχετικό POC είναι διαθέσιμο εδώ.
Εκτέλεση κώδικα .NET Core
Για να εκτελέσετε κώδικα, πρέπει να εντοπίσετε μια περιοχή μνήμης με δικαιώματα rwx, το οποίο μπορεί να γίνει χρησιμοποιώντας την εντολή vmmap -pages:
Είναι απαραίτητο να εντοπιστεί ένα σημείο για την αντικατάσταση ενός δείκτη συνάρτησης, και στο .NET Core αυτό μπορεί να γίνει στο Dynamic Function Table (DFT). Αυτός ο πίνακας, που περιγράφεται στο jithelpers.h
, χρησιμοποιείται από το runtime για τις βοηθητικές συναρτήσεις JIT μεταγλώττισης.
Για συστήματα x64, μπορεί να χρησιμοποιηθεί η τεχνική του signature hunting για να βρεθεί μια αναφορά στο σύμβολο _hlpDynamicFuncTable
στο libcorclr.dll
.
Η συνάρτηση αποσφαλμάτωσης MT_GetDCB
παρέχει χρήσιμες πληροφορίες, συμπεριλαμβανομένης της διεύθυνσης μιας βοηθητικής συνάρτησης, m_helperRemoteStartAddr
, που υποδεικνύει την τοποθεσία του libcorclr.dll
στη μνήμη της διεργασίας. Αυτή η διεύθυνση χρησιμοποιείται στη συνέχεια για να ξεκινήσει η αναζήτηση του DFT και η αντικατάσταση ενός δείκτη συνάρτησης με τη διεύθυνση του shellcode.
Ο πλήρης κώδικας POC για ενσωμάτωση στο PowerShell είναι προσβάσιμος εδώ.
Αναφορές
Last updated