【THM】Web Enumeration(web枚举)-学习
本文相关的TryHackMe实验房间链接: https://tryhackme.com/room/webenumerationv2
本文相关内容:学习使用Gobuster、Nikto和WPScan等工具来枚举网站信息。
gobuster介绍
gobuster基础简介:
项目地址(关于gobuster的具体参数和用法 请参考该项目中的readme.md):
https://github.com/OJ/gobuster
在kali中的安装命令:
sudo apt install gobuster
gobuster的一些全局参数:
Flag Long Flag Description
-t --threads Number of concurrent threads (default 10) 并发线程数(默认为10)
-v --verbose Verbose output 详细输出
-z --no-progress Don't display progress 不显示进度
-q --quiet Don't print the banner and other noise 不打印横幅和其他杂项
-o --output Output file to write results to 写入输出结果到文件
//将线程数更改为64以提高扫描速度,如果不更改线程的数量,Gobuster 可能会有点慢。
gobuster工作模式:
"dir"模式(扫描目录)
dir模式的基本用法介绍:
首先输入gobuster dir,这将告诉Gobuster你想要执行一个目录扫描,而不是其他扫描。
然后分别使用-u和-w选项添加 URL 和 wordlist(字典)。
例子:
gobuster dir -u http://10.10.10.10 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
注意:
URL 将是Gobuster开始进行查找的基础路径,上面的URL所对应的是服务器所对应的web服务的根目录。
例如,观察Linux系统中的Apache安装默认路径,可知其web服务的根目录是 /var/www/html
因此,如果你有一个“products”目录,并且你想枚举这个目录,你应该把这个URL设置为: http://10.10.10.10/products
你也可以把它想象成 http://example.com/path/to/folder
还要注意,在url中还指定了HTTP协议。这是必需的。
dir模式的其他常用参数介绍:
Flag Long Flag Description
-c --cookies 用于请求的cookie
-x --extensions 要搜索的文件扩展名
-H --headers 指定HTTP Header请求头 -H 'Header1: val1' -H 'Header2: val2'
-k --no-tls-validation 跳过 TLS 证书验证(注意: 标志 -k 可以与“ dir”模式和“ vhost”模式一起使用)
-n --no-status 不打印状态码
-P --password 用于基础身份认证的密码
-s --status-codes 白名单状态码
-b --status-codes-blacklist 黑名单状态码
-U --username 用于基础身份认证的用户名
例子:
gobuster dir -u http://10.10.252.123/myfolder -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x html,css,js
注意:
如果目标站点启用了HTTPS,则执行上述命令可能会遇到无效的证书错误,并提示我们并非私密连接,此时我们可以选择使用-k参数,从而忽略无效验证的错误提示。
关于dir模式的全部参数用法,请查看项目具体地址:https://github.com/OJ/gobuster#dir-mode-options
"dns" 模式(扫描子域名)
在渗透测试(或者CTF)过程中,检查目标顶级域的相关子域也非常重要。
虽然某些服务在常规的域中打了漏洞补丁,但是这不意味着它也在子域中也打了同样的漏洞补丁。
因此,在相关的子域中,目标服务也可能存在一些能够被利用的漏洞。
例如,如果State Farm公司拥有statefarm.com和mobile.statefarm.com两个域名,那么在statefarm.com中没有的漏洞,可能会存在于mobile.statefarm.com中。
因此,我们有必要扫描子域。
dns模式的基本用法介绍:
首先输入 gobuster dns,这将告诉 Gobuster你想要执行子域名暴破。
然后分别使用-d和-w选项添加目标域名和wordlist(字典)。
例子:
gobuster dns -d mydomain.thm -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
//执行这条命令,Gobuster将对域名“mydomain.thm”进行子域名扫描。如果有任何可用的子域名,Gobuster将找到它们并显示在终端界面中。
dns模式的其他常用参数介绍:
Flag Long Flag Description
-c --show-cname 显示 CNAME 记录(不能与“-i”选项一起使用)
-i --show-ips 显示 IP 地址
-r --resolver 使用自定义的 DNS 服务器(格式为 server.com 或 server.com: port)
关于dns模式的全部参数用法,请查看项目具体地址:https://github.com/OJ/gobuster#dns-mode-help
"vhost" 模式(扫描虚拟主机)
虚拟主机是同一台机器上的不同网站。
在某些情况下,它们可能看起来像子域,但不完全等同于子域。
虚拟主机是基于IP的,不同虚拟主机是运行在同一台服务器上的,这对于用户而言通常是不明显的。
如果主端口80/443扫描没有发现任何东西,那么扫描虚拟主机将是一个找到隐藏信息的好方法。
vhost模式的基本用法介绍:
首先输入gobuster vhost,这将告诉Gobuster你想要执行一个虚拟主机暴破。
然后分别使用-u和-w选项添加域名和wordlist(字典)。
例子:
gobuster vhost -u http://example.com -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
//执行这条命令,Gobuster将使用选定的字典针对 http://example.com 进行虚拟主机扫描
vhost模式的其他参数介绍:
“dir”模式中的许多参数,实际上仍然适用于“vhost”模式。
因此,关于vhost模式的其他参数介绍,我们可以参考上文的“dir”模式所介绍的部分。
我们也可以选择查看关于vhost模式的完整参数列表:
https://github.com/OJ/gobuster#vhost-mode-options
关于字典的使用
Kali Linux Default Lists(kali默认字典)
下面是Kali Linux会默认安装的一些比较有用的字典,以Kali版本2020.3为例。
带有通配符(*)字符的内容表明有多个匹配的字典文件条目:
/usr/share/wordlists/dirbuster/directory-list-2.3-*.txt
/usr/share/wordlists/dirbuster/directory-list-1.0.txt
/usr/share/wordlists/dirb/big.txt
/usr/share/wordlists/dirb/common.txt
/usr/share/wordlists/dirb/small.txt
/usr/share/wordlists/dirb/extensions_common.txt #这个字典在进行fuzzing测试的时候非常有用。
Non-Standard Lists(非标准字典)
从外部也可以安装字典到kali系统中,最常用的一个强大的github字典合集项目是:SecLists
可在kali中使用以下命令进行安装:
sudo apt install seclist
gobuster操作task
添加(并非覆盖) 目标ip及其对应域名到本地攻击机上的hosts文件中。
echo "10.10.73.36 webenum.thm" >> /etc/hosts
扫描目标域名的目录
gobuster dir -u http://webenum.thm -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
进某一目录进行更深一层的目录扫描(题目要求:找出 C********* 目录下的文件有哪些扩展名)
gobuster dir -u http://webenum.thm/Changes -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x html,js,txt,conf -t 64
依次对第一次结果中的每个目录进行更深一层的扫描,并查找txt和php等扩展名,这些扩展名代表存储flag文件的常见格式。
成功检索到目标文件之后,我们可以尝试在浏览器的地址栏中输入包含目标文件路径的url,然后选择打开flag文件,并查看其中的内容。
输入url并查看flag文件内容:
或者输入以下url也可以:
使用vhost模式并基于一个常用的子域名字典文件来扫描目标服务器上的虚拟主机:
gobuster vhost -u http://webenum.thm -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
将虚机主机扫描结果添加到本地攻击机上的hosts文件中:
echo "10.10.73.36 webenum.thm products.webenum.thm learning.webenum.thm" >> /etc/hosts
扫描每个虚拟主机并检索通用的flag文件扩展名,如php和txt,尝试找到flag文件:
gobuster dir -u http://learning.webenum.thm -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x php,txt
gobuster dir -u http://products.webenum.thm -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x php,txt
在浏览器中输入带flag文件的url地址,查看flag文件内容:
gobuster任务答案
WPScan介绍
WPScan基础简介
WPScan 框架能够列举和研究 WordPress 站点中存在的一些安全漏洞类别,包括但不限于:
查看公开的敏感信息(关于WordPress所使用的插件版本、WordPress已安装的主题版本的公开漏洞或CVE)
Path Discovery (Looking for misconfigured file permissions i.e. wp-config.php)
路径发现(寻找权限配置错误的文件,例如wp-config.php文件)
Weak Password Policies (Password bruteforcing)
弱密码检测(密码暴破)
Presence of Default Installation (Looking for default files)
检测默认安装的文件(检索一些可能泄露敏感信息的默认文件)
Testing Web Application Firewalls (Common WAF plugins)
测试Web应用程序防火墙(即WordPress可能使用的通用WAF插件)
WPScan安装
kali默认会安装WPScan工具,我们在kali中使用以下命令来安装或者更新WPScan:
sudo apt update && sudo apt install wpscan
WPScan数据库介绍
在枚举主题和插件时,WPScan会使用与该工具相关的数据库信息来作为主要参考。
WPScan在执行信息枚举时,通常会尝试寻找那些常见的主题和插件。
在使用WPScan之前,强烈建议先更新与此工具相关的本地数据库。
更新命令为:
wpscan --update
WPScan工作模式
枚举已安装的主题
对于正在运行的 WordPress ,WPScan有几种确定已经安装的主题的方法。
当然,我们可以选择手动查看WordPress站点的相关主题:
简单来说,我们可以尝试查看我们的web浏览器所加载的目标网站的资产,然后寻找这些资产在web服务器上的位置。
使用浏览器开发工具中的“网络”选项卡,就可以看到当我们访问一个目标网页时具体会加载什么文件。
以下面的截图为例,我们可以看到许多与目标网站相关的资产已经被加载,其中一些资产是脚本和主题的样式文件,它们决定了浏览器应该如何呈现目标网站。
例如,在下面的截图中突出显示的部分: http://redacted/wp-content/themes/twentytwentyone/assets/
这是一个很重要路径。
我们可以猜测当前主题的名称是“ twentytwentyone”。
在检查了网站的源代码之后,我们能注意到对“ twentytwentyone”的额外引用。
我们使用 WPScan 通过带 t 参数的--enumerate标志来加速这个过程,命令如下所示:
wpscan --url http://cmnatics.playground/ --enumerate t
等待几分钟后,我们就可以看到一些输出结果。
WPScan的强大之处在于,这个工具可以让我们大概知道:它是如何确定所得到的扫描结果的。
在以下截图中,我们被告知主题名称为“twentytwenty”,这是通过扫描“已知位置”来进行确认的。
tips:在2020年的WordPress版本中,“twentytwenty”主题是默认的WordPress主题。
枚举已安装的插件
web服务器的一个常见特性是“目录列表”,它会在默认情况下被启用。
简而言之,“目录列表”是指我们通过浏览器能够导航到的关于网站文件的列表(就像我们使用文件资源管理器或 Linux的ls命令所能够看到的那样)。
“目录列表”页面所对应的URL与文件路径非常相似。
比如URL http://cmnatics.playground/a/directory 实际上是webserver/a/目录的配置根目录
当网站没有默认的首页的时候,直接访问目标站点会显示该网站目录下的文件夹资源,常见的默认首页是“ index.html”或者“ index.php”
如下所示,由于这些首页文件不在/a/目录中,所以实际显示的网页内容将如下所示:
WPScan 可以利用以上特性作为一种技术来寻找已安装的插件。
因为这些插件都位于/wp-content/plugins/pluginname 中,所以 WPScan 可以枚举常见的/已知的插件
通过阅读 WordPress 的开发者文档,我们可以了解 WPScan 是如何确定WordPress版本号的。
简单地说,插件必须有一个“ README.txt”文件。这个文件包含一些元信息,比如插件名称、与之兼容的 WordPress 版本以及描述。
通过这个文件 WPScan可以获取到WordPress的版本号等信息。
WPS 也可以使用其他方法来发现插件(比如寻找引用或嵌入页面中的插件资产)。
我们可以将--enumerate标志与 p 参数一起使用,命令如下所示:
wpscan --url http://cmnatics.playground/ --enumerate p
枚举用户名
WPScan还可以执行暴破攻击,此时我们必须提供一个字典文件,比如rockyou.txt
WordPress网站的作者可以发布文章,而作者实际上就是该站点的用户,也就是说:我们可以通过查看文章的作者来手动找到有效的用户名。
枚举用户的命令如下:
wpscan --url http://cmnatics.playground/ --enumerate u
获取对应版本的WordPress已知漏洞
在目前的命令中,我们只列举了 WordPress 来发现什么样的主题、插件和用户。
我们必须查看输出,并使用 MITRE、 NVD 和 CVEDetails 等站点查找这些插件的名称和版本号来确定一些已知漏洞
在WPScan中可以使用--enumerate v命令参数,我们再添加另一个参数(如插件所对应的参数 p),从而尝试获取与插件版本相对应的公开漏洞信息。
例如,我们的命令语法将如下所示:
wpscan --url http://cmnatics.playground/ --enumerate vp
注意:此处还需要设置WPScan使用WPVulnDB API才能查看关于插件版本的公开漏洞信息。
执行密码攻击
在确定了目标WordPress站点的用户名列表之后,我们就可以使用WPScan针对已知的用户使用字典文件来执行密码暴破攻击,从而尝试获取用户的有效密码。
简而言之,我们可以基于用户名枚举的输出结果来构建如下所示的命令:
wpscan –-url http://cmnatics.playground –-passwords rockyou.txt –-usernames cmnatic
//对用户cmnatic执行密码攻击,尝试获取用户的有效密码
调整WPScan的攻击性(以便应对WAF)
除非特别指定,否则WPScan在运行时会尽量减少攻击“强度”。(因为对Web服务器的大量请求会触发目标站点的防火墙的拦截功能,从而会导致我们发送的数据被目标服务器所阻塞)
WPScan的低攻击强度意味着可能会有一些插件、主题信息会被我们的扫描操作所遗漏。
我们可以使用--plugins-detection命令并结合攻击性配置参数(passive/aggressive)来调整WPScan的攻击强度
--plugins-detection passive 或者 --plugins-detection aggressive
WPScan参数表
Flag Description Full Example
p 枚举插件 --enumerate p
t 枚举主题 --enumerate t
u 枚举用户 --enumerate -u
v 使用WPVulnDB交叉引用漏洞,例如寻找易受攻击的插件(p) --enumerate vp
aggressive WPScan攻击性配置 --plugins-detection aggressive
WPScan操作task
先更新WPScan数据库
wpscan --update
枚举WordPress主题:
wpscan --url http://wpscan.thm --enumerate t
结果:
枚举WordPress插件
wpscan --url http://wpscan.thm --enumerate p
结果:
枚举用户名
wpscan --url http://wpscan.thm --enumerate u
结果:
密码爆破(已知用户名的前提下)
wpscan --url http://wpscan.thm --passwords /usr/share/wordlists/rockyou.txt --usernames phreakazoid
结果:
WPScan任务答案
Nikto介绍
Nikto是一款漏洞扫描器,能够在所有类型的web服务器上执行安全评估(它不特定于某种web应用程序,比如WPScan工具是专门用于检测WordPress应用程序的)。
Nikto可以用来检索一些可能存在的漏洞信息,包括:
敏感文件
过时的服务器和应用程序程序(即是否安装了易受攻击的Web服务器)
常见的服务器、软件的错误配置(网站目录索引配置、cgi脚本配置、xss保护配置)
安装 Nikto
kali会内置安装Nikto工具,当然,我们也可以使用以下命令来手动安装以及更新Nikto:
sudo apt update && sudo apt install nikto
Nikto的使用
Nikto基本扫描
Nikto的基本扫描可以通过使用-h参数标志并提供一个目标IP地址或目标域名作为参数来执行。
这种基础扫描类型将检索由web服务器或应用程序(例如 Apache2、 Apache Tomcat、 Jenkins 或 JBoss)所发布的头文件,并会尝试查找任何可能存在的敏感文件或目录(例如 login.php、/admin/等)
具体命令如下:
nikto -h ip
//在不指定端口时,nikto会默认扫描目标ip的80端口
分析以上结果:
Nikto 根据目标站点的图标识别出对应的web应用程序是Apache Tomcat
如输出结果所示:客户端可以执行的HTTP方法有“ PUT”方法和“ DELETE”方法,我们可以使用这些方法来针对目标应用程序上传文件或者删除文件。
如输出结果所示:“/example/servlets/index.html”,这是Apache Tomcat应用程序的默认首页路径。
使用Nikto扫描多个主机和端口
我们可以在Nikto命令中同时使用多个参数。
我们也可以直接从Nmap扫描的结果中来获取信息并针对目标主机范围进行Nikto扫描。
通过Nmap扫描子网,我们可以在整个网络范围内寻找主机。
然后指示 Nmap 使用 Nmap 的 -oG 标志将扫描输出成对 Nikto 友好的格式。
例如,我们可以用 Nmap (使用默认的 web 端口80)扫描172.16.0.0/24(子网掩码255.255.255.0,产生254个可能的主机) ,并像这样解析输出到 Nikto:
nmap -p80 172.16.0.0/24 -oG - | nikto -h - -o a.txt
扫描一个特定主机上的多个端口。我们可以通过使用-p 标志并提供由逗号分隔的端口号列表来实现这一点,
例如:
nikto -h 10.10.10.1 -p 80,8000,8080
Nikto插件介绍
Nikto插件进一步扩展了Nikto的功能。
基于从Nikto基础扫描中所收集到的信息,我们还可以选择使用适合我们目标的Nikto插件来作进一步扫描。
我们可以在Nikto命令中使用--list-plugins参数标志来列出我们可用的Nikto插件。
我们也可以在线查看完整的Nikto插件列表:
https://github.com/sullo/nikto/wiki/Plugin-list
一些有趣的Nikto插件包括:
Plugin Name Description
apacheusers 尝试枚举Apache HTTP以验证有效用户身份
cgi 寻找我们可以利用的CGI脚本
robots 分析robots.txt文件,该文件的内容将指示我们能够访问哪些网站文件/文件夹
dir_traversal 尝试执行目录遍历攻击(如LFI)在Linux上查找系统文件,如/etc/passwd
(http://ip_address/application.php?view=../../../../../../../etc/passwd)
我们可以通过使用-Plugin参数和我们希望使用的插件的名称来指定 将要使用的Nikto插件
例如,如果想使用“ apacheuser”插件,我们的Nikto扫描命令将如下所示:
nikto -h 10.10.10.1 -Plugin apacheuser
Nikto的详细扫描
我们可以通过使用-Display 标志并添加以下命令参数来增加Nikto扫描结果的详细程度。
除非指定,否则 Nikto 给出的输出不是整个输出,它有时可能是不相关的输出(但情况并非总是如此!)
参数:
Argument Description Reasons for Use
1 显示 Web 服务器提供的任何重定向。 Web 服务器可能希望将我们重新定位到一个特定的文件或目录,因此我们需要相应地调整我们的扫描。
2 显示收到的任何 Cookie 应用程序经常使用 Cookie 作为存储数据的手段。
例如,Web 服务器使用会话,其中电子商务站点可以将产品作为 cookie 存储在您的购物篮中。证书也可以存储在 cookie 中。
E 输出任何错误 如果扫描没有返回所期望的结果,那么使用这个参数将对调试非常有用。
优化Nikto扫描以进行漏洞搜索
Nikto可以扫描几类漏洞,我们可以指定我们的扫描来进行信息枚举以及漏洞测试。
下面的参数列表并不详细,只包括了常用的部分参数。
我们可以使用-Tuning标志并在 Nikto 扫描中提供以下命令参数来进行漏洞搜索:
类别名称 描述 调整选项(Tuning Option)
File Upload 网络服务器上搜索任何允许我们上传文件的内容。这可以用来上传要执行的应用程序的反向shell。 0
文件上传
Misconfigurations / Default Files 搜索 Web 服务器上敏感的常见文件(不应该访问的文件,如配置文件)。 2
错误配置/默认文件
Information Disclosure 收集关于 Web 服务器或应用程序的信息(例如,版本号、 HTTP 头或任何可能有助于我们在以后的攻击中利用的信息) 3
信息泄露
Injection 搜索我们可以执行某种注入攻击(如 XSS 或 HTML)的可能位置,即:注入点 4
注入
Command Execution 搜索任何允许我们执行操作系统命令的内容(例如生成shell) 8
命令执行
SQL Injection
SQL注入 查找具有易受 SQL 注入影响的 URL 参数的应用程序 9
Nikto保存扫描结果
Nikto支持将扫描结果保存为文本文件(.txt格式)以及html报告(.html格式)
我们可以使用-o 参数(- Output 的缩写)并提供文件名和兼容的扩展名。
我们也可以特别指定格式(- f) ,但是 Nikto工具足够智能,它可以使用我们在-o 参数中提供的扩展名来相应地调整输出文件格式:
例子:
nikto -h http://ip_address -o report.html
Nikto操作task
使用Nikto扫描 得出目标ip 80端口上的服务器名称和版本
nikto -h 10.10.39.109:80
由上图可知
服务器名称和版本为:Apache/2.4.7
扫描其他常见web端口的服务器名称和版本
nikto -h 10.10.39.109 -p 80,8080
由上图可知:
服务器名称和版本:Apache-Coyote/1.1
cookie的名称(是cookie名称不是cookie值):JSESSIONID
Nikto任务答案