0x00 文件识别

image.png
可以看到木马无壳,C#编写,直接使用dnspy尝试反编译

0x01 入口分析

使用dnspy后反编译结果如下:
image.png

看样子是一个winfrom程序,找到程序入口,调用了this.InitializeComponent();初始化程序。
image.png

/*
通过分析inti函数,可以得知程序分别会计时调用:
this.start.Interval = 120000; this.start.Tick += this.start_Tick;
this.inf.Interval = 10000; this.inf.Tick += this.inf_Tick;
this.txt.Interval = 120000; this.txt.Tick += this.txt_Tick; subject.Interval = 120000; subject.Tick += this.subject_Tick;
this.run.Interval = 60000; this.run.Tick += this.run_Tick;
this.load.Interval = 120000; this.load.Tick += this.load_Tick;
this.screen.Interval = 8000; this.screen.Tick += this.screen_Tick;

所以根据设置的时钟,执行顺序应该为:

  1. 1. screen_Tick
  2. 1. run_Tick
  3. 1. inf_Tick
  4. 1. start_Tick
  5. 1. txt_Tick
  6. 1. subject_Tick
  7. 1. load_Tick

*/

0x02 start._tick函数分析

程序首先设置了一个start.tick = this.start_tick
查看start_Tick函数
image.png
start_Tick函数中首先是实例化了一个Lenor类的lenor对象,接着根据label15.text的值是否存在给this.dir赋值。
并且拼接了文件名audev.txt
查找label15可以发现
label15.text的值为:”C:\\Users\\Public\\Videos”
label16.text的值为:”C:\Documents and Settings\All Users\Documents”
image.png
所以这里this.dir的值应该是”C:\\Users\\Public\\Videos”
或者:”C:\Documents and Settings\All Users\Documents”

接下来将dir 作为参数传递给了lenor的id方法。
分析lenor的id方法
image.png

首先将dr作为和”C” 作为参数传递到了SN函数
查看SN函数可以得知
image.png
分析SN函数可以得知:
该函数首先会判断当前目录下是否有99.txt文件,如果没有,则会通过传递进来的参数拼接字符串:
这里应该是:
vol C:>>C:\Users\Public\Videos\99.txt
然后将该语句写入到了C:\Users\Public\Videos\b.bat并执行b.bat
根据语句可以得知,该bat文件执行之后,会在C:\Users\Public\Videos\目录下生成一个99.txt文件,文件内容为
image.png
接着程序哦通过ReadAllText将vol C:>>C:\Users\Public\Videos\99.txt的文件内容读取并复制给了text
经过处理之后,text最后的值为C盘系统卷的序列号(0001072B)

返回到SN的调用出,现在可以得知text2的值为C盘序列号
image.png
将序列号去空格之后
通过Environment.UserName获取当前账户用户名
然后拼接处理,保证处理出来的字符串长度为16
至此,id函数功能分析完毕,返回上层
image.png

所以start_Tick函数的功能为:获取C盘序列号和当前用户username,通过处理之后,将一个长度为16的串赋值给this._id变量

通过init处的代码可以得知,程序执行完start_Tick函数后会调用inf_Tick函数
image.png

0x03 inf_Tick函数分析

inf_Tick函数结构如下:
image.png
首先会将textBox2的内容分割存放到数组array中
查看textBox2的可以得知内容为:”carl.dolzhek17|vebek.morozh30”
image.png
分割之后将array[1]赋值给了a1,array[0]赋值给了b1
所以a1的值应为:vebek.morozh30
b1的值应为:carl.dolzhek17

同样的,textBox4的值为:”shinina.lezh|marvel.polezha”
image.png
分割之后分别赋值给了a2和b2
所以a2的值应当为:marvel.polezha
b2的值应当为:shinina.lezh

textBox3的值为:”P0tr4h4s7a|g0r7tsa45s”
image.png
分割之后a3:g0r7tsa45s
b3:P0tr4h4s7a

然后实例化了一个Lenor对象,将this.dir赋值给了lenor的Dir
image.png
通过上面的分析可以得知,this.dir=”C:\\Users\\Public\\Videos\“

接着调用了lenor的inf方法,将this.dir和label13的值拼接起来作为参数传递了进去
image.png
label13的值为:”si.ini”
所以传递的参数应该为:
C:\Users\Public\Videos\si.ini
接下来进入到inf方法:
image.png
可以看到,inf方法中,首先会获取一些基本信息,包括当前运行路径,系统内核版本,系统路径,userdomain,host,username,时间等。如下:
image.png

然后会获取每个磁盘详细的信息
image.png
image.png

最后会遍历所有C盘的应用目录并写入到si.ini文件中:
image.png
写入的si.ini文件内容大致如下:image.png
image.png

现在可以得知,lenor.inf函数的功能是:获取当前应用路径,然后收集系统基本信息,遍历所有磁盘,将C盘目录下所有应用目录写入到传入的路径中,这里是C:\Users\Public\Videos\si.ini

现在返回到了inf_Tick函数继续分析
image.png

接下来调用了lenor的sent方法,本别传递了MDat和AUTH两个参数,我们先分析参数内容,首先是MDat。
通过分析可以得知:
Dom = “@post.cz”
Host = “smtp.seznam.cz”
fn = “C:\Users\Public\Videos\si.ini”
ID = 用户名拼接磁盘序列号
bod = “ST”
mT = “sym777.g”

AUTH:
mF1 = vebek.morozh30
p1 = carl.dolzhek17
mF2 = marvel.polezha
p2 = shinina.lezh
mF3 = g0r7tsa45s
p3 = P0tr4h4s7a

现在查看lenor.sent函数
image.png
sent函数结构比较简单,功能主要是通过调用post_o函数实现:
分析post_o很容易可以得到该函数的功能为向目标服务器发送邮件。
邮件内容为fn,也就是之前收集的si.ini文件

邮件host:
“smtp.seznam.cz”
端口:
465
用户名和密码分为三组,分别为


username:
vebek.morozh30@post.cz
password:
carl.dolzhek17
b.
username:
marvel.polezha@post.cz
password:
shinina.lezh
c.
username:
g0r7tsa45s@post.cz
password:
P0tr4h4s7a

如果三次邮件都发送失败,那么就退出程序。

至此,inf_Tick函数分析完毕,该函数功能为:收集用户本地基本信息包括操作系统内核版本,系统路径,userdomain,host,username,系统时间地区,系统所有磁盘大小格式等。并且会将这些信息写入到”C:\Users\Public\Videos\si.ini”目录下,分隔出三个邮件用户名和密码,尝试将si.ini文件发送到邮件服务器,若发送失败则退出。

0x04 txt_Tick函数分析

初始化时第三个调用的函数为txt_Tick
image.png

函数结构如下:
image.png

可以看到,该函数首先会分割textBox6.txt并存入array变量
textBox6的值为:”Ku.87R9mok_0|kae.mezhnosh”
image.png

所以ai=kea.mezhnosh
bi=Ku.87R9mok_0

接下来将this._id , ai+textBox11.text , bi , textBox1.text 四个变量作为传输传递到了lenor的pi函数中四个参数分别为:
this_id = 用户名和磁盘序列号的拼接
ai + textBox11.Text = “kea.mezhnosh@post.cz”
bi = “Ku.87R9mok_0”
texBox1.text = “pop.seznam.cz”

lenor类中pi函数内容为:
image.png
该函数会连接pop3邮件服务器,地址为pop.seznam.cz
username = kea.mezhmosh@post.cz
password = Ku.87R9mok_0

之后会检查是否获取到了邮件内容,如果有邮件的标题ID = 本地用户名和磁盘序列号的组合,那么获取邮件body的hex数据并返回。

如果返回回来的_adr有数据,那么继续调用sent函数,发送label12的数据到服务器
label12的值为:set.txt
image.png

至此,txt_Tick函数功能分析完毕,该函数主要功能为:验证邮件服务器中是否有目标内容,如果有的话发送新的数据到服务器。

0x05 run_Tick函数分析

接下来被调用的函数是run_Tick
首先是尝试创建目录:
通过对rn的查找可以发现,rn的赋值分别在函数load_Tick和函数subject_Tick中,所以先分析这两个函数。
image.png
判断rn是否存在,如果存在则以rn的值创建路径
并且将”C:\Users\Public\Videos\audev.txt”移动到rn的路径下
image.png
然后发送”C:\Users\Public\Videos\1.txt”到服务器,bod为okey4
image.png
然后尝试创建新线程”C:\Users\Public\Videos\audev.txt”,若线程创建成功,则发送”C:\Users\Public\Videos\1.txt” 到服务器,bod = okey5

然后删除了注册表键值的Adbrdr
image.png

0x06 load_Tick函数分析

image.png
函数首先是对this._adr进行处理,通过之前对txt_Tick的分析可以得知,_adr的值为服务器返回的body。

0x07 screen_Tick函数分析

image.png
函数首先会分割textBox2的值并存放入array
经过分析textBox2.text = “carl.dolzhek17|vebek.morozh30”
所以a1 = vebek.morozh30
b1 = carl.dolzhek17
接着会分割textBox4的值并存放入array
image.png
textBox4.Text = “shinina.lezh|marvel.polezha”
所以a2= marvel.polezha
b2 = shinina.lezh

image.png
a3:g0r7tsa45s
b3:P0tr4h4s7a
image.png
接着调用了lenor类的scr函数

scr函数定义如下:
image.png
可以得知scr函数是截取当前屏幕并命名为scx.bin存入到dir目录下,也就是C:\Users\Public\Videos

然后实例化了MDat结构体:
image.png
通过分析可得
Dom = “@post.cz”
Host = “smtp.seznam.cz”
fn = “C:\Users\Public\Videos\scx.bin”
ID = 用户名与磁盘序列号的拼接
bod = “sc”
mT = “sym777.g”

然后实例化了AUTH结构体
image.png

AUTH:
mF1 = vebek.morozh30
p1 = carl.dolzhek17
mF2 = marvel.polezha
p2 = shinina.lezh
mF3 = g0r7tsa45s
p3 = P0tr4h4s7a

然后判断”C:\Users\Public\Videos\set.txt” 是否存在
如果存在,就调用lenor的Registration方法写入注册表
image.png
写入的注册表键值为:Adbrdr
image.png
很明显这个开机启动的操作

然后将”{System_Parametrs = 10}”写入到”C:\Users\Public\Videos\set.txt” 文件中

至此,screen_Tick函数分析完毕,该函数功能为:截取当前的屏幕存放到C:\Users\Public\Videos\scx.bin文件中。然后尝试发送bod=sc到服务器。

0x08 subject_Tick函数分析

image.png
首先将”000”写入到”C:\Users\Public\Videos\1.txt”文件中

然后调用lenor的pi函数,并将返回值赋值给rn
image.png

this_id = 用户名和磁盘序列号的拼接
ai + textBox11.Text = “kea.mezhnosh@post.cz”
bi = “Ku.87R9mok_0”
texBox1.text = “pop.seznam.cz”

将rn去空格后,再次尝试发送数据到邮件服务器:
image.png

发送的内容的bod=okey3,邮件内容为”C:\Users\Public\Videos\1.txt”