macOS .Net Applications Injection

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekleyin

Bu, https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/ adresindeki gönderinin bir özetidir. Daha fazla ayrıntı için kontrol edin!

.NET Core Hata Ayıklama

Hata Ayıklama Oturumu Kurma

.NET'te hata ayıklayıcı ile hata ayıklanan arasındaki iletişimin yönetimi dbgtransportsession.cpp tarafından yapılmaktadır. Bu bileşen, dbgtransportsession.cpp#L127 adresinde görüldüğü gibi her .NET işlemi için iki adlandırılmış boru hattı kurar ve bunlar twowaypipe.cpp#L27 aracılığıyla başlatılır. Bu boru hatları -in ve -out ile sonlandırılır.

Kullanıcının $TMPDIR dizinine giderek, .Net uygulamalarını hata ayıklamak için mevcut olan hata ayıklama FIFO'larını bulabilirsiniz.

DbgTransportSession::TransportWorker hata ayıklayıcıdan gelen iletişimi yönetmekten sorumludur. Yeni bir hata ayıklama oturumu başlatmak için, bir hata ayıklayıcı out boru hattı aracılığıyla MessageHeader yapısıyla başlayan bir mesaj göndermelidir; bu yapı .NET kaynak kodunda ayrıntılı olarak açıklanmıştır:

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];
}

Yeni bir oturum talep etmek için, bu yapı aşağıdaki gibi doldurulur, mesaj türü MT_SessionRequest ve protokol sürümü mevcut sürüm olarak ayarlanır:

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);

Bu başlık daha sonra write syscall'ı kullanılarak hedefe gönderilir, ardından oturum için bir GUID içeren sessionRequestData yapısı gelir:

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

out borusundaki bir okuma işlemi, hata ayıklama oturumu kurulumunun başarıyla tamamlandığını veya başarısız olduğunu doğrular:

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

Belleği Okuma

Bir hata ayıklama oturumu kurulduktan sonra, bellek MT_ReadMemory mesaj türü kullanılarak okunabilir. readMemory fonksiyonu, bir okuma isteği göndermek ve yanıtı almak için gerekli adımları gerçekleştiren ayrıntılı bir işlemdir:

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;
}

Tam kanıt konsepti (POC) burada mevcuttur.

Belleğe Yazma

Benzer şekilde, bellek writeMemory fonksiyonu kullanılarak yazılabilir. Süreç, mesaj türünü MT_WriteMemory olarak ayarlamayı, verinin adresini ve uzunluğunu belirtmeyi ve ardından veriyi göndermeyi içerir:

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;
}

İlgili POC burada mevcuttur.

.NET Core Kod Çalıştırma

Kod çalıştırmak için, rwx izinlerine sahip bir bellek bölgesi tanımlanmalıdır; bu, vmmap -pages: kullanılarak yapılabilir.

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

Bir işlev işaretçisini geçersiz kılmak için bir yer bulmak gereklidir ve .NET Core'da bu, Dynamic Function Table (DFT) hedeflenerek yapılabilir. Bu tablo, jithelpers.h dosyasında detaylandırılmıştır ve çalışma zamanı tarafından JIT derleme yardımcı işlevleri için kullanılır.

x64 sistemler için, _hlpDynamicFuncTable sembolüne bir referans bulmak için imza avcılığı kullanılabilir libcorclr.dll içinde.

MT_GetDCB hata ayıklayıcı işlevi, libcorclr.dll'nin işlem belleğindeki konumunu gösteren bir yardımcı işlevin adresi olan m_helperRemoteStartAddr dahil olmak üzere yararlı bilgiler sağlar. Bu adres daha sonra DFT'yi aramak ve bir işlev işaretçisini shellcode'un adresi ile geçersiz kılmak için kullanılır.

PowerShell'e enjeksiyon için tam POC kodu buradan erişilebilir.

Referanslar

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated