macOS .Net Applications Injection
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์ด๊ฒ์ ๊ฒ์๋ฌผ https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/์ ์์ฝ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ํ์ธํ์ธ์!
.NET Core Debugging
๋๋ฒ๊น ์ธ์ ์ค์
.NET์์ ๋๋ฒ๊ฑฐ์ ๋๋ฒ๊ทธ ๋์ ๊ฐ์ ํต์ ์ฒ๋ฆฌ๋ dbgtransportsession.cpp์์ ๊ด๋ฆฌ๋ฉ๋๋ค. ์ด ๊ตฌ์ฑ ์์๋ dbgtransportsession.cpp#L127์์ ๋ณผ ์ ์๋ฏ์ด ๊ฐ .NET ํ๋ก์ธ์ค์ ๋ํด ๋ ๊ฐ์ ๋ช
๋ช
๋ ํ์ดํ๋ฅผ ์ค์ ํ๋ฉฐ, ์ด๋ twowaypipe.cpp#L27๋ฅผ ํตํด ์์๋ฉ๋๋ค. ์ด๋ฌํ ํ์ดํ๋ -in ๋ฐ **-out**์ผ๋ก ์ ๋ฏธ์ฌ๊ฐ ๋ถ์ต๋๋ค.
์ฌ์ฉ์์ **$TMPDIR**๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด .Net ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋ฒ๊น
ํ๊ธฐ ์ํ ๋๋ฒ๊น
FIFO๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
DbgTransportSession::TransportWorker๋ ๋๋ฒ๊ฑฐ๋ก๋ถํฐ์ ํต์ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค. ์๋ก์ด ๋๋ฒ๊น
์ธ์
์ ์์ํ๋ ค๋ฉด, ๋๋ฒ๊ฑฐ๋ MessageHeader ๊ตฌ์กฐ์ฒด๋ก ์์ํ๋ ๋ฉ์์ง๋ฅผ out ํ์ดํ๋ฅผ ํตํด ์ ์กํด์ผ ํ๋ฉฐ, ์ด๋ .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 ์์คํ
ํธ์ถ์ ์ฌ์ฉํ์ฌ ๋์์ ์ ์ก๋๋ฉฐ, ๊ทธ ๋ค์ ์ธ์
์ ์ํ GUID๋ฅผ ํฌํจํ๋ sessionRequestData ๊ตฌ์กฐ์ฒด๊ฐ ์ต๋๋ค:
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;
}
์์ ํ ๊ฐ๋ ์ฆ๋ช (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์์ ์์ธํ ์ค๋ช
๋์ด ์์ผ๋ฉฐ, ๋ฐํ์์์ JIT ์ปดํ์ผ ํฌํผ ํจ์์ ์ฌ์ฉ๋ฉ๋๋ค.
x64 ์์คํ
์ ๊ฒฝ์ฐ, ์๋ช
๊ฒ์์ ์ฌ์ฉํ์ฌ libcorclr.dll์์ ์ฌ๋ณผ _hlpDynamicFuncTable์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
MT_GetDCB ๋๋ฒ๊ฑฐ ํจ์๋ ํฌํผ ํจ์์ ์ฃผ์์ธ m_helperRemoteStartAddr๋ฅผ ํฌํจํ์ฌ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ์์ libcorclr.dll์ ์์น๋ฅผ ๋ํ๋
๋๋ค. ์ด ์ฃผ์๋ DFT๋ฅผ ๊ฒ์ํ๊ณ ํจ์ ํฌ์ธํฐ๋ฅผ ์
ธ์ฝ๋์ ์ฃผ์๋ก ๋ฎ์ด์ฐ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
PowerShell์ ๋ํ ์ฃผ์ ์ ์ํ ์ ์ฒด POC ์ฝ๋๋ ์ฌ๊ธฐ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
References
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


