±â¼ú ÀÚ·á: 131065 - ¸¶Áö¸· °ËÅä: 2006³â 11¿ù 21ÀÏ È¿äÀÏ - ¼öÁ¤: 5.4
SeDebugPrivilege »ç¿ëÇÏ¸é ¸ðµç ÇÁ·Î¼¼½º·ÎÀÇ ÇÚµéÀ» ±¸ÇÏ´Â ¹æ¹ý
½Ã½ºÅÛ ÆÁ º» ¹®¼ÀÇ ³»¿ëÀº ±ÍÇϰ¡ »ç¿ëÇÏ´Â ¿î¿µ üÁ¦¿Í ´Ù¸¥ ¿î¿µ üÁ¦¿¡ ÇØ´çÇÕ´Ï´Ù. ¹®¼ ³»¿ë Áß ±ÍÇÏ¿Í °ü·Ã ¾ø´Â ºÎºÐÀº Ç¥½ÃµÇÁö ¾Ê½À´Ï´Ù.
Microsoft Windows NT, Microsoft Windows 2000 ¹× Microsoft Windows Server 2003 °Ë»öÇÒ ¼ö ÀÖ½À´Ï´Ù ¸ðµç ÇÁ·Î¼¼½º·ÎÀÇ ÇÚµéÀ» ½Ã½ºÅÛ ¿¡¼ È£Ãâ ÇÁ·Î¼¼½º°¡ SeDebugPrivilege »ç¿ë. È£Ãâ ÇÁ·Î¼¼½º°¡ PROCESS_ALL_ACCESS ÇÚµéÀÌ ±¸ÇÏ·Á¸é OpenProcess() Win32 API È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌ ±â´ÉÀº ½Ã½ºÅÛ ¼öÁØÀÇ µð¹ö±ë ¸ñÀûÀ¸·Î Á¦°øµË´Ï´Ù. ºñ ½Ã½ºÅÛ ÇÁ·Î¼¼½º µð¹ö±ëÀ» À§ÇØ ÇÊ¿äÇÏÁö ¾Ê½À´Ï´Ù ºÎ¿©Çϰųª ÀÌ ±ÇÇÑÀ» »ç¿ë.
ÀÌ ±ÇÇÑÀ» »ç¿ëÇϸé È£ÃâÀÚ°¡ ´ë»ó ÇÁ·Î¼¼½º°¡ TerminateProcess(), CreateRemoteThread(), ¹× ±âŸ ÀáÀçÀûÀ¸·Î À§ÇèÇÑ Win32 API¸¦ È£ÃâÇÏ´Â ±â´ÉÀ» Æ÷ÇÔÇÏ¿© ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ¸ðµç ¾×¼¼½º ¼ö ÀÖ½À´Ï´Ù.
SeDebugPrivilege »ç¿ëÀÚ³ª ±×·ì¿¡ ºÎ¿©ÇÒ ¶§ ¸Å¿ì ÁÖÀǸ¦ °É¸³´Ï´Ù.
¿¹Á¦ ÄÚµå ´ÙÀ½ ¿øº» Äڵ忡¼´Â PROCESS_ALL_ACCESS »ç¿ëÇÏ¿© ÇÁ·Î¼¼½º·ÎÀÇ ÇÚµéÀ» ¾ò´Â µ¥ SeDebugPrivilege °¡Á®¿À´Â ¹æ¹ýÀ» º¸¿© ÁÝ´Ï´Ù. »ùÇà ÄÚµå´Â TerminateProcess °á°ú ÇÁ·Î¼¼½º ÇÚµéÀ» È£ÃâÇÕ´Ï´Ù.
--*/
#define RTN_OK 0
#define RTN_USAGE 1
#define RTN_ERROR 13
#include <windows.h>
#include <stdio.h>
BOOL SetPrivilege(
HANDLE hToken, // token handle
LPCTSTR Privilege, // Privilege to enable/disable
BOOL bEnablePrivilege // TRUE to enable. FALSE to disable
);
void DisplayError(LPTSTR szAPI);
int main(int argc, char *argv[])
{
HANDLE hProcess;
HANDLE hToken;
int dwRetVal=RTN_OK; // assume success from main()
// show correct usage for kill
if (argc != 2)
{
fprintf(stderr,"Usage: %s [ProcessId]\n", argv[0]);
return RTN_USAGE;
}
if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))
{
if (GetLastError() == ERROR_NO_TOKEN)
{
if (!ImpersonateSelf(SecurityImpersonation))
return RTN_ERROR;
if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken)){
DisplayError("OpenThreadToken");
return RTN_ERROR;
}
}
else
return RTN_ERROR;
}
// enable SeDebugPrivilege
if(!SetPrivilege(hToken, SE_DEBUG_NAME, TRUE))
{
DisplayError("SetPrivilege");
// close token handle
CloseHandle(hToken);
// indicate failure
return RTN_ERROR;
}
// open the process
if((hProcess = OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
atoi(argv[1]) // PID from commandline
)) == NULL)
{
DisplayError("OpenProcess");
return RTN_ERROR;
}
// disable SeDebugPrivilege
SetPrivilege(hToken, SE_DEBUG_NAME, FALSE);
if(!TerminateProcess(hProcess, 0xffffffff))
{
DisplayError("TerminateProcess");
dwRetVal=RTN_ERROR;
}
// close handles
CloseHandle(hToken);
CloseHandle(hProcess);
return dwRetVal;
}
BOOL SetPrivilege(
HANDLE hToken, // token handle
LPCTSTR Privilege, // Privilege to enable/disable
BOOL bEnablePrivilege // TRUE to enable. FALSE to disable
)
{
TOKEN_PRIVILEGES tp;
LUID luid;
TOKEN_PRIVILEGES tpPrevious;
DWORD cbPrevious=sizeof(TOKEN_PRIVILEGES);
if(!LookupPrivilegeValue( NULL, Privilege, &luid )) return FALSE;
//
// first pass. get current privilege setting
//
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
&tpPrevious,
&cbPrevious
);
if (GetLastError() != ERROR_SUCCESS) return FALSE;
//
// second pass. set privilege based on previous setting
//
tpPrevious.PrivilegeCount = 1;
tpPrevious.Privileges[0].Luid = luid;
if(bEnablePrivilege) {
tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
}
else {
tpPrevious.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED &
tpPrevious.Privileges[0].Attributes);
}
AdjustTokenPrivileges(
hToken,
FALSE,
&tpPrevious,
cbPrevious,
NULL,
NULL
);
if (GetLastError() != ERROR_SUCCESS) return FALSE;
return TRUE;
}
BOOL SetPrivilege(
HANDLE hToken, // token handle
LPCTSTR Privilege, // Privilege to enable/disable
BOOL bEnablePrivilege // TRUE to enable. FALSE to disable
)
{
TOKEN_PRIVILEGES tp = { 0 };
// Initialize everything to zero
LUID luid;
DWORD cb=sizeof(TOKEN_PRIVILEGES);
if(!LookupPrivilegeValue( NULL, Privilege, &luid ))
return FALSE;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if(bEnablePrivilege) {
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
} else {
tp.Privileges[0].Attributes = 0;
}
AdjustTokenPrivileges( hToken, FALSE, &tp, cb, NULL, NULL );
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
void DisplayError(
LPTSTR szAPI // pointer to failed API name
)
{
LPTSTR MessageBuffer;
DWORD dwBufferLength;
fprintf(stderr,"%s() error!\n", szAPI);
if(dwBufferLength=FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
GetSystemDefaultLangID(),
(LPTSTR) &MessageBuffer,
0,
NULL
))
{
DWORD dwBytesWritten;
//
// Output message string on stderr
//
WriteFile(
GetStdHandle(STD_ERROR_HANDLE),
MessageBuffer,
dwBufferLength,
&dwBytesWritten,
NULL
);
//
// free the buffer allocated by the system
//
LocalFree(MessageBuffer);
}
}
º» ¹®¼ÀÇ Á¤º¸´Â ´ÙÀ½ÀÇ Á¦Ç°¿¡ Àû¿ëµË´Ï´Ù. Microsoft Win32 Application Programming Interface?À»(¸¦) ´ÙÀ½°ú ÇÔ²² »ç¿ëÇßÀ» ¶§ Microsoft Windows Server 2003, Standard Edition (32-bit x86) Microsoft Windows Server 2003, Enterprise Edition (32-bit x86) Microsoft Windows 2000 Advanced Server Microsoft Windows 2000 Server Microsoft Windows 2000 Professional Edition Microsoft Windows NT Advanced Server 3.1 Microsoft Windows NT Server 3.5 Microsoft Windows NT Server 3.51 Microsoft Windows NT Server 4.0 Standard Edition Microsoft Windows NT Workstation 3.1 Microsoft Windows NT Workstation 3.5 Microsoft Windows NT Workstation 3.51 Microsoft Windows NT Workstation 4.0 Developer Edition kbmt kbbug kbdebug kbhowto kbkernbase kbsecurity KB131065 KbMtko
±â°è ¹ø¿ªµÈ ¹®¼ Áß¿ä: º» ¹®¼´Â Àü¹® ¹ø¿ª°¡°¡ ¹ø¿ªÇÑ °ÍÀÌ ¾Æ´Ï¶ó Microsoft ±â°è ¹ø¿ª ¼ÒÇÁÆ®¿þ¾î·Î ¹ø¿ªÇÑ °ÍÀÔ´Ï´Ù. Microsoft´Â ¹ø¿ª°¡°¡ ¹ø¿ªÇÑ ¹®¼ ¹× ±â°è ¹ø¿ªµÈ ¹®¼¸¦ ¸ðµÎ Á¦°øÇϹǷΠMicrosoft ±â¼ú ÀÚ·á¿¡ ÀÖ´Â ¸ðµç ¹®¼¸¦ Çѱ۷ΠÁ¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ±â°è ¹ø¿ª ¹®¼°¡ Ç×»ó ¿Ïº®ÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù. µû¶ó¼ ±â°è ¹ø¿ª ¹®¼¿¡´Â ¸¶Ä¡ ¿Ü±¹ÀÎÀÌ Çѱ¹¾î·Î ¸»ÇÒ ¶§ ½Ç¼ö¸¦ ÇÏ´Â °Íó·³ ¾îÈÖ, ±¸¹® ¶Ç´Â ¹®¹ý¿¡ ¿À·ù°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. Microsoft´Â ³»¿ë»óÀÇ ¿À¿ª ¶Ç´Â Microsoft °í°´ÀÌ ÀÌ·¯ÇÑ ¿À¿ªÀ» »ç¿ëÇÔÀ¸·Î½á ¹ß»ýÇÏ´Â ºÎ Á¤È®¼º, ¿À·ù ¶Ç´Â ¼ÕÇØ¿¡ ´ëÇØ Ã¥ÀÓÀ» ÁöÁö ¾Ê½À´Ï´Ù. Microsoft´Â ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ±â°è ¹ø¿ª ¼ÒÇÁÆ®¿þ¾î¸¦ ÀÚÁÖ ¾÷µ¥ÀÌÆ®Çϰí ÀÖ½À´Ï´Ù.
ÀÌ ¹®¼ Ȱ¿ëÀ» À§ÇØ ¾î´À Á¤µµÀÇ ³ë·ÂÀ» ±â¿ïÀ̼̽À´Ï±î?
ÀÌ Á¤º¸¸¦ °³¼±ÇØ¾ß ÇÏ´Â ÀÌÀ¯¿Í °³¼±Çϱâ À§ÇØ ¹«¾ùÀ» ÇÒ ¼ö ÀÖ´ÂÁö ¾Ë·ÁÁֽʽÿÀ.
°¨»çÇÕ´Ï´Ù! º¸³»ÁֽŠÀǰßÀº Áö¿ø ÄÜÅÙÃ÷¸¦ Çâ»ó½ÃŰ´Â µ¥ »ç¿ëµÉ °ÍÀÔ´Ï´Ù. ÀÚ¼¼ÇÑ Áö¿ø ¿É¼ÇÀ» º¸·Á¸é
Microsoft °í°´Áö¿ø ȨÆäÀÌÁö ¸¦ ¹æ¹®ÇØ Áֽñ⠹ٶø´Ï´Ù.
Ãß°¡ ¸®¼Ò½º Ãß°¡ Áö¿ø »çÀÌÆ®
Ä¿¹Â´ÏƼ
±â¼ú ÀÚ·á ¹ø¿ª