DeimosC2 源碼閱讀

花了點時間閱讀了一下 https://github.com/DeimosC2/DeimosC2 項目的源代碼,本文是一個簡要的閱讀筆記

項目結構

.
|   build_frontend.bat
|   build_frontend.sh
|   requirements.txt
|   serial
|          
+---agents
|   +---doh
|   |       doh_agent.go               DNSOverHTTP agent代碼
|   +---https
|   |       https_agent.go             HTTPS agent
|   +---quic
|   |       quic_agent.go              QUIC agent
|   +---resources                      agent基礎功能
|   |   +---agentfunctions
|   |   |       functions.go
|   |   +---domainhiding
|   |   |       esni_DoH.go
|   |   +---filebrowser
|   |   |       filebrowser_linux.go
|   |   |       filebrowser_mac.go
|   |   |       filebrowser_windows.go
|   |   +---fingerprint
|   |   |       fingerprint_linux.go
|   |   |       fingerprint_mac.go
|   |   |       fingerprint_windows.go
|   |   +---selfdestruction
|   |   |       kill_linux.go
|   |   |       kill_macos.go
|   |   |       kill_windows.go
|   |   +---shellexec
|   |   |       exec_both.go
|   |   |       exec_windows.go
|   |   \---shellinject
|   |           shellcode_linux.go
|   |           shellcode_macos.go
|   |           shellcode_windows.go
|   \---tcp
|           tcp_agent.go 
+---archives
+---c2                                        C2 server主程序
|   |   main.go                                       程序入口
|   |   requirements.txt
|   +---agents
|   |   |   agent_handler.go                  agent相關基礎方法
|   |   \---techniques                        一些其他技術相關實現
|   |       \---httpstechniques
|   |               domainhiding.go
|   |               normal.go
|   +---gobfuscate                            gobfuscate開源項目抽取[golang混淆],可使用garble
|   |       const_to_var.go
|   |       gobfuscate.go
|   |       gopath_copy.go
|   |       hash.go
|   |       LICENSE
|   |       pkg_names.go
|   |       README.md
|   |       strings.go
|   |       symbols.go
|   |       util.go
|   +---lib
|   |   |   listener_handler.go               監聽器相關基礎方法
|   |   +---archive
|   |   |       archive.go                    數據備份相關
|   |   +---certs
|   |   |       gen_cert.go                   證書生成
|   |   +---gobuild
|   |   |       compile.go                    對生成的go代碼進行編譯,生成agent客戶端
|   |   +---sqldb
|   |   |       sql.go                        服務端數據庫相關
|   |   \---validation
|   |           validation.go                 服務端前後端數據驗證
|   +---listeners                             服務端監聽器相關實現
|   |       common.go
|   |       dns.go
|   |       https.go
|   |       quic.go
|   |       tcp.go
|   +---loot                                  戰利品相關操作
|   |       loot.go                           
|   +---modules                               模塊加載相關
|   |       module_handler.go
|   |       reflectivedll.go
|   +---webserver                             服務端前後端交互相關
|   |   |   dashboard.go
|   |   |   webserver.go
|   |   +---googauth
|   |   |       googauth.go
|   |   +---mfa
|   |   |       mfa.go
|   |   \---websockets
|   |           alerts.go
|   \---webshells
|           webshell_handler.go
+---docs
|       CHANGELOG.md
+---droppers
|   +---Linux
|   |   +---Bash
|   |   |       ondisk_dropper_tcp.sh
|   |   +---Perl
|   |   |       ondisk_dropper_tcp.pl
|   |   \---python
|   |           ondisk_dropper_tcp.py
|   +---Templates
|   |       tcp.template
|   \---Windows
|       |   dropper_options.json
|       +---binary
|       |   \---golang
|       |           dropper.go
|       +---Perl
|       |       ondisk_dropper_tcp.pl
|       +---PowerShell
|       |       ondisk_dropper_tcp.ps1
|       \---python
|               ondisk_dropper_tcp.py  
+---lib
|   +---agentscommon
|   |       agents.go
|   +---crypto
|   |       aes.go
|   |       rsa.go
|   +---logging
|   |       log.go
|   +---modulescommon
|   |       common.go
|   +---privileges
|   |       isadmin_linux.go
|   |       isadmin_macos.go
|   |       isadmin_windows.go
|   \---utils
|           utils.go
+---modules                                      一些的額外模塊
|   +---collection
|   |   \---screengrab
|   |       +---agents
|   |       |   +---bin
|   |       |   \---src
|   |       |           screengrab.c
|   |       |           screengrab.go
|   |       \---server
|   |           +---bin
|   |           \---src
|   |                   screengrab.go
|   +---credentialaccess
|   |   +---lsadump
|   |   |   +---agents
|   |   |   |   +---bin
|   |   |   |   \---src
|   |   |   |           lsadump.go
|   |   |   \---server
|   |   |       +---bin
|   |   |       \---src
|   |   |               lsadump.go
|   |   +---minidump
|   |   |   +---agents
|   |   |   |   +---bin
|   |   |   |   \---src
|   |   |   |           minidump.c
|   |   |   |           minidump.go
|   |   |   \---server
|   |   |       +---bin
|   |   |       \---src
|   |   |               lsassparse.py
|   |   |               minidump.go
|   |   +---ntdsdump
|   |   |   +---agents
|   |   |   |   +---bin
|   |   |   |   \---src
|   |   |   |           ntdsdump.go
|   |   |   \---server
|   |   |       +---bin
|   |   |       \---src
|   |   |               ntdsdump.go
|   |   +---samdump
|   |   |   +---agents
|   |   |   |   +---bin
|   |   |   |   \---src
|   |   |   |           samdump.go
|   |   |   \---server
|   |   |       +---bin
|   |   |       \---src
|   |   |               lsaparse.py
|   |   |               samdump.go
|   |   |               samparse.py
|   |   \---shadowdump
|   |       +---agents
|   |       |   +---bin
|   |       |   \---src
|   |       |           shadowdump.go
|   |       \---server
|   |           +---bin
|   |           \---src
|   |                   shadowdump.go
|   +---discovery
|   |       empty.txt
|   +---dlls
|   |       c2.c
|   +---exfil
|   |       empty.txt
|   +---lateral_movement
|   |       empty.txt
|   +---persistence
|   |       empty.txt
|   \---privilege_escalation
|           empty.txt

程序主體

  1. 初始化日誌
  2. 自定義 GOROOT 和 GOPATH 環境變量
  3. 恢復(監聽器和webshell)或初始化數據庫,自定義或生產證書
  4. 預混淆(依賴文件拷貝到GOPATH)
  5. 啓動插件註冊RPC服務
  6. 執行定期備份
  7. 啓動前後端之間的https和websocket接口服務

細節

服務端針對每一個session維護了一個執行命令隊列,agent端針對所有任務的輸出結果維護了一個隊列

server和agent之間維護着心跳,由agent主動向server發送心跳,每次心跳時,agent從server對應的任務隊列中獲取命令拿去執行,同時將自己的命令結果輸出返回到server

需要說一下的是modules文件夾,裏面分爲服務端和客戶端,客戶端是投遞到agent中執行的,服務端的概念是c2服務器中註冊的插件,整個流程大致上爲:

  1. 用戶下發模塊任務
  2. 找到對應的模塊
  3. 啓動該模塊插件RPC服務並在c2 RPC服務中註冊插件
  4. 將模塊客戶端投遞到agent進行執行
  5. c2服務器獲取到任務結果
  6. 將任務結果發送至模塊插件RPC服務進行處理並返回處理結果

其中agent端的架構也需要說一下,agent支持兩種模塊形式:

  1. drop: 直接投遞二進制可執行程序比如exe到agent進行執行
  2. inject: 投遞反射dll至agent的內存中執行

其中drop形式的就是上文中提到的模塊插件,c2利用rpc進行與第三方模塊之間的通信,第三方模塊通過c2的rpc註冊自己的插件,c2通過插件的rpc將結果發送至插件進行處理,在agent也有類似的處理,首先agent會啓動一個rpc服務,然後接收到c2投遞過來的drop exe後,將rpc端口作爲命令行參數傳遞給該exe進行執行,然後drop exe執行過程中會將結果通過傳遞進來的rpc服務端口進行結果回送

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章