0x01 agscript簡介
agscript
為Aggressor Script
的簡寫。
agscript
是CobaltStrike 3.0
之后版本中內置的腳本語言,利用Aggresor
編寫腳本可輕松地武裝您的CobaltStrike
客戶端。
agscript
是一種簡單腳本語言,主要用於紅隊編寫針對肉雞的攻擊腳本。 它有兩個作用,
一是可以用來對自己的肉雞做持久性控制。
二是可以用來擴展或修改Cobalt Strike
客戶端以滿足您的個性化需求。
cobalt strike agscript
的官方文檔:
https://www.cobaltstrike.com/aggressor-script/index.html
0x02 如何使用
0x0201 加載腳本
agscript
內置於Cobalt Strike
客戶端, 如果需要長期使用agscript
, 請移步Cobalt Strike
客戶端 -> Script Manager and press Load
功能。
0x0201 腳本控制台
Cobalt Strike
提供了交互式的腳本控制台。 通過控制台可跟蹤,配置,調試以及管理腳本。
可以通過View
- > Script Console
獲得進入agscript
控制台。
命令 | 參數 | 作用 |
? | "foo" 即 "foobar" | 測試Sleep predicate並打印結果 |
e | println("foo"); | 測試Sleep statement |
help | - | 列出所有命令 |
load | /path/to/script.cna | 加載腳本 |
ls | - | 列出已加載的腳本 |
proff | script.cna | 禁用腳本的Sleep Profiler |
profile | script.cna | 轉儲腳本的性能統計信息 |
pron | script.cna | 啟用腳本的Sleep Profiler |
reload | script.cna | 重新加載腳本 |
troff | script.cna | 禁用腳本的功能跟蹤 |
tron | script.cna | 啟用腳本的功能跟蹤 |
unload | script.cna | 卸載腳本 |
x | 2 + 2 | 執行表達式並返回結果 |
0x0203命令行使用agscript
您也許會希望在在沒有GUI的情況下啟動Cobalt Strike
,客戶端壓縮包中的agscript
這個腳本文件能夠滿足您的需求,連接命令:
./agscript [host] [port] [user] [password]
上述命令可以使您快捷的連接到團隊的服務器,當然,如果您希望加載agscript
腳本還可以這樣寫參數:
./agscript [host] [port] [user] [password] [/path/to/script.cna]
上述命令可以連接團隊服務器並運行您的腳本,下面給出一段demo代碼:
on ready { println("Hello World! I am synchronized!"); closeClient(); }
0x0204 交互式操作
agscript
顯示輸出同樣使用了Sleep
的&println
, &printAll
, &writeb
, 以及&warn
這四個函數,這些函數均可在控制台輸出內容。
大多數語言都可以注冊快捷命令,agscript
也不例外,使用command
即可創建命令:
command foo { println("Hello $1"); }
這段代碼將會注冊命令foo,腳本控制台會自動解析命令的參數,並按空格將它們拆分為參數,$1是第一個參數,$2是第二個參數,依此類推。用戶可以使用“雙引號”來創建帶空格的參數。 如果這種解析對您可能會對輸入執行造成破壞性的操作,請使用$0訪問傳遞給命令的原始文本。
0x0205 控制台文本顏色
如果你想給Cobalt Strike
的控制台添加一些色彩,通過\c
,\U
和\o
轉義即可告訴Cobalt Strike
如何格式化文本。 值得提醒的是這些轉義僅在雙引號字符串內有效。
\cX
就是告訴Cobalt Strike
你想輸出什么顏色,X是顏色的值:
0x03 cobalt strike客戶端
cobalt strike 內置的default.cna(https://www.cobaltstrike.com/aggressor-script/default.cna) 就是定義了工具欄是如何顯示的,並且規定了腳本控制台中的命令等等
本章將向您展示這些功能的工作流程,並使您能夠根據需要打造自己的Cobalt Strike
客戶端。
0x0301 快捷鍵綁定
使用bind可以快速的綁定快捷鍵,如果說我們像做一個按ctrl+P的快捷鍵打印出hello fengxuan的程序,我們該如何實現?
bind Ctrl+P { show_message("hello fengxuan!") }
加載后,按ctrl+p 就打印出
快捷鍵可以是任何ASCII字符或特殊鍵,快捷方式可能會應用一個或多個修飾符,修飾符修飾符僅為以下幾個特定按鍵:Ctrl,Shift,Alt,Meta。腳本可以指定修飾符+鍵。
0x0302 彈出菜單
cobalt strike 可以使用popup
這個關鍵字來實現我們自定義的彈窗。我們來舉個例子:
menubar("風炫測試tab2", "newtab", 1); popup newtab { item("&我的主頁", { url_open("https://evalshell.com/"); }); separator(); separator(); item("&About", { openAboutDialog(); }); }
這個例子就是新建一個風炫測試tab2的tab標簽,然后下面有兩個下拉菜單,分別是我的主頁和about,點擊我的主頁就會跳轉到https://evalshell.com/
0x0303 自定義輸出
agscript中的set關鍵字定義了如何格式化事件並將其輸出呈現給客戶端。 以下是set關鍵字的demo:
set EVENT_SBAR_LEFT { return "[" . tstamp(ticks()) . "] " . mynick(); } set EVENT_SBAR_RIGHT { return "[lag: $1 $+ ]"; }
上面的代碼定義了Cobalt Strike的事件日志(View -> Event Log)中狀態欄的內容,此狀態欄的左側顯示當前時間和您的昵稱,右側顯示了Cobalt Strike客戶端和團隊服務器之間的消息往返時間。
Cobalt Strike中默認的各種設置都可以通過統一的方法來修改覆蓋。
0x0304 事件管理
使用on這個關鍵字可以為事件定義處理程序,當Cobalt Strike連接到團隊服務器並准備代表您行動時,就緒事件將觸發。demo:
on ready { show_message("Ready for action!"); }
使用* meta-event可查看再Cobalt Strike中發生的所有事件。
on * { local('$handle $event $args'); $event = shift(@_); $args = join(" ", @_); $handle = openf(">>eventspy.txt"); writeb($handle, "[ $+ $event $+ ] $args"); closef($handle); }
0x04 數據API
teamserver
服務器存儲了所有主機,服務,憑據等信息信息。
0x0401 數據模型
使用&data_query
函數即可查詢到Cobalt Strike
的數據模型。 這個函數可以訪問Cobalt Strike
客戶端維護的所有狀態和信息。 使用&data_keys
多了一個可以查詢制定數據的功能,看demo:
command dumpallinfo { local('$handle $model $row $entry $index'); $handle = openf(">fengxuan.txt"); foreach $model (data_keys()) { println($handle, "== $model =="); println($handle, data_query($model)); } closef($handle); println("See fengxuan.txt for the data."); }
Cobalt Strike
提供了多種功能方便攻擊者們更直觀地使用數據模型。
模型 | 函數 | 功能描述 |
applications | &applications | 系統分析結果 [View -> Applications] |
archives | &archives | 連接日志/活動 |
beacons | &beacons | 激活beacons |
credentials | &credentials | 賬號密碼等 |
downloads | &downloads | 下載的文件 |
keystrokes | &keystrokes | Beacon接收到鍵盤記錄 |
screenshots | &screenshots | 截圖文件啊 |
services | &services | 服務相關信息 |
sites | &sites | 資產信息 |
socks | &pivots | SOCKS代理服務以及端口轉發 |
targets | &targets | 主機信息 |
調用這些函數會返回一個模型中每個條目的數組,每行對於的是一個字典,字典中包含了鍵與其鍵值。
要理解這東西最簡單的方式就是直接到控制台上手調試了,x
命令就是為此准備的,看圖
用x命令執行命令表達式,比如說上面的targets()是一個數組信息 用x命令就可以像python中字典一樣輕松訪問數據。
on keystrokes { println("I have new keystrokes: $1"); }
這行代碼表示,在接收到鍵盤記錄的時候 就打印I have new keystrokes: 記錄的字母