python 通過郵件控制電腦 實現遠程控制

0x00 思路

之前在博客上看到了使用python通過微信的接口,與微信交互的方式來控制電腦的攝像頭、開關機等。但是這種方式需要首先在python上登錄自己的微信纔可以,同時微信端也會有已經在網頁端登錄的字樣,很顯眼。因此想到了另外一種交互方式,通過郵件進行交互。

通過郵件的方式不要求用戶實時在線,只需要程序隔一段時間掃描一下郵箱的新郵件即可。這種交互方式更爲方便。其次,這種方式也更爲隱蔽,不會干擾微信的使用。

0x01 需要用到的庫

主要是python的一些用於收發郵件的庫

import smtplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import poplib
import pyautogui
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import os

0x02 具體實現

首先,實現郵件的讀取功能。讀取最新的一封郵件內容,這條內容中包含我們要做的事情,比如查詢ip地址、獲取屏幕截圖等。

在獲取內容之前,先將郵箱的登錄等做好初始化

def email_init():
    email = '[email protected]' #登錄的郵箱賬號
    password = 'xxxxx' # 注意這裏不是郵箱密碼 是要登錄的郵箱的授權碼
    pop3_server = 'pop.qq.com'

    # 連接到POP3服務器:
    server = poplib.POP3_SSL(pop3_server, 995)
    server.set_debuglevel(0)
    server.user(email)
    server.pass_(password)
    resp, mails, octets = server.list()
    index = len(mails)
    resp, lines, octets = server.retr(index)  # 這裏index代表讀取最後一封郵件 也就是第一封
    msg_content = b'\r\n'.join(lines).decode('utf-8')
    msg = Parser().parsestr(msg_content)

    return msg, server

要注意密碼不是郵箱的密碼,是授權碼,具體獲取方式可以百度。

隨後就可以將進行郵件的讀取了。

def print_info(msg, indent=0):
    if indent == 0:
        for header in ['From', 'To', 'Subject']:
            value = msg.get(header, '')
            if value:
                if header == 'Subject':
                    value = decode_str(value)
                else:
                    hdr, addr = parseaddr(value)
                    name = decode_str(hdr)
                    value = u'%s <%s>' % (name, addr)
            print('%s%s: %s' % ('  ' * indent, header, value))

    if msg.is_multipart():
        parts = msg.get_payload()
        for n, part in enumerate(parts):
            print('%spart %s' % ('  ' * indent, n))
            print('%s--------------------' % ('  ' * indent))
            return print_info(part, indent + 1)
    else:
        content_type = msg.get_content_type()
        if content_type=='text/plain' or content_type=='text/html':
            content = msg.get_payload(decode=True)
            charset = guess_charset(msg)
            if charset:
                content = content.decode(charset)
            print('%sText: %s' % ('  ' * indent, content))
            return content
        else:
            print('%sAttachment: %s' % ('  ' * indent, content_type))

將上一步得到的msg參數傳入到讀取函數中,通過遞歸調用查詢郵件內容並解碼。其中涉及到遞歸調用中的輸出問題,我再上一篇文章中有提到:https://blog.csdn.net/Clannad_niu/article/details/104792426

另外,涉及的解析函數decode_str()如下

def decode_str(s):
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value

在郵件中讀取相關命令後,就是對命令執行,然後在通過郵件的形式反饋命令結果了。

這裏以返回屏幕截圖以及執行dos命令爲例

def send_result(kind, result):
    # 第三方 SMTP 服務
    mail_host = "smtp.163.com"
    mail_user = "@163.com"  #發送信息的郵箱 這裏我是用的163郵箱
    mail_pass = "xxxxxxx"   # 郵箱的授權碼
 
    sender = '[email protected]'   #發送方地址
    receivers = ['[email protected]']  #收件地址

    if kind == 1:     # 第一方式 反饋屏幕截圖
        print('Sending screenshot.')
        # 創建一個帶附件的實例
        message = MIMEMultipart()
        message['From'] = '<[email protected]>'
        message['To'] = '<[email protected]>'
        subject = 'Hacker Center reply'
        message['Subject'] = Header(subject, 'utf-8')

        # 郵件正文內容
        message.attach(MIMEText('Hacker Server replay', 'plain', 'utf-8'))

        if os.path.exists("./screenshot.png"):
            # 構造附件1,傳送當前目錄下的 test.txt 文件
            att1 = MIMEText(open('./screenshot.png', 'rb').read(), 'base64', 'utf-8')
            att1["Content-Type"] = 'application/octet-stream'
            # 這裏的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字
            att1["Content-Disposition"] = 'attachment; filename="screenshot.png"'
            message.attach(att1)
        try:
            smtpObj = smtplib.SMTP_SSL(mail_host, 465)  # 啓用SSL發信, 端口一般是465
            smtpObj.login(mail_user, mail_pass)  # 登錄驗證
            smtpObj.sendmail(sender, receivers, message.as_string())  # 發送
            print("mail has been send successfully.")
        except smtplib.SMTPException as e:
            print(e)

    if kind == 2:   #第二種方式 返回dos命令結果
        message = MIMEText(result, 'plain', 'utf-8')
        message['From'] = '<[email protected]>'
        message['To'] = '<[email protected]>'
        subject = 'Hacker Center reply'
        message['Subject'] = Header(subject, 'utf-8')
        smtpObj = smtplib.SMTP_SSL(mail_host, 465)
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, receivers, message.as_string())
        print("mail has been send successfully.")

其中執行dos命令的函數如下:

def manage_cmd(cmd):
    print('The command is:%s' % cmd)
    kind = 0
    result = 'Nothing happen.'

    if 'screenshot' in cmd:
        img = pyautogui.screenshot()
        img.save('./screenshot.png')
        kind = 1

    if 'dos cmd' in cmd:
        dos_result = ''
        index = cmd.find(':')
        cmd = cmd[index+1:]

        if os.system(cmd):
            result = 'command err.'
        else:
            info = os.popen(cmd)

            for line in info:
                dos_result = dos_result + line
            kind = 3
            if dos_result != '':
                result = dos_result

    return kind, result

傳入的cmd參數就是解析出的郵件內容,通過判斷郵件內容來進行郵件反饋。

0x03 實驗結果

發送郵箱查詢本機ip地址

收到的反饋如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章