PDA

View Full Version : نکته های جالب در مورد Virus,Rootkit,Windows Kernel ,....



r00tkit
یک شنبه 18 دی 1390, 15:32 عصر
سلام

از این به بعد قصد دارم نکته های جالبی که در زمینه امنیت (Windows kernel, Rootki ,Virus ,...) پیدا کردم اینجا قرار بدم



امید وارم مفید باشه
( در صورت مفید نبودن ( تمایل نشون ندادن ) ادامه داده نمی شه )



اولیش : ویروس Win32/Bflient.AK (http://barnamenevis.org/www.virustotal.com/file-scan/report.html?id=50285d4665aa8d6454fc3379c685e341f69 e371df3570a10eaab945f8c0aa2f6-1306756589)با استفاده از تابع های bsearch و WriteFileEx تکنیک antidebug زده
خیلی برام جالب بود وقتی داشتم انالیز می کردمش ، همش از دستم در می رفت و اجرا می شد ، نکتش اینجاست که این توابع یه Callback می گیرن و جدا از دید کاربر توی ( انگار ) یه thread دیگه اجرا می شن، تابع هایی که کسی بهش شک هم نمی کنه :)

گشتم جایی بهش اشاره نشده بود

80384





http://barnamenevis.org/images/misc/pencil.png

Nima NT
یک شنبه 18 دی 1390, 19:00 عصر
بحث بسیار مفیدی رو شروع کردید مهندس ، امیدوارم این بحث همچنان ادامه داشته باشه و از اطلاعاتتون استفاده کنیم.

پیوست : یه سوال ، متد آنتی دیباگش رو امکانش هست تا حدودی شرح بدید ، چون من یه نسخه از این فایل رو گرفتم ( ویروس رو ) ولی تو دیباگر من راحت اجرا شد و به موردی که شما گفتید برنخوردم ، چون دوست داشتم دقیق تر بررسی کنم گفتم آدرس دقیق این مطلب رو ازتون جویا بشم.


متشکرم

r00tkit
دوشنبه 19 دی 1390, 09:23 صبح
سلام


تابع WriteFileEx یه تابع برای write هستش که Asynchronous I/O (http://en.wikipedia.org/wiki/Asynchronous_I/O) رو پشتیبانی می کنه ، اگه Thread در حالت Wait باشه و عمل Write کرنل تموم شده باشه سیستم عامل یه Completion Routine رو اجرا می کنه ( یعنی اجرای این تابع رو دیگه نمی شه توی OllyDbg دید ، مگر اینکه قبل اجرا بری روش BP بزاری ، به طور خلاصه : برنامه Miti-Thread بدون استفاده از توابع ایجاد Thread )



If the WriteFileEx function succeeds, the calling thread has an asynchronous I/O operation pending: the overlapped write operation to the file. When this I/O operation finishes, and the calling thread is blocked in an alertable wait state, the operating system calls the function pointed to by lpCompletionRoutine, and the wait completes with a return code of WAIT_IO_COMPLETION
بحث Asynchronous (http://en.wikipedia.org/wiki/Asynchronous_I/O) یه بحث پیچیده ولی جالب هستش ( این lpCompletionRoutine توسط queue کردن یه APC پیاده سازی شده )
TDL3 هم با این روش inject CODE می کرد

r00tkit
دوشنبه 19 دی 1390, 11:38 صبح
http://msdn.moonsols.com/

توضیح می خواد؟ :D

r00tkit
جمعه 23 دی 1390, 19:49 عصر
اگه می خوایین برنامتون در مقابل dll injection توسط SetWindowsHookEx ایمن باشه تابع KiUserCallbackDispatcher رو در PEB هوک کنید. ( قبلا دیده بودم kaspersky این کار رو می کرد ، ولی دقت نکرده بودم چرا :) )

r00tkit
یک شنبه 02 بهمن 1390, 12:13 عصر
سلام

با استفاده از LdrSetAppCompatDllRedirectionCallback می شه جلوی تزریق dll به روش های مختلف رو گرفت ( فقط xp تست کردم البته توی Seven نمی شه )


مثال :http://www.mediafire.com/?2fj31zxjjeui1hl
رمز فایل id منه
برنامه رو اجرا کنید و سعی کنید بهش dllی به اسم test.dll تزریق کنید .( به هر روشی)

این روش دیگه به دردم نمی خوره اگه کسی چیز بهتری برای نسخه های جدید ویندوز میشناسه بگه، این تابع توی نسخهی های بعدی پیاده سازی نشده .
برای نسخهی های جدید کسی ایده ای داره بگه .

r00tkit
دوشنبه 03 بهمن 1390, 14:45 عصر
کودکی توی یه فروم دیگه داشت در مورد استفاده از توابع بودن implicit linking می گفت گفتم برادر این جا رو نگاه :))))))

برنامه زیر اصلا IAT نداره حالش رو ببره(ید) :)))))

http://www.mediafire.com/?54hf537v1byzbzi

سعی کنید با OLLYDBG بررسی کنید ببینید چه خبره :)
{ البته چیز خاصی نیست خیلی وقته توسط ویروس ها استفاده می شه}

بعد اجرا یه فایلی به اسم hi.txt داخل درایرو C درست می شه که توش نوشته hi i am geek1982

Raham
دوشنبه 03 بهمن 1390, 17:41 عصر
کودکی توی یه فروم دیگه داشت در مورد استفاده از توابع بودن implicit linking می گفت گفتم برادر این جا رو نگاه :))))))

برنامه زیر اصلا IAT نداره حالش رو ببره(ید) :)))))

http://www.mediafire.com/?54hf537v1byzbzi

سعی کنید با OLLYDBG بررسی کنید ببینید چه خبره :)
{ البته چیز خاصی نیست خیلی وقته توسط ویروس ها استفاده می شه}

بعد اجرا یه فایلی به اسم hi.txt داخل درایرو C درست می شه که توش نوشته hi i am geek1982

با سلام

شما که دستت تو کاره عزیز. چرا از Ordinal استفاده کردی؟ روش های خیلی بهتری وجود داره:) همین باعث شده که مجبور بشی واسه XP,7 دو فایل جدا بزاری

از طرفی همونطور که میدونی برای کار با توابع سیستمی الان روش های خیلی بهتری استفاده میشه.(روش شما همون GetProcAddress Alternative هستش که Export Table رو میخونه)

واسه مقایسه نام فایل هم (بحث جستجو بین ماژول های Load شده) از Add استفاده نکنید:D خطاش زیاده.

موفق باشیم
یا علی

Raham
دوشنبه 03 بهمن 1390, 17:58 عصر
با سلام

واسه مبحث Anti Code Injection هم دنبال هوک کردن یک تابع خاص اصلا نباشید. چون دیگه قدیمی شده. براحتی میشه دورش زد.
کافیه DLL مورد نظر رو به صورت دستی (Inject Section,PE Header,Fix Header,Do reloc,Fill Import) تزریق کرد که اینطوری بنده خدا روحش هم خبر دار نمیشه که تزریقی شده:D
سوال شاید کنید اینطوری یه سری محدودیت های داره...مثلا از Export Table اون دیگه نمیشه استفاده کرد. در پاسخ: به تعداد انسان ها را است برای رسیدن به خدا


موفق باشیم
یا علی

r00tkit
دوشنبه 03 بهمن 1390, 23:57 عصر
سلام
کد, Ordinal برای XXXXX بود(همون سورس کد گرونی که لو رفت ) وقت ندارم برای نشون دادن به یه KID بشینم کد بزنم ( یه فروم دیگه ) فقط یه IFاش رو عوض کردم به Ordinal

واسه مقایسه نام فایل هم (بحث جستجو بین ماژول های Load شده) از Add استفاده نکنید:D خطاش زیاده.

همون طور که گفت ان تیکه کد برای من نیست ( همچنین POC نیاز به optimize نداره ) (____ فکر می کنی این ها رو نمی دونم؟ ___)



واسه مبحث Anti Code Injection هم دنبال هوک کردن یک تابع خاص اصلا نباشید. چون دیگه قدیمی شده. براحتی میشه دورش زد.

دنبال anti code injection نیستم چیزی هم که نوشتم مربوط بود فقط به injection Dll نه Code injection ( چیز های بود که اتفاقی تو تفریح گیر می یارم ) خودم می دونم با این چیزا نمی شه جلوی کد injection رو گرفت یه دیونه ای مثل napalm پیدا می شه ،فقط با SetThreadContext ( بدون استفاده از WriteProcessMemory ) و فقط دقیقا با SetThreadContext کد تزیق می کنه ( یا تکنیک نیمچه Zero day توی DUQU )

در مورد تکنیک هایی هم که گفتی ( اکثرا تغییر فایل رو دیسک بود که به راحتی می شه با hook IRP_MJ_CREATE جلوشونو گرفت :D ) حتی نمی تونی بهش چپ نگه کنی :D ( مگه اینکه مستقیم با SCSI Bus یا دسیک صحبت کنی ، دقیق دقیق یادم نمی یاد )
یا کل با هوک چند تا تابع توی SST می شه جلوشونو گرفت

چیز هایی که اینجا می نویسم ، چیز هایی هستن که اولا به دردم نمی خوره( کهنه شدن و....) دوما به کارم(تخصصم) ربط نداره (NDA اجازه نمی ده :) )
موفق باشی
یا امیر المومنین علی (ع)

r00tkit
چهارشنبه 12 بهمن 1390, 13:21 عصر
http://www.ioctls.net/
:)

r00tkit
یک شنبه 23 بهمن 1390, 15:27 عصر
سلام
ایده ی کد زیر به ذهنم رسید پیادش کردم ( از جایی ایده نگرفتم ابزار های مورد استفاده فقط windbg )
کد تمام callback های موجودی که توسط تابع PsSetLoadImageNotifyRoutine ثبت شده اند رو از کار می اندازه :


void callback (
IN PUNICODE_STRING FullImageName,
IN HANDLE ProcessId, // where image is mapped
IN PIMAGE_INFO ImageInfo
)

{
char* f;
void * pvReturn ;
void ** puEBP = NULL;
__asm { mov puEBP, ebp };
pvReturn = puEBP[1]; // this is the caller of my function
f=((char*)pvReturn)-0x36; //xp
// __asm
// {
// call DisableReadonly
// mov byte ptr [f],0xc2
// mov byte ptr [f+1],0x0c
// mov byte ptr[f+2],0x00
// call EnableReadonly
// }

DisableReadonly();
*f=0xc2;
*(f+1)=0x0c;
*(f+2)=0x00;
EnableReadonly();

DbgPrint("patch kernel %x ,%x \r\n",f,pvReturn);
}
با کمی تغییر
توابع دیگه رو هم می شه از کار انداخت
و توی همه سیستم ها اجراش کرد
و می شه با این روش لیست callback های ثبت شده رو هم بدست اورد

تست روی ویندوز xpsp3
روش استفاده :

NTSTATUS
DriverEntry
(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
DriverObject->DriverUnload = DriverUnload;
DbgPrint( "Hello World\n" );
PsSetLoadImageNotifyRoutine(callback);
return STATUS_SUCCESS;
}
موفق باشید

raspi.m
دوشنبه 24 بهمن 1390, 20:22 عصر
ایده ی کد زیر به ذهنم رسید پیادش کردم ( از جایی ایده نگرفتم ابزار های مورد استفاده فقط windbg )
کد تمام callback های موجودی که توسط تابع PsSetLoadImageNotifyRoutine ثبت شده اند رو از کار می اندازه :

سلام
با از کار انداختن این قابلیت چه اتفاقی میفته؟

r00tkit
دوشنبه 02 مرداد 1391, 15:09 عصر
با سلام

شما که دستت تو کاره عزیز. چرا از Ordinal استفاده کردی؟ روش های خیلی بهتری وجود داره:) همین باعث شده که مجبور بشی واسه XP,7 دو فایل جدا بزاری




موفق باشیم
یا علی

خبر نداری ؟
y. For most Windows API functions only the names are preserved across different Windows releases; the ordinals are subject to change. Thus, one cannot reliably import Windows API functions by their ordinals.