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 = 'xxxxx@qq.com' #登录的邮箱账号 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://www.jb51.net/article/182761.htm
另外,涉及的解析函数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 = 'xxxxxx@163.com' #发送方地址 receivers = ['xxxxx@qq.com'] #收件地址 if kind == 1: # 第一方式 反馈屏幕截图 print('Sending screenshot.') # 创建一个带附件的实例 message = MIMEMultipart() message['From'] = '<hacker_center@163.com>' message['To'] = '<niu5512@qq.com>' subject = 'Hacker Center reply' message['Subject'] = Header(subject, 'utf-8') # 邮件正文内容 message.attach(MIMEText('Hacker Server replay', 'plain', 'utf-8')) if os.path.exists("./screenshot.jpg"): # 构造附件1,传送当前目录下的 test.txt 文件 att1 = MIMEText(open('./screenshot.jpg', 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字 att1["Content-Disposition"] = 'attachment; filename="screenshot.jpg"' 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'] = '<hacker_center@163.com>' message['To'] = '<niu5512@qq.com>' 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.jpg') 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地址
收到的反馈如下:
总结
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- PS官方晒《怪物猎人:荒野》公测启动页面!你准备好了吗?
- 《怪物猎人:荒野》新怪物“赫猿兽”PV公布:残暴巨兽登场!
- 童丽2024 《千愁记旧情》8月最新 限量1:1母盘直刻[WAV+CUE][1.1G]
- 陈奕迅《认了吧》[新加坡纸盒版] [WAV+CUE][1.1G]
- 群星《小夫妻 电视原声带》[320K/MP3][113.44MB]
- 孙楠.2004-燃烧【华纳】【WAV+CUE】
- 群星.2003-英皇精挑细选VOL.1【英皇娱乐】【WAV+CUE】
- 林姗.2024-寄天的记忆【豪记】【FLAC分轨】
- 陈洁丽-《可改变HQ2》2024[WAV+CUE]
- 福田进一2024《魔鬼随想曲》WAV
- 群星《新歌龙卷风》2CD/DTS-ES[WAV]
- 群星《湮灭之潮 《明日之后》蓝潮资料片游戏原声带》[320K/MP3][50.49MB]
- 群星《湮灭之潮 《明日之后》蓝潮资料片游戏原声带》[FLAC/分轨][232.82MB]
- 威神V(WayV)《The Highest》[320K/MP3][45MB]
- lol全球总决赛lck二号种子是谁 S14全球总决赛lck二号种子队伍介绍