Metasploit เป็นเครื่องมือที่เรียกว่า Exploit Framework ซึ่งสามารถทำได้หลายอย่าง ตั้งแต่เป็น framework สำหรับการใช้งาน exploit ระบบ รวมถึงการใช้งานเพื่อการสร้าง module ใดๆในการโจมตี หรือการหาข้อมูลเครื่องเป้าหมาย โดยมีอีกส่วนที่สำคัญคือการรสร้าง backdoor หรือ payload ขึ้นมาเอง โดยใช้คำสั่งที่ชื่อว่า msfvenom
โดยตัว payload นั้นจะแบ่งออกเป็น 3 ประเภท
- single(inline) หรือเรียกอีกอย่างว่า Stageless
- staged
- stager
ซึ่งวันนี้ตัวที่เราจะพูดถึงคือความแตกต่างระหว่าง Staged และ Stageless ครับ
Staged Payloads
staged เป็น payload ชนิดหนึ่งใน Metasploit ตัวอย่างเช่น windows/meterpreter/reverse_tcp โดยเมื่อทำการสร้าง staged ขึ้นมาจะมีส่วนที่เรียกว่า stager เข้าไปด้วยโดยอัตโนมัติ ซึ่ง stager นั้นเป็นส่วนเล็กๆที่จะกระทำเมื่อถูก execute ดังนี้
- สร้าง connection กลับไป Metasploit Listener
- อ่าน 4 bytes แรกจาก Metasploit แล้วคำนวณขนาด payload ที่เหลือ
- ทำการ allowcate memory ซึ่งเป็น RWX (readable, writable and executable) ตามขนาดที่คำนวณ
- อ่านส่วน payload ที่เหลือจากการส่งมายัง stager ผ่าน connect จากนั้นเขียนไปยังส่วน memory ที่จอง (ส่ง metsrv.dll มาให้ก่อน เมื่อเสร็จแล้วจึงส่ง stdapi และ priv dll มาให้อีกที)
- เมื่อกระทำสำเร็จ ก็เริ่มทำการรัน payload ที่เหลือ ซึ่งจะกระทำส่วนการทำงานที่เหลือของ Metasploy Staged payload
- Loads ตัวเอง (เช่น
metsrv
) เข้าไปยัง memory โดยใช้ Reflective DLL Injection. - คำนวณ offset ของ configuration block.
- Patch configuration block ที่เก็บส่วน open socket handle ที่ใช้เชื่อมต่อกลับไปยัง Metasploit
- Executes
dllmain()
ผ่านmetsrv
ที่ถูกโหลดเข้าไปใหม่, passing pointer ไปยัง configuration block เพื่อให้metsrv
ควบคุม connection - เมื่อมีการรัน
metsrv
จะกระทำสร้าง connection กลับไปหา Metasploit
- Loads ตัวเอง (เช่น
จากที่เห็น stager นั้นไม่มีหน้าที่อะไรมาก เป็นแค่ตัวที่จะสร้าง connection กลับไปเพื่อเอา payload ที่ใหญ่มาซึ่งก็คือ payload มารันก็เพียงเท่านั้น ซึ่งเพื่อให้ stager สามารถทำงานได้อย่างง่ายๆในพื้นที่ที่ค่อนข้างจำกัดในการ exploit แต่ละที
ทีนี้มาดูส่วนของ Metasploit Listener บ้างว่าทำอะไรบ้าง
- รับ Connection ใหม่
- สร้าง payload ขึ้นมา ซึ่งจากตัวอย่างเราใช้ windows/meterpreter/reverse_tcp ดังนั้นสิ่งที่เกิดขึ้นคือ payload ที่ถูกสร้างขึ้นจะเป็น stage แรกของ Meterpreter และมาในรูปแบบของ dynamically patched
metsrv
DLL แล้วตามด้วย configuration block - ส่ง 4-byte ที่เป็นตัวบอกขนาดของ payload ที่เหลือ
- ส่ง payload ที่เหลือกลับไปให้เครื่องเป้าหมาย
- จากนั้นรอให้ payload ถูกรัน จากนั้นจะมี connection กลับมาและได้มาซึ่ง Meterpreter session
เป็นอันจบกระบวนการของ Staged Payload
Stageless payloads
ทีนี้มาดูในส่วนของ Stageless นั้นเป็น payload ที่ไม่ค่อยมีคนใช้เพราะเป็นการทำงานแบบทีเดียวจบ คือจะเป็นการสั่งงานไปที่เครื่องปลายทางโดยไม่มีการมาโหลดอะไรจาก Listener ไม่เหมือนกับ stager โดยตัวอย่าง payload ของ Stageless คือ windows/meterpreter_reverse_tcp
ตัว Stageless นั้นจะจบในตัวเองเลย โดยมีขั้นตอนการทำงานดังนี้
metsrv
จะถูกนำมาใช้ทันทีโดย pointer ไปยัง configuration block ซึ่งถูก set มาให้เหมาะสมกับ payload อยู่แล้ว- โหลด stdapi และ priv dll ต่อ
metsrv
ทำการสร้าง connection กลับไปยัง Metasploit Listener โดยอ่านจาก configuration block- จากนั้นก็คุยกับ Metasploit ผ่าน TLV Packet
ในส่วนของ Metasploit Listener นั้น
- ในส่วนการจัดการ connection ก็รอรับ connection กันไป
- เมื่อ connection ใหม่เกิดขึ้น แล้วพบว่าเป็น stageless ดังนั้นมันก็จะไม่มีการ generate payload อะไรอีก ซึ่งทำให้จะไม่มีการส่ง 4 byte หรือ payload อะไรไปให้แต่อย่างใด
- คุยผ่าน SSL
- ที่เหลือก็จะเป็นการสร้าง session ต่างปกติเหมือน staged session
ก็จบไปแล้วสำหรับการอธิบาย Stager vs Stageless นะครับ หากใครสนใจอยากได้รายละเอียดเพิ่มเติมก็สามารถลงเรียน Course Basic Penetration Testing ได้ครับ
Source:: Buffered.io,Rapid7