『渗透测试』信息收集(一)WEB应用
信息收集作为渗透测试的最重要一环,好的信息收集可以极大提升我们后面渗透测试的效果。在本文中,我们将对信息收集进行总述,并主要介绍如何进行其中web应用的信息收集。
信息收集总述
-
信息收集的目标
找出目标所有的业务资产和可测试点,在所有测试点中选取最脆弱的点进行攻击
对我们后续渗透测试有作用的业务资产类型可以分成以下几类:
- web应用
- APP应用
- PC段应用
- 小程序应用
- 微信公众号
- 其他产品等
-
总体思路
我们进行渗透测试的目标可能是以下几种形式给出:
- 公司企业名称
- 网站域名
- IP
已知企业名称,可以直接在爱企查进行企业资产的查询(有些信息看不了,可以在淘宝一元购买会员):
- 在查询企业的时候,可能会搜到一些与目标企业名称类似、logo相同的公司,这些公司可能是目标企业的分公司。分公司可能也具有一些自己的资产,要不要将这些资产进行收集以及后续的测试,要依据渗透测试的需求来定。
- 收集该企业名下的网站备案、微信公众号、APP
- 收集企业名下的邮箱
-
web应用信息收集
信息收集的最主要目标就是web应用资产信息的收集
1)web应用资产主要包括以下几种
- 程序语言
- 框架源码
- 搭建平台
- 数据库类
- 操作系统
2)如何快速探测web应用资产:指纹识别工具
接下来我们将分别介绍如何确定和收集提到的这些web应用资产
域名信息
域名信息主要包括两种:
- 获取单域名:在不知道目标资产名下域名的情况下,怎么收集到目标资产的域名
- 获取子域名:已知一些域名,如何收集更多相关的子域名
获取单域名
-
备案信息查询
已知公司名称或备案号,可以查到公司/备案号下面绑定的域名
工具:
-
公司产权
已知公司名称,可以直接在爱企查查看企业资产下的域名
-
域名注册查询
已知一些域名(可以是通过之前的爱企查获取到的),可以在注册域名平台查找别的类似域名,看是不是也是该公司名下的
工具:
-
IP反查域名
已知IP地址,反查这个IP下是否绑定了其他的相关网站(注意CDN)
工具:
获取子域名
-
DNS解析记录查询
查询当前域名的当前和历史DNS解析历史记录
- A记录:当我们访问一个网站时,DNS服务器会查找该网站域名的A记录来获取对应的IP地址,使你的浏览器能够连接到正确的服务器上。A记录下也可能会记录一些子域名的解析信息,但是这些域名只是曾经解析过,目前可能已经被删除掉。
- DNS记录:表示该域名使用了单独购买的DNS解析服务器,而不是公用的DNS解析服务器,这样可以防止共用的DNS解析服务器被劫持导致的域名无法访问问题
- MX记录:表示邮件服务器,这里可以看到该域名配置了四个邮件服务器,MX记录中的不同优先级表示在邮件传输过程中使用的服务器的优先顺序。
-
SSL证书查询
如果目标网站是https则存在SSL证书,可以在浏览器网址栏查看该证书是否绑定了其他的域名
通过工具检索
longi.com
,可以看到该网站相关的证书,以及相关的子域名。从这里就可以看出,找子域名的时候千万不可以只进行枚举爆破,像这种子域名是不可能存在于字典中的。 -
网络测绘引擎
直接在网络测绘引擎上进行检索
fofa语法:
1
domain = "xiaodi8.com"
工具:
-
威胁情报平台
在威胁情报平台上也可以查看收录的子域名信息
-
枚举解析(不推荐)
使用子域名爆破工具,通过逐一ping字典内的子域名来枚举获取子域名
工具:
- OneForAll工具,实现了上面多种方法的聚合:https://github.com/shmilylty/OneForAll
- layer子域名挖掘机
端口扫描
-
作用:
基于端口扫描的结果,可以识别中间件、数据库类型、其他服务协议等
-
方法:nmap扫描
状态:
- open:开放
- close:关闭
- filtered:目标受到了防火墙的保护,无法确定该端口是否开放
-
注意事项
如果目标服务器在内网环境中,通过一个外网服务器与我们进行通信,这个时候我们扫描的结果是外网服务器的端口开放情况,并不是目标服务器的。
端口 | 服务 | 渗透用途 |
---|---|---|
tcp 20,21 | FTP | 允许匿名的上传下载,爆破,嗅探,win提权,远程执行(proftpd 1.3.5),各类后门(proftpd,vsftp 2.3.4) |
tcp 22 | SSH | 可根据已搜集到的信息尝试爆破,v1版本可中间人,ssh隧道及内网代理转发,文件传输等等 |
tcp 23 | Telnet | 爆破,嗅探,一般常用于路由,交换登陆,可尝试弱口令 |
tcp 25 | SMTP | 邮件伪造,vrfy/expn查询邮件用户信息,可使用smtp-user-enum工具来自动跑 |
tcp/udp 53 | DNS | 允许区域传送,dns劫持,缓存投毒,欺骗以及各种基于dns隧道的远控 |
tcp/udp 69 | TFTP | 尝试下载目标及其的各类重要配置文件 |
tcp 80-89,443,8440-8450,8080-8089 | 各种常用的Web服务端口 | 可尝试经典的topn,vpn,owa,webmail,目标oa,各类Java控制台,各类服务器Web管理面板,各类Web中间件漏洞利用,各类Web框架漏洞利用等等…… |
tcp 110 | POP3 | 可尝试爆破,嗅探 |
tcp 111,2049 | NFS | 权限配置不当 |
tcp 137,139,445 | Samba | 可尝试爆破以及smb自身的各种远程执行类漏洞利用,如ms08-067,ms17-010,嗅探等 |
tcp 143 | IMAP | 可尝试爆破 |
udp 161 | SNMP | 爆破默认团队字符串,搜集目标内网信息 |
tcp 389 | LDAP | ldap注入,允许匿名访问,弱口令 |
tcp 512,513,514 | Linux rexec | 可爆破,rlogin登陆 |
tcp 873 | Rsync | 匿名访问,文件上传 |
tcp 1194 | OpenVPN | 想办法钓VPN账号,进内网 |
tcp 1352 | Lotus | 弱口令,信息泄漏,爆破 |
tcp 1433 | SQL Server | 注入,提权,sa弱口令,爆破 |
tcp 1521 | Oracle | tns爆破,注入,弹shell… |
tcp 1500 | ISPmanager | 弱口令 |
tcp 1723 | PPTP | 爆破,想办法钓VPN账号,进内网 |
tcp 2082,2083 | cPanel | 弱口令 |
tcp 2181 | ZooKeeper | 未授权访问 |
tcp 2601,2604 | Zebra | 默认密码zerbra |
tcp 3128 | Squid | 弱口令 |
tcp 3312,3311 | kangle | 弱口令 |
tcp 3306 | MySQL | 注入,提权,爆破 |
tcp 3389 | Windows rdp | shift后门[需要03以下的系统],爆破,ms12-020 |
tcp 3690 | SVN | svn泄露,未授权访问 |
tcp 4848 | GlassFish | 弱口令 |
tcp 5000 | Sybase/DB2 | 爆破,注入 |
tcp 5432 | PostgreSQL | 爆破,注入,弱口令 |
tcp 5900,5901,5902 | VNC | 弱口令爆破 |
tcp 5984 | CouchDB | 未授权导致的任意指令执行 |
tcp 6379 | Redis | 可尝试未授权访问,弱口令爆破 |
tcp 7001,7002 | WebLogic | Java反序列化,弱口令 |
tcp 7778 | Kloxo | 主机面板登录 |
tcp 8000 | Ajenti | 弱口令 |
tcp 8009 | tomcat Ajp | Tomcat-Ajp协议漏洞 |
tcp 8443 | Plesk | 弱口令 |
tcp 8069 | Zabbix | 远程执行,SQL注入 |
tcp 8080-8089 | Jenkins,JBoss | 反序列化,控制台弱口令 |
tcp 9080-9081,9090 | WebSphere | Java反序列化/弱口令 |
tcp 9200,9300 | ElasticSearch | 远程执行 |
tcp 11211 | Memcached | 未授权访问 |
tcp 27017,27018 | MongoDB | 爆破,未授权访问 |
tcp 50070,50030 | Hadoop | 默认端口未授权访问 |
中间件识别
中间件的详细解释见:『web安全』web安全基础
-
web服务器识别
-
包括 Apache、Nginx(反向代理服务器)、IIS、lighttpd 等
-
识别方法:请求返回包中的server字段
-
-
应用服务器识别
-
包括 Tomcat、Jboss、Weblogic、Websphere 等
-
识别方法:端口扫描技术,基于开放的端口号确定运行的应用服务器
-
工具:nmap 、 Masscan、网络测绘引擎
-
数据库识别
如何确定目标网站所使用的数据库类型?
-
基于默认端口号识别
许多数据库有默认的监听端口,通过端口扫描可能推测所用的数据库:
- MySQL:3306
- SQL Server:1433
- PostgreSQL:5432
- Oracle:1521
- MongoDB:27017
操作系统识别
其他服务协议
源码获取
CMS/指纹识别
CMS指纹识别出来的主要是php项目
-
手工发现
-
1)直接在网站主页上面找是否有暴露CMS的信息
-
2)访问主页,使用浏览器工具查看是否存在一些特殊的文件。
例如这里是一个博客网站,查看source里面有一个
zblogphp.js
文件,在搜索引擎上进行搜索就可能查询到相应的CMS
-
-
比对CMS字典:CMS识别工具大部分都是看网站是否存在某些特定icon、css,下载下来后计算md5值与字典中存储的CMS md5进行比对,来确定该网站是否使用了某个CMS
最好是根据自己的目的维护更新一个字典,比如我的目标是违法网站这一类型的网站,我可以维护一个专门收录违法网站CMS的字典,这样的效果更好
-
在线CMS识别、指纹识别网站
仅可以扫描公网的网站
- 云悉指纹:https://www.yunsee.cn/
- Wappalyzer:基于浏览器插件的指纹识别工具,支持多种Web框架、CMS、中间件、CDN等的识别。
- WhatWeb:基于命令行的指纹识别工具,支持多种Web框架、CMS、中间件、语言等的识别。
- Fingerprintjs2:基于JavaScript的指纹识别工具,可以识别浏览器的User-Agent、语言、时区、屏幕分辨率、字体等信息。
- BuiltWith:基于网站的指纹识别工具,可以识别网站所使用的Web框架、CMS、中间件、CDN等信息。
- Nuclei:基于命令行的扫描工具,可以使用已有的指纹识别模板进行扫描。
-
内网指纹识别工具
针对内网环境的指纹识别工具
开源代码获取
搜索引擎、咸鱼淘宝、第三方源码站、联系相关内部人员
第三方源码站:
闭源代码获取:源码泄露
如果我们并没有找到网站所使用的CMS,那么这个网站有很大的可能性是使用了闭源代码,我们可以看看是否存在网站源码泄露的问题。网站源码泄露的主要类型可能包含以下几种:
-
网站备份压缩文件
管理员将网站源代码备份在Web目录下,攻击者通过猜解文件路径,下载备份文件,导致源代码泄露。
-
常见的备份文件后缀:
1
.rar .zip .7z .tar .gz .bak .txt .old .temp
-
漏洞利用工具:网站目录扫描工具
- 御剑
-
-
git源码泄露
Git是一个开源的分布式版本控制系统,在执行
git init
初始化目录的时候,会在当前目录下自动创建一个.git
目录,用来记录代码的变更记录等。发布代码的时候,如果没有把.git
目录删除,就直接发布到了服务器上,攻击者就可以通过它来恢复源代码。-
漏洞验证:访问网站的
.git
目录,看是不是 404 -
漏洞利用工具:
GitHack:https://github.com/lijiejie/GitHack
1
GitHack.py http://www.openssl.org/.git/
-
-
svn源码泄露
SVN是一个开放源代码的版本控制系统。在使用SVN管理本地代码过程中,会自动生成一个名为
.svn
的隐藏文件夹,其中包含重要的源代码信息。如果网站管理员在发布代码时,没有使用“导出”功能,而是直接复制代码文件夹到WEB服务器上,就会使.svn
隐藏文件夹被暴露于外网环境,可以利用.svn/entries
文件,获取到服务器源码。-
漏洞利用工具:
Seay SVN
-
-
DS_Store 文件泄露
.DS_Store
是Mac下Finder用来保存如何展示文件/文件夹的数据文件,每个文件夹下对应一个。如果将.DS_Store
上传部署到服务器,可能造成文件目录结构泄漏,特别是备份文件、源代码文件。-
漏洞利用工具:
https://github.com/lijiejie/ds_store_exp
1
ds_store_exp.py http://hd.zj.qq.com/themes/galaxyw/.DS_Store
-
-
composer.json 泄漏
PHP 开发中使用
Composer
依赖管理工具时,会产生配置文件composer.json
,如果配置时被意外暴露或泄漏到公众访问的环境中,可能带来安全风险。
敏感目录文件扫描工具:
- dirsearch:基于命令行的目录扫描工具,支持自定义字典和多线程扫描,可以扫描常见的敏感目录和文件。
- ffuf:基于命令行的目录扫描工具,支持多线程扫描、自定义字典、过滤器等功能,速度较快。
- Gobuster:基于命令行的目录扫描工具,支持多线程扫描、自定义字典、过滤器等功能,速度较快。
- Arjun:基于Python的参数爆破工具,可以扫描常见的GET/POST参数,常用于发现备份文件和配置文件等。
特殊情况
如果以上两种情况都不符合,即可能是以下几种特殊情况:
-
知道使用了什么程序,但是下载不到源码
-
未识别出程序信息,且不存在源码泄露
基于我们收集到的关键字、关键文件,从码云资源平台(github、gitee和oschina等)尝试获取源码
- 网站中特殊命名的脚本文件
- 出现的可能与作者相关的信息:邮箱、作者名等
1)Github资源检索语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14in:name test # 仓库标题搜索含有关键字test
in:descripton test # 仓库描述搜索含有关键字
in:readme test # Readme文件搜素含有关键字
stars:>3000 test # stars数量大于3000的搜索关键字
stars:1000…3000 test # stars数量大于1000小于3000的搜索关键字
forks:>1000 test # forks数量大于1000的搜索关键字
forks:1000…3000 test # forks数量大于1000小于3000的搜索关键字
size:>=5000 test # 指定仓库大于5000k(5M)的搜索关键字
pushed:>2019-02-12 test # 发布时间大于2019-02-12的搜索关键字
created:>2019-02-12 test # 创建时间大于2019-02-12的搜索关键字
user:test # 用户名搜素
license:apache-2.0 test # 明确仓库的 LICENSE 搜索关键字
language:java test # 在java语言的代码中搜索关键字
user:test in:name test # 组合搜索,用户名test的标题含有test的2)搜索引擎检索语法
1
2
3
4site:github.com smtp # 搜索 GitHub 上包含 smtp 关键字的内容。
site:github.com smtp @qq.com # 搜索 GitHub 上包含 smtp 和 @qq.com 的内容。
site:Github.com smtp password # 搜索 GitHub 上包含 smtp 和 password 的内容。
site:github.com String password smtp # 搜索 GitHub 上包含 String、password 和 smtp 的内容。可能用于查找用字符串形式存储的密码相关 SMTP 配置代码。如果找到类似的源码,采用替换域名访问的方式来确定
-
其他类型行业(如黑灰产网站),使用对口资源站获取
根据自己的目的进行调整,如果我的目标是违法网站,收集渠道可以聚焦于灰铲、菜鸟源码、tg这些平台上
框架识别
下面介绍几种常用语言的流行开发框架如何识别
Python开发框架
-
Django
-
指纹识别插件Wappalyzer
-
请求网站数据包中的字段:
1
2
3Set-Cookie:expires=
或
Set-Cookie: csrftoken=
-
-
Flask
-
指纹识别插件Wappalyzer
-
请求网站数据包中的字段:
1
2
3Set-Cookie:expires=
或
Etag:"flask-
-
PHP开发框架
-
ThinkPHP
-
指纹识别插件Wappalyzer
-
识别出来使用的是什么CMS,查找该CMS使用的是基于什么框架开发的
-
请求网站数据包中的字段:
1
X-Powered-By: ThinkPHP
-
-
Laravel
-
指纹识别插件Wappalyzer
-
请求网站数据包中的字段:
1
2
3Set-Cookie: laravel_session=
或
Set-Cookie: XSRF-TOKEN
-
-
Yii
-
指纹识别插件Wappalyzer
-
请求网站数据包中的字段:
1
Set-Cookie:YII_CSRF_TOKEN
-
Java框架组件
Java存在哪些主流的框架和组件:52类110个主流Java组件和框架介绍
大部分的Java组件、框架是没有办法被指纹识别插件Wappalyzer识别到的。
下面介绍几个漏洞比较多,值得注意的Java框架组件
-
Fastjson/Jackson
一个用于将Java对象转化为json格式返回的组件
在提交JSON数据包中修改测试:
- Fastjson组件会把01解析成1
- Jackson组件在解析01时会抛出异常
-
Shiro
一个用于身份验证、授权、密码和会话管理的组件
出现以下几种情况表示目标使用了shiro组件
-
1)返回包中存在字段:
1
set-Cookie:remeberMe=deleteMe
-
2)有时候服务器不会主动返回
remeberMe=deleteMe
。如果我们直接发送原数据包,返回包中并不存在关键字,可以在发送数据包的cookie中增加字段:1
rememberMe=xx
如果返回包中存在
remeberMe=deleteMe
,则可以确定网站为apache shiro搭建。
-
-
Struts2
一个基于MVC设计模式的WEB层应用框架。
一般使用 Struts2 框架的网站url后缀带do或action
例如:
index.do
或index.action
-
Springboot
- web应用程序网页标签的小绿叶图标
- springboot框架的默认报错页面
-
Solr
一个基于 Apache LuceneTM 构建的搜索服务器
- 一般开放8983端口
- 访问页面也可以探针到
JS渗透测试
相关概念
-
什么是 JS 渗透测试
JS 源代码可以直接在前端阅读,相当于直接进行白盒测试。可以从而获取更多的资产信息(如URL、JS敏感信息),也可以了解到JS代码逻辑(如加密算法,APIkey配置,验证逻辑等),方便进行后期安全测试。
-
流行的 JS 框架
通过chrome插件Wappalyzer可以识别网站使用的框架
- Vue
- NodeJS
- jQuery
- Angular
-
JS 可能存在哪些安全问题
- 源码泄漏
- 未授权访问:JS里面可能存在更多的URL泄露,导致未授权的访问
- 敏感key泄漏:JS中可能存在一些配置信息(云应用,短信,邮件,数据库等)
- API接口安全:通过js了解到代码中加密提交、参数传递的逻辑
JS 信息搜集
随着SPA网页的兴起,js文件中会包含大量前端路由和后端api的链接信息,获取到这些链接能提供更多的有效信息。
JS 信息搜集即:在 JS 中搜集更多可用的资产信息。
手工搜索分析
-
在浏览器工具中找命名比较敏感的js文件并审计
如
login.js
、admin.js
等 -
在浏览器工具中的前端JS代码全局检索下列关键词
从而可以得到更多的 url 信息
1
2
3
4
5
6
7
8
9src= # 查找动态加载的url资源
path= # 定位哪些接口正在被调用
method:"get" # 查找指定请求方法(GET 或 POST)的代码片段
method:"post"
http.get(" # 查找使用 http 模块发起请求的代码
http.post("
$.ajax # 查找使用 jQuery 发起的网络请求代码
http://service.httppost # 查找访问特定 URL(如自定义后端服务)的代码
http://service.httpget
自动化分析工具
-
Burp 插件
高亮标记请求包中的一些敏感信息、JS接口和一些特殊字
- 官方插件:JS Link Finder & JS Miner
- 第三方插件:HaE & Unexpected_information
-
自动化JS信息提取工具
从url相关的JS文件中提取URL、key等信息
-
JSFinder:https://github.com/Threezh1/JSFinder
一款用作快速在网站的JS文件中提取URL,子域名的工具
1
python JSFinder.py -u https://px.gtxy.cn/np/#/login
-
URLFinder:https://github.com/pingc0y/URLFinder
一款用于快速提取检测页面中JS与URL的工具。功能类似于JSFinder,但JSFinder好久没更新了。
1
URLFinder-windows-amd64.exe -u https://px.gtxy.cn/np/#/login -s all -m 2
-
JSINFO-SCAN:https://github.com/p1g3/JSINFO-SCAN
递归爬取域名(netloc/domain),以及递归从JS中获取信息的工具
-
FindSomething:https://github.com/momosecurity/FindSomething
chrome插件,用于快速在网页的html源码或js代码中提取一些有趣的信息,包括可能请求的资源、接口的url,可能请求的ip和域名,泄漏的证件号、手机号、邮箱等信息。
-
-
获取更多的JS文件:JS Fuzz 工具
上面这些JS信息搜集工具的作用都是输入一个网站地址(URL),去扫描这个网站上用到的 JavaScript 文件,提取里面的有用信息。
但是它们有一个限制:它们只能找到跟当前这个网站 URL 相关的 JS 文件。比如说,如果你输入的是一个登录页面的地址,它只能获取登录页面上加载的 JS 文件,但无法获取到登录成功之后才会加载的其他 JS 文件,因为这些文件需要在用户登录后才能被看到。
要找到更多的js文件,就要使用到FUZZ爆破的思想
工具:
-
ffuf:https://github.com/ffuf/ffuf
爆破找到更多的js文件分析更多的信息,当我们获取到更多的js文件后,可以对新获取到的js文件使用上面的自动化JS信息提取工具获取到更多的有用信息
-
-
Webpack打包网站的测试工具
Packer-Fuzzer:https://github.com/rtcatc/Packer-Fuzzer
如果网站前端使用了Webpack进行打包(使用Wappalyzer确定),打包器会将整站的API和API参数打包在一起供Web集中调用,Packer-Fuzzer可以对基于Webpack等前端打包工具所构造的网站进行快速高效安全检测
JS 逆向
JS 逆向(JavaScript 逆向工程)是一种通过分析和理解 JavaScript 代码的逻辑与行为,来实现某些特定目的的技术。它通常应用于破解或分析前端代码的保护机制,比如数据加密、反爬虫机制、API 签名生成等。