macOS .Net Applications Injection

AWS hacklemeyi sıfırdan kahramana dönüştürmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları:

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

.NET Core Hata Ayıklama

Bir Hata Ayıklama Oturumu Kurma

.NET'te hata ayıklama aracı ve hata ayıklanan arasındaki iletişim dbgtransportsession.cpp tarafından yönetilir. Bu bileşen, her .NET işlemi için dbgtransportsession.cpp#L127 adresinde görüldüğü gibi iki adet isimlendirilmiş pipe kurar. Bu borular -in ve -out ile sonlandırılır.

Kullanıcının $TMPDIR'sini ziyaret ederek, .Net uygulamalarını hata ayıklamak için kullanılabilen hata ayıklama FIFO'larını bulabilirsiniz.

DbgTransportSession::TransportWorker, bir hata ayıklama aracından gelen iletişimi yönetmekten sorumludur. Yeni bir hata ayıklama oturumu başlatmak için, bir hata ayıklama aracı, .NET kaynak kodunda detayları verilen MessageHeader yapısını içeren bir mesajı out boruya göndermelidir:

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 isteği yapmak için, bu yapı aşağıdaki gibi doldurulur, mesaj türü MT_SessionRequest olarak 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 sistem çağrısı kullanılarak hedefe gönderilir ve ardından oturum için bir GUID içeren sessionRequestData yapısı gönderilir:

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

out boru üzerinde yapılan bir okuma işlemi, hata ayıklama oturumunun başarılı olup olmadığını doğrular.

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

Bellek Okuma

Bir hata ayıklama oturumu oluşturulduğunda, bellek MT_ReadMemory mesaj türünü kullanarak okunabilir. readMemory işlevi, bir okuma isteği göndermek ve yanıtı almak için gerekli adımları ayrıntılı olarak gerçekleştirir:

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 (POC) burada bulunmaktadır.

Belleğe Yazma

Benzer şekilde, belleğe yazma işlemi writeMemory fonksiyonu kullanılarak gerçekleştirilir. İşlem, mesaj türünün MT_WriteMemory olarak ayarlanması, verinin adresi ve uzunluğunun belirtilmesi ve ardından verinin gönderilmesini 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 bulunabilir.

.NET Core Kodu Yürütme

Kod yürütmek için, rwx izinlerine sahip bir bellek bölgesi belirlemek gerekmektedir. Bu, vmmap -pages kullanılarak yapılabilir:

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

Bir işlev işaretçisini üzerine yazmak için bir yer bulmak gereklidir ve .NET Core'da bunu yapmanın bir yolu Dynamic Function Table (DFT)'ye hedef alarak yapmaktır. Bu tablo, JIT derleme yardımcı işlevleri için çalışma zamanı tarafından kullanılan jithelpers.h dosyasında detaylı olarak açıklanmıştır.

x64 sistemler için, libcorclr.dll içindeki _hlpDynamicFuncTable sembolüne bir referans bulmak için imza avı kullanılabilir.

MT_GetDCB hata ayıklama işlevi, m_helperRemoteStartAddr adlı bir yardımcı işlevin adresi de dahil olmak üzere yararlı bilgiler sağlar. Bu adres, DFT'nin konumunu ve bir işlev işaretçisini kabuk kodunun adresiyle üzerine yazmak için kullanılır.

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

Referanslar

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Last updated