macOS .Net Uygulamaları Enjeksiyonu
Reading time: 5 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Bu, https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/ gönderisinin 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ı ve 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 kurar ve bunlar twowaypipe.cpp#L27 aracılığıyla başlatılır. Bu borular -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 bir 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
borusu 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 kurulumu işleminin başarıyla veya başarısız bir şekilde gerçekleştiğini 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, imza avcılığı, libcorclr.dll
içinde _hlpDynamicFuncTable
sembolüne bir referans bulmak için kullanılabilir.
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
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.