AsyncRAT利用分析

开发
AsyncRAT是一款使用C Sharp开发的C2工具,本文仅在技术研究的角度分析AsyncRAT的技术细节,介绍检测方法。

[[343203]]

0x01 简介

· AsyncRAT的优点

· AsyncRAT的技术细节

· 检测方法

0x02 AsyncRAT的优点

AsyncRAT使用C Sharp开发,应用于Windows系统,具有以下优点:

1. 支持从Pastebin.com读取C2服务器的配置信息;

2. 支持内存加载PE文件;

3. 支持动态编译并执行C#或者VB代码;

4. 支持U盘感染,能够感染U盘中所有使用.NET开发的exe文件;

5. 支持自动读取Firefox和Chrome浏览器中保存的密码;

6. 通过欺骗用户点击的方式绕过UAC进行提权;

7. 通过C#接口技术,提高程序的扩展性,在程序实现上将每一个功能对应一个类,编译成dll文件,在需要加载的时候,由Server发送至Client,Client通过Activator.CreateInstance将类实例化,进而调用类的方法。

0x03 AsyncRAT的技术细节

本节按照AsyncRAT控制面板上的功能逐个进行分析,如下图: 

1.SendFile

(1)ToMemory

内存加载exe文件,支持以下两种类型:

· Reflection

· 使用Assembly.Load加载C#程序

更多细节可参考之前的文章《从内存加载.NET程序集(Assembly.Load)的利用分析》。

· RunPE

· 通过替换进程内存的方式加载exe文件

可选择以下程序作为被注入的程序:

· aspnet_compiler.exe

· RegAsm.exe

· MSBuild.exe

· RegSvcs.exe

· vbc.exe

注:

· 以上5个exe文件位于Microsoft.NET Framework的安装目录,同AsyncClient.exe的位数保持一致

· 使用32位的AsyncClient.exe反弹回的Session,默认会寻找32位Microsoft.NET Framework的安装目录,例如:C:\Windows\Microsoft.NET\Framework\v4.0.30319

· 使用64位的AsyncClient.exe反弹回的Session,默认会寻找64位Microsoft.NET Framework的安装目录,例如:C:\Windows\Microsoft.NET\Framework64\v4.0.30319

· RunPE操作将启动以上5个exe文件中的一个,通过ReadProcessMemory、VirtualAllocEx、WriteProcessMemory和ResumeThread实现对进程内存的修改,替换成要加载的exe文件

· 这里需要注意要加载的exe文件需要同AsyncClient.exe的位数保持一致

· 使用32位的AsyncClient.exe反弹回的Session,使用RunPE操作只能加载32位的exe文件

· 使用64位的AsyncClient.exe反弹回的Session,使用RunPE操作只能加载64位的exe文件

更多细节可参考之前的文章《傀儡进程的实现与检测》

(2)ToDisk

将exe文件上传到目标主机的%Temp%目录,重命名为随机字符串,再使用Powershell启动exe文件,执行后不会删除%Temp%目录下的exe文件。

2. Monitoring

(1)Remote Desktop

· 监控屏幕,实时获得目标桌面的内容(只能监控,无法操作)

· 调用Graphics类的CopyFromScreen实现屏幕截图

通过Python实现监控屏幕的细节可参考之前的文章《Pupy利用分析——Windows平台下的屏幕控制》。

(2)Keylogger

· 实时获得目标主机键盘输入的消息和进程名称

· 通过hook的方式实现键盘记录

(3)Password Recovery

· 获得Firefox和Chrome浏览器中保存的密码

技术细节可参考之前的文章《渗透技巧——导出Firefox浏览器中保存的密码》和《渗透技巧——导出Chrome浏览器中保存的密码》。

(4)File Manager

· 文件管理,还支持隐蔽安装7zip和对文件的压缩及解压缩

隐蔽安装7zip的方式:

· 在%Temp%目录新建文件夹7-Zip,释放文件7z.exe和7z.dll

(5)Process Manager

· 进程管理,支持查看进程和关闭进程

(6)Report Window

· 监控重要进程,当目标主机上运行指定进程时,控制端弹出提示消息

(7)Webcam

· 开启摄像头

3.Miscellaneous

(1)Bots Killer

清除自身进程在注册表HKLM和HKCU下\Software\Microsoft\Windows\CurrentVersion\Run和Software\Microsoft\Windows\CurrentVersion\RunOnce保存的项。

(2)USB Spread

1. 当目标主机连接U盘时,感染U盘中的文件。

2. 将木马客户端复制到U盘中并隐藏,默认保存的名称为LimeUSB.exe。

修改U盘中所有使用.NET开发的exe文件,通过CSharpCodeProvider改变程序运行流程,添加以下代码:

  1. using System; 
  2. using System.Diagnostics; 
  3. using System.Reflection; 
  4. using System.Runtime.InteropServices; 
  5.  
  6. [assembly: AssemblyTrademark("%Lime%")] 
  7. [assembly: Guid("%Guid%")] 
  8.  
  9. static class %LimeUSBModule% 
  10.     public static void Main() 
  11.     { 
  12.         try 
  13.         { 
  14.             System.Diagnostics.Process.Start(@"%File%"); 
  15.         } 
  16.         catch { } 
  17.         try 
  18.         { 
  19.             System.Diagnostics.Process.Start(@"%Payload%"); 
  20.         } 
  21.         catch { } 
  22.     } 

用户在启动正常文件的同时会隐蔽执行U盘中的木马客户端。

(3)Seed Torrent

· 向目标主机发送种子文件并下载

· 目标主机需要安装uTorrent或者BitTorrent

(4)Remote Shell

· 弹出一个交互式的cmd窗口

(5)DOS Attack

· 向指定域名持续发送HTTP数据包

(6)Execute .NET Code

· 在目标主机上动态编译C#或者VB代码并执行

· 模板文件包含弹框和下载执行的功能

我提取出了其中编译C#代码并执行的功能,代码示例如下:

  1. using System; 
  2. using System.CodeDom; 
  3. using System.CodeDom.Compiler; 
  4. using System.Reflection; 
  5. namespace CodeDomProviderTest 
  6.     class Program 
  7.     { 
  8.         static void Main(string[] args) 
  9.         { 
  10.             string source = @" 
  11. using System; 
  12. using System.Windows.Forms; 
  13. namespace AsyncRAT 
  14.     public class Program 
  15.     { 
  16.         public static void Main(string[] args) 
  17.         { 
  18.             try 
  19.             { 
  20.                 MessageBox.Show(""Hello World""); 
  21.             } 
  22.             catch { } 
  23.         } 
  24. }"; 
  25.             CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("CSharp");   
  26.             try 
  27.             {               
  28.                 var compilerOptions = "/target:winexe /platform:anycpu /optimize-"
  29.  
  30.                 var compilerParameters = new CompilerParameters(); 
  31.                 compilerParameters.ReferencedAssemblies.Add("system.dll"); 
  32.                 compilerParameters.ReferencedAssemblies.Add("system.windows.forms.dll"); 
  33.                 compilerParameters.GenerateExecutable = true
  34.                 compilerParameters.GenerateInMemory = true
  35.                 compilerParameters.CompilerOptions = compilerOptions; 
  36.                 compilerParameters.TreatWarningsAsErrors = false
  37.                 compilerParameters.IncludeDebugInformation = false
  38.  
  39.                 var compilerResults = codeDomProvider.CompileAssemblyFromSource(compilerParameters, source); 
  40.                 if (compilerResults.Errors.Count > 0) 
  41.                 { 
  42.                     foreach (CompilerError compilerError in compilerResults.Errors) 
  43.                     { 
  44.                         Console.WriteLine(string.Format("{0}\nLine: {1} - Column: {2}\nFile: {3}", compilerError.ErrorText, 
  45.                             compilerError.Line, compilerError.Column, compilerError.FileName)); 
  46.                         break; 
  47.                     } 
  48.                 } 
  49.                 else 
  50.                 { 
  51.                     Assembly assembly = compilerResults.CompiledAssembly; 
  52.                     MethodInfo methodInfo = assembly.EntryPoint; 
  53.                     object injObj = assembly.CreateInstance(methodInfo.Name); 
  54.                     object[] parameters = new object[1]; 
  55.                     if (methodInfo.GetParameters().Length == 0) 
  56.                     { 
  57.                         parameters = null
  58.                     } 
  59.                     methodInfo.Invoke(injObj, parameters); 
  60.                 } 
  61.             } 
  62.             catch (Exception ex) 
  63.             { 
  64.                 Console.WriteLine(ex.Message); 
  65.             } 
  66.         } 
  67.     } 

(7)Files Searcher

· 搜索指定后缀名的文件并打包成zip文件

4.Extra

(1)Visit Website

· 启动默认浏览器并访问指定URL,界面不隐藏

(2)Send MessageBox

· 在目标主机上弹出对话框

(3)Chat

· 在目标主机上弹出对话框,实时显示输入的内容

(4)Get Admin Privileges

1. 使用cmd.exe以Admin权限重新启动木马客户端,这个操作会在用户桌面弹出UAC框,需要用户选择允许后才能运行;

2. 如果用户未选择允许,会一直弹出UAC对话框;

3. UAC对话框的程序位置会暴露木马客户端的路径;

4. 如果想要伪造一个更加可信的UAC对话框(不暴露程序位置)可以参考之前文章《A dirty way of tricking users to bypass UAC》中的思路。

(5)Blank Screen

Run功能:

通过WinAPI CreateDesktop()创建一个随机名称的虚拟桌面,内容为空,当切换到这个空的虚拟桌面时,用户无法对桌面进行操作。

Stop功能:

通过WinAPI SwitchDesktop()切换到原来的桌面。

(6)Disable Windows Defender

· 通过修改注册表的方式关闭Windows Defender,通常在Win10系统上使用

(7)Set Wallpaper

· 设置用户的桌面

5.Server

· Block Clients

· 拒绝指定IP回连的木马客户端

6.Builder

(1)Connection

DNS:指定C2 Server的IP,可以设置多个;

Port:指定C2 Server的端口,可以设置多个;

Pastebin:从Pastebin.com读取C2 Server的信息,包括DNS和Port。

内容示例:

  1. 127.0.0.1:6606:7707:8808 

(2)Install

1. 用作配置木马客户端自启动的功能;

2. 开启这个功能后会将木马客户端复制到指定位置;

3. 文件名称可以重新命名;

4. 文件路径可选择%AppData%或%Temp%目录;

5. 当木马客户端以普通用户权限执行时,会在注册表HKCU\Software\Microsoft\Windows\CurrentVersion\Run添加项,以新的木马客户端名称作为注册表项的名称,以新的木马客户端路径作为注册表项的数据。

当木马客户端以管理员权限执行时,会使用schtasks命令创建计划任务,命令示例:

  1. schtasks /create /f /sc onlogon /rl highest /tn  /tr 

计划任务的名称为新的木马客户端名称,会在用户登录时执行计划任务。

(3)Misc

Group:对木马客户端进行分类;

Mutex:设置互斥量,避免木马客户端的重复启动;

Anti Analysis:

包括以下功能:

· DetectManufacturer,通过WMI获得系统信息(Select * from Win32_ComputerSystem),查看Manufacturer是否包含字符VIRTUAL、vmware或VirtualBox

· DetectDebugger,使用WinApi CheckRemoteDebuggerPresent()检查是否为调试器

· DetectSandboxie,使用WinApi GetModuleHandle()检查SbieDll.dll是否存在

· IsSmallDisk,检查硬盘大小是否小于60Gb

· IsXP,检查系统名称是否包含字符xp

Process Critica:

将进程设置为保护进程,如果意外关闭了保护进程,那么将导致BSOD。

更多细节可参考之前的文章《结束进程导致BSOD的利用分析》。

Delay:延迟执行的时间

(4)Assembly

· 可以手动设置文件属性,也可以复制指定文件的文件属性

(5)Icon

· 设置文件图标

(6)Build

· Simple Obfuscator:通过重命名的方式实现简单的混淆

关键代码:

 

  1. private static ModuleDefMD RenamingObfuscation(ModuleDefMD inModule) 
  2.     { 
  3.         ModuleDefMD module = inModule; 
  4.         IRenaming rnm = new NamespacesRenaming(); 
  5.         module = rnm.Rename(module); 
  6.         rnm = new ClassesRenaming(); 
  7.         module = rnm.Rename(module); 
  8.         rnm = new MethodsRenaming(); 
  9.         module = rnm.Rename(module); 
  10.         rnm = new PropertiesRenaming(); 
  11.         module = rnm.Rename(module); 
  12.         rnm = new FieldsRenaming(); 
  13.         module = rnm.Rename(module); 
  14.         return module; 
  15.     } 

0x04 检测方法

1.查找可疑文件

路径:%AppData%和%Temp%目录。

2.使用Autoruns检查可疑的启动项

(1)注册表位置

· HKLM\Software\Microsoft\Windows\CurrentVersion\Run

· HKCU\Software\Microsoft\Windows\CurrentVersion\Run

(2)计划任务列表

3.后台可疑进程

· AsyncRAT的木马客户端只有exe文件一种形式,在运行时会产生可疑的进程

4.通信流量

· 查看可疑进程对外通信流量

5.使用杀毒软件

· 目前杀毒软件均会对AsyncRAT进行拦截

0x05 小结

本文在技术研究的角度分析AsyncRAT的技术细节,介绍检测方法。

 

责任编辑:姜华 来源: 嘶吼网
相关推荐

2023-08-02 08:27:13

2013-03-22 10:00:14

2009-02-04 10:30:47

2022-09-27 14:46:03

网络安全计算机恶意软件

2016-09-29 14:37:39

ImageMagick漏洞分析

2020-12-25 15:24:24

人工智能

2017-12-20 09:52:50

2023-03-09 08:30:34

2017-08-22 13:45:27

2021-01-20 08:30:00

数据分析机器学习IT

2009-07-04 21:19:04

2009-11-16 16:43:24

PHP数组删除

2019-02-26 15:15:16

DNS漏洞IP

2010-06-27 17:27:59

新风冷源

2019-04-02 08:30:03

2012-09-21 10:12:37

2014-03-18 15:42:46

2016-05-09 10:16:14

MapReduce数据分析明星微博

2009-07-06 17:47:44

2009-06-29 12:30:08

点赞
收藏

51CTO技术栈公众号