nginx header参数丢失_某Nginx后门分析与重现
安全分析與研究
專注于全球惡意軟件的分析與研究
背景
前幾天,接到一個nginx后門樣本,本著就分析和復(fù)現(xiàn)的思路,完整的將整個過程做一次復(fù)現(xiàn),不料最終還獲取到了后門的核心代碼部分,遂將其整理發(fā)布,僅供學(xué)習(xí)研究之用。
在后續(xù)分析之前先來了解下nginx后門的功能。通過在Cookie中包含特征字符串lkfakjfa,并填寫需要反彈的ip和端口,完成shell反彈,這就是后門的一個大致情況。
樣本分析
1.在已有的分析情報的幫助下,得知nginx后門位于ngx_http_header_filter,IDA裝載樣本,發(fā)現(xiàn)樣本帶有符號信息,如下所示:
2.找到ngx_http_header_filter函數(shù),找到了關(guān)鍵字符串lkfakjf,如下所示:
3.F5之后,發(fā)現(xiàn)之后調(diào)用了一個connect_shell的函數(shù),如下所示:
4.通過對connect_shell進(jìn)行分析發(fā)現(xiàn),是一個反彈shell的功能,利用socket編程完成shell反彈,如下所示:
后門復(fù)現(xiàn)
1.首先啟動后門nginx文件,由于nginx會綁定80端口,如果多次啟動會提示80端口被占用而無法啟動,如下所示:
2.接著進(jìn)行本地監(jiān)聽9999,如下所示:
3.使用curl來觸發(fā)漏洞,如下所示:
4.此時nc里已經(jīng)得到了shell,如下所示:
原理分析
1.通過gdb調(diào)試和IDA分析發(fā)現(xiàn),要判斷cookies中是否存在特征字符串lkfakjf,用到了一個這樣的結(jié)構(gòu)體ngx_http_request_t,使用source insight打開nginx源碼,定位到ngx_http_header_filter,發(fā)現(xiàn)參數(shù)就是ngx_http_request_t,查看該結(jié)構(gòu)體的情況,如下所示:
2.該結(jié)構(gòu)體相對比較大,這里截圖只留下要使用的部分header_in,如下所示:
3.通過header_in的結(jié)構(gòu)繼續(xù)尋找,找到cookies的定義,如下所示:
4.最后找到關(guān)于cookies的結(jié)構(gòu)體情況,如下所示:
5.結(jié)合IDA中代碼分析,v4就是cookies結(jié)構(gòu)體,通過結(jié)構(gòu)體偏移+32字節(jié)定位到輸入的特征字符串,在這里我也沒有分析的特別清楚,初步判斷應(yīng)該是ngx_pool_t結(jié)構(gòu)體,如下所示:
重現(xiàn)后門
1.首先,我們要先獲取cookies的結(jié)構(gòu),通過r->headers_in.cookies.elts即可獲得,然后取到void *elts的內(nèi)容,最后通過32字節(jié)偏移得到存儲輸入特征碼的地址,取其值即可拿到輸入的特征字符串的值,最后的代碼形式,如下所示:
對這代碼做個解釋,首先v1和v2是long *的指針。
第一句代碼(long *)r->headers_in.cookies.elts;將void *的elts指針轉(zhuǎn)化為long *的指針。
第二句代碼v2=(long *)*v1;*v1是取其值,在將其值轉(zhuǎn)化為long*的指針。
第三句代碼cookie =(char *)*(v2+4);v2+4是表示在v2的基礎(chǔ)上,偏移4個long*個字節(jié),如果你的v2定義為char *這里就是v2+32;*(v2+4)取該偏移的內(nèi)容,最后轉(zhuǎn)化為char *的指針。
以上代碼只適用于64位linux,以上代碼只適用于64位linux,以上代碼只適用于64位linux,重要的事情說三遍。
2.使用nginx的configure配置,只需要配置--prefix=/root/nginx即可,當(dāng)configure運(yùn)行完成后會生成Makefile文件。配置過程中,可能缺少很多的依賴,逐個安裝即可,如下所示:
3.然后修改位于objs里的Makefile文件,修改為如下配置,否則編譯會報錯,如下所示:
4.此時使用make編譯,等待編譯完成,如下所示:
5.make install安裝一下,安裝的位置為之前配置的prefix路徑,如下所示:
6.運(yùn)行和調(diào)試nginx文件,能夠成功獲取輸入的特征字符串,如下所示:
7.其中rsi為觸發(fā)漏洞的輸入,rdi為內(nèi)置特征字符串,這里選擇了printf打印,能夠成功獲取到輸入的特征字符串,如下所示:
8.接下來準(zhǔn)備復(fù)現(xiàn)反彈shell,添加功能代碼,代碼只能適用于帶有nc命令的系統(tǒng),編譯后進(jìn)行復(fù)現(xiàn)操作,如下所示:
9.現(xiàn)在的特征字符串被修改為123456,現(xiàn)在來觸發(fā)該后門,如下所示:
10.成功接收到反彈的shell,如下所示:
自此后門重現(xiàn)成功,整個分析和復(fù)現(xiàn)過程到此結(jié)束。
后門排查
目前后門排查只能針對特定的版本,如果出現(xiàn)新nginx后門,排查手段大概率會失效。
1.本地驗證 通過grep命令判斷當(dāng)前運(yùn)行對nginx里面是否存在"/bin/sh"可疑字符串
$ which nginx |xargs grep "/bin/sh" –la
2.將nginx文件提取出來,使用IDA分析查找ngx_http_header_filter,下載nginx源碼和IDA F5做對比判斷是否存在后門。
最好的效果是下載nginx對應(yīng)的源碼對比是否有增加或改動的地方,但是這份方法比較耗時耗力,但是效果比較好。
威脅情報
HASH
ab498686505dfc645e14c6edad280da7
這篇文章作者很早之前就發(fā)給我了,一直沒時間編輯發(fā)布,后面作者也發(fā)布在了看雪論壇,鏈接地址:
https://bbs.pediy.com/thread-260954.htm
安全分析與研究專注于全球惡意軟件的分析與研究,追蹤全球黑客組織攻擊活動,不忘初心,專注,專業(yè),堅持,歡迎關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的nginx header参数丢失_某Nginx后门分析与重现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven不配置环境变量可以使用吗_哪些
- 下一篇: nginx匹配规则_Nginx系列之se