<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    shad0w原理分析 part 1

    VSole2021-10-18 16:17:10

    01 生成木馬的方式

    由作者的介紹可以得知,shad0w生成木馬的命令為

    python3 shad0w.py beacon -p x64/windows/secure -H 192.168.1.81 -f exe -o beacon.exe

    payload 分為兩種:

    • 1、x64/windows/secure 分步加載
    • 2、x64/windows/secure/static 直接生成beacon

    secure 分步加載

    get_payload_variables函數是對傳入的payload參數進行提取,提取出4個變量

    1. self.arch 位數(x64,x86)

    2. self.platform 環境windows

    3. self.secure 是否啟用保護

    4. self.static 是否直接生成beacon

    由上面提取的static變量判斷是否分步執行,如果static為null,則將stager目錄下的所有文件拷貝到build里面。

    并更新配置信息,更新的主要為

    _C2_CALLBACK_ADDRESS 回連ip

    _C2_CALLBACK_PORT 回連端口

    下一步為編譯build里面的內容,

    1、如果使用了secure,則會在makelist中添加宏變量secure(此變量用處為beacon中啟用syscall)

    2、_crypt_strings 會異或加密函數名并將加密后字符串和key寫入到strings.h

    3、使用make編譯stager 

    最后,payload_format.create函數中將stager變成shellcode

    根據輸出結果對輸出內容進行判斷,如果為raw直接生成shellcode,exe 是先生成shellcode,再將shellcode寫入一個加載器編譯成exe,dll也是一樣。

    shellcode生成是使用donut這個項目

    static 生成beacon

    靜態是將src或者injectable目錄的代碼拷貝到build編譯生成,后面步驟和上面一樣。(經測試src生成的beacon功能存在bug,此處我直接使用injectable中代碼生成beacon)

    02 stager和beacon

    stager

    stager代碼再beacon/stager下

    stager功能代碼較為簡單

    第一步、向服務器請求beacon

    簡單說是使用winhttp庫發起https請求

    向/stager發起post請求,參數是payload=x64/windows/secure/static(定義了secure)或payload=x64/windows/static(沒有secure)(x64,x86是根據系統位數判斷)

    beacon會在shad0w啟動listen時生成

    過程和第一步生成stager的時候一樣,不過生成的位置是在/tmp/beacon_id/build下面。生成的exe轉成shellcode進行base64編碼會存入shad0w.payloads"x64_secure_static"。 

    服務端是使用flask啟動的服務器,會在控制端請求/stager返回shad0w.payloads["x64_secure_static"]["bin"]的內容。

    第二步、使用shellcode加載器加載beacon

    beacon

    第一步、收集用戶信息、 NetBIOS

    首先獲取sid,后通過sid獲取username、domain 

    獲取機器的位數、系統版本、是否編譯時定義secure

    第二步向服務端注冊信息

    向/register 發送上面收集的信息(username、domain、netbios、位數、系統版本、是否開啟secure)

    會將服務端返回的id記錄在IdBuffer中。

    服務端會記錄用戶信息,機器信息并生成beacon_id,返回beacon_id 第三步 會根據sleep休眠時間定期向服務端發送心跳包。

    心跳包發送的方式為

    向/tasks發起請求,參數為之前獲取的beacon_id

    解析返回結果。task用于后續用于判斷執行方式。

    InjectExecuteCode:注入shellcode于一個運行的進程。

    SpawnExecuteCode: 新啟一個進程注入shellcode

    Stdlib:自帶庫。

    InjectExecuteDll:反射型dll注入注入dll。

    args為后續操作執行的內容。

    服務端處理

    在請求中獲取beacon_id。opcode, data是在后續執行命令時獲取,心跳包控制端只傳遞beacon_id。

    opcode為0, data為空 即心跳包傳遞。

    返回存活狀態和task(0x1000)。(在beacon中0x1000為跳出)

    03 免殺方式syscall介紹

    shad0w使用的syscall的方式并不是硬編碼,而是在程序執行開始時讀取ntdll并將其寫入到內存,從而實現避免被edr/av hook。

    先看一個函數使用syscall執行的流程。

    ParseNtdll(&NtdllInfo, &rSyscall);

    MakeSyscall("NtOpenThread", NtdllInfo.pExprtDir, NtdllInfo.lpRawData, NtdllInfo.pTextSection, NtdllInfo.pRdataSection, SyscallStub);

    rSyscall.NtOpenThread(&hThread, PROCESS_ALL_ACCESS, &ObjectAttributes, &uTid);

    CleanSyscall(SyscallStub);

    說一下syscall執行的流程

    1. 在程序執行開始時將ntdll.dll寫入內存

    2. 解析ntdll的.text,.rdata節:

       .text里面存儲導出函數執行的代碼 .rdata里面存儲的是導出函數的名稱

    3. 在內存中找到要調用的函數(比如:NtOpenThread),將其拷貝到內存其他位置

    4. 聲明函數原型

    5. 定義函數類型的變量指向內存,通過變量調用系統調用。

    04 執行方式介紹

    1.InjectExecuteCode

    1. 首先通過進程的pid打開進程。
    2. 將內存屬性更改為可讀可寫,將shellcode拷貝到內存。
    3. 改為內存屬性為可讀可寫可執行。
    4. 獲取當前線程的句柄,掛起線程。
    5. 獲取目標線程的上下文
    6. 設置rip(程序指令寄存器)的地址為shellcode的地址
    7. 恢復線程
    8. shellcode執行

    2.SpawnExecuteCode

    1. 創建匿名管道,創建線程從匿名管道讀取結果,向服務端發送結果。 

    2.創建進程,在進程中分配內存,寫入shellcode,apc注入執行 

    3.Stdlib

    這個是控制端自寫的一些功能,主要是從服務端接受命令并進入相應的函數去執行。這個在將命令模塊的時候再具體介紹。

    4.InjectExecuteDll

    1、這個函數主要是通過pe文件格式解析導出表,找到ReflectiveLoader函數的入口點地址。2、通過前面InjectExecuteCode方法的掛起線程,將程序寄存器(rip)地址改成ReflectiveLoader函數的地址。3、ReflectiveLoader會恢復dll在內存中的位置從而執行。

    未完待續

    對shad0w的命令模塊還沒有進行介紹。

    1. 命令模塊存在一些bug

    2. 大量的模塊都是通過將exe轉成shellcode,再通過SpawnExecuteCode的方式執行,需要將一些常用的模塊二次開發后再進行介紹。

    3. 目前已經重寫upload,download模塊。

    4. 后續添加shell執行命令的模塊,將shellcode加載部分更改加載方式,不使用在其他進程中加載。

    beacon
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    如果成功連接到管道, 使用WriteFile函數將shellcode數據寫入已連接的命名管道。使用IDA分析檢查導出函數:第一個是反射式DLL注入,限于篇幅,在本篇中不展開分析第二個是DLL的入口函數。在后續的文章中,會根據檢測特征和csprofile的繞過按照專題進行分析。同時,大部分的CS檢測特征都是在此。而在后續的文章分析中,將會著重的分析CS beacon中使用到的幾種DLL注入方式;beacon config的檢測;同時結合CS profile 的配置,研究一下CS的對抗檢測方式。
    從零開始開發CS beacon
    2021-12-21 16:01:20
    因為我也才學golang,基本面向github編程,在網上只找到python版加解密的方式,所以需要翻譯成go語言。
    Beacon 通常是反射加載到內存中,還可以配置各種內存中混淆選項以隱藏其有效負載。 Beacon 可以配置各種內存中混淆選項以隱藏其有效負載。例如,obfuscate-and-sleep 選項會試圖在回調之間屏蔽部分 Beacon 有效負載,以專門避開基于特征的內存掃描。
    Beacon 通常是反射加載到內存中,還可以配置各種內存中混淆選項以隱藏其有效負載。Beacon 可以配置各
    SMB Beacon 與命名管道在 Windows 中,無管理員權限的情況下,即無法添加白名單。定義特定版本的協議的消息數據包集稱為方言。進行身份驗證后,用戶可以訪問服務器上不受共享級別安全性保護的所有共享。
    CobaltStrike ShellCode詳解
    2022-08-04 16:51:50
    接下來就是重點了,加載起來的這段shellcode開頭先將DF標志位置0,這里為什么這樣做后面會提到。
    微軟社區網友 LiCaoZ 發文表示,自 8 月 19 日 11 時起,包括必應搜索在內的部分 Microsoft 服務受到了部分地區中國移動省份網關屏蔽,流向 Microsoft 數據中心節點的數據包會在經過省份網關時被丟棄。
    wangan Cookie 指引
    2022-11-23 12:05:32
    實體標簽可代替 Cookie,用以追蹤個別使用者,并容許我們可更深入了解和改善 wangan 服務。例如,收集網站和應用程式的使用數據、收集 wangan 用戶基本的統計信息并分析相關的趨勢。我們對第三方的任何追蹤技術概不承擔任何責任;B. 我們可能會將通過追蹤技術收集所得的信息與我們收集所得關于您的其他信息合并。
    研究人員首次發現藍牙信號可作為指紋用于追蹤智能手機。 智能手機、智能手表、健身手環等移動設備常以每分鐘500 藍牙beacon的速率用來傳輸信號。這些beacon可以用于蘋果的“Find My”丟失設備追蹤服務、疫情追蹤APP、連接智能手機到其他設備等。
    Wireshark是一款數據包嗅探工具。正常情況下,AP每隔一段時間就會自動廣播一個Beacon(信標)信號包,來宣布該無線網絡的存在。所以,通過將無線網卡設置為監聽模式,然后使用Wireshark嗅探監聽接口的數據包,即可發現附近開放的無線網絡。本文介紹使用Wireshark掃描無線網絡的方法。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类