[21601] in bugtraq

home help back first fref pref prev next nref lref last post

RE: W2k: Unkillable Applications

daemon@ATHENA.MIT.EDU (Toomas Kiisk)
Wed Jul 18 12:00:36 2001

Date: Wed, 18 Jul 2001 16:22:13 +0200 (EET)
From: Toomas Kiisk <vix@cyber.ee>
To: Frank Breedijk <FrankB@InterXion.com>
Cc: <bugtraq@securityfocus.com>
In-Reply-To: <9DEF5AE699246E48BBBC3B9469681C0010C9E2@NL-AMS-06.office.interxion.net>
Message-ID: <Pine.LNX.4.33.0107181603170.3831-100000@ondatra.tartu-labor>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Tue, 17 Jul 2001, Frank Breedijk wrote:

> > I'm sure they could have told you that an administrator
> > can end system processes by right clicking on them and
> > choosing "Debug" and then ending the process.
>
> That feature is only available on systems with a debugger installed.
> Mine isn't
>

There's no need for a debugger. SE_DEBUG privilege is simply
disabled by default, and it must be enabled using
AdjustTokenPrivileges(). Here's the source of a small
utility I posted few years ago to ee.arvutid.microsoft,
hopefully it is self-explanatory. The source has undergone
some "formatting" by google archive, so there may be few
underscores missing.


--------------begin kill.c----------
#include <windows.h>
#include <malloc.h>
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>


void usage_exit( void );
void w32_error( const char *blah, ... );


int main( int argc, char **argv )
{
	HANDLE proc, token;
	TOKEN_PRIVILEGES *p = NULL, *dummy = NULL;
	DWORD psize = 0, i = 0;

	if ( argc < 2 )
		usage_exit();

	assert( OpenProcessToken( GetCurrentProcess(),
			TOKEN_ALL_ACCESS, &token ) );

	while ( ! GetTokenInformation( token, TokenPrivileges, p,
				psize, &psize ) ) {
		if ( GetLastError() != ERROR_INSUFFICIENT_BUFFER ) {
			w32_error( "GetTokenInformation()" );
			exit( 1 );
		}
		if ( ! (p = alloca( psize ) ) ) {
			w32_error( "alloca( %u )", psize );
			exit( 1 );
		}
	}

	for ( i=0; i<p->PrivilegeCount; i++ )
		p->Privileges[ i ].Attributes |= SE_PRIVILEGE_ENABLED;

	while ( ! AdjustTokenPrivileges( token, FALSE, p, psize,
				dummy, &psize ) ) {
		if ( GetLastError() != ERROR_INSUFFICIENT_BUFFER ) {
			w32_error( "AdjustTokenPrivileges()" );
			exit( 1 );
		}
		if ( ! (dummy = alloca( psize ) ) ) {
			w32_error( "alloca( %u )", psize );
			exit( 1 );
		}
	}

	while ( --argc ) {
		proc = OpenProcess( PROCESS_TERMINATE, FALSE,
				(DWORD)atoi( argv[ argc ] ) );
		if ( proc == NULL ) {
			w32_error( "Openprocess(): PID=%s",
				argv[ argc ] );
			continue;
		}

		if ( ! TerminateProcess( proc, 1 ) ) {
			(void)CloseHandle( proc );
			w32_error( "TermnateProcess(): PID=%s", argv[ argc ] );
			continue;
		} else {
			(void)CloseHandle( proc );
			fprintf( stdout, "PID=%s killed\n", argv[ argc ] );
		}
	}

	return 0;
}

void usage_exit( void )
{
	fprintf( stderr, "Usage:\tkill <pid list>\n" );
	exit( 1 );
}

void w32_error( const char *blah, ... )
{
	char *msg;
	va_list a;

	if ( FormatMessage(
			FORMAT MESSAGE ALLOCATE BUFFER |
			FORMAT MESSAGE FROM SYSTEM,
			NULL,    GetLastError(),
			MAKELANGID(LANG NEUTRAL,
			SUBLANG_DEFAULT),
			(LPTSTR)&msg, 0, NULL ) )
	{
		va_start( a, blah );
		(void)vfprintf( stderr, blah, a );
		(void)fprintf( stderr, ": %s\n", msg );
		(void)LocalFree( msg );
		va_end( a );
	}
}


home help back first fref pref prev next nref lref last post