花了點時間閱讀了一下 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
程序主體
- 初始化日誌
- 自定義 GOROOT 和 GOPATH 環境變量
- 恢復(監聽器和webshell)或初始化數據庫,自定義或生產證書
- 預混淆(依賴文件拷貝到GOPATH)
- 啓動插件註冊RPC服務
- 執行定期備份
- 啓動前後端之間的https和websocket接口服務
細節
服務端針對每一個session維護了一個執行命令隊列,agent端針對所有任務的輸出結果維護了一個隊列
server和agent之間維護着心跳,由agent主動向server發送心跳,每次心跳時,agent從server對應的任務隊列中獲取命令拿去執行,同時將自己的命令結果輸出返回到server
需要說一下的是modules文件夾,裏面分爲服務端和客戶端,客戶端是投遞到agent中執行的,服務端的概念是c2服務器中註冊的插件,整個流程大致上爲:
- 用戶下發模塊任務
- 找到對應的模塊
- 啓動該模塊插件RPC服務並在c2 RPC服務中註冊插件
- 將模塊客戶端投遞到agent進行執行
- c2服務器獲取到任務結果
- 將任務結果發送至模塊插件RPC服務進行處理並返回處理結果
其中agent端的架構也需要說一下,agent支持兩種模塊形式:
- drop: 直接投遞二進制可執行程序比如exe到agent進行執行
- inject: 投遞反射dll至agent的內存中執行
其中drop形式的就是上文中提到的模塊插件,c2利用rpc進行與第三方模塊之間的通信,第三方模塊通過c2的rpc註冊自己的插件,c2通過插件的rpc將結果發送至插件進行處理,在agent也有類似的處理,首先agent會啓動一個rpc服務,然後接收到c2投遞過來的drop exe後,將rpc端口作爲命令行參數傳遞給該exe進行執行,然後drop exe執行過程中會將結果通過傳遞進來的rpc服務端口進行結果回送