一个类名为U的类继续ClassLoader,这里我只给大家阐明一点,避免对classloader阐明太多让大家不易理解。classloader便是将class文件加载到JVM中。读者理解这一点就行……
获取request工具,然后通过request工具获取要求方法。如果是POST方法则向下处理……
定义一个密钥,由于其采取aes加密,然后将这个key存入session工具,key为u,value为密钥。
通过Cipher工具实现了AES加密
然后初始化这个加密算法init(int opmode, Certificate certificate)init这个api是利用给定证书中的公钥初始化此密码。然后此处办理一个疑问,此处的aes加密还是解密是我困惑的一个点,后来差文档创造第一个参数opmode支持两种模式ENCRYPT_MODE , DECRYPT_MODE , WRAP_MODE或 UNWRAP_MODE,然后他传了一个int类型的2即为解密。然后将上文声明的key当作密钥传入。自此aes方法声明结束。
然后实例化当前类,对付这种链式操作很大程度上减少了代码量,但是对付剖析者不怎么友好。这种写法须要从内向外剖析。1.调用request工具的getReader然后逐行读取要求包里的内容。2.调用sun包下misc中Base64Decoder方法对其进行base64解密3.调用上文中实例的aes算法工具的dofinal对其进行aes解密4.将内容传给声明的方法g中,内部调用defineClass方法动态解析内容成class内容
这里紧张是defineClass方法给出api,可以搜索这个api文档深入理解。
聊聊这样实现的上风我不得不承认的冰蝎作者对webshell管理端这样的先河开辟者的佩服。缘故原由如下:对付一个webshell的掌握,其最紧张的功能在于命令实行也便是Runtime类。客户端向做事端发送命令,做事端获取内容然后带入exec当中。但是冰蝎作者没有这么做,他选择类加载的办法,客户端发送给做事端类文件由做事端利用classloader加载到jvm。这样做最大的好处便是可扩展性,可以做的事情不在局限于runtime类,让可以做的事情无限放大。从0到1是个大问题……
客户端接下来看看客户端目录构造,让我光彩的是。当我再次看到这样的目录构造让我留下的阔别已久的泪水,那些老架构项目的架构烂的一塌糊涂。这样的架构,分层思想给我接下来的剖析减少了很大压力,直接pom下载依赖。冰蝎利用了sqllite数据库
核心表就两张,hosts和shell表。多对多的关系,保存shell的记录。1.dao层卖力查询数据2.entity层卖力数据库和运用程序的实体映射3.ui卖力界面4.util工具包5.payload是客户真个功能实现
功能实现自己看吧,无非创建文件删除文件这些没啥说的。
聊聊特色https://www.freebuf.com/sectool/247009.html 我一句这篇文章来做一个回嘴吧1.content-type Content-Type: application/octet-stream属于强特色。这种属于流传输,而用到流传输的地方多了去了,不能作为特色。2.user-Agent 。我看了源码中
冰蝎子中默认定义的agent头,查阅后并未创造敏感分外字样,都为正常ua头。如果实在担心可以修正默认的ua头。
Accept&Cache-Control,文章中说如果不自行定义则会利用默认的Accept: text/html, image/gif, image/jpeg, ; q=.2, /; q=.2Cache-Control: no-cachePragma: no-cacheUser-Agent: java/1.8这很正常,大多数要求都不会自己定义。综上所述,以上几种特色都属于强行找特色。如果有必要,建议只修正ua头即可。
总结看完全个代码之后的觉得便是,冰蝎作者的开拓功底可以,个顶用到多种设计模式,方法的抽离性比较强。每个方法都放到了该放的位置,但是数据库设计的个人认为有很多冗余字段存在于host和shell表中。末了提一嘴,
除流量特色以外的内存特色session 中的key为u算不算一个呀,这个作为内存马检测算不算很有力。