nginx header参数丢失_某Nginx后门分析与重现

安全分析与研究

专注于全球恶意软件的分析与研究

背景

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

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

样本分析

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

4ef90ac57f47a6b4a2491bddf3bf9b9f.png

2.找到ngx_http_header_filter函数,找到了关键字符串lkfakjf,如下所示:

d89c0650b07caecd484b7a1a509aea15.png

3.F5之后,发现之后调用了一个connect_shell的函数,如下所示:

897908c2c9ae6375370f8af49f5c3b27.png

4.通过对connect_shell进行分析发现,是一个反弹shell的功能,利用socket编程完成shell反弹,如下所示:

b39e82846650ee862c4dc9db5fd4e415.png

后门复现

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

ef5e6a18d8f5bca966c3fa80b860e0b6.png

2.接着进行本地监听9999,如下所示:

c0201ba5bb95d0633138b948fd194d1b.png

3.使用curl来触发漏洞,如下所示:

924b161e973263336f715c5cf60297b4.png

4.此时nc里已经得到了shell,如下所示:

d11e5524ed2424e12fab322183479488.png5624caacf67e0d95b23d79ebf2a55904.png

原理分析

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

2e6ce49f952ff8ac848210986d3ac4ee.png

2.该结构体相对比较大,这里截图只留下要使用的部分header_in,如下所示:

7dcea569b8bc7746e5664357d3242ce6.png

3.通过header_in的结构继续寻找,找到cookies的定义,如下所示:

230d2370d765d4abe260a7a062d6640a.png

4.最后找到关于cookies的结构体情况,如下所示:

baa491a5c9b9ea3428d4618e6112434c.png

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

17be147a5a9f72cfb72e6754f4cafd1c.png

重现后门

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

c3c353d9a8ed495faa70362fbc218f57.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,重要的事情说三遍。

2.使用nginx的configure配置,只需要配置--prefix=/root/nginx即可,当configure运行完成后会生成Makefile文件。配置过程中,可能缺少很多的依赖,逐个安装即可,如下所示:

1f4313833f0d7ec9312dc9f5ad52ea4b.png

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

6bdd10e9daef56465e9f1b8555f35f90.png

4.此时使用make编译,等待编译完成,如下所示:

4ff4de91e2000ccf1bf8c361d42e8ddb.png

5.make install安装一下,安装的位置为之前配置的prefix路径,如下所示:

5fb4688e63be1a0a1eff3bffe6984a37.png

6.运行和调试nginx文件,能够成功获取输入的特征字符串,如下所示:

5ced773405ef46ade0e9fa1d06b2f186.png

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

26d25c4c8cdf0f55eae5104c1337ec00.png

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

bd51f8feb61b57d74d8538d9c5fe9e6b.png

9.现在的特征字符串被修改为123456,现在来触发该后门,如下所示:

1c85fdef6b687e2ce231330cc332eade.png

10.成功接收到反弹的shell,如下所示:

7b6a6056d72ce01d6a739bbee79152f8.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对应的源码对比是否有增加或改动的地方,但是这份方法比较耗时耗力,但是效果比较好。

威胁情报

HASH

ab498686505dfc645e14c6edad280da7

这篇文章作者很早之前就发给我了,一直没时间编辑发布,后面作者也发布在了看雪论坛,链接地址:

https://bbs.pediy.com/thread-260954.htm

安全分析与研究专注于全球恶意软件的分析与研究,追踪全球黑客组织攻击活动,不忘初心,专注,专业,坚持,欢迎关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bch纠错码 码长8_浅析BCH码的编码方法.docx

浅析BCH码的编码方法浅析BCH码的编码方法0 引言数字信号在传输系统中传输时,不免会受到各种因素的干扰,使到达接收端的数字信号中混有噪声,从而引发错误判决。为了抗击传输过程中的干扰,必然要利用纠错码的差错控制技术。BCH码是纠…

virtual box一直正在加载文件_Linux基础导航与文件管理

Linux基础导航与文件管理对于新手,或许很关心如何通过命令行来控制操作系统。这编文章将会尝试带你快速熟悉Linux系统基础,但是不会覆盖所有的Linux系统知识,在未来对Linux探索过程中会有很大的帮助。本篇文章继续学习Linux基础。准备与目标在…

高德地图各种摄像头图标_高德导航中,限速摄像头,违章摄像头,监控摄像头各有什么区别...

展开全部限速摄像头e69da5e6ba903231313335323631343130323136353331333365666163是测速用的,超过限制时速就会抓拍,一般都是两个点中间的距离固定,分别拍照进入分析系统记录,超出时速限制,就会记录违章了。违章摄像头…

go去掉最后一个字符_Go语言去除字符串中的指定字符

Go语言中常用的去除字符串中指定字符的方法如下表所示。 表:字符串处理函数 方法功能描述 func Trim(s string, cutset string) string 将字符串 s 首尾包含在 cutset 中的任一字符去掉返回 func TrimFunc(s string, f func(rune) bool) string 将字符串 s 首尾满足函数 f(r)=…

打开fiddler后打不开网页_如何通过fiddler的导入导出功能,保存一份分类管理的请求报文...

在使用fiddler抓取请求报文时,我们更习惯于直接操作APP或者web系统,然后到fiddler中找我们想要的数据报文。但若这些报文是我们经常要看的 ,我们可以使用另外一种更简单的方式来查看,那就是把我们想要的报文保存到本地&#xff0c…

和vc的正确服用时间_最新研究:口服VC吸收远高于我们的意料

本文采自美国著名科普杂志,Townsendletter,发抗坏血酸口服生物利用中意外的早期反应。本研究提示,口服VC可能达到与静脉VC相同或接近的血液VC水平,而且纯VC比VC钠盐吸收更好。这是前所未料的。-成长博士。 介绍:重复和…

定点运算和浮点运算_C2000浮点运算注意事项——CPU和CLA的差异及误差处理技巧...

C28xFPU架构的C2000微处理器在原有的C28x定点CPU的基础上加入了一些寄存器和指令,来支持IEEE 单精度浮点数的运算。对于在定点微处理器上编写的程序,浮点C2000也完全兼容,不需要对程序做出改动。浮点处理器相对于定点处理器有如下好处&#x…

python模拟登录吃鸡_Python高级爬虫开发,高难度JS解密教程,绝地求生模拟登陆!...

前言这篇文章因为涉及到JS解密部分,所以难度比较高,Python基础比较薄弱的同学可以来看看思路。开始进入到该网站后我们可以看到如下界面,今天要做的内容就是模拟登陆那么咱们首先抓到登陆的包看看:登陆的同时总共发送了两次post请…

imread函数 matlab_地理人,你会用Matlab吗?

​Matlab 读取不同格式数据作为一个地信的小白,本科就学会了一个ArcGIS。虽然Matlab, C, Java, C, C# 等的编程课上了一大堆,但是考完试就完全忘了,妥妥的一个代码小白,当初连如何切换当前目录都不会……读研后,发现Ma…

jquery li ul 伪分页_求教关于Jquery的ul li的分页,该怎么处理

求教关于Jquery的ul li的分页ul 下有若干个li 3个为1个分页 1个input按钮点击显示后3个 另一个显示前3个 求大神这个怎么做分享到:更多------解决方案--------------------html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org…

url过滤怎么解除_腾讯面试官是这样来问布隆过滤器的?

作者:张振伟来源:https://zhangzw.com/20190521.html假设遇到这样一个问题:一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中&…

python dataframe遍历_对Python中DataFrame按照行遍历的方法

对Python中DataFrame按照行遍历的方法在做分类模型时候,需要在DataFrame中按照行获取数据以便于进行训练和测试。import pandas as pddict[[1,2,3,4,5,6],[2,3,4,5,6,7],[3,4,5,6,7,8],[4,5,6,7,8,9],[5,6,7,8,9,10]]datapd.DataFrame(dict)print(data)for indexs i…

mysql数值比中文检索快_MySQL 千万 级数据量根据(索引)优化 查询 速度

一、索引的作用索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上…

python enumerate函数_Python中enumerate函数用法详解

enumerate函数用于遍历序列中的元素以及它们的下标,多用于在for循环中得到计数,enumerate参数为可遍历的变量,如 字符串,列表等一般情况下对一个列表或数组既要遍历索引又要遍历元素时,会这样写:for i in range (0,len(list)):pri…

mysql5.7.24 安装步骤_MySQL5.7.24解压版安装步骤

网上安装MySQL数据库的教程有.msi格式包安装和.zip格式解压安装,zip安装我个人感觉安装方式纯净又能学习更多知识,因此我更倾向于zip安装。一、下载并解压前往MySQL官网下载5.7.24版本https://dev.mysql.com/downloads/下拉移动看见select Version 选择m…

python在工作中怎么用_如何用python在工作中“偷懒”

原标题:如何用python在工作中“偷懒”“偷懒还能干完活,才是本事 ”有些朋友在工作中会有这样的困惑:明明我从早忙到晚,为什么得到的评价还不高?要知道,企业对一个员工的评价是出于“ 产出”而非“ 付出”。…

mysql utf8mb4 造成慢_mysql使用utf8mb4经验吐血总结

1. utf8 与 utf8mb4 异同1234The character set named utf8 uses a maximum of three bytes per character and contains only BMP characters. The utf8mb4 character set uses a maximum of four bytes per character supports supplementary characters:- For a BMP charact…

java移动接口发短信_Java面试零碎知识点

1.Java文件经过JVM编译成字节码文件,即.class文件,将字节码文件在不同的操作系统中运行时,操作系统再将字节码文件编译成机器码文件。这就是Java跨平台2.首先明确一点,java 的 GC 回收是完全自动的,没有提供相关 api 手…

如何安装mysql5.7.21_Linux 安装MySql 5.7.21 操作步骤

一:到mysql官网下载最新的mysql包 mysql-5.7.21-linux-glibc2.12-x86_64二:在linux /usr/local/中解压mysql压缩包 改名为mysqlcd /usr/local/tar -xzvf mysql压缩包名三:创建用户组mysql,创建用户mysql并将其添加到用户组mysql中…

java重定向代码_Java程序员经典面试题集大全 (三十四)

341. Servlet API中forward() 与redirect()的区别?答:为实现程序的模块化,就需要保证在不同的Servlet之间可以相互跳转,而Servlet中主要有两种实现跳转的方式:FORWARD方式与redirect方式。 Forward() : 是服务器内部的…