linux 系统命令被后门修改_某Nginx后门分析复现与改写

本文为看雪论坛精华文章

看雪论坛作者ID:Risks

背景

前几天,接到一个nginx后门样本,本着就分析和复现的思路,完整的将整个过程做一次复现,不料最终还获取到了后门的核心代码部分,遂将其整理发布。
在后续分析之前先来了解下nginx后门的功能。通过在Cookie中包含特征字符串lkfakjfa,并填写需要反弹的ip和端口,完成shell反弹,这就是后门的一个大致情况。

样本信息

MD5: ab498686505dfc645e14c6edad280da7
VT中可直接下来,前几日还是0查杀,当时只有tencent可以查杀,(当时写文章的时候),目前已被12家厂商查杀。

样本分析

在已有的分析情报的帮助下,得知nginx后门位于ngx_http_header_filter,IDA装载样本,发现样本带有符号信息。

3e968bb2a09b36bb0f7e68ee9ceeed61.png


找到ngx_http_header_filter函数,找到了关键字符串lkfakjf。

4f2ab882ab8e558cc1c28ea3ec4f272b.png


F5之后,发现之后调用了一个connect_shell的函数。

bc69f253a0d625ea73fec1db8fc3f19c.png


通过对connect_shell进行分析发现,是一个反弹shell的功能,利用socket编程完成shell反弹。

5f445f44d67e58dead6bd479315c97c7.png

后门复现

首先启动后门nginx文件,由于nginx会绑定80端口,如果多次启动会提示80端口被占用而无法启动。

a5f874996b9c0f968feda0e9ab1c835f.png


接着进行本地监听9999

a8fd52c84725ba618480b9dcfe4f6ff2.png


使用curl来触发漏洞。

3634940b84143d7adcdeafb12b8a74df.png


此时nc里已经得到了shell

35ef750370712b452fcdd76045ea5fa0.png

b95483803f1034c0ddffc5eee2391d7e.png

原理分析

通过gdb调试和IDA分析发现,要判断cookies中是否存在特征字符串lkfakjf,用到了一个这样的结构体ngx_http_request_t。
使用source insight打开nginx源码,定位到ngx_http_header_filter,发现参数就是ngx_http_request_t,查看该结构体的情况。

2d9267869180ceb47a133c79135dd339.png


该结构体相对比较大,这里截图只留下要使用的部分header_in;

e143b726dfb845500af30ea48c3391dd.png


通过header_in的结构继续寻找,找到cookies的定义。

036ed32162dba13aa739c911d0c42210.png


最后找到关于cookies的结构体情况。

78403f54180254ddaa0ff12f86faec56.png


结合IDA中代码分析,v4就是cookies结构体,通过结构体偏移+32字节定位到输入的特征字符串,在这里我也没有分析的特别清楚,初步判断应该是ngx_pool_t结构体。

789608d8606d7b5f5e41fa35e38e6a77.png

改写后门

首先,我们要先获取cookies的结构,通过r->headers_in.cookies.elts即可获得。
然后取到void elts的内容,最后通过32字节偏移得到存储输入特征码的地址,取其值即可拿到输入的特征字符串的值,最后的代码形式如下图。

f0f27c31899a9d0fd3affb939fb2bfdb.png

对这代码做个解释,首先v1和v2是long 的指针。
第一句代码(long )r->headers_in.cookies.elts;将void 的elts指针转化为long 的指针。第二句代码v2=(long )v1;v1是取其值,在将其值转化为long的指针。第三句代码cookie =(char )(v2+4);v2+4是表示在v2的基础上,偏移4个long个字节,如果你的v2定义为char 这里就是v2+32;(v2+4)取该偏移的内容,最后转化为char *的指针。
以上代码只适用于64位linux,以上代码只适用于64位linux,以上代码只适用于64位linux,重要的事情说三遍。
使用nginx的configure配置,只需要配置--prefix=/root/nginx即可,当configure运行完成后会生成Makefile文件。配置过程中,可能缺少很多的依赖,逐个安装即可。

4bd343b33236202d339ca0d50f79fc8a.png


然后修改位于objs里的Makefile文件,修改为如下配置,否则编译会报错。

91c88b2c6395f38cef905677017226a1.png


此时使用make编译,等待编译完成。
make install安装一下,安装的位置为之前配置的prefix路径。

f077e7ca38b7ea3665bd392de546a9ec.png


运行和调试nginx文件,能够成功获取输入的特征字符串。

1a5f05f21af8f758530534f236a5873a.png


其中rsi为触发漏洞的输入,rdi为内置特征字符串,这里选择了printf打印,能够成功获取到输入的特征字符串。

b80d1847abc4944e6d05bf1f5898bdf8.png


接下来准备复现反弹shell,添加功能代码,代码只能适用于带有nc命令的系统,编译后进行复现操作。

0ca28bdd4c45dc9455e2822d6f30a289.png


现在的特征字符串被修改为123456,现在来触发该后门。

3b671325dd88433314ca9330911bb9d0.png


成功接收到反弹的shell

ed1f995eb6cd20816d65883ab71cd7a3.png


自此后门重现成功,整个分析和复现过程到此结束。

后门排查

目前后门排查只能针对特定的版本,如果出现新nginx后门,排查手段大概率会失效。
1.本地验证 通过grep命令判断当前运行对nginx里面是否存在"/bin/sh"可疑字符串
$ which nginx |xargs grep "/bin/sh" –la
2.将nginx文件提取出来,使用IDA分析查找ngx_http_header_filter,下载nginx源码和IDA F5做对比判断是否存在后门。
最好的效果是下载nginx对应的源码对比是否有增加或改动的地方,但是这份方法比较耗时耗力,但是效果比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值