Thursday, March 30, 2006

Security/C#: Demonstration of Steganography Messages to Evade IDS Detection

In response to a discussion with Taosecurity author Richard Bejtlich I had some time back in regards to botnet techniques used to evade detection, I have come up with a very simple technique that can be used to circumvent firewalls and IDS systems, and still allow bots to receive commands in a bot-net. I’ve been putting off posting this article for some time since I wanted to add more to it (work in progress since about October, I believe). I really wanted to do more with it, however time just didn’t allow me to research cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue any furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. However, I do feel that I have collected enough information to accurately demonstrate this concept; although I had to leave out some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 features I wanted to demonstrate.

This technique uses steganography to embed a simple command protocol into image files. When combined with methods for determining proxy configurations (Windows stores this internally, you can set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m under Internet Explorer under Tool, Internet Options, Connections, and Lan Settings, or under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Control Panel), clients can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing egress rules to retrieve said embedded file remotely through approved outbound ports and proxy servers. To any passive observer, this is simple web traffic retrieving graphics that are embedded into everyday web pages. Clients than can be set to retrieve graphics from a location or locations at random or set intervals.

This program is written in Visual C# 2005 Express. It makes use of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .Net Steganography library found here. I also use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 example program from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se libraries to embed my message into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image file, although I could just as easily custom written something for a more elaborate protocol. But for demonstration purposes, this will do nicely.

The protocol designed in this demonstration is very simple, it will only display a message box, or it will open notepad.exe, depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 message embedded into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image file. The protocol source is below.

namespace Protocol
{
    class protocol_class
    {
        const int POP_UP_WINDOWS = 1;
        const int RUN_NOTEPAD = 2;

        public void  processCommand(int inCommand){
            switch (inCommand)
            {
                case POP_UP_WINDOWS:
                      System.Windows.Forms.MessageBox.Show("Command Recieved");
                      break;
                case RUN_NOTEPAD:
                      System.Diagnostics.Process.Start("Notepad.exe");
                      break;
            }
        }
    }

The main program will utilize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 System.Timer.Timer component      to trigger a function once every 10 seconds. Since this program is a console program and is not using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 graphical designer, I will need to manually assign an event handler to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Elapsed event.

The Event Handler will basically parse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given Stego Bitmap to retrieve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 commands and process using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Protocol_Class defined above. It passes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Steganography libraries Decode function to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processCommand function to execute cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given command. The Main source file for this example is below:

/****************************************************************************
* Author: John Ward
* Date: 01-09-2006
*
* This program will retrieve a steganography image, and respond to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 embedded
* commands inside of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 undecoded message
* **************************************************************************/
using System;
using System.Collections.Generic;
using System.Text;
using Steganography;
using Protocol;

//Name of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program
namespace ConsoleApplication1
{
    class Program
    {
        //We need a general System Timer to use throughout cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class
        private static System.Timers.Timer t = new System.Timers.Timer();
        
        //Main function for command line
        static void Main(string[] args)
        {
            //Enable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timer and set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interval for 10 seconds
            t.Enabled = true;
            t.Interval = 10000;

            //Assign a new event handler to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Elapsed method
            t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
          
            //Start cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timer
            t.Start();

            //Loop repeatably
            while (true) ;
        }

        //The evant handler for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timer intervals
        static void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            //The protocol class that will respond to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 messages encoded in each image
            protocol_class p = new protocol_class();

            //Use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 protocol class method to respond to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decoded message at this location, using password test
            p.processCommand(Decode("C:\\Documents and Settings\\Administrator\\My Documents\\Blog Entries\\Steganography Protocol\\Steganography Source\\sguil_window_of_portscan_2.bmp",
                    "test"));
        }

        //The decode method for this class, based off of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Steganography
        //class built by
        private static int Decode(string fileName, string password)
        {
            // Open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stego file
            IStegoFile stego = new BMPStegoFile(fileName, password);

            //REturn cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hidden message as a 16 bit integer
            return Convert.ToInt16(stego.HiddenMessage);
        }

    }
}

And that is basically it. Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source code for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image encoder included with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .Net Steganography library, and using a generic password of “test”, I embed a simple message of eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r “1” or “2” into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 graphic. The Convert.ToInt16() function will take care of changing it from a text to a numeric representation for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Protocol classes processCommand function.

So basically, all this does is open a Bitmap file, decode cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stenography message, and pass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting message to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 protocol class for handling. More sophisticated techniques can be employed, and steganography has grown as a field, so different graphics formats, MP3 files, or even specially encoded HTML headers can contain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 message. This deviates from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 traditional botnet where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client connects to an IRC channel or some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r central media to receive commands in real time. In this method, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker loses real-time response and gains stealth. With a reasonable interval of time set for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 clients, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker can have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir nefarious commands executed in a short amount of time. By combining this code with some disguised distribution method, lets say an image thumb-nail browser for an online graphics catalog, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program can be distributed widely, and its online image grabbing behavior would never be suspect until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mass traffic adding to a DDOS attack came from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client machine. And even if it were, your normal Net-Sec analyst would only see an image file and have no clue that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image file contained a steganography-encoded message. There are tools for detecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of steganography in image files, however I have not seen any that do so passively over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wire. AS cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program stands, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 console window is still visible, however cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are methods for hiding it and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process list entry making it very difficult to detect if it were to stay resident after execution.

On a side note, this also gave me a chance to demonstrate a few C# concepts, such as using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 System.Timers class and setting up custom event handlers for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Elapsed method, and creating and instantiating a simple class.

3 comments:

Anonymous said...

You proposed an interesting solution, however your described technique to evade firewall and IDS is already used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild (HTTP as c&c protocol, registry for proxy server detection). Additionally cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steganography of using an image is not really required here. First, think of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 traffic 10k Bots produce retrieving a 10 kB Image every 60 seconds. Second, a simple text protocol with a variable 2-byte key XOR already does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 job as well.

John Ward said...

I was actually going to use HTTP at first, but I came across cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steganography library and thought that would be an interesting demonstration. There are tons of plain site methods that are possible, such as HTML text with bitmasks, or regular HTML keywords in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HTMP headers, obscure cookie values, values of rotating ads, etc. I wasn't aware that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HTTP method was already in use in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild. I figured it was only a matter of time before someone figured out that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proxy settings in Windows are stored int eh registry, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .Net internet controls use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se settings by default, thus reducing programming tasks.

Anonymous said...
This comment has been removed by a blog administrator.