前言
在这次HVV中靠这个进入内网,获取了大量分数。但是过程很曲折,一度以为这个是个蜜罐,哈哈哈哈哈哈哈哈哈。
操作步骤或者是思路
通过fofa进行信息收集,发现目标存在蓝凌 EKP系统,通过手中的Nday进行测试,发现存在Treexml目录。
发现页面存在回显,参数s_bean不能为空,猜测漏洞大概率存在。
进行漏洞测试
先发送一个123
成功发送,当时以为命令执行近在眼前了。
构造exp,发送,被拦截!!!
进行url编码,被拦截!!!
进行HTMl编码,被拦截!!
进行Unicode编码,被waf拦截!!
PS:甚至想过二次编码,但命令能过,但是后端无法进行解析,(ps:估计不会进行二次解码,但能不能先拼接第一段unicode,效果就是解密一次unicode,关键函数进行二次unicode,这个可以问问chatgpt,未尝试,做一个引子。)
------------引子知识---
主要是/sys/common目录下有一系列神奇的jsp,而且它们有几个还有对应的分身,为了方便,我们直接去jar包看分身的源码。kmss_core.jar!com.landray.kmss.common.actions.DataController
@ResponseBody
public RestResponse<JSONArray> datajson(HttpServletRequest request, HttpServletResponse response) throws Exception {
String s_bean = request.getParameter("s_bean");
JSONArray array = new JSONArray();
JSONArray jsonArray = null;
try {
Assert.notNull(s_bean, "参数s_bean不能为空!");
RequestContext requestInfo = new RequestContext(request, true);
String[] beanList = s_bean.split(";");
List result = null;
for (int i = 0; i < beanList.length; i++) {
IXMLDataBean treeBean = (IXMLDataBean)SpringBeanUtil.getBean(beanList[i]);
result = treeBean.getDataList(requestInfo);
s_bean传参,可以用分号分割,然后依次getBean,最终强转成IXMLDataBean,将整个RequestContext传进去调用getDataList()。也就是说,我们可以调用任意实现了IXMLDataBean接口的getDataList(),那么搜索getDataList发现如下类。
其中SysFormulaValidate可造成bsh代码执行。
public List getDataList(RequestContext requestInfo) throws Exception {
List<Map<Object, Object>> rtnVal = new ArrayList();
Map<Object, Object> node = new HashMap<>();
String msg = null;
String confirm = null;
try {
String script = requestInfo.getParameter("script");
String type = requestInfo.getParameter("returnType");
String funcs = requestInfo.getParameter("funcs");
String model = requestInfo.getParameter("model");
FormulaParser parser = FormulaParser.getInstance(requestInfo,
new ValidateVarGetter(null), model);
if (StringUtil.isNotNull(funcs)) {
String[] funcArr = funcs.split(";");
for (int i = 0; i < funcArr.length; i++)
parser.addPropertiesFunc(funcArr[i]);
}
Object value = parser.parseValueScript(script, type);
script传参,跟进parseValueScript()
public Object parseValueScript(String script, String type) throws EvalException, KmssUnExpectTypeException {
Object value = parseValueScript(script);
if (StringUtil.isNotNull(type))
value = getSysMetadataParser().formatValue(value, type);
return value;
}
继续跟进parseValueScript()
public Object parseValueScript(String script) throws EvalException {
if (StringUtil.isNull(script))
return null;
Interpreter interpreter = new Interpreter();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
try {
if (loader != null)
interpreter.setClassLoader(loader);
StringBuffer importPart = new StringBuffer();
importPart.append("import ").append(
OtherFunction.class.getPackage().getName()).append(
".*;\r\n");
StringBuffer preparePart = new StringBuffer();
StringBuffer leftScript = new StringBuffer();
String rightScript = script.trim();
Map<String, FunctionScript> funcScriptMap = new HashMap<>();
/*.............*/
String m_script = String.valueOf(importPart.toString()) + preparePart.toString() +
leftScript + rightScript;
if (logger.isDebugEnabled())
logger.debug("执行公式:" + m_script);
runningData.set(this.contextData);
return interpreter.eval(m_script);
script传值进去,剩下就没去尝试了
因为我突然想到了,好像可以真实IP进行绕过
这个域名解析4个ip,通过一系列不为人知的操作
也就是多地ping,dns解析,还有证书等等
发现真实ip
然后就是拿shell,拿数据库密码等等
还有就是后渗透攻击了
总结
这次总的来说花了,最后还是拿到了权限,中间测试了很多方法,学习到了很多的知识,但是有时候的灵光一闪,真的让人欣喜若狂。