Questions about this topic? Sign up to ask in the talk tab.

Difference between revisions of "Shellcode"

From NetSec
Jump to: navigation, search
Line 1: Line 1:
 
Shellcode, bytecode, or [[machine code]] is represented in [http://www.blackhatacademy.org/security101/index.php?title=Assembly_Basics#Binary_.26_Hexadecimal hexadecimal].  Every [[programming language]] eventually becomes [[binary]].  [[Assembly Basics|Assembly]] translates to [[binary]] [[machine code]].  When writing a [[Buffer Overflows|buffer overflow]] there are many obstructions from [[Network Security|network security]], such as [[DEP]], [[ASLR]], [[firewall|firewalls]], or [[SIM|SIMS]].
 
Shellcode, bytecode, or [[machine code]] is represented in [http://www.blackhatacademy.org/security101/index.php?title=Assembly_Basics#Binary_.26_Hexadecimal hexadecimal].  Every [[programming language]] eventually becomes [[binary]].  [[Assembly Basics|Assembly]] translates to [[binary]] [[machine code]].  When writing a [[Buffer Overflows|buffer overflow]] there are many obstructions from [[Network Security|network security]], such as [[DEP]], [[ASLR]], [[firewall|firewalls]], or [[SIM|SIMS]].
  
 +
{{info|This is just one of many shellcoding concepts. Ultimately, the most important concepts are [[anti-heuristics]], [[shellcode obfuscation]], and [[IDS]]/[[IPS]]/[[Firewall]] evasion.}}
  
{{cleanup}}
+
'''[[Anti-heuristics]]''':
 +
* Evading heuristics - evading debuggers, tricking the [[Programmer|programmers]], attacking debuggers, and evading/attacking virtual machines are all part of this technique. [[Anti-heuristics]] rely on the code's ability to protect itself from user, administrator, or even [[programmer]] and debugger intervention.
  
 +
'''Obfuscation''':
 +
* "Uglifying" one's code - obfuscation includes utilization of polymorphism and metamorphism, and describes anything that makes the code appear to do one thing or hold certain data when in fact the code does something else or holds different data.
  
This is where we must look back at the [[security industry]], at the [[DEP]] being used by most common Operating Systems, and even look back to the operating systems themselves. Many times attackers settle for a bindshell, or a connect-back shell, during exploitation. This will not always be successful. Suppose for a moment that the remote host sits behind a [[firewall]] that restricts all outgoing connections and refuses to allow any incoming connections other than port 80. You overflow the [[HTTP]] daemon with shellcode for a bindshell on port 4444. The [[firewall]] is blocking your connection attempt to 4444, so while the server may even be running your bindshell, it does you no good. Now you try a connectback. The target server is unable to connect to your machine because it does not have permissions to create client sockets.
+
'''[[IDS]]/[[IPS]]/[[Firewall]] Evasion''':
 +
* Evading detection engines is currently best done by using alphanumeric shellcode. Alphanumeric and [[ascii shellcode]] appear within standard user-printable data, making your arbitrary code appear as standard user inputted data in stead of malicious [[machine code]]. Generally it is hard for an admin to detect that this is actually a payload to begin with.
  
What do we do now? The answer is surprisingly simple. We craft custom shellcode to turn the socket that the exploit came in on into the actual bindshell.
+
[[machine code|Machine code]] is just as powerful as any other [[programming language]]. [[Machine code]] can be used by a [[programmer]] to write any application with an [[Assembly Bassics|assembly]] approach.
  
This is just one of many shellcoding concepts. Ultimately, the most important concepts are [[anti-heuristics]], [[shellcode obfuscation]], and [[IDS]]/[[IPS]]/[[Firewall]] evasion. I have defined each of these for the reader below:
+
Self-linking shellcode refers to [[Machine code|machine code's]] ability to use what functions are already present in memory as opposed to carrying all of its functionality within itself. From a general perspective, a linker is comprised of two parts. One part of the linker must be able to isolate the base pointer of any given library loaded into memory, and the other part of the linker must be able to parse the library and return the memory address for the start of any given function.  This happens through the export table of the [[binary]].
 
+
[[Anti-heuristics]]
+
 
+
Evading heuristics - evading debuggers, tricking the [[Programmer|programmers]], attacking debuggers, and evading/attacking virtual machines are all part of this technique. [[Anti-heuristics]] rely on the code's ability to protect itself from user, administrator, or even [[programmer]] and debugger intervention.
+
 
+
Obfuscation "Uglifying" one's code - obfuscation includes utilization of polymorphism and metamorphism, and describes anything that makes the code appear to do one thing or hold certain data when in fact the code does something else or holds different data.
+
 
+
[[IDS]]/[[IPS]]/[[Firewall]] Evasion Evading detection engines is currently best done by using alphanumeric shellcode. Alphanumeric and [[ascii shellcode]] appear within standard user-printable data, making your arbitrary code appear as standard user inputted data in stead of malicious [[machine code]]. Generally it is hard for an admin to detect that this is actually a payload to begin with.
+
 
+
Don't forget that [[machine code]] is just as powerful as any other [[programming language]]. [[Machine code]] can be used by a [[programmer]] to write any application - so why not write an entire application into shellcode? Approach writing shellcode as if one were sitting down and writing an application in assembly.
+
 
+
Self-linking shellcode refers to [[Machine code|machine code's]] ability to use what functions are already present in memory as opposed to carrying all of its functionality within itself. From a general perspective, a linker is comprised of two parts. One part of the linker must be able to isolate the base pointer of any given library loaded into memory, and the other part of the linker must be able to parse the library and return the memory address for the start of any given function.
+
  
 
This is called self-linking shellcode or self-linking [[machine code]] because it does not rely on being linked with any kernel, in stead it finds the functionality it needs within the run- time environment and calls already existing functions out of memory. This will save the [[programmer]] time and size, and potentially even allow the [[programmer]] to write a cross-OS [[machine code]] application that is fully capable of using pre-built-in functionality of the operating system by linking itself in stead of relying on an external linker to both link and format the binary properly. Everything is possible in the world of technology today, and so I wish you and your shellcoding the best of luck.
 
This is called self-linking shellcode or self-linking [[machine code]] because it does not rely on being linked with any kernel, in stead it finds the functionality it needs within the run- time environment and calls already existing functions out of memory. This will save the [[programmer]] time and size, and potentially even allow the [[programmer]] to write a cross-OS [[machine code]] application that is fully capable of using pre-built-in functionality of the operating system by linking itself in stead of relying on an external linker to both link and format the binary properly. Everything is possible in the world of technology today, and so I wish you and your shellcoding the best of luck.

Revision as of 04:24, 19 October 2011

Shellcode, bytecode, or machine code is represented in hexadecimal. Every programming language eventually becomes binary. Assembly translates to binary machine code. When writing a buffer overflow there are many obstructions from network security, such as DEP, ASLR, firewalls, or SIMS.

c3el4.png This is just one of many shellcoding concepts. Ultimately, the most important concepts are anti-heuristics, shellcode obfuscation, and IDS/IPS/Firewall evasion.

Anti-heuristics:

  • Evading heuristics - evading debuggers, tricking the programmers, attacking debuggers, and evading/attacking virtual machines are all part of this technique. Anti-heuristics rely on the code's ability to protect itself from user, administrator, or even programmer and debugger intervention.

Obfuscation:

  • "Uglifying" one's code - obfuscation includes utilization of polymorphism and metamorphism, and describes anything that makes the code appear to do one thing or hold certain data when in fact the code does something else or holds different data.

IDS/IPS/Firewall Evasion:

  • Evading detection engines is currently best done by using alphanumeric shellcode. Alphanumeric and ascii shellcode appear within standard user-printable data, making your arbitrary code appear as standard user inputted data in stead of malicious machine code. Generally it is hard for an admin to detect that this is actually a payload to begin with.

Machine code is just as powerful as any other programming language. Machine code can be used by a programmer to write any application with an assembly approach.

Self-linking shellcode refers to machine code's ability to use what functions are already present in memory as opposed to carrying all of its functionality within itself. From a general perspective, a linker is comprised of two parts. One part of the linker must be able to isolate the base pointer of any given library loaded into memory, and the other part of the linker must be able to parse the library and return the memory address for the start of any given function. This happens through the export table of the binary.

This is called self-linking shellcode or self-linking machine code because it does not rely on being linked with any kernel, in stead it finds the functionality it needs within the run- time environment and calls already existing functions out of memory. This will save the programmer time and size, and potentially even allow the programmer to write a cross-OS machine code application that is fully capable of using pre-built-in functionality of the operating system by linking itself in stead of relying on an external linker to both link and format the binary properly. Everything is possible in the world of technology today, and so I wish you and your shellcoding the best of luck.