看我如何从外网直接拿下内网靶标
2020-11-20 10:43:53 Author: xz.aliyun.com(查看原文) 阅读量:324 收藏

1.拿到目标制定策略进行信息收集

某地攻防演练拿到演习目标后,进行了一波常规信息收集,打了一个靶标。
发现靶标分数有点高还是打靶标来得快,于是对所有靶标进行分析。但是大部分靶标都给的是内网地址,
观察了一下收集的所有目标ip发现基本上存在于xx.xx.98.x-xx.xx.106.x这个范围

主动扩大范围扫描x.x.95.x-x.x.110.x这些段,直接通过fofa api查询所有记录

然后使用我B哥的webalivescan扫描
https://github.com/broken5/WebAliveScan

发现这个站打开跳转
http://x.x.x.x:81/x.aspx
和某个内网靶标端口文件名都对上了

使用弱口令进入后台,但是任何功能都没有

2.寻找靶标系统源码

然后又是相同套路从fofa寻找相同系统,有一百多个站基本备份就是稳得

webalivescan再扫一波备份,扫到一个bin.rar

3.任意文件上传结合目录浏览轻松拿下靶标

通过代码审计发现一处文件上传
主要在xxx/UploadPic.aspx下
代码大致如下:

很多人看到第97行出现了png jpg等字符就会认为是白名单效验,其实不然。大部分文件上传操作还是会存在一些小小的瑕疵的。
例如

string text = base.Server.MapPath("~/UpPic/xxxPic/");

定义了文件的存储目录

if (base.Request["id"] != null && base.Request["id"].ToString() == "1")

当接收参数id的值等于1时。进入if条件语句:

string[] array = files[0].ContentType.Split(new char[]
                {
                    '/'
                });
string arg = array[1].Equals("jpeg", StringComparison.CurrentCultureIgnoreCase) ? "" : array[1];
string text2 = HttpUtility.UrlEncode(HttpContext.Current.Request["name"], Encoding.GetEncoding("GB2312"));
string[] array2 = new string[]
{
"jpg",
"png",
"gif",
"bmp"
};

其中,第5行进行了Content-Type 的效验 ,如果上传的Content-Type以/分割后的第一个值不为jpeg。那么arg的值为false。
第6行接收一个参数name。值赋值给text2
第7行定义了一个数组。为允许上传的文件类型。
主要问题在于下方:

for (int i = 0; i < array2.Length; i++)
{
    int num = text2.ToString().Substring(text2.Length - 3, 3).IndexOf(array2[i]);
    if (num > -1)
    {
    text2 = array2[i];
    }
}

将array2的内容进行循环判断。如果text2后三位的值中存在array的某个值。
那么 num 为0 ,进入if语句。 text2被重写为后辍。
这里有个问题就是只有存在的时候才进行重写。不存在就不重写。也就是说我传入的name为text.aspx。那么也不会进行任何改变。
最终文件存储操作是在143行。

其中fileanme的值为 text(目录名) + str3的值。
str3的值主要根据if条件语句进行赋值。只要text2的值不为空,那么最终的文件名就会以name的值进行结尾。导致任意文件上传。

文件地址:UpPic/xxxPic/+时间+随机数+text2(可控)
构造请求包

UpPic/xxxPic/ 存在目录浏览
找到shell名字

哥斯拉连接,执行ipconfig

确定为靶标内网地址,至此拿下靶标shell。


文章来源: http://xz.aliyun.com/t/8541
如有侵权请联系:admin#unsafe.sh