社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

某Nginx后门分析复现与改写

看雪学院 • 4 年前 • 518 次点击  

本文为看雪论坛精华文章

看雪论坛作者ID:Risks





背景



前几天,接到一个nginx后门样本,本着就分析和复现的思路,完整的将整个过程做一次复现,不料最终还获取到了后门的核心代码部分,遂将其整理发布。

在后续分析之前先来了解下nginx后门的功能。通过在Cookie中包含特征字符串lkfakjfa,并填写需要反弹的IP和端口,完成shell反弹,这就是后门的一个大致情况。





样本信息



MD5: ab498686505dfc645e14c6edad280da7

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





样本分析



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



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



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



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





后门复现



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



接着进行本地监听9999



使用curl来触发漏洞。



此时nc里已经得到了shell:







原理分析



通过gdb调试和IDA分析发现,要判断cookies中是否存在特征字符串lkfakjf,用到了一个这样的结构体ngx_http_request_t。

使用source insight打开nginx源码,定位到ngx_http_header_filter,发现参数就是ngx_http_request_t,查看该结构体的情况。



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



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



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



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





改写后门



首先,我们要先获取cookies的结构,通过r->headers_in.cookies.elts即可获得。

然后取到void elts的内容,最后通过32字节偏移得到存储输入特征码的地址,取其值即可拿到输入的特征字符串的值,最后的代码形式如下图。



对这代码做个解释,首先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文件。配置过程中,可能缺少很多的依赖,逐个安装即可。



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



此时使用make编译,等待编译完成。

make install安装一下,安装的位置为之前配置的prefix路径。



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



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



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



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



成功接收到反弹的shell:



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





后门排查



目前后门排查只能针对特定的版本,如果出现新nginx后门,排查手段大概率会失效。

1. 本地验证 通过grep命令判断当前运行对nginx里面是否存在"/bin/sh"可疑字符串$ which nginx |xargs grep "/bin/sh" –la

2. 将nginx文件提取出来,使用IDA分析查找ngx_http_header_filter,下载nginx源码和IDA F5做对比判断是否存在后门。

最好的效果是下载nginx对应的源码对比是否有增加或改动的地方,但是这份方法比较耗时耗力,但是效果比较好。



- End -


看雪ID:Risks

https://bbs.pediy.com/user-830514.htm

  *本文由看雪论坛 Risks 原创,转载请注明来自看雪社区。


推荐文章++++

* 一种通过后端编译优化脱混淆壳的方法

* Win10 1909逆向(反向计算Windows内核内存布局及代码实现)

* Chunk Extend and Overlapping笔记

* Frida 入门小练习

* 索然无味的勒索病毒

好书推荐











公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com



ps. 觉得对你有帮助的话,别忘点分享点赞在看,支持看雪哦~


“阅读原文一起来充电吧!
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/72225
 
518 次点击