Return
parent
e65c1ed5ce
commit
ca864aa4d5
26
README.md
26
README.md
|
@ -1,3 +1,25 @@
|
||||||
# dEncExDelRe
|
# dEncexdel
|
||||||
|
|
||||||
Decrypt|Encrypt|Execute|Delete|Return
|
dEncexdel encrypts a linux executable or decrypts it into memory, executes it and deletes the decrypted file.
|
||||||
|
|
||||||
|
Practical uses: execute a service from memory without storing the plain source or the binary on disk, secure a PoC exploit.
|
||||||
|
|
||||||
|
dEncexdel uses /dev/shm/.
|
||||||
|
|
||||||
|
Wins:
|
||||||
|
- You can have executables that are encrypted.
|
||||||
|
- Does not write to the physical drive, but to memory.
|
||||||
|
|
||||||
|
Limitations:
|
||||||
|
- Goes only as far as execution.
|
||||||
|
- The executed binary can still be read from memory by root (eg. cat /proc/PID/bin > /tmp/bin)
|
||||||
|
|
||||||
|
|
||||||
|
# usage
|
||||||
|
Be careful, -e overwrites the passed executable
|
||||||
|
|
||||||
|
python3 dEncexdel.py -e executable # encrypt
|
||||||
|
|
||||||
|
python3 dEncexdel.py -x executable # decrypt and execute
|
||||||
|
|
||||||
|
python3 dEncexdel.py -r executable # just stdout the decrypted data
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
# dEncexdel by six
|
||||||
|
# version: 1.1
|
||||||
|
|
||||||
|
import getpass
|
||||||
|
import argparse
|
||||||
|
import base64
|
||||||
|
from cryptography.fernet import Fernet
|
||||||
|
from cryptography.hazmat.backends import default_backend
|
||||||
|
from cryptography.hazmat.primitives import hashes
|
||||||
|
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
|
||||||
|
|
||||||
|
# Taking arguments from the user
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("-e", help="Encrypt the executable")
|
||||||
|
parser.add_argument("-x", help="Decrypt, execute and delete")
|
||||||
|
parser.add_argument("-r", help="Read and print the decrypted data to stdout")
|
||||||
|
args = parser.parse_args()
|
||||||
|
passkey = getpass.getpass("Passkey: ")
|
||||||
|
|
||||||
|
# Building the key for Fernet
|
||||||
|
passkey = passkey.encode()
|
||||||
|
salt = b'\x05bWB\xc5i\x8b\x8dy\xd5\xe3[~\\Z\x10' # You want to change this and possibly store salts in a database
|
||||||
|
kdf = PBKDF2HMAC(
|
||||||
|
algorithm=hashes.SHA256(),
|
||||||
|
length=32,
|
||||||
|
salt=salt,
|
||||||
|
iterations=100000,
|
||||||
|
backend=default_backend()
|
||||||
|
)
|
||||||
|
key = base64.urlsafe_b64encode(kdf.derive(passkey)) # Fernet(key) requires to be a base64 urlsafe string
|
||||||
|
f = Fernet(key)
|
||||||
|
|
||||||
|
|
||||||
|
# Encryption, overwrites the original file
|
||||||
|
def encrypt(filename, key):
|
||||||
|
f = Fernet(key)
|
||||||
|
with open(filename, "rb") as file:
|
||||||
|
file_data = file.read()
|
||||||
|
encrypted_data = f.encrypt(file_data)
|
||||||
|
with open(filename, "wb") as file:
|
||||||
|
file.write(encrypted_data)
|
||||||
|
|
||||||
|
|
||||||
|
# Decryption to /dev/shm/dEncexdel/<filename>
|
||||||
|
def decrypt(filename, key):
|
||||||
|
|
||||||
|
# decryption
|
||||||
|
f = Fernet(key)
|
||||||
|
with open(filename, "rb") as file:
|
||||||
|
encrypted_data = file.read()
|
||||||
|
try:
|
||||||
|
decrypted_data = f.decrypt(encrypted_data)
|
||||||
|
except:
|
||||||
|
print("Wrong passkey")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Print to stdout if -r is used and do not execute
|
||||||
|
if args.r:
|
||||||
|
try:
|
||||||
|
print(decrypted_data.decode('utf-8'))
|
||||||
|
except:
|
||||||
|
import sys
|
||||||
|
sys.stdout.buffer.write(decrypted_data)
|
||||||
|
return
|
||||||
|
|
||||||
|
# Prepare a directory with read permissions to the user only
|
||||||
|
import os
|
||||||
|
temp_dir = "/dev/shm/dEncexdel/"
|
||||||
|
os.mkdir(temp_dir)
|
||||||
|
os.chmod(temp_dir, 0o700)
|
||||||
|
|
||||||
|
# Write out the decrypted executable
|
||||||
|
filename = temp_dir + filename
|
||||||
|
with open(filename, "wb") as file:
|
||||||
|
file.write(decrypted_data)
|
||||||
|
|
||||||
|
# Make the temporary file executable
|
||||||
|
os.chmod(filename, 0o700)
|
||||||
|
from subprocess import Popen
|
||||||
|
Popen([filename])
|
||||||
|
|
||||||
|
# Wait until binary is loaded but execution not finished
|
||||||
|
# Let me know if you have a better idea
|
||||||
|
import time
|
||||||
|
time.sleep(3)
|
||||||
|
|
||||||
|
# Remove the file and the directory
|
||||||
|
Popen(['rm','-rf',temp_dir])
|
||||||
|
|
||||||
|
|
||||||
|
# Deciding if we encrypt or decrypt and run or just read to stdout
|
||||||
|
if args.e:
|
||||||
|
encrypt(args.e, key)
|
||||||
|
|
||||||
|
if args.x:
|
||||||
|
decrypt(args.x, key)
|
||||||
|
|
||||||
|
if args.r:
|
||||||
|
decrypt(args.r, key)
|
Loading…
Reference in New Issue