注:
此文章仅用于将笔记存放于云端,方便本人随时查看,不供建议不供参考
一、信息收集阶段
1.主机发现
sudo namp -sn 192.168.88.0/24
sudo
sudo并不是已root身份启动的回话
不用root账号 用sudo+命令这种方式是最佳,最安全的
使用root账号登录系统具有完全的管理权限,可以执行任何操作
当kali使用普通用户 需要使用sudo来提升特定命令或操作的权限,这样仅对这项操作进行授权,而不是持续以完全管理员权限运行整个会话
-sn
在主机发现之后不进行端口扫描,不是指网络network,而是noportscan,只打印了主机嗅探的可用主机,这种扫描也被称为ping扫描,但相比于ping扫描,也可以使用主机脚本。默认情况下这比列表扫描-sL都具有相同的目的,但-sn多了一步入侵,他允许对目标网络进行轻量级的侦查而不会引起太多注意,对攻击者来说知道有多少主机处于活动状态,比列表扫描提供的每个ip和主机名的列表更有价值。
-sn可以很容易的看有多少个网络上可用的主机或监视服务器的可用性,他相比对广播地址进行ping请求更可靠,因为很多主机不会相应广播查询。
默认这项参数发送四个请求:
1. icmp回显请求
2.对端口443的tcp syn请求
3.对端口80的tcpack
4.默认情况下的icmp时间戳请求
当非特权用户(非root用户不加sudo)使用这条命令时,他只会使用connect调用发送syn数据包到目标主机的80或443端口,现在使用的是特权用户扫描本地网络,他是用的是arp请求,自然不是上述四种请求,arp请求是数据链路层的数据包,就没有tcp和icmp的关系,自然没有上述四种请求的关系 ,在这种情况下,nmap的扫描跟
sudo arp-l
这条命令相似,扫描本地网络的原理相同
在扫描本地网络时,也可以通过加入参数--send-ip ,让nmap发送icmp时间戳请求,已获取主机的活动性,因为在网络中arp请求可能不会被所有主机相应,而icmp时间戳请求,更可靠的用于主机发现。
扫描结果中,发现打开靶机后新增加的ip为192.168.88148.,确定此ip为靶机ip
PS:
-sn选项可以与任何发现探测类型结合使用,比如-pn等,以获得更大的灵活性,如果使用了这些探测类型和端口号选项中的任何一个,则会覆盖默认探测,如果在运行nmap的主机和目标网络之间存在严格的防火墙,推荐使用这些高级技术,否则当防火墙丢弃探测或相应数据包时,可能会错过主机,所以经常听到有人说,nmap一扫就会被防御系统发现,很大程度上是使用时不精细。
2.端口扫描
sudo nmap --min-rate 10000 -p- 192.168.88.148 -oA nmapscan/ports
在一般扫描中 --min-rate 之前会加一个扫描命令 -sS、-sT
两者区别为:
-sS:为默认扫描技术,他利用tcp的syn标志位来探测目标主机上的开放端口,发送一个syn包只简历tcp连接的第一步,如果收到了目标主机的syn加ack回复则表示相应的端口是开放的,如果收到rst复位,则表示该端口是关闭的,syn扫描常常用于快速扫描目标主机的端口状态,因为它能快速探测开放和关闭的端口
-sT:是用三次握手过程来判断端口的状态。他通过发送完整的tcp连接请求。等待目标主机的回应,如果收到了syn和ack回复,则表示相应的端口是开放的,需要进行完整的tcp连接过程,因此相对较慢,但是-sT更准确。-sT的好处不仅仅于此,很多防火墙都能监测到不完整的tcp连接(只发送一个syn包的情况),所以-sT,对于某些目标主机上使用了syn过滤机制或防火墙的情况可能会更有效
在打靶机的时候,我们要在准确率上的优先级更高,速度有保障的情况下,用-sT会更适合
若有流量和速度的指标要求,具体情况选择合适的扫描技术
--min-rate:为设定最慢的扫描每秒发包速率,具体数值没有区间设定,打靶时这里设置10000去速度准确性的平衡,同时网络和系统性能能够承受,很多大佬都会用10000这个值,红队行动中会慢很多,已避免被判定恶意。
-p-:-p为指定端口范围的参数,而-是简化的指定1-65535全端口进行扫描,因为默认nmap只扫描常用的1000个端口,使用-指定全部端口后就会覆盖掉原来默认指定1000个端口。动态范围端口和管理员留高端管理端口的习惯决定着我们不要用nmap的默认端口扫描。
-oA:-o为输出,A为all,包括了nmap支持的三种输出格式,后面跟具体指明nmapscan这个文件夹下去存储命名为ports的文件,最终他会用三种不同输出格式和扩展名输出三个文件。
PS:这条命令的构造原则就是要扫描的准、全,并且时间上可接受,还要有一定的隐蔽性。-sT解决的准和隐蔽性的问题,--min-rate解决的是隐蔽性和速度的平衡,指定了65535全部端口而不是1000,而输出是为了便于扫描结果的数据化
输出结果为三种格式:gnmap、nmap、xml
gnmap:为nmap自己定义的文本格式,按照官方文档,这种格式已经被放弃了,出于历史的延续性和兼容性依然保留,但是nmap的作者自己也说,xml格式比gmap格式要好的多
nmap
xml:带来的想象力和兼容交互性不言而喻
得到这些结果后,进行详细信息扫描之前,我们要考虑,此次扫描结果仅仅为四个端口,若遇到更多端口时,操作不便,需要把端口提取出来
使用grep去搜索nmapscan中ports.nmap文件下扫描结果中有端口的数据行
grep open nmapscan/ports.nmap
得到全部有端口号的数据行。然后用awk指定-F的参数 用/做分隔符打印出第一列
grep open nmapscan/ports.nmap | awk -F'/' '{print $1}'
将全部的端口提出来,他能解决端口较多时,把所有端口自动提取出来
最后用paste 加-sd,-s指定为一行,d为指定分隔符,分隔符用逗号,','
grep open nmapscan/ports.nmap | awk -F'/' '{print $1}' | paste -sd ','
将四行输出为一行,更方便读取数据
再将端口信息进行赋值
ports=$(grep open nmapscan/ports.nmap | awk -F'/' '{print $1}' | paste -sd ',')
3.详细信息扫描
sudo nmap -sT -sV -sC -O -p21,22,80,3306 192.168.88.148 -oA nmapscan/detail
-sT:指定以tcp协议进行扫描
-sV:探测各服务的版本。通过和系统对应端口服务的交互,判断每个端口上跑的是什么服务以及具体的版本。
-sC:用默认脚本进行扫描。C为script,用的是nmap默认的脚本分类目录名称。
-O:探测操作系统的版本
-p:指定端口,tab键会将指定的端口自动读取出来
这次扫描用了四个参数,是用nmap扫描中最重的一次扫描,但刚刚已经对端口的确定,也就没有想象中的那么重,若加了四个参数再继续扫65535全部端口,增加的流量和暴露的可能以及对于本机和目标机器(当前为靶机)带来的冲击是非常大的。
21:ftp服务,应用版本为vstfp 2.0.8 d一般表示驻留程序。可以实现匿名登录,有三个目录已经列出,很可能有信息泄露
22:ssh服务。在渗透测试时,优先级排后,直接通过ssh登录的意义不大,但不绝对。
80:Apache2.4.18可能为乌班图。title也列了出来。渗透优先级权重最高
3306:有?,信息有疑问。mysql默认端口,可能有弱密码的访问权限,或配合渗透测试其他环节完成利用。
优先级:先看21和3306能给到哪些信息,然后重点放在80
4.udp扫描
sudo nmap -sU --top-ports 20 192.168.88.148 -oA nmapscan/udp
-sU:指定以udp协议进行扫描,与上述扫描命令-sT是对应的。nmap也有将多个协议一起扫描的语句的写法,但因为他们表现的攻击面是不同的,也为了扫描结果更便于查看,建议将不同的协议分开扫描
--top-ports:端口udp的初步扫描一般指定20个常用udp端口
当前显示的扫描结果,top20端口的开放都为悬疑状态,没有明确开放的端口,结果保存备用,必要时再回来查看。
5.默认脚本扫描
sudo nmap --script=vuln -p21,22,80,3306 192.168.88.148 -oA nmapscan/vuln
vuln:全称vulnerability 。nmap的默认脚本目录
21,22,3306端口并未发现有用信息。
80:
并未发现csrf,xss漏洞。
有存在slowloris可利用漏洞,为dos攻击,在渗透测试时dos攻击基本不会选择,过于暴力且没有技术含量。
没有找到基于dom的xss漏洞
在http-enum(枚举)显示有wordpress
PS:udp及脚本扫描虽然在此次靶机并未发现有用信息,但每次打靶都值得尝试。还有一件事情,虽然此次靶机并未涉及到,当找不到攻击面的时候,要考虑存在ipv6地址的可能,因为此次打靶已经暴露出攻击面,就不再继续尝试。
总结:nmap扫描和信息收集阶段,主要的就是完成nmap的四大扫描,同时要考虑ipv6地址存在的可能,以及最重要的攻击面分析,确定初步的渗透优先级和策略
1.端口扫描--开放那些端口,缩短后续扫描范围
2.详细信息扫描--最重也是最重要的扫描
3.udp扫描
4.nmap漏洞脚本扫描
二、渗透阶段
21:ftp
nmap的扫描结果中,存在ftp匿名登录漏洞,输入用户名anonymous,密码为空
ftp 192.168.88.148
状态码230成功登录
输出结果提示用二进制传输文件
对于渗透测试,进到ftp中首先要想到的就是用binary切换到二进制模式
提示切换成功
PS:如果不切换到二进制模式,很可能下载下来的文件是坏的无法读取
ftp使用的命令可以用?显示出来,与linux很像
ls列出nmap扫描中暴露出的几个目录
切换到content目录看到有三个文件都是可读,依次下载
先执行prompt,把交互模式的提示关掉,这样不用每一次都需要确认
使用mget 一次性下载三个txt文件并且不需要交互式的确认
mget *.txt
将三个目录下的txt全部下载下来
使用cat命令读取全部txt文件
cat *.txt
逐个分析:
New FTP Server For W1R3S.inc
wires公司新的FTP。对于渗透测试对new要敏锐,新的往往意味着建设不完善,是可以建立渗透测试信心的。
01ec2d8fc11c493b25029fb1f47f39ce
一段字符串,经验丰富的话可以直接看出来。也可以使用kali中自带工具hash-identifier识别
将字符串复制到HASH:
得出字符串为MD5加密
解码:
建立md5文件
john未破解出来
经网站md5解密后为:this is not a password
再通过kali校验一下解密结果
echo -n 'This is not a password' | md5sum
得出结果与输出吻合
第三段字符串
SXQgaXMgZWFzeSwgYnV0IG5vdCB0aGF0IGVhc3kuLg==
hash-idnentifier并没有解密出
但我们可以通过经验得知, 此字符串为base64加密
base64严格意义并不能称得上是加密,而算是一种编码转换。且base64字符串一定会被4整除,通常以等号==结尾
那我们直接使用kali进行解码
echo "SXQgaXMgZWFzeSwgYnV0IG5vdCB0aGF0IGVhc3kuLg==" | base64 -d
-d为解码命令
得输出结果:
It is easy, but not that easy..
ps:两段字符串都没有获得有价值信息,继续跟着txt文件往下看
下面是w1r3s的员工列表, 当我们拿到这些信息的,
Manager经理可能有一些基于业务的特别的权限,也有可能他拿着所有员工的数据
Hector,A IT Dept 他可能掌握着所有员工权限的信息,比如ftp的账户信息,邮箱的账户信息,有可能有基于技术的高权限,包括系统权限
web design可能他们的信息就没那么重要
Gina.L - Inventory 库管。可能有一些权限数据,员工基本信息,联系方式,活动信息
Rico.D - Human Resources 人力资源 他可能拿着全部人员的最详细的信息
Ps:也许在这台靶机中,这些人员信息并不能利用,但在以后的渗透测试过程中,这些信息要有一个大体的认知,要对信息敏感。
ı pou,ʇ ʇɥıuʞ ʇɥıs ıs ʇɥǝ ʍɐʎ ʇo ɹooʇ¡
....punoɹɐ ƃuıʎɐןd doʇs ‘op oʇ ʞɹoʍ ɟo ʇoן ɐ ǝʌɐɥ ǝʍ
这两段字符串,排列顺序是颠倒的
借助网络工具upsidedowntext.com进行转换
输出结果为:
ı don't thınk thıs ıs the way to root!
we have a ןot of work to do‘ stop pןayıng around˙˙˙˙
截止到现在,ftp获取的信息全部解密,但并没有发现有价值信息。
ftp21端口到此为止
3306端口
mysql -h 192.168.88.148 -u root -p
因为是linux操作系统,所以root用户是一定存在的,只是允不允许使用的问题 -p不知道,尝试登录
需要密码,尝试空密码登录,失败 输出结果不允许ip:192.168.88.142登录,也就是我的kali机器
3306暂时放弃
80端口:
打开80端口页面
Apache的默认页面:
这个页面一般是维持架设服务器时候的原貌,个别也有时候在不同的地方隐藏信息,尤其是一些小的网站,新建的网站,团队协作的时候,很可能在某一处留下一些信息。
简单浏览,这个页面很难获得攻击面
查看页面源代码:
我们要高度重视里面的注释,但这个页面的源代码并没有发现有价值信息
目录爆破:
刚刚在nmap的漏洞脚本扫描过程中,显示有WordPress的字样,但目前我们还没有发现。
加wordpress尝试
访问不成功,但跳转到了localhost的地址
使用gobuster进行目录爆破
sudo gobuster dir -u http://192.168.88.148 --wordlist=/usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
这个字典是kali自带的,目录爆破时经常使用,日常打靶比如vulnhub及textbox使用medium大小的字典就已经够了,并不需要自己构造或找别的字典。
访问三个网站
http://192.168.88.148/wordpress/
http://192.168.88.148/javascript/
http://192.168.88.148/administrator
这个网站存在是一个程序的安装
页面的title 是Cuppa CMS 是一个内容管理系统
目录爆破结束,没有新的发现。目前遇到的问题是wordpress自动跳转到localhost
尝试修改host文件,看能否访问到网站
sudo vim /etc/hosts
将localhost指向靶机ip192.168.88.148,同时再给定一个任意网站做一下验证。为什么这么做,是为了kali不允许localhost指定非本机ip,设置为127.0.0.1是可以的。但现在让localhost指向靶机的ip有可能不行,那么使用.com这种,是为了校验,如果这个域名可以的话,而localhost还不可以,就证明现在的kali环境允许这样操作。
访问设置好的kl37dddan.com,访问成功
访问localhost依旧失败
继续尝试访问http://kl37dddan.com/wordpress
依旧访问到localhost
综上尝试,证明我们没有办法控制kali设置localhosts。我们那么这条路是否完全为死路,但至少证明我们需要对kali进行更深度的调整,但因为目前这个过程所需要的时间以及其他的路径我们没有尝试完的情况下,需要将这个步骤的优先级排后。
先看刚刚的 http://192.168.88.148/administrator
显示给我们的是一个安装的页面,核对重要信息都是支持的,绿字状态代表我们可以执行安装,这是很多cms在安装的过程中检测前置条件时通用的做法
尝试点击next
这里需要有一个意识。我们在进行渗透测试,执行的操作是否会改编目标机器上的东西,现在执行next是否会进行安装,或没有其他办法的情况下,目标机器给了一个这样的交互状态,那我们也只能往下走,但要对走的结果有一个预期,哪怕之后会产生不可控的结果,但也是在之前要预料到的。比如这里的某个操作,点了next,对系统,服务器环境造成不可逆的修改,导致服务器终止服务或被管理员发现,这种结果是需要有预期有准备的。
点击next后,是一个安装的配置页面,数据库和用户管理员设置。如果你得到错误信息,那么核对主机、数据库名、用户和密码是正确的,这是通用的一个配置界面
数据库默认给了localhost
HOST ?处会弹出tips提示是localhost
Datebase Name处弹出:要在其中运行Cuppa CMS的数据库的名称
并且发现database拼写错误,这算是一个独特的字符,比如我们现在渗透到这一步,不知道后面产生什么状况,这个错字是一个独特的标志,那我们就可以在网上搜到这个界面或者描述一件事情的文章,这样我们就可以快速定位到我们想要的东西。对渗透测试者要知道,这对渗透测试的过程有什么作用,那我们通过这个独特的错词可以搜到类似的场景和描述,那就能知道我们进行下去会发声什么,现在这个错词存在靶机我们没有那么大的压力,如果这是一台实际运营的服务器,我们再继续下去是会手抖的,因为我们完全不知道接下来的操作是否会让我们直接暴露,即使没那么夸张,也可能对服务器造成不可逆的修改以及让管理员发现。
那我们去尝试填写
下方给了我们相应的提示,在我们充分评估了风险之后。我们继续往下走,我们要看能否安装成功后,给我们一个可以登陆的后台,那么我们就有可能获得基于他所用的基于让靶机所用的数据站中执行反弹shell的机会,点击下一步。
输出结果告诉我们:配置文件Yes、创建表格Yes、管理员的用户创建 No
证明我们对系统产生操作的,可能安装了,但我们仍然进不去,交互的按钮只有一个back,只能回去。
我们考虑一下源码
既没有Cuppar CMS 的版本,也没有泄露出敏感信息。
总归这是一套内容管理系统,作为应有的思路,我们要想到这套内容管理系统有没有bug,无论是大的系统还是小的系统,肯定有一些公开漏洞允许我们利用
kali运行searchsploit
这是kali的一个数据库搜索工具,搜索的内容为exploit-db.com
这是kali公司的另一款产品,而通过searchspoloit这个工具搜索的就是这个数据库的本地拷贝,他是不联网的。搜索cuppa cms,因为我们不知道当前服务器运行cuppa是哪个版本
searchsploit cuppa cms
下载txt文件
searchsploit cuppa -m 25971
测试在windows和linux下,都会有成功利用的可能
在这个cms 的alerts文件夹下的alertConfigField.php的文件 在第22行,REQUEST处理urlConfig参数的时候产生了文件包含漏洞。
攻击者可能包含 本地或远程的php file 或者是用这个漏洞来读取非php文件。
如果能读取php文件源码,非php文件可能是passwd、shadow,一般文件包含都要想到这几点 。然后用获得的数据创建一个文件名能够包括到当前的文件中,在文件中的php代码将被评估,非php代码也能嵌到文件的输出中,这个漏洞有可能导致服务器的失陷
利用的过程:可以远程包含、passwd的读取
不仅如此,我们可以通过php字节流访问Configuration.php的源码
通过txt给的利用方式执行一下利用,先看能否读取passwd这个文件,因为是否远程包含shell.txt这个文件需要进一步构造,而在这之前,我们验证这个漏洞是否存在
尝试访问
http://target/cuppa/alerts/alertConfigField.php?urlConfig=../../../../../../../../../etc/passwd
路径是不对的,我们需要自己构造
http://target/cuppa/alerts/alertConfigField.php?urlConfig=../../../../../../../../../etc/passwd
alerts是肯定存在的,因为cuppa cms的安装路径在administrator,那么就有可能passwd也存在于administrator这个目录
重新构造路径尝试访问
有回显,虽并没有打开passwd,但证明这个路径是正确的
简单分析:date
txt给的利用方式就是这样的。urlconfig是作为一个参数给过来的,一般来说,作为参数是用get的方式处理数据,但程序的处理逻辑未必是这样,需要进一步确认。同时,有base64编码,这是txt文件中提到的一点,我们目前还并不知道编码有什么作用,所以我们针对base64编码进行尝试,,在url中传递的参数,后台的处理方式,如果不是get那么有可能是post,这样能解释这个页面现在的问题,但也只是猜测。
现在也可以做代码审计,虽然现在不能访问服务器上的源代码,但这是一套内容管理系统,而且txt文件还有软件链接,有第三方网站
而且这个第三方网站不是在官方网站,而是在sourceforge.com,他提供的cuppa cms的源码包,下载下来就可以做代码审计
wget http://jaist.dl.sourceforge.net/project/cuppacms/cuppa_cms.zip
上面txt文件告诉我们第22行存在漏洞,这是一个样式文件,我们也可以通过关键字 include urlconfig寻找
这是使用post提交方式处理传过来的参数,并且没有做任何处理,漏洞就是这个。
可以使用burpsuit、也可以使用命令行工具
curl 中的 --date-urlencode,对数据进行url编码并且通过post的方式进行传递
curl --data-urlencode 'urlConfig=../../../../../../../../../etc/passwd' http://192.168.88.148/administrator/alerts/alertConfigField.php
将变量urlconfig 的内容通过url编码给到处理程序,这样也符合在源码审计中看到的以post的提交方式进行传输的需求
执行查看输出结果
已经输出了passwd的内容,第二段都是输出了x,证明密码是以哈希的方式存在于shadow文件中
继续执行命令找shadow文件,尝试能否读取
curl --data-urlencode 'urlConfig=../../../../../../../../../etc/shadow' http://192.168.88.148/administrator/alerts/alertConfigField.php
没有问题,读取到了hash值 用户名密码
删掉没有hash值的用户名,只保存存在hash值的用户名,丢给john进行破解
尝试登录ssh
输入密码computer
登陆成功,获得了登录权限
拥有27sudo权限
尝试提权,提权的第一步,查看当前用户有哪些系统权限
sudo -l
输出结果显示w1r3s存在所有权限,那就等于等于root权限
启动新的bash会话
sudo /bin/bash
看到命令号中带有#
证明提权成功
没有问题
查看是否有flag
切换到root目录下
flae提示我已经完成挑战
CONGRATULATIONS!!
22端口
还剩一下22端口,一般认为暴力破解的可能性不大,会将其优先级排后,实际的攻防中,其他方法行不通的时候,也可以尝试一下
使用hydra -L 指定用户名,但其需要字典
构造字典,需要结合ftp暴露的敏感信息构造,因为ftp是很容易搜集到的信息
vim user.list
hector为 ftp拿到的敏感信息 IT Dept
使用字典进行ssh爆破
hydra -L user.list -P /usr/share/wordlists/rouckyou.txt ssh://192.168.88.148 -t 4
尝试登录ssh
输入密码computer
第二次获得root权限
CONGRATULATION!!
总结:
1.nmap获得四个端口21,22,80,3306都是标准的服务端口,但在nmap扫描过程中我们详细的对获得数据进行取舍、利用,在渗透以及实际攻防的过程中,怎么使用,怎么选择。也不要忽略udp、ipv6、对四个端口的优先级排序
1.21端口ftp,里面获得了若干的文本文件,逐一查看、破解、处理,虽然此次靶机并没有什么用,但在过程中这是必不可缺的,在若干信息中突围,选择取舍,这才是必要的。
2.3306端口mysql,尝试登录为禁止连接状态
3.80端口、先是目录爆破,看到wordpress、administrator目录,因为wordpress的目录问题,我们没有配置成功,需要做大的调整,因为时间问题和技术难度,暂时放弃。然后在administrator路径下看到了安装目录,发现是cuppa cms 的安装路径,通过公开漏洞利用搜索,找到了可利用的漏洞,了解之后,用它的路径去执行、做了代码审计,用它的文件包含漏洞获得了shadow文件,然后用jahn进行破解,获得了w1r3s用户的凭据computer,成功获得了系统的立足点。提权阶段发现sudo -l 查看发现有全部sudo权限,这样直接用sudo启用新的bash回话获得了系统的root shell,也拿到了flag
4.22端口,原本并没有指望获取有价值的信息,简单评估我们用ftp中获得的关键信息,生成一个字典对ssh进行用户名密码爆破,然后用rochyou密码库进行爆破,也获得了一个w1r3s的密码,这样再一次获得了系统的rootshell 拿到了flag。
反思:
如果说ssh爆破是最快的方式,那么之前的都是兔子洞,如果cuppa cms 是正确的方式,那么ftp泄露的信息以及wordpress都算兔子洞。反思下来,我们不要害怕兔子洞,只要我们能否走下去就够了。因为是否为兔子洞,需要我们随时盘点判断获取到的信息。尤其是在学习的时候,我们需要去逐一尝试,即使走不通,那也是有价值的尝试和思考。
声明:此文章操作及经验来源于bilibili红队笔记。