Part 6 - Encoders

Video Activity

In the cat and mouse game of hacking, there are certain countermeasures such as antivirus software that often must be overcome in order to successfully exploit a target. Dean presents Metasploit encoders in this video and how to utilize them to mask data signatures in a payload that can potentially trigger detection by AV software.

Join over 3 million cybersecurity professionals advancing their career
Sign up with
Required fields are marked with an *
or

Already have an account? Sign In »

Time
5 hours 38 minutes
Difficulty
Intermediate
Video Description

In the cat and mouse game of hacking, there are certain countermeasures such as antivirus software that often must be overcome in order to successfully exploit a target. Dean presents Metasploit encoders in this video and how to utilize them to mask data signatures in a payload that can potentially trigger detection by AV software.

Video Transcription
00:04
>> All right. Let's talk a little bit
00:04
more about payloads then.
00:04
Let me go back [NOISE] out of this one,
00:04
and let's use a payload for Windows,
00:04
for a binding TCP shell.
00:04
I'll start typing use payload.
00:04
I know on what windows,
00:04
>> I'm doing tab complete on these.
00:04
>> I'll start with shell,
00:04
and we get bind TCP.
00:04
A bind in TCP shell means that
00:04
>> I can be bound to a port,
00:04
>> and I should be able to get a command shell on
00:04
that Windows system when this actually connects.
00:04
One of the things that you'll
00:04
find when you're doing this kind of
00:04
work is that you need to frequently generate shellcode.
00:04
Because your payload as is,
00:04
will get detected by antivirus,
00:04
and that's going to stop your pen test and its tracks.
00:04
We have a command called Generate.
00:04
Once you're within a payload or an exploit or a module,
00:04
you can use a dash H command to get help information.
00:04
I can use help by itself.
00:04
Of course, like I showed earlier,
00:04
and you'll notice that the generate command is
00:04
within the payload category.
00:04
I'll do generate dash H to see what my options are,
00:04
and I can see that I've got some encoding options here.
00:04
I can force the encoding,
00:04
I can tell it to avoid certain characters,
00:04
and we'll see what that looks like here in a minute.
00:04
I can tell it how many iterations to perform.
00:04
Because the more times I encode something,
00:04
the more likely it is to remain
00:04
undetected That's the theory anyway.
00:04
I can also specify the size of the [inaudible] slide,
00:04
there's lots of different options.
00:04
There are a lot of different output
00:04
formats. I've got quite a few different categories.
00:04
Perl, Java, PowerShell, Raw,
00:04
Ruby, visual basic script,
00:04
so lots of different possibilities there.
00:04
All right. The first thing we're going to do is just do
00:04
a generate command without
00:04
any options, without any arguments.
00:04
You'll see I've generated shellcode for
00:04
this shell bind TCP payload that I'm using.
00:04
Now you can see it gives me some parameters.
00:04
I can see how many bytes,
00:04
the payload is 328 bytes.
00:04
I've got my local port specified.
00:04
The remote host is not specified.
00:04
But obviously, you want to prepare
00:04
those settings during the process
00:04
of building your payload.
00:04
For instance, I could go back,
00:04
and do a set G for my remote host,
00:04
show my options.
00:04
I can see where my local host is now set.
00:04
Now if I were to generate command again,
00:04
I'll see that that is encoded in the payload.
00:04
There it is and knows what my local host is,
00:04
my local port is.
00:04
I've got some shellcode that I could try
00:04
to use as a payload
00:04
when I get connected to a victim system.
00:04
But there might be certain bytes in this payload
00:04
that are known to trigger the antivirus.
00:04
I'm just going to randomly pick something here.
00:04
The process of figuring out what
00:04
those bytes are is
00:04
a little bit beyond the scope of what we're doing.
00:04
But the basic idea is that you would try to
00:04
take your payload and analyze it and see
00:04
what portion of it is
00:04
actually triggering a signature on an IDS.
00:04
Maybe I know that this XFF hex code
00:04
here is part of the problem.
00:04
I might want to get rid of this.
00:04
I want to filter it out and replace it with
00:04
something else in order
00:04
to try to get my shellcode past the antivirus.
00:04
I can run the generate command with the dash B.
00:04
We saw that earlier,
00:04
I'll do the dash H again.
00:04
The dash B says,
00:04
"These are the characters to avoid."
00:04
Dash B, I'll just use the ones I see here.
00:04
I've got XFF,
00:04
which I want to get rid of.
00:04
I also want to get rid of, let's say X50.
00:04
Because those are both problematic.
00:04
Now you'll notice that
00:04
my payload size is different, it's 350 bytes.
00:04
Previously it was only 328 member
00:04
serves, and there it is.
00:04
You'll notice I have an X50 on
00:04
that at the end of the first line before.
00:04
Now that X50 is gone,
00:04
and I shouldn't be able to find X50 anywhere in here.
00:04
I also should not be able to find XFF.
00:04
Previously, it was somewhere there was.
00:04
Now, that I've filtered that out,
00:04
it replaces it with other shellcode,
00:04
which provides that same functionality.
00:04
That's why the size of
00:04
the payload grew a little bit because I needed
00:04
other codes to compensate for
00:04
the fact that I removed these two from the payload.
00:04
Other things to think about would be you
00:04
could certainly generate a much longer list.
00:04
I could remove,
00:04
let's say all of
00:04
these half codes or these parts of the shellcode.
00:04
If I do this, no,
00:04
actually my size does not change,
00:04
it's still stayed 350 bytes, which is unusual.
00:04
I thought it would probably have gone up.
00:04
But you get the basic idea.
00:04
You're, you're able to filter out a lot
00:04
of these byte codes that may be problematic.
00:04
Now if you go too far,
00:04
and I'll show this as an example,
00:04
you might say, well, I've got so
00:04
many of them I need to get rid of.
00:04
I'm just going to pick this entire line,
00:04
and that actually work.
00:04
If you do too many though,
00:04
you may get an error message
00:04
that says you cannot generate the payload.
00:04
That basically means that
00:04
you've tried to eliminate too many of
00:04
the shellcode options that you've got available to you.
00:04
Now the software can
00:04
the metasploit encoder when
00:04
it's generating the payload cannot
00:04
basically put that together.
00:04
There's limits to how far you can go with removing
00:04
objectionable bytes from your payload.
00:04
All right. Another thing we want to look
00:04
at is the encoders themselves.
00:04
Within this shell buying TCP,
00:04
I can do a show encoders.
00:04
>> I can see all the ones I've got available to me.
00:04
Some of these are excellent,
00:04
like PowerShell Base-64 or Shikata Ga Nah.
00:04
Again, we get a little description here,
00:04
polymorphic exclusive or additive feedback encoder.
00:04
That sounds impressive.
00:04
What it means is that there are ways to make
00:04
your payload less likely to get detected.
00:04
There's also other things, for instance,
00:04
we can say we want a non-Alphanumeric encoder
00:04
or one that doesn't use any upper character, non-upper.
00:04
There's lots of different choices here
00:04
for customizing your payload for the task at hand.
00:04
For instance, maybe I want to use
00:04
the Nilef as an example.
00:04
Actually, I'll use the Shikata encoder instead.
00:04
I can go ahead and run my generate command again.
00:04
This time I'm going to use the dashed e for encode.
00:04
>> I can type.
00:04
>> [NOISE] It doesn't like that.
00:04
I'll use my Copy and Paste.
00:04
Tab complete usually works,
00:04
but there might be certain instances
00:04
within the framework where it doesn't work,
00:04
so just be aware of that.
00:04
Now I use this encoder and it tells
00:04
me 355 bytes for this shell bind TCP for Windows.
00:04
There's my encoder, my local port, my remote host.
00:04
These are all part of the payload now.
00:04
But I can also do compound statements.
00:04
For instance, I know I don't want the XFF,
00:04
and I don't want X50,
00:04
so I can make sure I can get rid of those.
00:04
I can add multiple options to the command line.
00:04
If we go back up to our help screen,
00:04
we can see for generate.
00:04
I can specify my standard output,
00:04
if I want to save this information.
00:04
I can use templates.
00:04
I can also pick the number of iterations.
00:04
Let's experiment with that a little bit.
00:04
I've got the encoder.
00:04
I'm going to get rid of these two characters.
00:04
Let me add one word list.
00:04
I'll go to x, Charlie 9 because I see that,
00:04
the corner of the table there.
00:04
Let's encode again.
00:04
I got air. I can't get rid of that many characters.
00:04
Let's just try these two.
00:04
It's being picky.
00:04
I can only get rid of XFF that shows you some of
00:04
the limits of what the encoder is capable of doing.
00:04
What do we end up with?
00:04
Three hundred and fifty five bytes.
00:04
Now, what if I want to encode
00:04
this a few times to make it more complex?
00:04
I can encode it three times.
00:04
You'll notice that it
00:04
doesn't actually give me three outputs.
00:04
It does it three times and then I get the output.
00:04
It grew quite a bit. Now it's up to 409 bytes.
00:04
But still I've excluded XFF,
00:04
and I'm still using this particular encoder.
00:04
Again, this multiple
00:04
passes that you're doing with the dash I makes
00:04
your encoding that much
00:04
more difficult for the antivirus of
00:04
the victim machine to detect.
00:04
There are probably limits here as well,
00:04
as far as how many iterations you want
00:04
to go through or some of the other things that
00:04
you'd want to set.
00:04
Let's go back to our home screen.
00:04
We can see we've got the dash O option.
00:04
Because I know some of my options are available here,
00:04
I can do something like,
00:04
I'll do up arrow, go back to my generate.
00:04
Let's say when I'm doing my generate,
00:04
I want to change my local port to something else.
00:04
I'll change it to 5555.
00:04
I forgot to put the equal sign. That's why.
00:04
[NOISE] Little details matter.
00:04
We can see now that it went down to 409 bytes,
00:04
still showing my encoder,
00:04
my local port is now
00:04
5555 because I've encoded a different version of this.
00:04
This goes to show you how flexible
00:04
the syntax I can change my encoding method.
00:04
I can change a number of times.
00:04
I do the encoding, I can set some of my variables and
00:04
encode a payload all in one step,
00:04
which makes your life a lot easier when you're
00:04
trying to evade anti-virus.
00:04
Lastly, let's look at our dash T option.
00:04
This gives us our output format.
00:04
Dash C, C-sharp hacks Java, and so on.
00:04
[inaudible] a lot different payload options.
00:04
We can experiment with this.
00:04
I've got my last command there.
00:04
Let's say I want to do this in Bash format.
00:04
That's what Bash shell code
00:04
looks like. It's a little different.
00:04
I've got some dollar signs here.
00:04
The characters look a little bit different perhaps.
00:04
I can try one with the PowerShell.
00:04
[NOISE] Maybe I can try C-sharp.
00:04
There's a different encoding method using C-Sharp.
00:04
You get the basic idea. I've got lots of options.
00:04
You got the things here that might be useful
00:04
depending on your environment that you're going after.
00:04
Maybe a visual basic script or
00:04
you're dealing with binary [inaudible].
00:04
Just showing some of
00:04
the possibilities for your AV avoidance.
00:04
We'll get into more detail
00:04
>> about that in a later section.
Up Next