“冰河”数据分析笔记

“冰河”可称得上是(国内)远程控制的一面“大旗”了。尽管自2.2[DARKSUN]专版以后,作者黄鑫停止了对新版本的开发,但其强大的功能和易用性,以及层出不穷的各种改版,仍然使很多“网络安全技术爱好者”乐此不疲。

咳,这么一本正经的说话真是别扭啊,既然大家同道中人,我也就不那么多P话了。如果你还不知道“冰河”是个什么玩艺的话……就先别看这篇帖子了,去找一下“古代典籍”,会有收获的。

OK,进入正题。

“冰河”是个“木马”,具有“木马”的“经典”(怎么需要这么多引号呢?)特征:客户端和服务器(“蓝色火焰”等只有服务器)。“冰河”客户端所发送命令是经过加密的,而服务器返回的是明文(你别问我是怎么知道的,客观事实!)。我们要研究的是客户端发送数据的格式和加密方法。

我们只需要一种工具就能完成这项工作:“PORTLISTEN”,它的作用我就不用赘述了(“赘”述:Port“端口”,Listen“监听”,Port Listen“端口监听”)。这种端口监听工具的优点在于可以直接把接收到的数据转换成ASCII码的形式,这样就方便了我们的分析。

为了进行对比,我用冰河的客户端连续发送了四条搜索本地硬盘的命令(就是用鼠标点以下服务器的图标,只不过我点了四下而已)。消息A、B是没有密码的,消息C、D是密码分别为“a”和“b”的。

以下是这四条消息(十进制ASCII):
A: 245 203 201 207 198 245 200 200 206 199 245 206 199 205 201 245 187 154 140 148 171 144 143 197 245 213 209 213 245
B: 245 203 201 207 198 245 200 200 206 199 245 206 199 205 200 245 187 154 140 148 171 144 143 197 245 213 209 213 245
C:158 245 203 201 207 198 245 200 200 206 199 245 206 199 205 199 245 187 154 140 148 171 144 143 197 245 213 209 213 245
D:157 245 203 201 207 198 245 200 200 206 199 245 206 199 205 198 245 187 154 140 148 171 144 143 197 245 213 209 213 245

通过对比可以发现这四条消息:
1.A、B两条消息比C、D少一位,就是开头的一位。
2.C、D两条消息的密码都是一个字母,而且是连续的,而开头多出来的一位也是连续的两个数。
3.每条消息第15位是不同的,而且是递减的顺序,这一位的作用是什么呢?
4.每段数据之间会有“245”出现。

根据上面的问题,提出这样的猜想:
1.“245”是一个标志位。
2.消息格式应该是这样的:密码(标志位)消息1(标志位)消息n(标志位)
3.第十五位或者说整个消息3的是一个序号(没有别的解释了,除非去问黄鑫本人:)
4.密码对消息不具有加密功能(重要!可以对算法进行可选择明文攻击!)

我们还是先解开它的密码算法吧,这看上去很简单。

ASCII码97(a)的加密后数据为158,98是157。显然加密是顺序的,也就是简单的单表替换,这好办了。加密后的数据是和ASCII表的顺序相反的,这样我们可以推算c的加密后ASCII码为156,d为155……就可见字符来说,ASCII码最小的是“[空格]”,最大的是“~”这样,我就已这两个字符为密码截获他们的加密后消息:空格的编码为223,~的编码为129(别忘了加密后数据和ASCII的顺序是相反的)。这样,为了大家不用像我一样重现加密源程序,我列了一张表对应所有的可见字符的加密前,字符,加密后的资料:

前 字符 后
126 ~ 129
125 } 130
124 | 131
123 { 132
122 z 133
121 y 134
120 x 135
119 w 136
118 v 137
117 u 138
116 t 139
115 s 140
114 r 141
113 q 142
112 p 143
111 o 144
110 n 145
109 m 146
108 l 147
107 k 148
106 j 149
105 i 150
104 h 151
103 g 152
102 f 153
101 e 154
100 d 155
099 c 156
098 b 157
097 a 158
096 `159
095 _1 60
094 ^ 161
093 ] 162
092 \ 163
091 [ 164
090 Z 165
089 Y 166
088 X 167
087 W 168
086 V 169
085 U 170
084 T 171
083 S 172
082 R 173
081 Q 174
080 P 175
079 O 176
078 N 177
077 M 178
076 L 179
075 K 180
074 J 181
073 I 182
072 H 183
071 G 184
070 F 185
069 E 186
068 D 187
067 C 188
066 B 189
065 A 190
064 @ 191
063 ? 192
062 > 193
061 = 194
060 < 195
059 ; 196
058 : 197
057 9 198
056 8 199
055 7 200
054 6 201
053 5 202
052 4 203
051 3 204
050 2 205
049 1 206
048 0 207
047 / 208
046 . 209
045 - 210
044 , 211
043 + 212
042 * 213
041 ) 214
040 ( 215
039 ' 216
038 & 217
037 % 218
036 $ 219
035 # 220
034 " 221
033 ! 222
032 空格 223

好了!我们可以直接读消息明文了!以消息A为例(已分段):
1. 245 203 201 207 198
明文: 4 6 0 9
2. 245 200 200 206 199
明文: 7 7 1 8(客户端接收端口)
3. 245 206 199 205 201
明文: 1 8 2 9(序号)
4. 245 187 154 140 148 171 144 143 197
明文: D e s k t o p :(搜索位置)
5. 245 213 209 213 245
明文: * . *(目标类型)

看明白了吗?“冰河”数据格式的面纱已经褪去,这就是他的本来面目!因为消息中没有命令,所以消息段1肯定是命令编号!2是客户端接收端口,3是序号,4、5是参数。

补记:
写完以后我觉的文章不怎么实用,或者说根本没用。但是想想还是发了出来,或许有人愿意做个“冰河密码破解器”之类的东西。另外,冰河实际上并不是使用典型的C/S模式,而是“CS/CS”模式,即客户端和服务器即要被连接也要向对方发起连接,客户端的7718端口就处在侦听状态,等待服务器的连接。这样,只要捕获了客户端的接收端口,既可以对它发送消息了,不带命令编号的消息会在客户端窗口底部的状态栏里面显示出来,比如你给他发一个"你好,你被我逮到了"的消息, 或者发起一次D.O.S攻击。

Published At
Categories with 网络技术
comments powered by Disqus