Während bei dem so hochgelobten, modernen (Visual Basic) RAT „Blackshades“ eine solche Lücke durch 2-stündiges Sniffen schnell aufgedeckt war, gestaltete sich das bei Bifrost allein durch die Verschlüsselung des Traffics um einiges schwieriger. Ich reverste also den Bifrost server (zuerst Bifrost v1.1, dann v1.2) um der Verschlüsselung auf die Schliche zu kommen. Bei Bifrost v1.1 gestaltete sich das einfacher als erwartet, Version 1.2 wartete dann aber mit unerwarteter Herausforderung auf.
Hier der Sourcecode für Version 1.1
crypt11.h
typedef unsigned char byte; /* En- or decrypt Bifrost v1.1 Traffic. # - # char *data Pointer to string to en-/decrypt int len Length of plain material when encrypting. Can be set 0 when decrypting, in which case the function will decrypt until finding a \0 */ void encrypt(byte *data, int len); void decrypt(byte *data, int len);
crypt11.c
/* Coded by OpCodez visit opcodez.wordpress.com visit n0psl3d.com mail: [email protected] # - # */ #include "crypt11.h" void encrypt(byte *data, int len) { byte key[] = { 0xA3, 0x78, 0x26, 0x35, 0x57, 0x32, 0x2D, 0x60, 0xB4, 0x3C, 0x2A, 0x5E, 0x33, 0x34, 0x72, 0x00 }; for (int i = 0; (len != 0) ? (i < len) : (i == 0 || data[i - 1] != 0); i++) data[i] ^= key[i % sizeof(key)]; } void decrypt(byte *data, int len) { encrypt(data, len); }
Der Key ist hierbei konstant. Wenn ein Wert ungleich 0 für len übergeben wird, so werden len Bytes ent-/verschlüsselt. Wird jedoch für len 0 übergeben, so wird entschlüsselt, bis die funktion auf ein Nullbyte stößt. Das ist beispielsweise praktisch, wenn man einfach einen String entschlüsseln will, ohne genau die Länge zu kennen. So weit also zu Bifrost v1.1 – Nacher kommt dann noch ein Post zu Bifrost v1.2, was schon etwas komplizierter ist. Dann mit Listing aus dem Debugger und genaueren Erklärungen.