Hack Roulette 1
Contents
Info
- Quand? Jeudi 4 Mars de 20h a plus d'heure...
- Ou? /tmp/lab
- Quoi? Hack Roulette... on tire au hasard un logiciel... et on le défonce ;-) sortez vos fuzzer et vos debugger et hop.
- Pourquoi? Ca c'est la question que tout le monde se pose, eh, ah, si on avait la réponse, eh...
Pour apprendre a trouver des vulnerabilités dans un logiciel, pour apprendre a fuzzer, pour s'amuser, pour montrer a quel point la loi DADSI avec son interdiction de publier des failles est DEBILE car c'est le SEUL moyen de savoir si son logiciel est vulnérable, enfin pour s'améliorer dans une pratique de base de la sécurité informatique.
Participants
- Phil
Si vous etes parano, as la peine de vous inscrire... venez juste :)
Script
Code analyzers:
Fuzzers:
- spike
- peach
- sulley
- Laurent Gaffié 10 lines of python
Premiere roulette: ladccad
ladccad
Results
Phil
INSTALL
apt-get install ladccad apt-get install jackd
RUN
jackd -d alsa
VULNS?
ladccad/project.c: err = system (cmd);
et la sanitization de ce truc:
char * escape_file_name (const char * fn) { char * escfn; size_t escfn_size; size_t fn_size; ptrdiff_t * escchars = NULL; size_t escchars_size = 0; const char * ptr; unsigned int i, j; ptr = fn - 1; while ( (ptr = strpbrk (ptr + 1, " |&;()<>")) ) {
oublie $ dans la liste, donc potentiellement on remplace avec une variable shell qu'on aura passé avant l'exec du daemon? ou utiliser opportunément une var existante avec les caractères que l'on recherche ";XXXXX" par exemple.
RUNNING:
strace ladccad -d /tmp ... futex(0xb7d0ead0, 0x81 /* FUTEX_??? */, 2147483647) = 0 socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 11 connect(11, {sa_family=AF_INET6, sin6_port=htons(14541), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0 getsockname(11, {sa_family=AF_INET6, sin6_port=htons(47455), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0 connect(11, {sa_family=AF_UNSPEC, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, 16) = 0 connect(11, {sa_family=AF_INET, sin_port=htons(14541), sin_addr=inet_addr("0.0.0.0")}, 16) = 0 getsockname(11, {sa_family=AF_INET6, sin6_port=htons(43007), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
StalkR
Par rapport au system(), oublie aussi les backquotes `` et ça c'est bon.
Par contre l'exploitation via $ on ne peut pas lui faire exécuter une autre commande par "; cmd" ou "$()" :
$ cat << EOF > test.c #include <stdio.h> #include <stdlib.h> int main() { system("echo $TEST"); return 0; } EOF $ gcc -Wall -o test test.c $ TEST="test \$(id); id " ./test test $(id); id