macOS .Net Applications Injection

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Αυτό είναι ένα σύνοψη του άρθρου 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:

struct MessageHeader {
MessageType   m_eType;        // Message type
DWORD         m_cbDataBlock;  // Size of following data block (can be zero)
DWORD         m_dwId;         // Message ID from sender
DWORD         m_dwReplyId;    // Reply-to Message ID
DWORD         m_dwLastSeenId; // Last seen Message ID by sender
DWORD         m_dwReserved;   // Reserved for future (initialize to zero)
union {
struct {
DWORD         m_dwMajorVersion;   // Requested/accepted protocol version
DWORD         m_dwMinorVersion;
} VersionInfo;
...
} TypeSpecificData;
BYTE          m_sMustBeZero[8];
}

Για να ζητηθεί μια νέα συνεδρία, αυτή η δομή συμπληρώνεται ως εξής, ορίζοντας τον τύπο μηνύματος σε MT_SessionRequest και την έκδοση πρωτοκόλλου στην τρέχουσα έκδοση:

static const DWORD kCurrentMajorVersion = 2;
static const DWORD kCurrentMinorVersion = 0;

// Configure the message type and version
sSendHeader.m_eType = MT_SessionRequest;
sSendHeader.TypeSpecificData.VersionInfo.m_dwMajorVersion = kCurrentMajorVersion;
sSendHeader.TypeSpecificData.VersionInfo.m_dwMinorVersion = kCurrentMinorVersion;
sSendHeader.m_cbDataBlock = sizeof(SessionRequestData);

Αυτή η κεφαλίδα στέλνεται στον στόχο χρησιμοποιώντας την κλήση συστήματος write, ακολουθούμενη από τη δομή sessionRequestData που περιέχει ένα GUID για τη συνεδρία:

write(wr, &sSendHeader, sizeof(MessageHeader));
memset(&sDataBlock.m_sSessionID, 9, sizeof(SessionRequestData));
write(wr, &sDataBlock, sizeof(SessionRequestData));

Μια λειτουργία ανάγνωσης στο αγωγό out επιβεβαιώνει την επιτυχία ή την αποτυχία της διαδικασίας αποσφαλμάτωσης:

read(rd, &sReceiveHeader, sizeof(MessageHeader));

Ανάγνωση Μνήμης

Μόλις έχει δημιουργηθεί μια συνεδρία αποσφαλμάτωσης, η μνήμη μπορεί να διαβαστεί χρησιμοποιώντας τον τύπο μηνύματος MT_ReadMemory. Η συνάρτηση readMemory είναι λεπτομερής, εκτελώντας τα απαραίτητα βήματα για να στείλει ένα αίτημα ανάγνωσης και να ανακτήσει την απόκριση:

bool readMemory(void *addr, int len, unsigned char **output) {
// Allocation and initialization
...
// Write header and read response
...
// Read the memory from the debuggee
...
return true;
}

Η πλήρης απόδειξη του concept (POC) είναι διαθέσιμη εδώ.

Εγγραφή Μνήμης

Αντίστοιχα, η μνήμη μπορεί να εγγραφεί χρησιμοποιώντας τη συνάρτηση writeMemory. Η διαδικασία περιλαμβάνει την ρύθμιση του τύπου μηνύματος σε MT_WriteMemory, τον καθορισμό της διεύθυνσης και του μήκους των δεδομένων, και στη συνέχεια την αποστολή των δεδομένων:

bool writeMemory(void *addr, int len, unsigned char *input) {
// Increment IDs, set message type, and specify memory location
...
// Write header and data, then read the response
...
// Confirm memory write was successful
...
return true;
}

Το σχετικό POC είναι διαθέσιμο εδώ.

Εκτέλεση κώδικα .NET Core

Για να εκτελέσετε κώδικα, πρέπει να εντοπίσετε μια περιοχή μνήμης με δικαιώματα rwx, το οποίο μπορεί να γίνει χρησιμοποιώντας την εντολή vmmap -pages:

vmmap -pages [pid]
vmmap -pages 35829 | grep "rwx/rwx"

Είναι απαραίτητο να εντοπιστεί ένα σημείο για την αντικατάσταση ενός δείκτη συνάρτησης, και στο .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 είναι προσβάσιμος εδώ.

Αναφορές

Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated